반응형

🚨 문제 상황: NAS 데이터 이전 중 발생한 배드섹터와 rsync 멈춤 현상

노후화된 NAS 장비를 새 장비로 교체하거나 데이터를 마이그레이션 할 때 가장 많이 사용하는 도구가 바로 rsync입니다. 하지만 소스(원본) NAS의 하드디스크에 배드섹터(Bad Sector)나 파일 시스템 손상이 있는 경우, rsync가 특정 파일에서 진행되지 않고 무한 대기(Hang) 상태에 빠지거나 에러를 뿜으며 연결이 끊어지는 답답한 상황이 발생합니다.

이때 급한 마음에 디스크를 통째로 복제하는 dd 명령어를 떠올리기 쉽지만, 이는 매우 위험한 선택입니다. 오늘은 배드섹터가 존재하는 악조건 속에서 데이터를 가장 안전하게 마이그레이션하는 두 가지 실무 전략을 정리해 보겠습니다.


❌ 왜 일반적인 dd 명령어 사용을 비추천할까?

서비스를 중지(Offline)한 상태라 하더라도, 배드섹터가 있는 디스크에 일반 dd 명령어를 사용하는 것은 강력히 비권장합니다. 그 이유는 다음과 같습니다.

  1. 동일한 I/O 에러 발생: dd 역시 배드섹터 구간을 만나면 읽기 오류로 명령어가 중단되거나 시스템 전체가 먹통이 됩니다.
  2. 파티션 및 RAID 정보 충돌: NAS는 제조사마다 OS 영역, 스왑, 데이터 영역의 파티션 구조가 다릅니다. dd로 디스크를 통째로 밀어버리면 타겟 NAS의 OS나 RAID 정보까지 덮어써져 부팅 불능 상태가 될 수 있습니다.
  3. 비효율적인 전송 시간: 파일의 유무와 상관없이 빈 공간까지 모두 복사하므로 시간이 기하급수적으로 늘어납니다.

따라서 데이터의 성격(일반 파일 vs 통짜 볼륨)에 따라 아래의 해결책 1 또는 해결책 2를 선택해야 합니다.


🛠️ 해결책 1. 파일 레벨 마이그레이션: rsync 무한 루프 스크립트 적용 (추천)

일반적인 문서, 이미지, 동영상 파일(SMB/NFS 공유)을 넘기는 상황이라면 rsync에 타임아웃(Timeout)과 무한 재시도 로직을 장착하는 것이 가장 확실합니다.

배드섹터가 있는 파일에서 잠시 멈췄다가 강제로 끊어내고, 다음 정상 파일부터 이어받기를 수행하는 강력한 쉘 스크립트입니다.

📌 rsync 자동 재시도 쉘 스크립트 (migration.sh)

Bash
 
#!/bin/bash

echo "🚀 배드섹터 대응 NAS 마이그레이션을 시작합니다..."

# rsync가 완전히 성공(종료 코드 0)할 때까지 무한 반복하는 루프
while [ 1 ]
do
    # 핵심 옵션: --timeout=60 (60초 응답 없으면 강제 종료 후 루프 재시작)
    # --inplace 및 --partial 옵션으로 끊긴 부분부터 이어받기 수행
    rsync -avh \
          --update \
          --ignore-errors \
          --partial \
          --inplace \
          --timeout=60 \
          --log-file=/var/log/nas_mig.log \
          /source_dir/ \
          /target_dir/
    
    # rsync 종료 코드 확인
    if [ "$?" = "0" ] ; then
        echo "✅ 마이그레이션이 성공적으로 완료되었습니다."
        break # 루프 탈출
    else
        echo "⚠️ 배드섹터/네트워크 오류(타임아웃) 발생! 10초 대기 후 이어받습니다..."
        sleep 10
    fi
done

💡 실무 꿀팁: 백그라운드로 스크립트를 실행한 뒤, /var/log/nas_mig.log 파일에서 rsync error나 Input/output error 키워드만 추출(grep)해보세요. 어떤 파일이 배드섹터 때문에 복사를 실패했는지 정확히 리스트업 할 수 있습니다.


🛠️ 해결책 2. 블록 레벨 마이그레이션: ddrescue를 활용한 디스크 복제

만약 NAS를 가상머신(VM) 저장소나 데이터베이스용 iSCSI LUN으로 사용 중이라면, 파일 단위 복사가 불가능하므로 디스크(블록) 단위로 복원해야 합니다. 이때는 dd가 아닌 **데이터 복구 전용 도구인 ddrescue**를 사용해야 합니다.

ddrescue는 배드섹터를 만나면 즉시 건너뛰고 정상 데이터부터 빠르게 복사한 뒤, 나중에 건너뛴 배드섹터 영역만 다시 찾아가 정밀 타격(Scraping)을 시도하는 지능형 복구 툴입니다.

📌 ddrescue 2단계 복구 시나리오

주의사항: 절대 원본 고장 디스크를 마운트(Mount)하지 마시고, 타겟 디스크의 용량이 원본보다 같거나 커야 합니다. (원본: /dev/sda, 대상: /dev/sdb 가정)

1단계: 정상 데이터부터 대피시키기 (Fast Pass) 배드섹터를 긁어내려 애쓰지 않고(-n), 정상적인 블록들만 최대한 빠르게 대상 디스크로 넘깁니다.

Bash
 
# -f: 물리 디스크 강제 덮어쓰기 허용 / -n: 배드섹터 스크래핑 건너뛰기
# /root/rescue.map 파일은 작업 지도로 반드시 필요함!
ddrescue -f -n /dev/sda /dev/sdb /root/rescue.map

2단계: 건너뛴 배드섹터 정밀 복구 (Scraping & Retry) 1단계가 끝나면 동일한 맵 파일(rescue.map)을 사용하여, 앞서 실패했던 구간만 Direct I/O(-d) 모드로 최대 3번(-r3) 재시도합니다.

Bash
 
ddrescue -d -f -r3 /dev/sda /dev/sdb /root/rescue.map

📝 마무리 요약

  • NAS 간 마이그레이션 시 배드섹터가 의심된다면 절대 일반 dd를 사용하지 마세요.
  • 파일/폴더 기반 동기화는 rsync 타임아웃 옵션 + 무한 루프 스크립트가 정답입니다.
  • 디스크 통짜 복제가 불가피한 환경이라면 ddrescue를 이용해 Multi-pass 복구를 진행하세요.

데이터 마이그레이션은 엔지니어에게 가장 피 말리는 작업 중 하나입니다. 위 가이드가 무사히 데이터를 넘기는 데 도움이 되길 바랍니다.

반응형

+ Recent posts