홈서버 ZFS 디스크 다중 이탈(UNAVAIL) 트러블슈팅: 원인은 디스크 고장이 아닌 DC-to-DC 5V 전원 부족이었다

ZFS 풀이 깨졌다. 다반사로 겪었던 일이라 기계적으로 풀을 복구하려고 디스크를 교체했는데, 혹시나 싶어 AI 에게 관련 내용을 물어봤다. 덕분에 도시바 디스크 중 모델명 뒤에 v 가 붙은 모델은 CCTV 용이라서 apm 설정이 안된다는 것을 새로 알게 되었다. 이런 곁다리는 제외하고, 다른 중요한 대화 내용을 Gemini 가 정리해 주었다.


홈서버를 운영하다 보면 어느 날 갑자기 ZFS 풀(tank0)의 디스크 여러 개와 캐시(L2ARC)가 동시에 UNAVAIL 상태로 떨어지는 아찔한 상황을 마주할 때가 있습니다.

처음에는 디스크 이상으로 판단해 디스크를 초기화한 뒤 ID 기반으로 교체(zpool replace)하여 리실버링(Resilvering)으로 풀을 복구했습니다. 하지만 이후 로그와 하드웨어 스펙을 추적해 본 결과, 근본 원인은 디스크 자체 결함이 아니라 미니 PC용 DC-to-DC 파워의 +5V 레일 전류 부족으로 인한 순간 전압 강하였습니다.

이번 글에서는 ZFS 디스크 교체 및 리실버링 복구 과정과 함께, 진짜 원인인 전원 병목을 찾아내 ryzenadj와 smartctl, 배선 최적화로 시스템을 안정화한 과정을 정리합니다.

1. 증상 및 초기 복구: 디스크 초기화 후 ID 기반 zpool replace 진행

ZFS 풀(tank0) 상태를 확인하던 중 데이터 디스크 2개와 캐시 장치가 동시에 연결 끊김(UNAVAIL) 상태로 변경되었습니다.

이를 복구하기 위해 먼저 대상 디스크의 기존 파일 시스템과 파티션 메타데이터를 wipefs로 빠르게 초기화한 뒤, 재부팅 시 장치명(/dev/sdX)이 바뀌는 문제를 방지하고자 /dev/disk/by-id/ 경로를 확인해 zpool replace로 리실버링을 진행했습니다.

Bash

# 1. 대상 디스크 파일 시스템 및 파티션 테이블 빠른 초기화
sudo wipefs -a -f /dev/sdX
sudo partprobe /dev/sdX

# 2. 디스크 고유 ID 경로 확인 (-part가 없는 전체 디스크 ID 사용)
ls -la /dev/disk/by-id/ | grep sdX

# 3. 고유 ID 경로로 ZFS 디스크 교체 및 리실버링 실행
sudo zpool replace tank0 <기존_디스크_ID> /dev/disk/by-id/<새_디스크_ID>

리실버링을 통해 풀은 정상 복구되었지만, 디스크 1개가 아니라 3개의 장치가 같은 시점에 동시에 UNAVAIL로 떨어졌다는 점에서 단순 디스크 고장이 아닌 시스템 공통의 전원·컨트롤러 문제를 의심하고 본격적인 원인 추적에 들어갔습니다.

2. 원인 추적: ZFS 이벤트 로그와 하드웨어 스펙 대조

① ZFS 이벤트 로그(zpool events)로 물리 경로 확인

ZFS 자체 이벤트 로그를 조회해 디스크가 빠진 정확한 물리 경로(vdev_physpath)를 추적했습니다.

Bash

sudo zpool events -v | head -n 80

로그 분석 결과, 이탈한 두 디스크 모두 동일한 PCIe SATA 확장 카드(pci-0000:06:00.0)의 5번, 6번 포트에 연결되어 있었으며, 특정 디스크의 배드섹터(미디어 에러) 누적 없이 해당 컨트롤러 라인의 장치들이 동시에 ONLINE에서 UNAVAIL로 전환된 것을 확인했습니다.

② 범인은 DC-to-DC 파워의 +5.00V 레일 한계

전체 어댑터 용량은 120W(12V 10A)로 넉넉해 보였지만, 사용 중인 DC-to-DC 파워 보드의 세부 출력 스펙을 확인해 보니 병목 지점이 명확히 드러났습니다.

  • +3.30V: Avg 8.0A / Peak 10.0A
  • +5.00VSB: Avg 2.0A / Peak 2.5A
  • +5.00V: Avg 6.0A (30W) / Peak 10.0A

일반적인 3.5인치 HDD는 모터 구동에 12V를 주로 사용하지만, 2.5인치 HDD와 SATA SSD, PCIe SATA 확장 카드는 전력의 대부분을 +5.00V 레일에서 끌어다 씁니다.

