개요
이 가이드는 물리 디스크 /dev/sdb를 이용해 기존 시스템 디스크(/dev/sda)를 RAID 1로 보호하는 과정을 설명합니다. /dev/md0은 비-LVM 부트 파티션용 RAID 1, /dev/md1은 LVM용 RAID 1로 구성합니다. 초기에는 /dev/sda의 파티션을 제거할 수 없으므로 ‘missing’ 플레이스홀더를 사용해 degraded 상태로 RAID를 생성한 뒤, 데이터 이동과 동기화 과정을 통해 완전한 RAID 상태로 전환합니다.
중요 용어 한 줄 정의:
- RAID: 여러 디스크를 묶어 가용성/성능을 높이는 기술.
- LVM: 논리 볼륨 관리자로서 볼륨 크기 확장/축소를 쉽게 해줍니다.
전제 조건
- 루트(root) 권한으로 작업합니다.
- mdadm, lvm2, mkinitrd/mkinitrd-tools가 설치되어 있어야 합니다.
- 중요한 데이터는 작업 전에 백업해 두세요.
Important: 라이브 시스템에서 디스크/파티션 작업은 부팅 실패 위험이 있으므로, 콘솔 접근(또는 물리 접근)이 가능한 환경에서 진행하세요.
단계 1: RAID 배열 생성
다음 명령으로 RAID 장치 /dev/md0과 /dev/md1을 생성합니다. /dev/sdb1은 /dev/md0에, /dev/sdb2는 /dev/md1에 추가됩니다. /dev/sda1과 /dev/sda2는 현재 사용 중이므로 우선 ‘missing’을 플레이스홀더로 사용해 degraded 상태로 만듭니다.
mdadm –create /dev/md0 –level=1 –raid-disks=2 missing /dev/sdb1
mdadm –create /dev/md1 –level=1 –raid-disks=2 missing /dev/sdb2
다음 명령으로 RAID 상태를 확인합니다:
cat /proc/mdstat
예시 출력(참고용)은 다음과 같습니다. [U] 또는 [U]는 배열이 degraded 상태임을, [UU]는 정상임을 뜻합니다:
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb2[1]
10377920 blocks [2/1] [_U]
md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
단계 2: 파일시스템 생성 및 LVM 준비
비-LVM RAID(/dev/md0)에 ext3 파일시스템을 만듭니다:
mkfs.ext3 /dev/md0
LVM용 RAID(/dev/md1)를 LVM 물리 볼륨으로 준비합니다:
pvcreate /dev/md1
그 다음 /dev/md1을 기존 볼륨 그룹 VolGroup00에 추가합니다:
vgextend VolGroup00 /dev/md1
pvdisplay 출력 예시는 다음과 같습니다(참고용):
[root@server1 ~]# pvdisplay
— Physical volume —
PV Name /dev/sda2
VG Name VolGroup00
PV Size 9.90 GB / not usable 22.76 MB
Allocatable yes (but full)
PE Size (KByte) 32768
Total PE 316
Free PE 0
Allocated PE 316
PV UUID aikFEP-FB15-nB9C-Nfq0-eGMG-hQid-GOsDuj
— Physical volume —
PV Name /dev/md1
VG Name VolGroup00
PV Size 9.90 GB / not usable 22.69 MB
Allocatable yes
PE Size (KByte) 32768
Total PE 316
Free PE 316
Allocated PE 0
PV UUID u6IZfM-5Zj8-kFaG-YN8K-kjAd-3Kfv-0oYk7J
[root@server1 ~]#
vgdisplay 출력 예시:
[root@server1 ~]# vgdisplay
— Volume group —
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 19.75 GB
PE Size 32.00 MB
Total PE 632
Alloc PE / Size 316 / 9.88 GB
Free PE / Size 316 / 9.88 GB
VG UUID ZPvC10-cN09-fI0S-Vc8l-vOuZ-wM6F-tlz0Mj
[root@server1 ~]#
단계 3: mdadm 구성 파일과 fstab/mtab 수정
현재 RAID 구성을 /etc/mdadm.conf에 저장합니다:
mdadm --examine --scan > /etc/mdadm.conf
파일 내용을 확인합니다:
cat /etc/mdadm.conf
파일에는 두 degraded RAID 배열의 정보가 들어 있어야 합니다:
| ARRAY /dev/md0 level=raid1 num-devices=2 UUID=0a96be0f:bf0f4631:a910285b:0f337164 ARRAY /dev/md1 level=raid1 num-devices=2 UUID=f9e691e2:8d25d314:40f42444:7dbe1da1
|
다음으로 /etc/fstab에서 LABEL=/boot를 /dev/md0로 바꿉니다:
vi /etc/fstab
| /dev/VolGroup00/LogVol00 / ext3 defaults 1 1 /dev/md0 /boot ext3 defaults 1 2 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 /dev/VolGroup00/LogVol01 swap swap defaults 0 0
|
그리고 /etc/mtab에서도 /dev/sda1을 /dev/md0로 교체합니다:
vi /etc/mtab
| /dev/mapper/VolGroup00-LogVol00 / ext3 rw 0 0 proc /proc proc rw 0 0 sysfs /sys sysfs rw 0 0 devpts /dev/pts devpts rw,gid=5,mode=620 0 0 /dev/md0 /boot ext3 rw 0 0 tmpfs /dev/shm tmpfs rw 0 0 none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0 sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
|
Note: /etc/mtab는 일부 배포판에서 동적으로 생성되므로 직접 편집하는 대신 재부팅/마운트 조작으로 업데이트하는 것이 더 안전할 수 있습니다.
단계 4: GRUB 설정 변경 및 initrd 재생성
/boot/grub/menu.lst를 열고 default=0 바로 다음에 fallback=1을 추가합니다:
vi /boot/grub/menu.lst
| [...] default=0 fallback=1 [...]
|
이 설정은 첫 번째(0번) 커널 부팅에 실패하면 fallback 인덱스(여기서는 1)를 시도하게 합니다.
다음으로 파일의 커널 스탠자를 복사해 첫 번째 항목 앞에 붙이고 root (hd0,0)를 root (hd1,0)로 바꿉니다. 이렇게 하면 GRUB가 두 디스크 중 하나에서 부팅을 시도하도록 합니다.
| [...] title CentOS (2.6.18-128.el5) root (hd1,0) kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-128.el5.img title CentOS (2.6.18-128.el5) root (hd0,0) kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-128.el5.img
|
전체 예시는 다음과 같습니다:
| # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 fallback=1 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18-128.el5) root (hd1,0) kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-128.el5.img title CentOS (2.6.18-128.el5) root (hd0,0) kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-128.el5.img
|
root (hd1,0)은 /dev/sdb를 가리키며, 이는 이미 RAID에 포함된 디스크입니다. 이 시점에서 시스템을 재부팅하면 degraded RAID에서 먼저 부팅을 시도하고 실패 시 /dev/sda로 폴백합니다.
initrd를 새 환경에 맞게 재생성합니다:
mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img_orig
mkinitrd /boot/initrd-`uname -r`.img `uname -r`
Important: initrd 파일을 잘못 변경하면 부팅 불능 상태가 될 수 있으므로 원본을 보관하세요.
단계 5: 데이터 이동 — LVM PV 이동 및 /boot 복사
이제 설정이 완료되었으므로 /dev/sda의 내용을 /dev/sdb로 이동합니다. 먼저 LVM 파티션(/dev/sda2)을 /dev/md1으로 이동합니다:
pvmove /dev/sda2 /dev/md1
이 작업은 시간이 걸립니다. 진행 중일 때는 시스템 상태에 따라 I/O 부하가 증가할 수 있으니 주의하세요.
이동이 완료되면 /dev/sda2를 볼륨 그룹에서 제거하고 LVM에서 해제합니다:
vgreduce VolGroup00 /dev/sda2
pvremove /dev/sda2
pvdisplay 출력은 다음과 같이 /dev/md1만 남아 있음을 보여야 합니다:
[root@server1 ~]# pvdisplay
— Physical volume —
PV Name /dev/md1
VG Name VolGroup00
PV Size 9.90 GB / not usable 22.69 MB
Allocatable yes (but full)
PE Size (KByte) 32768
Total PE 316
Free PE 0
Allocated PE 316
PV UUID u6IZfM-5Zj8-kFaG-YN8K-kjAd-3Kfv-0oYk7J
[root@server1 ~]#
다음으로 /dev/sda2의 파티션 타입을 Linux raid autodetect(fd)로 변경합니다:
fdisk /dev/sda
예시 상호작용:
[root@server1 ~]# fdisk /dev/sda
The number of cylinders for this disk is set to 1305.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): <– t
Partition number (1-4): <– 2
Hex code (type L to list codes): <– fd
Changed system type of partition 2 to fd (Linux raid autodetect)
Command (m for help): <– w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
[root@server1 ~]#
파티션 유형을 변경한 후 새 파티션을 RAID에 추가합니다:
mdadm --add /dev/md1 /dev/sda2
다음 명령으로 동기화 진행 상태를 확인합니다:
cat /proc/mdstat
동기화 중일 때는 예시 출력처럼 recovery 진행률과 예상 완료 시간이 표시됩니다:
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[2] sdb2[1]
10377920 blocks [2/1] [_U]
[====>…………….] recovery = 23.4% (2436544/10377920) finish=2.0min speed=64332K/sec
md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
실시간 모니터링을 위해 다음을 사용할 수 있습니다(종료: Ctrl+C):
watch cat /proc/mdstat
동기화가 완료되면 [UU]로 표시됩니다:
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[0] sdb2[1]
10377920 blocks [2/2] [UU]
md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
이제 /dev/md0를 마운트하고 /boot 내용을 복사합니다:
mkdir /mnt/md0
mount /dev/md0 /mnt/md0
다음은 mount 출력 예시입니다:
[root@server1 ~]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/md0 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/md0 on /mnt/md0 type ext3 (rw)
[root@server1 ~]#
마지막으로 /boot(/dev/sda1)의 내용을 새 RAID 파티션에 복사합니다:
cd /boot
cp -dpRx . /mnt/md0
이제 /dev/md0가 /boot로 서비스되며, 전체 시스템은 RAID 및 LVM 기반으로 전환되었습니다.
검증 및 인수 기준
인수 기준:
- cat /proc/mdstat의 모든 RAID가 [UU]로 표시되어야 함.
- vgdisplay/pvdisplay 출력에서 PV가 /dev/md1로 바뀌었음을 확인.
- /boot의 파일들이 /dev/md0(/mnt/md0)에 정확히 복사되었는지 확인.
- 재부팅 후 GRUB가 두 디스크 중 하나에서 정상적으로 부팅하는지 확인.
검증 명령 목록:
- cat /proc/mdstat
- pvdisplay
- vgdisplay
- mount | grep /boot
- ls -la /mnt/md0
- dmesg | grep -i md
운영 체크리스트 (역할 기반)
시스템 관리자:
- 백업 완료 여부 확인
- mdadm, lvm2, mkinitrd 설치 확인
- /etc/mdadm.conf, /etc/fstab, /boot/grub/menu.lst 변경 후 백업 파일 생성
운영 엔지니어:
- mdadm –detail /dev/md0 및 /dev/md1 확인
- RAID 동기화 모니터링
- 재부팅 후 부팅 로그(dmesg, /var/log/messages) 검토
네트워크/백업 담당자:
- 원격 콘솔(예: IPMI) 접근 권한 확인
- 백업 스케줄 및 스냅샷 정책 검토
문제 해결 요령
문제: RAID가 동기화되지 않거나 슬레이브 디스크가 인식되지 않는 경우
- /proc/partitions와 fdisk -l로 디스크 파티션을 확인하세요.
- mdadm –examine /dev/sda2 /dev/sdb2로 메타데이터를 확인하세요.
- dmesg로 커널 로그를 확인해 I/O 오류를 찾으세요.
문제: 부팅 실패
- GRUB 설정이 올바른지, root (hd1,0)와 root (hd0,0) 엔트리가 존재하는지 확인하세요.
- initrd를 원본으로 되돌려 보고 부팅 여부를 확인하세요.
- 콘솔(직접 또는 원격 관리)을 사용해 복구 모드로 진입하세요.
대안적 접근 방법
- 미러링 대신 rsync를 사용해 한 디스크에서 다른 디스크로 데이터를 복사한 뒤 RAID를 구성할 수 있습니다. (하지만 이 방법은 커널/부트 로더 동기화를 수동으로 처리해야 하므로 더 복잡할 수 있습니다.)
- 부트로더로 GRUB2를 사용한다면 설정 파일 경로 및 설치 방법이 다르므로 문서에 맞춰 변경하세요.
위험 분석 및 완화책
- 위험: 작업 중 부팅 불능 -> 완화: 원격 콘솔(IPMI) 또는 물리 접근 확보, initrd 원본 보관, 부팅 복구 미디어 준비
- 위험: 데이터 손상 -> 완화: 사전 전체 백업, 작업 전 스냅샷 생성
- 위험: RAID 동기화 지연으로 인한 성능 저하 -> 완화: 비업무 시간에 작업 수행, 모니터링
보안/운영 권장 사항
- /etc/mdadm.conf와 같은 민감 구성 파일의 권한을 제한하세요(chmod 600).
- RAID 관련 로그를 중앙 로깅으로 수집해 이상 징후를 조기에 파악하세요.
- 주기적으로 mdadm –detail로 상태를 확인하고 이메일/알람을 설정하세요.
테스트 케이스 및 수락 테스트
기본 수락 테스트:
- 모든 RAID 디스크를 정상적으로 동기화하면 cat /proc/mdstat에서 [UU]를 확인한다.
- 재부팅 후 루트 파티션이 정상적으로 마운트되는지 확인한다.
- /boot 파일들이 /dev/md0에 정확히 존재하는지 확인한다.
복구 시나리오 테스트:
- 한 디스크를 물리적으로 제거하고 시스템이 정상적으로 유지되는지 확인한다.
- 제거된 디스크를 다시 추가하고 동기화가 정상적으로 완료되는지 확인한다.
체크리스트 템플릿
- 백업 생성 완료
- mdadm 설치 확인
- LVM(pvcreate/vgextend) 준비 완료
- /etc/mdadm.conf 업데이트 및 백업
- /etc/fstab 및 /etc/mtab 변경 완료
- GRUB 설정 변경 및 initrd 재생성
- pvmove 및 vgreduce/pvremove 완료
- mdadm –add로 디스크 추가 및 동기화 완료
- /boot 복사 및 권한 검토
- 재부팅 후 시스템 정상 부팅 확인
간단한 명령어 치트시트
- RAID 생성: mdadm –create /dev/mdX –level=1 –raid-disks=2 missing /dev/sdY1
- RAID 상태: cat /proc/mdstat
- PV 생성: pvcreate /dev/md1
- VG 확장: vgextend VolGroup00 /dev/md1
- PV 이동: pvmove /dev/sda2 /dev/md1
- PV 제거: pvremove /dev/sda2
- 파티션 타입 변경: fdisk /dev/sda (t -> 2 -> fd -> w)
- RAID에 디스크 추가: mdadm –add /dev/md1 /dev/sda2
1줄 용어집
- mdadm: 리눅스 소프트웨어 RAID 관리 도구.
- pvcreate: LVM의 물리 볼륨 생성 명령어.
- vgextend: 볼륨 그룹에 물리 볼륨을 추가하는 명령어.
- pvmove: LVM 물리 볼륨 간의 데이터 이동 명령어.
요약
- 이 가이드는 degraded 상태로 RAID를 생성한 뒤 LVM PV를 RAID에 추가하고, pvmove로 데이터를 이동하며 최종적으로 RAID로 부팅하도록 GRUB과 initrd를 업데이트하는 전체 흐름을 설명합니다.
- 작업 중 복구 수단과 백업을 반드시 준비하고, 동기화가 완료될 때까지 모니터링하세요.
Notes: 실제 환경에 따라 명령어나 파일 경로가 다를 수 있습니다. 배포판별 차이를 고려해 조정하세요.