RAID1 을 세우고, 한 장을 죽이고, 다시 맞춘다
목표
루프 장치 위에 md RAID1 을 세우고, 한 장을 고장 내 degraded 상태를 직접 보고, 새 장치로 재구성한 뒤 체크섬과 점검(check)으로 데이터가 무사하다는 증거를 남깁니다.
왜 중요한가
디스크 교체는 인프라 엔지니어가 가장 자주 하는 하드웨어 작업이지만, 대부분은 그 순간을 처음 겪으면서 배웁니다. /proc/mdstat 의 [U_] 가 무엇인지, --fail 과 --remove 가 왜 따로 있는지, 재구성이 끝났다는 것과 데이터가 그대로라는 것이 왜 다른 증거인지를 미리 손으로 겪어 두면 새벽 알림에 당황하지 않습니다.
이 실습은 우분투 24.04 VM 에서 root 로 돕니다. 빈 디스크가 없으므로 파일을 블록 장치처럼 보이게 하는 루프 장치(losetup)로 디스크 세 장을 흉내 냅니다. 실무에서 디스크 없이 RAID 를 시험할 때 쓰는 바로 그 방법입니다. 세션은 60분에 시작해 최대 180분까지 연장할 수 있고, VM 은 세션이 끝나면 사라집니다.
단계
/var/lib/sto/raid-a.img,/var/lib/sto/raid-b.img,/var/lib/sto/raid-c.img를 각각 256MiB 로 만들고 셋 다 루프 장치로 붙이세요.losetup -a출력을/root/sto/raid/loops.txt에 저장하세요.raid-a.img와raid-b.img의 루프 장치 둘로 RAID1 배열/dev/md/sto를 만드세요(메타데이터 1.2).raid-c.img는 아직 넣지 않습니다./dev/md/sto를 ext4 로 포맷해/srv/raid에 마운트하세요./srv/raid/ledger.dat에 20MiB 짜리 임의 데이터를 쓰고,sha256sum /srv/raid/ledger.dat출력을/root/sto/raid/ledger.sha256에 저장하세요./etc/mdadm/mdadm.conf에/dev/md/sto의ARRAY줄을 추가하세요. 그 배열의 UUID 가 적힌ARRAY줄은 정확히 한 줄이어야 합니다.raid-b.img의 루프 장치를 고장(fail) 으로 표시한 직후의/proc/mdstat를/root/sto/raid/degraded.txt에 저장하고, 그 장치를 배열에서 제거(remove) 하세요.raid-c.img의 루프 장치를 배열에 추가해 재구성하고 끝날 때까지 기다리세요. 상태가clean, 활성 장치 2개, 고장 장치 0개여야 합니다.- 3단계의 체크섬으로
ledger.dat를 검사하고sha256sum -c출력을/root/sto/raid/verify.txt에 저장하세요. - 배열에 점검(check) 을 돌리고 끝나면
/root/sto/raid/scrub.txt에last_sync_action=<값>과mismatch_cnt=<값>두 줄을 적으세요(값은/sys/block/<md 장치>/md/에서 읽습니다).
참고
- 루프 장치:
truncate -s 256M 파일→losetup -f --show 파일, 되찾기는losetup -j 파일. - 배열:
mdadm --create,mdadm --detail,cat /proc/mdstat,mdadm --wait. - 교체:
mdadm <배열> --fail <장치>→--remove <장치>→--add <새 장치>. - 흔한 실수 1:
--detail --brief를 두 번 돌려mdadm.conf에 같은ARRAY줄을 두 번 쌓는 경우. - 흔한 실수 2: 재구성이 끝나기 전에 "끝났다" 고 기록하는 경우 —
recovering이 사라질 때까지 기다리세요.
루프 장치 세 개 만들기
/var/lib/sto/raid-a.img, /var/lib/sto/raid-b.img, /var/lib/sto/raid-c.img 를 각각 256MiB 로 만들고(희소 파일이면 됩니다) 셋 다 루프 장치로 붙이세요. losetup -a 출력을 /root/sto/raid/loops.txt 에 저장하세요.
truncate -s 로 크기를 정하고 losetup -f --show 로 비어 있는 루프 장치에 붙입니다. 번호를 직접 적으면 snap 이 쓰고 있는 장치와 부딪힙니다.
RAID1 배열 /dev/md/sto 만들기
raid-a.img 와 raid-b.img 의 루프 장치 둘로 RAID1 배열 /dev/md/sto 를 만드세요(메타데이터 1.2). raid-c.img 는 아직 넣지 않습니다.
mdadm --create 에 --level 과 --raid-devices 를 줍니다. 부팅 장치로 쓰기에 알맞지 않다는 확인 질문이 나오면 이 실습에서는 y 로 넘어가도 됩니다. 어느 루프 장치인지는 losetup -j <파일> 로 되찾습니다.
파일시스템과 체크섬 남기기
/dev/md/sto 를 ext4 로 포맷해 /srv/raid 에 마운트하세요. /srv/raid/ledger.dat 에 20MiB 짜리 임의 데이터를 쓰고, 그 파일의 SHA-256 을 sha256sum /srv/raid/ledger.dat 형식 그대로 /root/sto/raid/ledger.sha256 에 저장하세요.
배열도 블록 장치이므로 mkfs.ext4 와 mount 가 그대로 됩니다. head -c 20M /dev/urandom 으로 임의 데이터를 만들 수 있습니다. 체크섬 파일에는 절대 경로가 들어가야 나중에 어디서든 sha256sum -c 로 검사할 수 있습니다.
mdadm.conf 에 배열을 한 줄로 등록
/etc/mdadm/mdadm.conf 에 /dev/md/sto 의 ARRAY 줄을 추가하세요. 그 배열의 UUID 가 적힌 ARRAY 줄은 정확히 한 줄이어야 합니다.
mdadm --detail --brief 가 ARRAY 줄을 만들어 줍니다. 이미 그 UUID 가 파일에 있는지 먼저 보고 없을 때만 붙이세요. 실제 서버라면 update-initramfs -u 까지 해야 부팅 초기에 조립됩니다.
한 장을 고장 내고 빼기
raid-b.img 의 루프 장치를 배열에서 고장(fail) 으로 표시한 직후의 /proc/mdstat 를 /root/sto/raid/degraded.txt 에 저장하고, 그 장치를 배열에서 제거(remove) 하세요. /srv/raid/ledger.dat 는 여전히 읽혀야 합니다.
mdadm <배열> --fail <장치> 다음 --remove <장치> 순서입니다. 고장 표시 직후의 mdstat 에는 장치 이름 뒤에 (F) 가, 상태 칸에 [2/1] 이 보입니다.
새 디스크로 재구성하기
raid-c.img 의 루프 장치를 배열에 추가해 재구성하고, 재구성이 끝날 때까지 기다리세요. 끝난 뒤 mdadm --detail /dev/md/sto 의 상태가 clean 이고 활성 장치가 2개, 고장 장치가 0개여야 합니다.
mdadm <배열> --add <장치> 로 넣으면 커널이 recovery 를 시작합니다. mdadm --wait 가 끝날 때까지 기다려 줍니다. cat /proc/mdstat 에 진행률이 보입니다.
체크섬으로 데이터 확인
3단계에서 남긴 체크섬으로 /srv/raid/ledger.dat 를 검사하고, sha256sum -c 의 출력을 /root/sto/raid/verify.txt 에 저장하세요.
sha256sum -c <체크섬 파일> 은 파일마다 OK 또는 FAILED 를 한 줄씩 냅니다. 배열이 clean 이라는 것과 데이터가 그대로라는 것은 다른 증거입니다.
점검(check)을 돌리고 결과 남기기
배열에 점검(check) 을 돌리고 끝날 때까지 기다린 뒤, /root/sto/raid/scrub.txt 에 두 줄을 적으세요: last_sync_action=<값>, mismatch_cnt=<값>. 두 값은 /sys/block/<md 장치>/md/ 아래의 같은 이름 파일에서 읽습니다.
/dev/md/sto 는 /dev/mdNNN 을 가리키는 링크입니다(readlink -f). 그 장치의 /sys/block/mdNNN/md/sync_action 에 check 를 쓰면 점검이 시작되고, mdadm --wait 로 끝날 때까지 기다릴 수 있습니다.