4 RAID 배열 생성
이제 /dev/md0, /dev/md1, /dev/md2 RAID 배열을 생성합니다. /dev/sdb1은 /dev/md0에, /dev/sdb2는 /dev/md1에, /dev/sdb3은 /dev/md2에 추가됩니다. 현재 시스템이 /dev/sda1, /dev/sda2, /dev/sda3에서 실행 중이므로 이들을 즉시 추가할 수 없습니다. 따라서 다음 세 명령어에서 missing(플레이스홀더)를 사용합니다.
mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3
다음 명령으로 RAID 상태를 확인합니다:
cat /proc/mdstat
이제 세 개의 degraded(감소된) RAID 배열을 확인할 수 있어야 합니다. [U] 또는 [U]는 배열이 감소된 상태임을 나타내며 [UU]는 정상 상태입니다.
| [root@server1 ~]# cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md2 : active raid1 sdb3[1] 4618560 blocks [2/1] [_U] md1 : active raid1 sdb2[1] 513984 blocks [2/1] [_U] md0 : active raid1 sdb1[1] 104320 blocks [2/1] [_U] unused devices:
|
다음으로 RAID 장치에 파일시스템을 생성합니다. /dev/md0과 /dev/md2에는 ext3, /dev/md1에는 swap을 만듭니다.
mkfs.ext3 /dev/md0
mkswap /dev/md1
mkfs.ext3 /dev/md2
mdadm 설정 파일을 생성합니다:
mdadm --examine --scan > /etc/mdadm.conf
파일 내용을 확인합니다:
cat /etc/mdadm.conf
파일에는 세 개의(감소된) RAID 배열에 대한 정보가 포함되어 있어야 합니다.
| ARRAY /dev/md0 level=raid1 num-devices=2 UUID=2848a3f5:cd1c26b6:e762ed83:696752f9 ARRAY /dev/md1 level=raid1 num-devices=2 UUID=8a004bac:92261691:227767de:4adf6592 ARRAY /dev/md2 level=raid1 num-devices=2 UUID=939f1c71:be9c10fd:d9e5f8c6:a46bcd49
|
중요: RAID 어레이를 생성할 때 올바른 디바이스 경로를 사용했는지 다시 확인하세요. 잘못된 디바이스를 포맷하면 데이터가 손실됩니다.
5 시스템을 RAID1에 맞게 조정
우선 /dev/md0과 /dev/md2를 마운트합니다(스왑 배열 /dev/md1은 마운트 불필요).
mkdir /mnt/md0
mkdir /mnt/md2
mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2
다음 명령으로 마운트된 항목을 확인합니다:
mount
예시 출력:
| [root@server1 ~]# mount /dev/sda3 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/sda1 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) /dev/md2 on /mnt/md2 type ext3 (rw) [root@server1 ~]#
|
다음으로 /etc/fstab을 수정합니다. LABEL=/boot을 /dev/md0으로, LABEL=SWAP-sda2을 /dev/md1로, LABEL=/을 /dev/md2로 교체합니다. 최종 파일은 다음과 같아야 합니다:
vi /etc/fstab
| /dev/md2 / 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/md1 swap swap defaults 0 0
|
또한 /etc/mtab에서 LABEL=/boot와 LABEL=/을 /dev/md0, /dev/md2로 교체합니다:
vi /etc/mtab
| /dev/md2 / 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
|
GRUB 설정 변경
/boot/grub/menu.lst를 열어 default=0 바로 아래에 fallback=1을 추가합니다. 이 설정은 첫 번째 커널(인덱스 0)이 실패하면 fallback 인덱스(여기서는 1)를 부팅하게 합니다.
vi /boot/grub/menu.lst
| [...] default=0 fallback=1 [...]
|
같은 파일 하단의 커널 stanza를 찾아 첫 번째 stanza를 복사해 기존 첫 stanza 앞에 붙여 넣습니다. 그리고 root=LABEL=/을 root=/dev/md2로, root (hd0,0)을 root (hd1,0)로 바꿉니다.
| [...] title Fedora (2.6.23.1-42.fc8) root (hd1,0) kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/md2 rhgb quiet initrd /initrd-2.6.23.1-42.fc8.img title Fedora (2.6.23.1-42.fc8) root (hd0,0) kernel /vmlinuz-2.6.23.1-42.fc8 ro root=LABEL=/ rhgb quiet initrd /initrd-2.6.23.1-42.fc8.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/sda3 # initrd /initrd-version.img #boot=/dev/sda default=0 fallback=1 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Fedora (2.6.23.1-42.fc8) root (hd1,0) kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/md2 rhgb quiet initrd /initrd-2.6.23.1-42.fc8.img title Fedora (2.6.23.1-42.fc8) root (hd0,0) kernel /vmlinuz-2.6.23.1-42.fc8 ro root=LABEL=/ rhgb quiet initrd /initrd-2.6.23.1-42.fc8.img
|
root (hd1,0)은 /dev/sdb를 가리키며, 이는 레이드에 이미 포함된 디스크입니다. 잠시 후 시스템을 재부팅하면 (아직 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`
이제 /dev/sda1과 /dev/sda3의 내용을 /dev/md0과 /dev/md2(각각 /mnt/md0, /mnt/md2에 마운트됨)로 복사합니다:
cp -dpRx / /mnt/md2
그리고 /boot 내용을 복사합니다:
cd /boot
cp -dpRx . /mnt/md0
6 GRUB 준비 (1부)
그다음으로 두 번째 하드 드라이브 /dev/sdb에 GRUB 부트로더를 설치해야 합니다.
grub
GRUB 프롬프트에서 다음 명령을 입력합니다:
root (hd0,0)
예시:
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub>
setup (hd0)
설치 과정 예시:
grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd0)"... 16 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub>
그다음 다른 디스크(여기서 hd1)를 지정하고 동일하게 설치합니다:
root (hd1,0)
setup (hd1)
설치가 끝나면 grub 프롬프트에서 quit로 나옵니다.
quit
정상 쉘로 돌아온 후 시스템을 재부팅하여 RAID 어레이에서 부팅되는지 확인합니다:
reboot
확인 체크리스트 (시작 전/후)
- 시작 전: 전체 백업 완료 여부 확인
- mdadm으로 RAID 생성 시 디바이스 경로 재확인
- /etc/mdadm.conf에 배열 정보가 정확히 기록되었는지 확인
- /etc/fstab 및 /etc/mtab 수정이 올바른지 검증
- initrd 재생성 후 파일 존재 및 날짜 확인
- GRUB 설치 후 두 디스크 모두에 부트로더가 정상 설치되었는지 확인
- 재부팅 후 정상적으로 부팅되는지 확인, 실패 시 콘솔 메시지 캡처
롤백 및 복구 절차(간단)
- 만약 RAID 구성 후 부팅 실패가 발생하면, 부팅 가능한 미디어(라이브 USB)로 부팅합니다.
- 원본 디스크(/dev/sda 및 /dev/sdb)의 /boot 내용과 fstab을 검토합니다.
- /etc/fstab을 원래 LABEL 기반 항목으로 복원하고 initrd 원본 파일을 복원합니다.
- GRUB를 원래 주 디스크(/dev/sda)에 설치합니다:
grub
root (hd0,0)
setup (hd0)
quit
- 재부팅하여 정상 복구 여부를 확인합니다.
중요: 복구 전에는 항상 데이터 백업을 먼저 확인하세요.
테스트 항목 및 수락 기준
- 재부팅 시 시스템이 /dev/md2에서 루트 파티션으로 성공적으로 부팅되어야 합니다.
- /boot가 /dev/md0에서 마운트되어야 합니다.
- swapon -s로 /dev/md1 스왑이 활성화되어야 합니다.
- /proc/mdstat에서 각 RAID 어레이가 정상(또는 재동기화 중)인 것을 확인해야 합니다.
리스크 및 완화
- 리스크: 잘못된 디바이스에 mkfs를 실행하여 데이터 소실. 완화: 작업 전 전체 백업, 명확한 디바이스 네이밍, 동료 검토.
- 리스크: GRUB 설치 실패로 부팅 불가. 완화: 라이브 미디어로 복구 절차 준비, 부트로더 재설치 방법 숙지.
짧은 공지문(100–200자)
서버를 RAID1으로 전환해 디스크 장애에 대한 가용성을 높였습니다. 재부팅 과정에서 RAID 기반 부팅을 설정했고, 문제가 발생할 경우 기존 디스크로 폴백하도록 GRUB을 구성했습니다. 변경 전 전체 백업을 권장합니다.
간단 용어집
- RAID1: 두 개 이상의 디스크에 같은 데이터를 미러링하여 가용성을 높이는 구성.
- mdadm: 리눅스에서 소프트웨어 RAID를 관리하는 유틸리티.
- initrd: 커널 부팅 시 필요한 초기 램디스크 이미지.
요약:
- mdadm으로 degraded 상태의 RAID1 배열을 생성하고 파일시스템과 스왑을 준비했습니다.
- /etc/fstab, /etc/mtab, /boot/grub/menu.lst를 RAID 환경에 맞게 수정했습니다.
- initrd를 재생성하고 /dev/sda의 데이터를 /dev/md0,/dev/md2로 복사했습니다.
- GRUB을 두 디스크에 설치해 RAID 부팅을 가능하게 했습니다.
핵심 확인 포인트: 백업, fstab/mtab 정확성, mdadm 상태, 그리고 재부팅 후 부팅 성공 여부입니다.