본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 30. 23:18

고장 난 Raspberry Pi를 AI 에이전트에게 맡겼더니 SSH를 통해 모든 것을 해결했습니다

요약

OS 업그레이드 실패로 네트워크 연결이 끊긴 Raspberry Pi 4를 AI 에이전트를 활용해 복구하는 과정을 다룹니다. macOS의 파일 시스템 한계를 Jetson Nano와 Tailscale을 이용해 극복하고, 에이전트의 가이드에 따라 시스템을 조사하는 실전 사례를 보여줍니다.

핵심 포인트

  • OS 업그레이드 실패 시 발생할 수 있는 네트워크 및 SSH 접속 불가 상황 해결
  • macOS에서 ext4 파티션 접근 불가 문제를 Jetson Nano로 우회 해결
  • AI 에이전트를 활용한 체계적인 시스템 트러블슈팅 및 포렌식 조사
  • Tailscale을 이용한 원격 환경에서의 효율적인 디버깅 프로세스

헤드리스 (Headless) Raspberry Pi 4. 실패한 OS 업그레이드. 모니터 없음, 키보드 없음, 네트워크 없음. 하나의 AI 에이전트, 하나의 Jetson Nano, 그리고 Tailscale 연결.

상황 (The Situation)

저는 NextDNS, PiVPN/WireGuard, Tailscale, Docker, 그리고 Pi-hole과 같은 중요한 홈 인프라를 처리하는 homepi라는 이름의 헤드리스 (Headless) Raspberry Pi 4를 운영하고 있습니다. 이 기기는 모니터가 연결되지 않은 채 벽장 안에 놓여 있습니다.

지난주, 저는 Raspbian 10 (Buster)에서 11 (Bullseye)로 업그레이드를 시도했습니다. apt full-upgrade가 몇 시간 동안 실행되었고, 몇 가지 설정 파일 질문을 던진 뒤 침묵에 빠졌습니다. 그 후 Pi는 네트워크에 다시 연결되지 않았습니다.

DHCP 임대(lease)도 없었습니다. SSH도 안 됩니다. Ping도 안 됩니다. 라우터에는 아무것도 나타나지 않았습니다.

저는 32GB SanDisk microSD 카드를 뽑아 Mac에 연결했습니다. Finder에는 FAT32 /boot 파티션만 표시되었습니다. 모든 설정과 로그가 저장되어 있는 ext4 루트 (root) 파티션은 macOS에서 보이지 않았습니다.

이 지점에서 대부분의 사람들은 새 SD 카드를 꺼내 처음부터 다시 시작할 것입니다. 하지만 저에게는 AI 에이전트가 있었고, 그것이 어디까지 해낼 수 있는지 보고 싶었습니다.

1단계: macOS에서의 분류 (눈먼 상태) (Phase 1: Triage From macOS (Blind))

저는 /boot 디렉토리의 스크린샷을 에이전트와 공유했습니다. 에이전트는 즉시 수상한 점을 발견했습니다: cmdline.txt의 날짜가 1979년 12월 31일 — 즉, Unix epoch(유닉스 에포크)로 되어 있었습니다. 데이터 손상일까요?

에이전트: "1단계: Mac 터미널에서 cat /Volumes/boot/cmdline.txt를 실행하세요."

파일은 온전했습니다 — 타임스탬프(timestamp) 손상일 뿐이었습니다. 커널 명령줄 (kernel command line)은 정상적으로 보였습니다. 하지만 에이전트는 ext4 루트 (root) 파티션을 읽지 않고서는 더 깊이 들어갈 수 없었습니다. macOS는 이를 기본적으로 수행할 수 없습니다.

우리는 macFUSE를 설치하려고 시도했습니다. Homebrew에서 에러가 발생했습니다. macOS 버전(macOS 16의 개발자 베타로 보이는 26.5 버전)이 사용 가능한 어떤 macFUSE 빌드와도 호환되지 않았습니다.

Mac은 막다른 길이었습니다. 우리에게는 Linux가 필요했습니다.

2단계: Tailscale로의 전환 (Phase 2: The Tailscale Pivot)

제 Tailscale 네트워크에는 Jetson Nano가 있습니다. 이것은 JetPack (Ubuntu 기반)을 실행하며 여분의 microSD 슬롯을 가지고 있습니다. 에이전트가 제안했습니다:

