はじめに
NASとか、メールサーバとか、信頼性が必要なものにはRAIDは必須ですよね!ってことで、OpenWRTでRAIDを組んでみました。
この記事はURoad-Home2+にUSBをつけ、そこに専用2連マウンタをつけてた環境で行いました。
参考文献
ぺんぎんや「【Linux】mdadmを用いたソフトウェアRAID構築」
メモメモ Linux「ソフトウェアRAIDが自動起動しない」
ぴろにっき「mdadmでソフトRAIDを手動で起動する方法 [Linux(LVM/RAID/Storage)]」
RAIDを組む
mdadmを使用したソフトウェアRAIDを使用します。2台接続した場合です。今回はRAID 1を組みます。
0. パッケージのインストール
USBのHDDを接続し、パーティショニング、マウントするのに以下のパッケージをインストールして下さい。
kmod-usb-storage
mount-utils
kmod-scsi-core
kmod-scsi-generic
parted
e2fsprogs
kmod-fs-ext4
mdadm
をインストールして下さい。
1. 確認ls /dev/
でHDDがsdaやsdbなどとして認識されているか確認して下さい。
2. フォーマット&パーティション作成
partedを使用します。例として、/dev/sdaの場合はparted /dev/sda
でpartedを起動します。mklabel gpt
でGPTにします。mkpart ext4 0% 100%
でext4のパーティションを作成します。set 1 raid on
でHDDのRAIDフラグを立てます。p
でパーティションを確認します。quit
でpartedを終了します。
3. RAID 1の作成
以下のコマンドでmd0としてsda1とsdb1でRAID1を作成します。mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
mdadm --detail /dev/md0
で作成したmd0についての情報を知ることができます。
(4). 設定の保存
自分は実行していません。7のシェルスクリプトを起動時に実行する方法を使用しています。
起動時に自動でmd0が作成されるようにしたい場合はecho "DEVICE /dev/sda1 /dev/sdb1" >> /etc/mdadm.conf
を実行してから次に進んで下さい。自分は試していないためわかりませんが、多分これと次のコマンドを実行することで起動時に自動でmd0がセットアップされます。
4. 設定の保存
これで、uuidの保存がされます。mdadm --detail --scan >> /etc/mdadm.conf
これだけでは起動時に自動でセットアップはされません。
正直これを実行する必要が本当にあるのかは謎です。
5. 初期化
作成されたmd0をext4で初期化します。mkfs.ext4 /dev/md0
6. マウント
/mnt/md0にマウントする場合、まず、mkdir /mnt/md0
でディレクトリを作成し、mount -t ext4 /dev/md0 /mnt/md0
でマウントします。
7. 起動時に実行されるシェルスクリプト(mount_md0.sh)を書く
そのままmdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1
だけを実行してもいいですが、USBで接続しているので稀にちゃんと認識されないことがあるので、どちらかのHDDが欠けている場合は再起動するようにシェルスクリプトを書きます。vim mount_md0.sh
で、/rootの下などに書いて下さい。
また、3回再起動しても認識されなかった場合は再起動を停止するようにしてあります。任意にコマンドを追加してメールを送信したりGPIOでLEDを点滅させるようにするなど改良してください。
#!/bin/ash
# save reboot count
REBOOT_COUNT_FILE="/root/reboot_count.txt"
# def check /dev
check_device() {
[ -e "/dev/$1" ]
}
# read rebootcount.txt
if [ -f "$REBOOT_COUNT_FILE" ]; then
read REBOOT_COUNT < "$REBOOT_COUNT_FILE"
else
REBOOT_COUNT=0
fi
# check sda1 and sdb1
if check_device "sda1" && check_device "sdb1"; then
echo "sda1 and sdb1 is exist"
echo 0 > "$REBOOT_COUNT_FILE"
echo "make raid1"
mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1
echo "mount raid1 at /mnt/md0"
mount -t ext4 /dev/md0 /mnt/md0
else
echo "sda1 or sdb1 isn't exist"
if [ $REBOOT_COUNT -lt 3 ]; then
# add reboot count
REBOOT_COUNT=$((REBOOT_COUNT + 1))
echo $REBOOT_COUNT > "$REBOOT_COUNT_FILE"
# reboot
echo "sda1 or sdb1 isn't exist. Reboot in 5sec"
sleep 5
reboot
else
# reboot count is 3
echo "reboot 3 times"
echo "stop reboot"
# add some comannd ex.send mail or blink GPIO
fi
fi
6. 権限をつける
先程のシェルスクリプトに実行権限をつけます。chmod 775 mount_md0.sh
7. rc.localにmount_md0.shを追加
/etc/rc.localは起動時に実行されるシェルスクリプトなのでvim /etc/rc.local
で
./root/mount_md0.sh
を追加して下さい。Luciからの追加でも大丈夫です。
8. 完了
再起動をして、正常にmd0がマウントされるか確認して下さい。
ddコマンドを使用したベンチマークなどしてみると面白と思います。
おわりに
前回で物理的なセットアップ、今回でRAIDを組みました。次回はメールサーバの立ち上げです。