OpenWRTでmdadmを使用したソフトウェアRAIDを組む

投稿者: | 12月 15, 2023

はじめに

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を組みました。次回はメールサーバの立ち上げです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)