테스트: 고장 하드 시뮬레이션
이 예제에서는 /dev/sdb가 고장난 것으로 가정합니다. (/dev/sda가 고장난 경우 명령에서 sda↔sdb를 교환해서 적용하세요.)
중요: 어느 디스크를 제거할지 확실히 파악한 후 진행하세요. 실수로 살아 있는 디스크를 제거하면 데이터 손실이 발생할 수 있습니다.
하드웨어 방식으로는 시스템을 종료한 뒤 물리적으로 드라이브를 분리하면 됩니다. 소프트 방식으로는 mdadm으로 해당 파티션을 실패 상태로 표시하고 제거합니다:
mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --manage /dev/md1 --fail /dev/sdb2
mdadm --manage /dev/md2 --fail /dev/sdb3
mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm --manage /dev/md1 --remove /dev/sdb2
mdadm --manage /dev/md2 --remove /dev/sdb3
시스템을 종료합니다:
shutdown -h now
그런 다음 새 물리 디스크를 넣고 부팅합니다. (만약 /dev/sda를 교체했다면, 새 하드는 /dev/sda 위치에 넣고 이전 /dev/sdb는 /dev/sdb로 연결해야 합니다.)
부팅 후 다음을 실행하여 배열이 degraded(저하) 상태인지 확인합니다:
cat /proc/mdstat
예시 출력:
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid1 sda1[0]
104320 blocks [2/1] [U_]
md1 : active raid1 sda2[0]
513984 blocks [2/1] [U_]
md2 : active raid1 sda3[0]
4618560 blocks [2/1] [U_]
unused devices:
[root@server1 ~]#
또한 fdisk -l 출력에서 새 디스크(/dev/sdb)에 파티션 테이블이 없는 것을 확인할 수 있습니다:
[root@server1 ~]# fdisk -l
Disk /dev/sda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x0007b217
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 fd Linux raid autodetect
/dev/sda2 14 77 514080 fd Linux raid autodetect
/dev/sda3 78 652 4618687+ fd Linux raid autodetect
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/md2: 4729 MB, 4729405440 bytes
2 heads, 4 sectors/track, 1154640 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md2 doesn't contain a valid partition table
Disk /dev/md1: 526 MB, 526319616 bytes
2 heads, 4 sectors/track, 128496 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
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 identifier: 0x00000000
Disk /dev/md0 doesn't contain a valid partition table
[root@server1 ~]#
파티션 테이블 복사
원본 디스크(/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: 652 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 1237004 1028160 fd Linux raid autodetect
/dev/sdb3 1237005 10474379 9237375 fd Linux raid autodetect
/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 ~]#
노트: sfdisk가 섹터 0 서명을 언급하면 –force로 진행하거나 필요하면 dd로 첫 512바이트를 초기화한 뒤 재시도하십시오.
기존 RAID 잔여물 제거 및 디스크 추가
이전 RAID 슈퍼블록 잔여물을 제거합니다:
mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
mdadm --zero-superblock /dev/sdb3
새 디스크 파티션을 RAID에 추가합니다:
mdadm -a /dev/md0 /dev/sdb1
mdadm -a /dev/md1 /dev/sdb2
mdadm -a /dev/md2 /dev/sdb3
다시 /proc/mdstat을 확인합니다:
cat /proc/mdstat
복구가 진행 중인 예시:
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
104320 blocks [2/2] [UU]
md1 : active raid1 sdb2[1] sda2[0]
513984 blocks [2/2] [UU]
md2 : active raid1 sdb3[2] sda3[0]
4618560 blocks [2/1] [U_]
[===>.................] recovery = 15.4% (715584/4618560) finish=4.9min speed=13222K/sec
unused devices:
[root@server1 ~]#
동기화가 완료될 때까지 기다립니다. 완료되면 모든 mdX 행에 [UU] 상태가 표시됩니다:
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
104320 blocks [2/2] [UU]
md1 : active raid1 sdb2[1] sda2[0]
513984 blocks [2/2] [UU]
md2 : active raid1 sdb3[1] sda3[0]
4618560 blocks [2/2] [UU]
unused devices:
[root@server1 ~]#
부트로더 설치
루트 권한의 grub 콘솔을 열고 두 HDD에 부트로더를 설치합니다:
grub
grub 상호작용 예시:
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
이로써 RAID1에서 실패한 하드를 교체하고 복구하는 절차가 완료됩니다.
점검 항목 (체크리스트)
- 고장 디스크 식별 및 표기
- mdadm으로 해당 파티션을 fail/remove 처리했는가
- 새 디스크를 올바르게 장착/인식했는가
- sfdisk로 파티션이 정확히 복사되었는가
- mdadm –zero-superblock로 잔여 슈퍼블록을 제거했는가
- mdadm -a로 디스크를 추가하고 /proc/mdstat에서 동기화가 완료되었는가
- GRUB을 두 디스크에 설치했는가
역할별 간단 체크:
- 시니어/운영자: 전체 절차 승인, 부팅 디스크 순서 확인
- 주니어/인턴: 명령 실행 및 /proc/mdstat 모니터링, 로그 캡처
일반적인 문제와 해결책
- sfdisk: “sector 0 does not have an msdos signature” — –force 사용하거나 dd로 첫 512바이트를 정리한 뒤 재시도.
- 디스크 이름이 바뀜(/dev/sda <-> /dev/sdb): udev 규칙이나 시스템 BIOS/케이블 포트 확인. 실수 방지를 위해 직렬 번호로 확인하세요: ls -l /dev/disk/by-id
- mdadm이 디스크를 인식하지 못함: 파티션 유형(Id)이 fd(Linux raid autodetect)로 맞는지 확인.
수용 기준
- /proc/mdstat의 각 mdX가 [UU] 상태
- fdisk -l에서 각 /dev/sdX 파티션이 원본과 동일한 레이아웃을 가짐
- 시스템이 두 디스크 중 어느 하나로도 정상 부팅 가능
명령 요약
- 실패 표시: mdadm –manage … –fail
- 제거: mdadm –manage … –remove
- 파티션 복사: sfdisk -d /dev/sda | sfdisk /dev/sdb
- 슈퍼블록 초기화: mdadm –zero-superblock /dev/sdbX
- 디스크 추가: mdadm -a /dev/mdX /dev/sdbX
- 상태 확인: cat /proc/mdstat, fdisk -l
- GRUB 설치: grub → root/setup 순으로 각 디스크에 설치
추가 참고 링크
- The Software-RAID Howto: http://tldp.org/HOWTO/Software-RAID-HOWTO.html
- Fedora: http://fedoraproject.org
요약: 단계별로 차근차근 진행하면 RAID1 환경에서 단일 디스크 실패를 안전하게 시뮬레이션하고 복구할 수 있습니다. 문제가 발생하면 로그와 /proc/mdstat, fdisk 출력을 기준으로 원인을 좁히세요.