목적
이 가이드는 RAID1 구성에서 한 쪽 디스크가 실패했을 때 이를 시뮬레이션하고, 새 드라이브로 교체하여 배열을 복구하는 절차를 단계별로 설명합니다. 용어: RAID1 — 동일한 데이터를 두 디스크에 미러링하는 소프트웨어 RAID 구성.
사전 확인(핵심 사항)
- 현재 어떤 장치가 실패했는지(/dev/sda 또는 /dev/sdb)를 명확히 하세요.
- 중요한 데이터가 있다면 절차 시작 전에 백업을 권장합니다.
- 루트 권한으로 실행해야 합니다.
1) 실패 디스크 시뮬레이션
어떤 디스크(/dev/sda 또는 /dev/sdb)가 실패했는지는 상관없습니다. 예제에서는 /dev/sdb가 실패했다고 가정합니다.
물리적으로 시스템 전원을 끄고 디스크를 분리하거나, 소프트 페일(soft-fail)로 제거할 수 있습니다:
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/sdb로 연결하는 등 장치 네임을 주의하세요.)
부팅 후 배열 상태를 확인합니다:
cat /proc/mdstat
다음과 같이 degraded(저하) 상태가 보일 수 있습니다:
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid1 sda1[0]
200704 blocks [2/1] [U_]
md1 : active raid1 sda2[0]
5036288 blocks [2/1] [U_]
unused devices:
[root@server1 ~]#
fdisk로 디스크 정보를 확인합니다:
fdisk -l
예시 출력(그대로 참조):
[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: 0x0008b885
Device Boot Start End Blocks Id System
/dev/sda1 * 1 25 200781 fd Linux raid autodetect
/dev/sda2 26 652 5036377+ 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/md1: 5157 MB, 5157158912 bytes
2 heads, 4 sectors/track, 1259072 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md1 doesn't contain a valid partition table
Disk /dev/dm-0: 4462 MB, 4462739456 bytes
255 heads, 63 sectors/track, 542 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000
Disk /dev/dm-0 doesn't contain a valid partition table
Disk /dev/dm-1: 637 MB, 637534208 bytes
255 heads, 63 sectors/track, 77 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x30307800
Disk /dev/dm-1 doesn't contain a valid partition table
Disk / dev/md0: 205 MB, 205520896 bytes
2 heads, 4 sectors/track, 50176 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md0 doesn't contain a valid partition table
[root@server1 ~]#
2) 파티션 테이블 복사
정상인 /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 401624 401562 fd Linux raid autodetect
/dev/sdb2 401625 10474379 10072755 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 ~]#
3) 기존 RAID 흔적 제거 및 디스크 추가
이전 RAID 슈퍼블록 정보를 지웁니다:
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] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
200704 blocks [2/2] [UU]
md1 : active raid1 sdb2[2] sda2[0]
5036288 blocks [2/1] [U_]
[=====>...............] recovery = 29.8% (1502656/5036288) finish=18.8min speed=3116K/sec
unused devices:
[root@server1 ~]#
동기화가 완료될 때까지 기다립니다(진행 표시가 100%가 됨):
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
200704 blocks [2/2] [UU]
md1 : active raid1 sdb2[1] sda2[0]
5036288 blocks [2/2] [UU]
unused devices:
[root@server1 ~]#
4) 부트로더 설치
배열이 정상 상태가 되면 grub을 실행하여 부트로더를 양쪽 HDD에 설치합니다:
grub
grub 프롬프트에서 다음을 순서대로 실행합니다:
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
이로써 RAID1에서 실패한 하드 드라이브를 성공적으로 교체하고 재동기화하여 시스템을 정상 상태로 복구했습니다.
중요(Notes)
- 파티션 테이블을 덮어쓸 때는 대상 장치를 정확히 확인하세요. 잘못하면 데이터 손실이 발생합니다.
- RAID 재동기화 중 디스크 I/O가 높아질 수 있으니 서비스 영향도를 고려해 수행하세요.
- 부트로더 설치 시 디스크 순서(hd0/hd1)가 시스템에 따라 바뀔 수 있으니 확인이 필요합니다.
운영자 체크리스트 (간단 SOP)
- 실패 디스크 식별(/dev/sd*)
- 소프트 페일/제거 또는 물리적 분리
- 새 디스크 장착 및 부팅
- sfdisk로 파티션 복사
- mdadm –zero-superblock로 잔여 정보 제거
- mdadm -a로 배열에 추가
- /proc/mdstat으로 동기화 상태 확인(완료될 때까지 대기)
- grub으로 부트로더 양쪽 디스크에 설치
- 시스템 재부팅 및 부팅 확인
문제 해결: 흔한 상황과 대처법
- sfdisk에서 msdos 시그니처 오류: –force로 다시 시도하거나 parted로 수동 파티션 생성.
- 재동기화 속도가 너무 느림: 다른 큰 IO 작업을 중지하거나 RAID 재구성 속도 제한 설정(mdadm –detail –scan 및 sysfs tunables 참조).
- 부트 실패: grub 설치 시 디스크 식별이 잘못되었을 가능성 있음. rescue 모드에서 올바른 디스크에 설치하세요.
간단 의사 결정 흐름
flowchart TD
A[디스크 실패 감지] --> B{물리적 분리?}
B -- 예 --> C[새 디스크 장착 후 부팅]
B -- 아니오 --> D[mdadm --fail, --remove 실행]
C --> E[sfdisk로 파티션 복사]
D --> E
E --> F[mdadm --zero-superblock]
F --> G[mdadm -a로 배열에 추가]
G --> H[/proc/mdstat으로 동기화 확인]
H --> I[grub로 양쪽 HDD에 부트로더 설치]
I --> J[완료]
요약
- 고장난 디스크를 소프트로 제거하고 새 디스크로 파티션을 복사한 뒤 mdadm으로 배열에 재추가합니다.
- 재동기화가 완료되면 grub을 양쪽 디스크에 설치해 부팅 안전성을 확보합니다.
참고 링크
- The Software-RAID Howto: http://tldp.org/HOWTO/Software-RAID-HOWTO.html
- Fedora: http://fedoraproject.org