RaspberryPiでRAID構成試してみる


このエントリーをはてなブックマークに追加

RAIDを扱わないといけなくなったがそもそもRAIDってなんだ状態だったので色々調べて

うまくいった方法を備忘録

環境は



参考リンク


下記リンクあたりがRAID構築に参考になった

USBメモリでRAID 5を構築(1)

SanDisk Ultra Fit 128GB 4個でRAID5を構築してみた

Raspberry Pi3でサーバを構築する (2) RAID1ディスクの構築 - 虎之助の徒然記



とりあえず構築していく


今回は(認識してくれなかった分を差し引いても)USBメモリが3つあったのでRAID5を構築してみることにした

やり方はまず主に下記を参考にした

SanDisk Ultra Fit 128GB 4個でRAID5を構築してみた


まずRaspberryPiに適当なUSBメモリを挿してみるとsdaとしてDevice認識される

確認は lsコマンドで確認可能

1
2
3
$ ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 Apr 28 10:27 /dev/sda
brw-rw---- 1 root disk 8, 1 Apr 28 10:27 /dev/sda1

最初からパーティション分けされてるみたいで /dev/sda1 が出てきた


fdiskコマンドでフォーマットする

今回は容量が小さいのでfdiskコマンドを使う。

合計容量が2TB以上になる場合は、fdiskコマンドではなくpartedコマンドなどを使うことになるっぽいので注意

fdisk vs parted - Unix & Linux Stack Exchange

大容量ハードディスクのRAIDは2TBの壁に注意 | ドスパラ - 製品レビュー


usbメモリを3本挿したところ、sda, sdb, sdcという名前で認識されたので

それぞれフォーマットしていく

例えばsdaの場合は以下のようになる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ sudo fdisk /dev/sda
...
パーディションが作成されている場合は d で削除、念のためdeleteしておく
Command (m for help): d
# n で新しいパーティションを作る
Command (m for help): n
# RAID用のファイルシステムタイプを選ぶので type の意味のt
Command (m for help): t
# RAID用は fd
Hex code (type L to list all codes): fd
# できたパーティションを p で確認
Command (m for help): p
# 保存のために w(write)
Command (m for help): w

nを入力して新しいパーティションを作るさい

途中下記4つをどうするか色々聞かれるが、全部デフォルトでいいので何もせずエンターでよい

1
2
3
4
Select (default p)
Partition number (1-4, default 1)
First sector
Last sector


同様にsdb, sdcもやっていく

それぞれできてるか確認

1
2
3
4
5
6
7
$ ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 Apr 28 14:03 /dev/sda
brw-rw---- 1 root disk 8, 1 Apr 28 14:03 /dev/sda1
brw-rw---- 1 root disk 8, 16 Apr 28 14:05 /dev/sdb
brw-rw---- 1 root disk 8, 17 Apr 28 14:05 /dev/sdb1
brw-rw---- 1 root disk 8, 32 Apr 28 14:05 /dev/sdc
brw-rw---- 1 root disk 8, 33 Apr 28 14:05 /dev/sdc1


RAID用のパッケージをインストール

1
2
3
$ sudo apt-get install mdadm -y
途中のconfiguration画面 は ESC キーを押してキャンセルしてよい,もしくは all を入力


RAID構築コマンドを実行

1
2
3
$ sudo mdadm -C /dev/md0 -l 5 -n 3 /dev/sd[abc]1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
  • -C RAIDのデバイス名: RAIDアレイ名を指定する。マルチプルデバイスなでmd
  • -l 数字: RAIDのレベルを指定。今回はRAID5なので数字は5
  • -n 数字: RAIDのデバイス数を指定。今回は3台なので3
  • /dev/sd[abcd]1: sda1, adb1, adc1 を使用するという意味

実は結構時間がかかってて、裏側でRAID構成のために動いてる

構成の進捗確認は下記でできる

1
2
3
4
5
6
7
8
9
10
11
$ sudo cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md1 : active raid5 sda1[0] sdb1[1] sdc1[2]
15120384 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
[===================>.] recovery = 99.4% (7521660/7560192) finish=0.1min speed=3543K/sec
unused devices: <none>
継続して監視する場合は下記
$ sudo watch -n1 cat /proc/mdstat


