리눅스 소프트웨어 RAID 는 커널의 md(multiple devices) 드라이버와 관리 도구 mdadm 으로 만든다. 하드웨어 RAID 컨트롤러 없이 여러 디스크를 하나의 블록 장치 /dev/mdN 으로 묶는다. 배포판을 가리지 않고 같은 명령을 쓴다.
| 레벨 | 최소 디스크 | 용량 | 내결함성 | 용도 |
|---|---|---|---|---|
| 0 (stripe) | 2 | 합계 | 없음 | 임시 · 캐시. 디스크 하나 죽으면 전부 잃는다 |
| 1 (mirror) | 2 | 1개분 | 1개 | OS · 부팅 디스크 |
| 5 | 3 | (N-1)개분 | 1개 | 대용량 데이터. 재구성 중 두 번째 장애에 약하다 |
| 6 | 4 | (N-2)개분 | 2개 | 대용량 디스크 다수 |
| 10 | 4 | 절반 | 미러당 1개 | 데이터베이스. 성능과 안전 |
HDFS · Ceph · GlusterFS 처럼 응용 계층에서 복제하는 저장소에는 RAID 를 쓰지 않고 디스크를 JBOD 로 준다.
mdadm 패키지 — RHEL 계열 sudo dnf -y install mdadm, Ubuntu sudo apt -y install mdadm/dev/sdb)은 재부팅 시 바뀔 수 있으므로 어레이는 UUID 로 다룬다.디스크를 확인하고 이전 RAID 메타데이터를 지운다.
lsblk
sudo mdadm --zero-superblock /dev/sdb /dev/sdc /dev/sdd
통째로 쓰지 않고 파티션을 잘라 쓰려면 Partitioning 대로 파티션을 만들고 타입을 Linux RAID 로 둔다.
RAID 5 를 디스크 세 개로 만드는 예다. --level 과 --raid-devices 를 바꾸면 다른 레벨이 된다.
sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
핫 스페어를 두려면 --spare-devices=1 을 더하고 디스크를 하나 더 준다. 생성 직후에는 백그라운드에서 초기 동기화가 돈다.
cat /proc/mdstat
sudo mdadm --detail /dev/md0
sudo mkfs.xfs /dev/md0
sudo mkdir -p /data
sudo mount /dev/md0 /data
/etc/fstab 에는 UUID 로 적는다. 옵션은 fstab 마운트 옵션 참조.
sudo blkid /dev/md0
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data xfs defaults,nofail 0 0
재부팅 후에도 같은 이름으로 조립되도록 어레이 정의를 저장하고 initramfs 를 갱신한다.
# RHEL 계열
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm.conf
sudo dracut --force
# Ubuntu
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u
cat /proc/mdstat
sudo mdadm --detail /dev/md0
df -h /data
State : clean 이고 모든 디스크가 active sync 이면 정상이다. 동기화 중이면 resync 진행률이 /proc/mdstat 에 나온다.
# 고장 표시 후 제거
sudo mdadm /dev/md0 --fail /dev/sdc
sudo mdadm /dev/md0 --remove /dev/sdc
# 새 디스크를 꽂은 뒤 추가 — 재구성이 자동으로 돈다
sudo mdadm /dev/md0 --add /dev/sde
cat /proc/mdstat
정합성 검사는 다음으로 시작한다.
echo check | sudo tee /sys/block/md0/md/sync_action
sudo umount /data
sudo mdadm --stop /dev/md0
sudo mdadm --zero-superblock /dev/sdb /dev/sdc /dev/sdd
/etc/mdadm.conf 와 /etc/fstab 의 항목도 지운다.
2021년 테스트 됨. 당시 명령은 다음과 같다. 장치 이름 /dev/svde 는 오타로 보이며 /dev/xvde 가 맞다. 이름 raid0 로 RAID 5 를 만든 것이라 위 절차의 /dev/md0 와 같은 뜻이다.
mdadm --create raid0 --level=5 --raid-device=3 /dev/xvdb /dev/xvdc /dev/xvde