コンテンツにスキップ

mdadmによるRAID1の設定

Debian 13.xで2台のディスクからRAID1を作成し、ext4ファイルシステムを/srv/dataへ永続的にマウントする。


項目 値
OS Debian 13.x
1台目のディスク /dev/sdb
2台目のディスク /dev/sdc
メンバーパーティション /dev/sdb1、/dev/sdc1
RAIDレベル RAID1
MDデバイス /dev/md0
ファイルシステム ext4
マウントポイント /srv/data

/dev/sdbと/dev/sdcのパーティションテーブル、ファイルシステム、既存のRAIDメタデータは消去される。OSディスクやデータを残すディスクがこの名前で認識されている場合は実行しない。


ディスクのモデル、シリアル番号、容量、ファイルシステム、マウント先を確認する。

Terminal window
lsblk -o NAME,PATH,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL,SERIAL
Terminal window
sudo fdisk -l /dev/sdb /dev/sdc

/dev/sdbと/dev/sdcがRAID専用の空ディスクであり、どのパーティションもマウントされていないことを確認する。

既存のMDアレイも確認する。

Terminal window
cat /proc/mdstat

/dev/md0が既に存在する場合は、この手順の名前と重複するため続行しない。


2. 必要なパッケージをインストールする

Section titled “2. 必要なパッケージをインストールする”
Terminal window
sudo apt update
sudo apt install mdadm parted

3. RAID用パーティションを作成する

Section titled “3. RAID用パーティションを作成する”

次の操作により、/dev/sdbと/dev/sdcに存在する署名とパーティションテーブルを消去する。

Terminal window
sudo wipefs --all /dev/sdb
sudo wipefs --all /dev/sdc

各ディスクへGPTパーティションテーブルと、ディスク全体を使うRAID用パーティションを作成する。

Terminal window
sudo parted --script /dev/sdb \
mklabel gpt \
mkpart primary 1MiB 100% \
set 1 raid on
Terminal window
sudo parted --script /dev/sdc \
mklabel gpt \
mkpart primary 1MiB 100% \
set 1 raid on

set 1 raid onは、GPTのパーティション種別をLinux RAIDとして記録する。MDメタデータそのものは次のmdadm --createで書き込まれるため、アレイ作成の必須条件ではない。パーティションの用途をOSや管理ツールから識別できるようにするため設定する任意の指定である。

カーネルが新しいパーティションを認識するまで待ち、結果を確認する。

Terminal window
sudo udevadm settle
lsblk -o NAME,PATH,SIZE,TYPE,FSTYPE /dev/sdb /dev/sdc

/dev/sdb1と/dev/sdc1が存在し、ほぼ同じ容量であることを確認する。

新しいパーティションと同じ位置に残っている古いファイルシステムやRAIDの署名を消去する。この操作により、以前のパーティション内容は利用できなくなる。

Terminal window
sudo wipefs --all /dev/sdb1
sudo wipefs --all /dev/sdc1

Terminal window
sudo mdadm --create /dev/md0 \
--level=1 \
--raid-devices=2 \
--metadata=1.2 \
--name=data \
/dev/sdb1 /dev/sdc1

--level=1と--raid-devices=2は、2つのメンバーを持つRAID1として作成するために必要である。--metadata=1.2はDebian 13のmdadmで既定となるメタデータ形式を明示する任意指定、--name=dataはメタデータへアレイ名を保存する任意指定である。

確認を求められた場合は、対象が/dev/sdb1と/dev/sdc1であることを再確認してyesを入力する。

アレイの状態を確認する。

Terminal window
cat /proc/mdstat
Terminal window
sudo mdadm --detail /dev/md0

作成直後はresyncが表示される。アレイはresync中でも使用できる。完了までの進捗を監視する場合は、任意で次のコマンドを実行する。

Terminal window
watch -n 2 cat /proc/mdstat

Ctrl+Cで監視を終了する。resync完了後は[2/2] [UU]となり、mdadm --detailのStateがcleanになる。


5. ファイルシステムを作成してマウントする

Section titled “5. ファイルシステムを作成してマウントする”

/dev/md0上にある既存のファイルシステムは、この操作で上書きされる。

Terminal window
sudo mkfs.ext4 -L data_raid1 /dev/md0
Terminal window
sudo install -d -o root -g root -m 755 /srv/data
sudo mount /dev/md0 /srv/data
Terminal window
findmnt /srv/data
df -hT /srv/data

書き込みを確認する。

Terminal window
echo 'RAID1 write test' | sudo tee /srv/data/raid-test.txt
sudo cat /srv/data/raid-test.txt

6. アレイを起動時に組み立てる

Section titled “6. アレイを起動時に組み立てる”

アレイからmdadm.confへ記録するARRAY行を生成する。

Terminal window
sudo mdadm --detail --brief /dev/md0