에이전트: "microSD를 USB 카드 리더기에 꽂고 Jetson에 연결하세요. 그런 다음 Tailscale을 통해 SSH로 접속하겠습니다."

저는 Pi의 SD 카드를 Jetson의 내부 슬롯에 삽입했고, 에이전트는 Tailscale SSH를 통해 연결되었습니다. 몇 초 지나지 않아 다음과 같은 결과가 나타났습니다:

$ lsblk
mmcblk0     29.7G
├─mmcblk0p1  256M vfat   boot
...

두 파티션 모두 확인되었습니다. 둘 다 마운트(mount) 가능했습니다. 우리는 환자(대상 기기)에 대한 완전한 접근 권한을 얻었습니다.

3단계: 포렌식 조사 (Forensic Investigation)

에이전트는 두 파티션을 마운트하고 체계적인 조사를 시작했습니다. 에이전트가 찾아낸 결과는 다음과 같습니다 — 순서대로:

발견 #1: 인터페이스 이름 탈취

Pi의 dhcpcd.conf에는 eth0에 대해 192.168.1.100이라는 정적 IP(static IP) 설정이 되어 있었습니다. 하지만 Bullseye 버전은 **예측 가능한 네트워크 인터페이스 이름 (predictable network interface names)**을 도입했습니다. 즉, eth0enxxx:xx:xx:xx:xx:xx와 같은 형태로 변하는 것입니다. eth0라는 인터페이스는 더 이상 존재하지 않았습니다.

해결책: 전통적인 명명 방식을 유지하기 위해 cmdline.txtnet.ifnames=0 biosdevname=0을 추가했습니다.

하지만 그것만으로는 충분하지 않았습니다. 에이전트는 커널 로그(kernel logs)를 더 깊이 파고들었습니다:

May 30 15:17:05 kernel: bcmgenet fd580000.ethernet: GENET 5.0 EPHY: 0x0000
...
May 30 15:17:14 kernel: eth0: renamed from vethace5160

발견 #2: 인터페이스 이름을 가로챈 Docker

Broadcom 이더넷 드라이버(bcmgenet)는 하드웨어를 올바르게 로드하고 감지하고 있었습니다. 하지만 Docker가 먼저 시작되었고, Docker의 가상 이더넷 인터페이스가 물리적 NIC(Network Interface Card)의 초기화가 완료되기 전에 eth0라는 이름을 선점해 버렸습니다. 실제 이더넷은 가져갈 이름이 없었습니다.

해결책: Docker와 containerd의 자동 시작을 비활성화했습니다 — multi-user.target.wants에서 심볼릭 링크(symlinks)를 제거했습니다.

발견 #3: 에너지 효율적 이더넷 (Energy Efficient Ethernet)

Raspberry Pi 4의 알려진 특이 사항입니다: 에너지 효율적 이더넷(Energy Efficient Ethernet)은 일부 스위치와 링크 협상(link negotiation) 실패를 일으킬 수 있습니다.

해결책: config.txtdtparam=eee=off를 추가했습니다.

발견 #4: 근본 원인 🔴

세 가지 해결책을 적용했지만, 에이전트는 만족하지 않았습니다. 에이전트는 systemd 저널(journal)을 계속 파헤쳤고, syslog에서 다음 내용을 발견했습니다:

5월 30 15:17:05 homepi systemd[416]: dhcpcd.service: Failed to locate executable
    /usr/lib/dhcpcd5/dhcpcd: No such file or directory
5월 30 15:17:05 homepi systemd[1]: dhcpcd.service: Failed with result 'exit-code'.
...

이 메시지는 부팅할 때마다 6번 반복되었습니다. dhcpcd는 시작되기도 전에 조용히 실패하고 있었으며, 이로 인해 Pi에는 실행 중인 DHCP 클라이언트가 전혀 없었습니다.

원인은 /etc/systemd/system/dhcpcd.service.d/wait.conf에 있었습니다:

[Service]
ExecStart=
ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w

이것은 Buster 시절의 DietPi 기반 오버라이드(override) 설정이었습니다. Bullseye에서는 dhcpcd의 경로가 /usr/lib/dhcpcd5/dhcpcd에서 /usr/sbin/dhcpcd로 변경되었습니다. 즉, 오버라이드 설정이 **더 이상 존재하지 않는 바이너리(binary)**를 가리키고 있었던 것입니다. Systemd는 이를 실행하려고 시도하다가 ENOENT 오류를 받고 포기했습니다.

