개요
이 문서는 소프트웨어 RAID1(미러) 환경에서 하드 드라이브 장애를 시뮬레이션하고, 장애 디스크를 교체한 뒤 어레이를 복구하는 단계별 절차와 검증 방법을 설명합니다. 예시에서는 /dev/sdb가 실패한 것으로 가정하지만, /dev/sda가 실패한 경우에도 같은 절차를 적용하면 됩니다.
중요 용어 한 줄 요약:
- RAID1: 두 개 이상의 디스크에 동일한 데이터를 유지하는 미러링 방식.
- mdadm: 리눅스 소프트웨어 RAID를 관리하는 도구.
절차 개요
- 장애 디스크를 실패로 표시하고 제거(또는 물리적 제거).
- 시스템 재부팅 후 상태 확인(/proc/mdstat).
- 새 디스크에 기존 디스크의 파티션 테이블 복사(sfdisk).
- 이전 RAID 정보 제거(mdadm –zero-superblock).
- 새 파티션을 어레이에 추가(mdadm -a).
- 동기화 완료 대기 및 확인.
- 양쪽 디스크에 부트로더 설치(grub).
1. 장애 시뮬레이션
어떤 디스크(/dev/sda 또는 /dev/sdb)를 실패로 표시해도 절차는 동일합니다. 예시에서는 /dev/sdb가 실패한 것으로 가정합니다.
소프트로 디스크를 실패로 표시하고 제거하려면:
mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --manage /dev/md1 --fail /dev/sdb2
mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm --manage /dev/md1 --remove /dev/sdb2
또는 물리적으로 시스템을 종료하고 디스크를 제거할 수 있습니다. 시스템 종료 명령 예:
shutdown -h now
그 후 새 디스크를 장착하고 부팅합니다. (만약 /dev/sda를 실패로 시뮬레이션했다면 새 HDD를 /dev/sda 위치에 넣고 이전 /dev/sdb를 /dev/sda로 옮기지 마세요: 장치 이름은 커널에 의해 할당됩니다. 하드웨어/BIOS 연결 순서에 유의하세요.)
2. 상태 확인: /proc/mdstat
부팅한 뒤 어레이 상태를 확인합니다:
cat /proc/mdstat
예시 출력:
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[0]
104320 blocks [2/1] [U_]
md1 : active raid1 sda2[0]
10377920 blocks [2/1] [U_]
unused devices:
[root@server1 ~]#
출력 해석: [U_] 는 하나의 디스크만 활성화되어 어레이가 degraded 상태임을 의미합니다.
3. 디스크 파티션 테이블 확인
fdisk로 디스크와 파티션 정보를 확인합니다:
fdisk -l
예시 출력(원본 유지):
[root@server1 ~]# fdisk -l
Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 fd Linux raid autodetect
/dev/sda2 14 1305 10377990 fd Linux raid autodetect
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/md1: 10.6 GB, 10626990080 bytes
2 heads, 4 sectors/track, 2594480 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md1 doesn't contain a valid partition table
Disk /dev/md0: 106 MB, 106823680 bytes
2 heads, 4 sectors/track, 26080 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md0 doesn't contain a valid partition table
[root@server1 ~]#
여기서 /dev/sdb는 파티션 테이블이 없으므로 /dev/sda의 파티션 테이블을 복사해야 합니다.
4. 파티션 테이블 복사 (sfdisk)
기존 정상 디스크(/dev/sda)의 파티션 테이블을 새 디스크(/dev/sdb)에 복사합니다:
sfdisk -d /dev/sda | sfdisk /dev/sdb
오류가 발생하면 –force 옵션을 시도할 수 있습니다:
sfdisk -d /dev/sda | sfdisk --force /dev/sdb
예시 출력(원본 유지):
[root@server1 ~]# sfdisk -d /dev/sda | sfdisk /dev/sdb
Checking that no-one is using this disk right now ...
OK
Disk /dev/sdb: 1305 cylinders, 255 heads, 63 sectors/track
sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/sdb: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0
Device Boot Start End #sectors Id System
/dev/sdb1 * 63 208844 208782 fd Linux raid autodetect
/dev/sdb2 208845 20964824 20755980 fd Linux raid autodetect
/dev/sdb3 0 - 0 0 Empty
/dev/sdb4 0 - 0 0 Empty
Successfully wrote the new partition table
Re-reading the partition table ...
If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
[root@server1 ~]#
주의: 일부 시스템에서는 sector 0 시그니처 관련 경고가 출력될 수 있으나 파티션 테이블 복사는 성공할 수 있습니다. 필요하면 –force 사용을 검토하세요.
5. 이전 RAID 잔재 제거 및 어레이에 추가
이전 RAID superblock 정보가 남아 있을 수 있으므로 이를 제거합니다:
mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
그런 다음 새 파티션을 어레이에 추가합니다:
mdadm -a /dev/md0 /dev/sdb1
mdadm -a /dev/md1 /dev/sdb2
추가 후 상태 확인:
cat /proc/mdstat
예시 출력(부분 유지):
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
104320 blocks [2/2] [UU]
md1 : active raid1 sdb2[2] sda2[0]
10377920 blocks [2/1] [U_]
[======>..............] recovery = 32.3% (3360768/10377920) finish=1.5min speed=74238K/sec
unused devices:
[root@server1 ~]#
여기서는 md0이 이미 OK([UU])인 반면 md1이 복구 중임을 볼 수 있습니다.
6. 동기화 완료 대기 및 확인
동기화(리빌드)가 완료될 때까지 기다립니다. 완료되면 모든 어레이가 [UU] 상태가 되어야 합니다:
cat /proc/mdstat
완료 예시:
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
104320 blocks [2/2] [UU]
md1 : active raid1 sdb2[1] sda2[0]
10377920 blocks [2/2] [UU]
unused devices:
[root@server1 ~]#
검증 포인트: 모든 미러 디바이스가 [UU]인지 확인하세요. 하나라도 언더 스코어(_)가 남아 있으면 동기화가 완료되지 않은 상태입니다.
7. 부트로더 설치
루트 권한에서 grub을 실행하고 양 디스크에 부트로더를 설치합니다. 예시 대화형 순서:
grub
grub 프롬프트에서:
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
이로써 두 디스크 모두에서 부팅 가능하도록 부트로더가 설치됩니다.
검증 및 완료
- 시스템을 재부팅하여 정상적으로 부팅되는지 확인합니다.
- /proc/mdstat가 모든 어레이에서 [UU] 상태를 보이면 복구가 성공한 것입니다.
중요: 실제 운영 환경에서는 물리적 SSD/HDD의 모델과 펌웨어, 파티션 정렬(예: GPT/MBR), BIOS/UEFI 설정, 부트 모드(legacy/UEFI)를 반드시 확인하세요. 이 요소들이 맞지 않으면 grub 설치 또는 디스크 인식에서 문제가 발생할 수 있습니다.
문제 해결 요령
- 파티션 복사 중 “sector 0 does not have an msdos signature” 경고가 나오면 –force로 재시도하거나 dd로 섹터 클리어 후 다시 시도합니다.
- 다른 디스크 크기 차이: 대상 디스크가 원본보다 작으면 파티션 복사가 실패합니다. 이 경우 대상 디스크 용량을 확인하고 크기가 충분한지 확인하세요.
- 동기화 속도가 느리면 I/O 부하, 컨트롤러 성능, 스케줄러/IO 스케줄러 영향이 있을 수 있습니다. 업무 시간 외에 작업을 수행하거나 복구 속도를 조절하세요.
역할 기반 체크리스트
운영자(현장):
- 장애 디스크 식별 및 물리 식별 태그 확인
- 디스크 핫스왑(가능 시) 또는 전원 차단 및 교체
- 새 디스크 연결 확인
시스템 관리자:
- mdadm로 fail/remove 처리
- 파티션 테이블 복사 및 superblock 제거
- 어레이에 추가 후 동기화 모니터링
- grub 재설치 및 부팅 검증
체크리스트(한눈에 보기)
- 장애 디스크를 mdadm으로 fail 표시함
- 장애 디스크를 mdadm에서 remove 함
- 시스템 재부팅 후 /proc/mdstat 확인
- sfdisk로 파티션 테이블 복사 성공
- mdadm –zero-superblock로 잔재 제거
- mdadm -a로 파티션 추가
- /proc/mdstat에서 동기화 완료([UU]) 확인
- grub을 양 디스크에 설치
- 최종 재부팅 및 정상 서비스 확인
수명주기 및 대안
- 대안: RAID1 대신 RAID10을 사용하면 읽기 성능과 일부 장애 허용성에서 장점이 있습니다(설계 고려 필요).
- 확장성: RAID1은 가용성과 단순성에서 장점이 있지만 저장 용량 효율은 낮습니다(복제본이 필요한 만큼 용량 소모).
간단한 의사결정 흐름 (Mermaid)
flowchart TD
A[디스크 장애 감지] --> B{디스크가 물리적으로 손상되었나?}
B -- 예 --> C[운영자: 물리 교체]
B -- 아니요 --> D[소프트웨어로 fail/replace]
C --> E[시스템 부팅 및 상태 확인]
D --> E
E --> F{파티션 테이블 있나?}
F -- 예 --> G[mdadm --zero-superblock 후 mdadm -a]
F -- 아니요 --> H[sfdisk로 파티션 복사 후 mdadm -a]
G --> I[동기화 확인]
H --> I
I --> J{[UU] 상태?}
J -- 예 --> K[grub 설치 및 재부팅]
J -- 아니요 --> L[문제해결: 로그 확인 및 재시도]
수용 기준
- 모든 md 디바이스가 /proc/mdstat에서 [UU]를 표시해야 함.
- 시스템이 두 디스크 중 어느 하나가 없어도 부팅 및 서비스가 정상 동작해야 함.
- 부트로더가 양쪽 디스크에 설치되어 있어야 함.
테스트 케이스(검증 항목)
- 시나리오 1: /dev/sdb를 실패로 표시하고 제거한 후 새 디스크로 교체하여 동기화 완료 확인.
- 시나리오 2: 파티션 복사 실패 시 –force 옵션 사용 후 재시도 및 동작 확인.
- 시나리오 3: grub가 한 쪽 디스크에만 설치된 상태에서 해당 디스크를 제거했을 때 부팅 실패 재현 및 복구.
요약
이 가이드는 RAID1 어레이에서 하드 드라이브를 교체하고 복구하는 전체 절차를 설명합니다. 핵심은 파티션 테이블을 정확하게 복사하고 기존의 RAID 메타데이터를 제거한 뒤 어레이에 새 파티션을 추가하여 동기화가 완료될 때까지 기다리는 것입니다. 마지막으로 부트로더를 두 디스크 모두에 설치해 부팅 내구성을 확보해야 합니다.
중요: 프로덕션 환경에서는 작업 전에 백업을 확인하고 유지보수 창을 확보하세요.
참고 링크
- The Software-RAID Howto: http://tldp.org/HOWTO/Software-RAID-HOWTO.html
- CentOS: http://www.centos.org/