表示されたARRAY行を、/etc/mdadm/mdadm.confへ1回だけ追加する。

メンバー側のMDメタデータだけでもアレイを検出できるが、ARRAY行にMDアレイUUIDと名前を記録すると、起動時に同じアレイを意図したMDデバイスとして組み立てやすくなる。--detail --brief /dev/md0は指定したアレイだけを設定行の形式で表示する。--detail --scanは/proc/mdstatにある全アレイを表示するため、複数アレイがある場合はそのまま追記しない。

Terminal window
sudoedit /etc/mdadm/mdadm.conf

追加後、同じMDアレイUUIDを持つARRAY行が重複していないことを確認する。

Terminal window
grep '^ARRAY ' /etc/mdadm/mdadm.conf

ルートファイルシステムなど、通常のルートファイルシステムをマウントする前に必要なアレイへ設定を反映する場合は、任意でinitramfsを更新する。

Terminal window
sudo update-initramfs -u

7. ファイルシステムを起動時にマウントする

Section titled “7. ファイルシステムを起動時にマウントする”

ファイルシステムUUIDを確認する。

Terminal window
sudo blkid /dev/md0

TYPE="ext4"と表示された行のUUIDを使用し、/etc/fstabへ次の形式で追加する。

/etc/fstab
UUID=<blkidで確認したext4のUUID> /srv/data ext4 defaults 0 2
Terminal window
sudoedit /etc/fstab

現在のマウントを解除し、fstabだけで再マウントできることを確認する。

Terminal window
sudo umount /srv/data
sudo mount -a
findmnt /srv/data
sudo cat /srv/data/raid-test.txt

ここでは/dev/sdb1が故障し、交換ディスクが/dev/sddとして認識されたものとする。実際のデバイス名は、モデルとシリアル番号を使って確認する。

Terminal window
lsblk -o NAME,PATH,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL,SERIAL
sudo mdadm --detail /dev/md0

まだアクティブな/dev/sdb1を交換する場合は、故障状態にしてから取り外す。

Terminal window
sudo mdadm /dev/md0 --fail /dev/sdb1
sudo mdadm /dev/md0 --remove /dev/sdb1
Terminal window
cat /proc/mdstat
sudo mdadm --detail /dev/md0

[2/1] [U_]または[2/1] [_U]とdegradedが表示されることを確認する。

交換ディスク/dev/sddの既存データを消去し、RAID用パーティションを作成する。この操作により/dev/sddの既存データは失われる。

Terminal window
sudo wipefs --all /dev/sdd
sudo parted --script /dev/sdd \
mklabel gpt \
mkpart primary 1MiB 100% \
set 1 raid on
sudo udevadm settle
sudo wipefs --all /dev/sdd1

交換パーティションが既存のRAIDメンバー以上の容量であることを確認する。

Terminal window
lsblk -b -o NAME,PATH,SIZE,TYPE /dev/sdc /dev/sdd

交換パーティションをアレイへ追加する。

Terminal window
sudo mdadm /dev/md0 --add /dev/sdd1
Terminal window
watch -n 2 cat /proc/mdstat

recoveryの完了後、[2/2] [UU]とcleanへ戻ったことを確認する。

Terminal window
sudo mdadm --detail /dev/md0
sudo cat /srv/data/raid-test.txt

メンバー交換ではMDアレイUUIDとext4のUUIDは変わらないため、mdadm.confとfstabのUUIDは変更しない。


Terminal window
sudo reboot

再起動後、アレイとマウントを確認する。

Terminal window
cat /proc/mdstat
sudo mdadm --detail /dev/md0
findmnt /srv/data
sudo cat /srv/data/raid-test.txt

/dev/md0がcleanかつ[UU]であり、/srv/dataからテストファイルを読めることを確認する。


mdmonitor.serviceの状態を確認する。

Terminal window
systemctl status mdmonitor.service

メール通知を使う場合は、/etc/mdadm/mdadm.confへ実際に受信できる宛先を1つ設定する。

/etc/mdadm/mdadm.conf
MAILADDR admin@example.com

設定後にサービスを再起動し、任意でテストイベントを送る。テストを実行する前に、このホストから指定した宛先へメールを配送できることを確認する。

Terminal window
sudo systemctl restart mdmonitor.service
sudo mdadm --monitor --scan --oneshot --test

定期check用timerを確認する。

Terminal window
systemctl list-timers mdcheck_start.timer mdcheck_continue.timer

mdcheck_start.timerが無効で、定期checkを利用する場合は有効化する。

Terminal window
sudo systemctl enable --now mdcheck_start.timer

checkの実行中は/proc/mdstatへ進捗が表示される。完了後の不一致数は次のファイルで確認する。

Terminal window
cat /proc/mdstat
cat /sys/block/md0/md/mismatch_cnt