해결 방법: sed 명령어 한 줄이면 충분했습니다:

sed -i 's|/usr/lib/dhcpcd5/dhcpcd|/usr/sbin/dhcpcd|g' wait.conf

전체 수정 목록 (The Full Hit List)

에이전트가 감사를 마쳤을 때, 수정된 사항은 다음과 같습니다:

#문제 (Issue)영향 (Impact)
1cmdline.txt 내 net.ifnames=0인터페이스 이름이 enx...로 변경되어 dhcpcd가 이를 찾을 수 없음
...

계층(Layer) 1~3은 인터페이스가 작동하는 것을 방해하고 있었습니다. 계층 4는 인터페이스가 존재하더라도 dhcpcd가 IP를 할당할 수 없음을 의미했습니다. Pi는 부팅되고 있었고, 커널(kernel)은 정상이었으며, 이더넷 하드웨어도 감지되었지만, DHCP 클라이언트가 도착하자마자 사망한 상태였습니다.

진실의 순간 (The Moment of Truth)

Jetson에서 SD 카드를 뽑아 Pi 4에 다시 넣고 전원을 켰습니다.

라우터에 새로운 DHCP 임대(lease)가 나타났습니다. SSH 연결이 성공했습니다. homepi가 돌아왔습니다.

$ ssh pi@192.168.1.100
Linux homepi 5.10.103-v7l+ #1529 SMP Tue Mar 8 12:24:00 GMT 2022 armv7l
마지막 로그인: Fri May 30 18:45:22 2026
...

아키텍처: 작동 원리

복구 체인은 다음과 같이 작동했습니다:

 macOS (Finder는 FAT32만 인식함)
    ↓ "/boot는 볼 수 있지만 루트 파티션은 볼 수 없습니다"
 Hermes Agent (클라우드 VPS에서 실행 중)
...

에이전트는 Pi에 키보드를 연결한 적이 없었습니다. 부팅 화면을 본 적도 없습니다. 기기에 핑(ping)을 보낸 적도 없습니다. 모든 작업은 Tailscale 메시 네트워크(mesh network)를 통해 다른 기기에 마운트된 콜드 스토리지(cold storage)의 포렌식 분석(forensic analysis)을 통해 수행되었습니다.

이것이 의미하는 바

우리는 AI 에이전트가 단순하게 사람이 복사해서 붙여넣을 명령어를 생성하는 수준을 넘어, 실제로 시스템을 자율적으로 진단, 조사 및 복구하는 정당한 시스템 관리자(sysadmin) 업무를 수행할 수 있는 시대에 진입하고 있습니다.

에이전트는 단순히 "재설치를 시도해 보세요"라고 제안한 것이 아니었습니다. 에이전트는 다음과 같은 작업을 수행했습니다:

  • 드라이버 초기화 순서를 이해하기 위해 커널 로그(kernel logs)를 읽고 해석함
  • systemd 서비스 파일과 파일 시스템(filesystem)의 실제 상태를 교차 참조함
  • 배포판 업그레이드 과정에서 DietPi 시절의 설정이 남아 있음을 식별함
  • 정확한 실패 체인을 추적함: systemd → override → 누락된 바이너리(missing binary) → dhcpcd 없음 → IP 없음
  • 실행 중인 시스템이 아닌, 마운트된 파일 시스템 상의 설정 파일을 수정함
  • 이전에 한 번도 접속한 적 없는 기기에 대해 Tailscale SSH를 통해 이 모든 과정을 수행함

그리고 에이전트는 말 그대로 네트워크 접속이 불가능한 시스템을 대상으로 이 작업을 수행했습니다. 환자는 혼수상태였고, 외과의는 다른 신체를 통해 수술을 집도한 셈입니다.

이 복구 작업은 경험으로부터 학습하고 재사용 가능한 기술(skills)을 저장하는 오픈 소스 AI 에이전트 프레임워크인 Hermes Agent에 의해 수행되었습니다. 전체 세션은 Telegram을 통해 진행되었으며, 에이전트는 Tailscale SSH를 통해 Jetson에 접속하고 포렌식 분석을 위해 Pi의 SD 카드를 마운트했습니다.

네 가지 수정 사항, 조사 로그, 그리고 복구 워크플로우(workflow)는 모두 향후 사고를 대비한 재사용 가능한 기술(reusable skills)로 저장되었습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0