ddrescue를 이용한 고장난 RAID 어레이 데이터 복구 실전 가이드
출처: Dev.to
RAID 어레이가 고장났을 때 가장 나쁜 행동은 당황해서 바로 손대는 것입니다. 인내심 없는 재구축 시도가 유일하게 남은 좋은 복사본을 덮어쓰는 경우를 너무 많이 보았습니다. 이 안내서는 ddrescue 를 최고의 친구로 삼아, 손상되었거나 고장난 RAID에 안전하게 접근하는 방법을 단계별로 설명합니다.
mdadm —assemble 을 실행하기 전, 어떤 작업을 시작하기 전에도 물리 디스크를 복제하십시오. 하나의 디스크가 고장난 RAID 5는 재구축 중 두 번째 디스크가 읽기 오류를 일으키는 순간 모든 데이터를 잃을 수 있습니다. 이는 가상의 시나리오가 아니라 대부분의 전체 RAID 손실이 발생하는 방식입니다.
황금률: 먼저 이미지를 만들고, 그 다음에 복구한다.
현재 RAID 상태 확인
cat /proc/mdstat
자세히 보기
mdadm --detail /dev/md0
다음과 같은 표시를 찾으세요:
[UUU_]— 하드디스크 하나가 실패(밑줄은 누락된 디스크)[UU__]— 두 개가 실패(RAID 5에서는 치명적)- 상태:
degraded,recovering, 혹은failed
주의: 아직 mdadm --manage /dev/md0 --add /dev/sdX 를 실행하지 마세요. 대신 어레이를 중지합니다:
mdadm --stop /dev/md0
왜 ddrescue인가?
ddrescue는 읽기 오류를 부드럽게 처리합니다. 불량 섹터를 매핑하고 재시도하며, 중단된 세션을 이어서 진행할 수 있습니다. 고장난 디스크에 dd 를 절대 사용하지 마세요.
설치
# Debian/Ubuntu
sudo apt install gddrescue
# RHEL/CentOS
sudo dnf install ddrescue
각 RAID 멤버를 별도 이미지 파일로 복제
(전체 디스크 용량만큼 충분한 저장소가 필요합니다.)
# 첫 번째 패스: 읽을 수 있는 모든 데이터를 복사하고, 불량 섹터는 빠르게 건너뜀
sudo ddrescue -d -r0 /dev/sda /mnt/backup/sda.img /mnt/backup/sda.log
# 두 번째 패스: 불량 섹터를 최대 3번 재시도
sudo ddrescue -d -r3 /dev/sda /mnt/backup/sda.img /mnt/backup/sda.log
핵심 옵션
-d— 디스크에 직접 접근(커널 캐시 우회)-r0/-r3— 불량 섹터 재시도 횟수 지정.log파일은 매우 중요합니다. 복제 도중 중단되면 이 로그를 이용해 이어서 진행할 수 있습니다.
위 과정을 sdb, sdc 등 어레이에 포함된 모든 디스크에 반복합니다.
이미지 파일로 소프트웨어 RAID 재조립 (루프 디바이스 사용)
원본 물리 디스크가 아니라 이미지 파일만 사용합니다.
# 루프 디바이스 설정
sudo losetup /dev/loop0 /mnt/backup/sda.img
sudo losetup /dev/loop1 /mnt/backup/sdb.img
sudo losetup /dev/loop2 /mnt/backup/sdc.img
# 읽기 전용으로 어레이 조립 (가능하면 읽기 전용이 가장 안전)
sudo mdadm --assemble --readonly /dev/md0 /dev/loop0 /dev/loop1 /dev/loop2
만약 superblock 불일치 등으로 조립이 안 될 경우 --force 옵션을 시도합니다:
sudo mdadm --assemble --force /dev/md0 /dev/loop0 /dev/loop1 /dev/loop2
마운트 (읽기 전용)
sudo mount -o ro /dev/md0 /mnt/raid_recovery
내용 확인
ls -la /mnt/raid_recovery/
df -h /mnt/raid_recovery/
파일시스템이 마운트되지 않을 때
- ext4: 마운트 전에 루프‑조립된 md 디바이스에
fsck실행sudo fsck.ext4 -n /dev/md0 # -n : 실제 쓰기 없이 건조 실행 - XFS: 건조 실행은
xfs_repair -n /dev/md0
흔히 마주치는 함정
- Dirty bit / write‑intent bitmap 불일치
mdadm이 전체 재동기화를 시도할 수 있습니다. 루프 이미지에서는 안전하지만, 진행 상황을 주시하세요. - 섹터 크기 혼합
sudo blockdev --getpbsz /dev/sda - 두 개가 고장난 RAID 6
- 청크 크기 불일치
--force사용 시 원본과 동일한--chunk=512(예시) 옵션을 지정해야 할 수도 있습니다. 기존mdadm.conf혹은 디스크 이미지의 메타데이터(strings)를 확인하세요.
복구된 파일 무결성 확인
find /mnt/raid_recovery -name "*.db" -exec md5sum {} + > /tmp/recovered_hashes.txt
시스템 로그로 RAID 오류 탐색
sudo dmesg | grep -i "raid\|md0\|error" | tail -30
주의: 중요한 데이터를 별도의 정상 디스크로 복사하기 전까지는 절대로 언마운트하지 마세요.
심각한 경우
두 개 이상이 고장났고 불량 섹터가 심각한 경우, 소프트웨어 재조립만으로는 부족할 수 있습니다. 스트라이프 레이아웃·청크 경계 등을 수동으로 재구성해야 하는데, 이는 전문 도구 없이는 매우 시간도 많이 걸리고 오류 위험도 큽니다. 이때는 RAID 고장 모드와 전문 복구 옵션에 대한 자세한 자료를 먼저 살펴본 뒤, 상황에 따라 전문가에게 의뢰하는 것이 좋습니다.
핵심 요점: 어떤 작업을 시작하기 전에 반드시 전체 디스크를 이미지로 만들 것. ddrescue + 루프 디바이스 조합은 유일한 복사본을 위험에 빠뜨리지 않고 안전하게 실험할 수 있는 샌드박스를 제공합니다.
행운을 빕니다 — 그리고 패리티 디스크가 절대 고장 나지 않기를 바랍니다.