完了すると下記のようにでた

1
2
3
4
5
6
$ sudo cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md1 : active raid5 sda1[0] sdb1[1] sdc1[0]
15120384 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>


とりあえずあとは構成して自動で認識、マウントまでしてしまうようにする

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sudo mkfs -t ext4 /dev/md0
$ sudo mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 name=raspberrypi:1 UUID=891d584b:78e43777:72a42a52:8aa86094
自分は上記出力結果が出てきたので、それを下記で書き込む
$ sudo vim /etc/mdadm/mdadm.conf
#下記を書き込む
ARRAY /dev/md0 metadata=1.2 name=raspberrypi:1 UUID=891d584b:78e43777:72a42a52:8aa86094
自動マウント設定
$ sudo vim /etc/fstab
/dev/md0 /usbmem ext4 defaults,noatime 0 0


ちなみに、自動マウント設定はdefaultsもいいけど、マウントに失敗してしまうとemergencyモードで立ち上がってしまって

ssh接続とかできなくなるので、オプションはnofailがよいかも

CentOS7の/etc/fstabのnofailオプション(あるいはsystemd) - Qiita

というわけで実際は下記にした

1
/dev/md0 /usbmem ext4 defaults,nofail,noatime 0 0

これで、rebootした状態でもRAIDが構築されていたら成功

ただし、どうやらたまにマウントに失敗してしまうことがあって

最初はデバイス名が変わってしまうこととかが原因かと思ったけどそれよりも

mountする時にデバイスが認識されるのとRAIDの構築プログラムの立ち上がりの差異が生じること?

みたいなのが原因みたいなので下記リンク先ページを参考にbootを遅らせてみることにした

USBメモリでRAID 5を構築(3)

1
2
3
4
5
$ sudo vim /etc/init.d/mdadm-raid
# 下記二行を追加
# wait 10 seconds for USB memory detected.
/bin/sleep 10


追加場所は下記を参照

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
...
case "${1:-}" in
start)
PREFIX="Assembling MD array"
if [ ! -f /proc/mdstat ] && [ -x "$(command -v modprobe)" ] ; then
modprobe -q md 2>/dev/null || :
fi
if [ ! -f /proc/mdstat ]; then
log_problem "failed to load MD subsystem"
exit 0
fi
if [ ! -f $CONFIG -a ! -f $ALTCONFIG ]; then
log_problem "no $CONFIG file"
exit 0
fi
# handle devfs-style names and version-1 devices
# fail gracefully in case we're on a read-only filesystem, in which
# case it's safe to assume that the admin knows what s/he's doing.
# See (#382876).
mkdir --parent /dev/md || :
# ugly hack because shell sucks
IFSOLD=${IFS:-}
IFS='
'
# 下記二行を追加
# wait 10 seconds for USB memory detected.
/bin/sleep 10
for line in $($MDADM --assemble --scan --auto=yes --symlink=no 2>&1); do
...


これで今のところ問題なくRAIDが使えるようになった


あとは補足事項や調べたことをなんとなく



とりあえずddコマンドでテストしてみる


RAIDが構築されているかLinuxのddコマンドでテストしてみる

下記を参考にした

Raspberry PiにUSBメモリ4本でRAID10を組む - Qiita

1
2
$ cd /usbmem
$ sudo dd if=/dev/zero of=file bs=10M count=10



mdadmコマンドについて


mdadm(8) ver.1.5 man page [日本語]

例えば下記コマンドでraidを構築する時

1
2
3
4
$ sudo mdadm --create /dev/md0 --level=raid1 --raid-devices=2 /dev/sda1 /dev/sdb1
下記コマンドも同じ意味
$ sudo mdadm -C /dev/md0 -l 1 -n 2 /dev/sd[ab]1
  • –create /dev/md0
    • /dev/md0 というRAIDのディレクトリを構築
    • -C /dev/md0 でも同じ意味
  • –level=raid1
    • RAID1を構築するという意味
    • RAID5の場合は –level=raid5
    • -l 1 とかでも可能
  • –raid-devices=2 /dev/sda1 /dev/sdb1
    • RAIDに用いるデバイス数が2個ということ
      • それぞれ /dev/sda1 /dev/sda2
    • -n 2 でも同じこと