장치 구분수량개당 피크 전류 (+5V)합계 피크 전류 (+5V)
2.5인치 HDD (WD10JPVX, MQ01ABD100 등)5개 이상0.9A ~ 1.1A (스핀업/탐색 시)5.0A ~ 5.5A
SATA SSD 및 PCIe SATA 컨트롤러1식1.0A ~ 1.8A1.0A ~ 1.8A
메인보드 내부 5V 회로 및 USB 장치1식0.5A ~ 1.0A0.5A ~ 1.0A
총합계피크 7.0A ~ 8.3A (정격 6.0A 초과)

ZFS 스크럽(Scrub)이나 동시 읽기/쓰기 부하가 몇 초 이상 이어지면서 +5.00V 레일의 평균 정격인 6.0A를 초과했고, 그 결과 전압 강하(Droop)가 발생해 확장 카드 끝단에 물린 디스크들이 일제히 링크 다운된 것이었습니다.

3. 해결 및 시스템 전력 최적화 과정

파워 서플라이를 +5V 정격 10A 이상(200W~250W급 DC-to-DC) 모델로 업그레이드하기 전, 현재 하드웨어 상태에서 피크 전력 급등을 억제하기 위해 3단계 조치를 적용했습니다.

① ryzenadj로 APU 패키지 소비전력 18W 제한

AMD Ryzen 7 5825U 프로세서는 기본 설정상 지속 전력(STAPM)은 15W지만, 순간 피크 전력(PPT LIMIT FAST)이 30W까지 치솟도록 설정되어 있습니다. 디스크 부하와 CPU 피크 부하가 겹치는 것을 막기 위해 ryzenadj를 빌드하여 CPU와 내장 GPU를 포함한 APU 전체 소비전력을 18W로 고정했습니다.

Bash

# 18W 전력 제한 적용 (지속, 순간 피크, 단기 부스트, 내장 GPU 포함)
sudo ryzenadj --stapm-limit=18000 --fast-limit=18000 --slow-limit=18000 --apu-slow-limit=18000

(재부팅 후에도 유지되도록 systemd 서비스에 등록했습니다.)

② HDD 스핀다운(standby) 해제 및 APM 설정 조정

전력을 아끼려고 HDD 스핀다운(플래터 정지)을 켜두는 경우가 많지만, 5V 레일이 부족한 환경에서는 스핀다운이 오히려 독이 됩니다. 2.5인치 HDD는 회전 유지 시 개당 약 0.7W만 쓰지만, 멈췄다가 다시 돌 때(스핀업)는 개당 5W(5V 1A) 가까운 피크 전류를 한꺼번에 당기기 때문입니다.

따라서 smartctl을 이용해 스핀다운 타이머를 비활성화(0)하고, APM(고급 전원 관리) 지원 모델은 헤드 파킹과 성능의 균형점인 192 레벨로 조정했습니다.

Bash

# 스핀다운 타이머 비활성화 (동시 스핀업 피크 전류 방지)
sudo smartctl -s standby,0 /dev/sdX

# APM 레벨 설정 (지원 모델에 한해 192 적용)
sudo smartctl -s apm,192 /dev/sdX

(참고: 감시카메라/DVR용 모델인 TOSHIBA MQ01ABD100V처럼 펌웨어 차원에서 APM을 차단해 scsi error aborted command가 반환되는 드라이브는 기본 상태로 두어도 무방합니다.)

③ 5V 전원선 물리적 분산 배선

하나의 SATA 전원 라인에 Y자 분배기를 여러 개 꽂아 문어발식으로 연결하면 전선 저항만으로도 끝단 전압이 떨어집니다. DC-to-DC 보드에서 나오는 전원 커넥터 갈래를 나누어 메인보드 포트 디스크와 PCIe 확장 카드 디스크의 전원 라인을 물리적으로 분리했습니다.

4. 검증 및 마무리

위 조치를 모두 적용한 뒤, 모든 디스크에 동시에 최대 읽기 부하를 주는 sudo zpool scrub tank0 명령을 실행하여 스트레스 테스트를 진행했습니다. 그 결과 스크럽이 완료될 때까지 커널 로그에 단 한 건의 SATA link down이나 컨트롤러 리셋 없이 안정적으로 버티는 것을 확인했습니다.

이번 트러블슈팅의 교훈:

  • ZFS에서 여러 디스크가 동시에 UNAVAIL이 되면 디스크 교체 복구 이후 반드시 전원 레일이나 컨트롤러 병목을 점검해야 재발을 막을 수 있습니다.
  • 미니 PC나 자작 NAS에서 2.5인치 HDD와 SSD를 다수 구성할 때는 총 어댑터 용량(W)뿐만 아니라 DC-to-DC 보드의 +5.00V 최대 출력 전류(A)가 충분한지 반드시 확인해야 합니다.