その他コマンドだと(スーパーユーザーで実行するので # )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
RAIDの詳細の確認
# mdadm --detail /dev/md0
1代目のハードディスク /dev/sda に障害を発生させる
# mdadm --fail /dev/md0 /dev/sda
障害が発生したHDD(/dev/sda)を/dev/md0から切り離す
# mdadm --remove /dev/md0 /dev/sda
RAIDデバイスにハードディスク /dev/sdbを追加する
# mdadm --add /dev/md0 /dev/sdb
HDDを交換した場合はRAID情報を保存
# mdadm --detail --scan > /etc/mdadm.conf



デバイス名は固定にしなくてもよい?


実際、デバイス名を固定する必要があるのかなぁと思ったら下記ページもヒットした

USBメモリでRAID 5を構築(1)

でも、この作業が本当に必要なのか、イマイチ分かってません。と言うのも、後で構築されたRAIDアレイの情報を見る(mdadm –detail /dev/md0)と、構成デバイス名は /dev/sd* の方で表示されていますし、構成情報にはUUIDで記録されている様子だからです。

確かに特に固定しなくても、デバイスさえちゃんと認識されてたら大丈夫なような気がする・・・がこのあたり

調べてもまだはっきりとはよくわからない

とりあえず上記リンク先の方法でも固定IDにする方法は載ってるので、それもやっておくとより安全ではあるかもしれない



なんかいったんUSBが1本認識されなくなった


なんか cat /proc/mdstat してみたらアクティブなusbが 3/2 だったこれは・・・?

とりあえずmdstatの読み方

◇起動設定とメンテナンス◇初心者のためのLinuxサーバー構築講座(CentOS 自宅サーバー対応)☆お便利サーバー.com☆

自分の時は、以下のようなのがでてきてどうやらusbメモリが1本認識されてない状態が生じてた

1
2
md1 : active raid5 sda1[0] sdb1[1]
15120384 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
  • md1:
    • RAIDデバイス名
  • active
    • 動作状態
  • raid5
    • RAIDレベル
  • sda1[0] sdb1[1]
    • パーティション[認識番号]
    • パーティションがsda1とsdb1を使ってて、認識番号がそれぞれ0と1ということっぽい
  • 15120384 blocks
    • RAIDのサイズ、blockで表される(これだと約15GB)
  • [3/2]
    • 3がRAIDを構成すべきパーティション数、2が実際に稼働しているパーティション数
  • [UU_]
    • パーティションの動作状態

つまり、なんか一個ディスクが壊れてるってことなのかな・・・・?
と思ったけど、RAIDを一旦解除してメモリをフォーマットしてもう一度構成し直したら大丈夫だった

ので、とりあえずRAID解除と再び構成までを下記にメモ


◇mdadmによるRAIDの解除◇初心者のためのLinuxサーバー構築講座(CentOS 自宅サーバー対応)☆お便利サーバー.com☆
を参考にして

fstab、mdadm.confに記載したものを削除した後

mdadmコマンドでRAIDをストップ、usbメモリのブロックを削除後フォーマットした

1
2
3
4
5
6
$ sudo mdadm --misc --stop /dev/md0
mdadm: stopped /dev/md0
$ sudo cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
unused devices: <none>

RAIDが解除されると /proc/mdstat のステータスが消える

次に、ハードディスク上のスーパーブロックを削除する

1
2
3
$ sudo mdadm --misc --zero-superblock /dev/sda1
$ sudo mdadm --misc --zero-superblock /dev/sdb1
$ sudo mdadm --misc --zero-superblock /dev/sdc1


最後にfdiskコマンドで各パーティションを削除したらok

例えばsdaの場合は下記

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ sudo fdisk /dev/sda
Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): d
Selected partition 1
Partition 1 has been deleted.
Command (m for help): p
Disk /dev/sda: 7.2 GiB, 7746879488 bytes, 15130624 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xe9e34eb6
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

後は普通に構築し直せばok



その他tips


調べてたら便利そうかもなってリンクがあった



このエントリーをはてなブックマークに追加