今回の記事では、前回、設置した4台のハードディスクを2組のRAID1ディスクに構成にします。raspberry pi特有なのか、外付けHDDでRAIDを組む場合に起こるのか、いくつか問題が発生しましたので、その問題解決を含めて、説明していきます。
1. RAIDディスク構築の流れ
RAIDディスク構築の大まかな流れは、以下の通りです。
- RAIDに用いるディスクにRAID用のパーティションを作成する。
- それぞれのパーティションを用いて、RAIDディスクを構成する。
- RAIDディスクに ファイルシステムを作成する。
- マウントする(必要に応じて、自動マウントするように設定する)。
今回は、2台のRAIDディスクを作成するので、まず1台目のRAIDを上記の流れに従って設定した後に、2台目を1台目と同様に設定します。
以下では、流れに沿ってそれぞれ説明します。
2. RAID用パーティションの作成
2.1 ディスクの確認
まずは、4台あるディスクがちゃんと認識されているか確認します。
$ lsusb
Bus 001 Device 021: ID 1bcf:0c31 Sunplus Innovation Technology Inc. SPIF30x Serial-ATA bridge
Bus 001 Device 020: ID 1bcf:0c31 Sunplus Innovation Technology Inc. SPIF30x Serial-ATA bridge
Bus 001 Device 019: ID 174c:55aa ASMedia Technology Inc. ASMedia 2105 SATA bridge
Bus 001 Device 017: ID 174c:55aa ASMedia Technology Inc. ASMedia 2105 SATA bridge
Bus 001 Device 016: ID 1a40:0201 Terminus Technology Inc. FE 2.1 7-port Hub
Bus 001 Device 004: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ ls /dev/sd*
/dev/sda /dev/sdb /dev/sdc /dev/sdd
上の4つがHDDなのですが、4つもあるとどれとどれが対応するのか区別ができないので(*)、まず2つのHDDを用いて1つのRAIDディスクを構成することにしました。はじめに、USB2.0のHDDを外したところ、ASMediaが/dev/sda,/dev/sdbとして残りました。これがUSB3.0のHDDです。残りが、SunplusがUSB2.0のHDDとなります。
*: lsusbやhdparmでは特定できませんでした。どうすれば良かったんだっけ?
2.2 パーティションの作成
fdiskやparted、gpartedなどで、パーティションテーブルを編集できます。ここでは、fdiskとpartedでの作成例を示します。実際にはfdiskで作成しました。
昔は、fdiskでは2TB超のHDDを取り扱えない場合があったので、partedを使う必要がありましたが、最近はどうなんでしょう。
(追記:2016/6/6) 2TB超の場合、gdiskを使うようです。パーティションテーブルの編集には、これまでpartedを使っていましたが、次の機会にはgdiskを使ってみようと思います。
2.2.1 fdiskを使う場合
fdiskの場合、最短「n→(default)→t→fd→w」だけのキー入力なので、簡単です。
$sudo fdisk /dev/sda
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p):
Using default response p.
Partition number (1-4, default 1):
First sector (2048-3907029167, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-3907029167, default 3907029167):
Created a new partition 1 of type 'Linux' and of size 1.8 TiB.
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): L
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC b
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f4 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT
1e Hidden W95 FAT1 80 Old Minix
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
2.2.2 partedを使う場合
partedを使う場合には、以下のようになります。
$ sudo parted /dev/sda
(parted) mklabel msdos
(parted) mkpart
Partition type? primary/extended? primary
File system type? [ext2]? ext4
Start? 0
End? -1s
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? I
(parted) set 1 raid on
(parted) p
Model: ST2000LM 003 HN-M201RAD (scsi)
Disk /dev/sdb: 2000GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 512B 2000GB 2000GB primary ext4 raid, lba
(parted) quit
RAIDで使うので、file system typeを指定する必要はないような気がしますが、いつも使っているext4を指定しています。
3. RAID1デバイスの作成
/dev/sda,/dev/sdbのパーティションを作成したら、次にRAIDデバイスを構成します。
3.1 mdadmのインストール
RAIDディスクを構築・管理するmdadmをインストールします。
$ sudo apt-get install mdadm
インストールの途中、起動時にアレイを開始するか聞かれましたが、"none"と回答しました。本当のサーバ機なら、"all"のままでいいと思いますが、ときどき外付けHDDを外したりするのではないかと思ったので、"none"にしました (*) 。ubuntuでは聞かれない質問でしたので、ちょっと困惑。
*: 最終的には、"all"にしました。"none"のまま自動マウントを設定すると、ラズパイの起動が途中で停止して、自動マウントが設定できなかったのです。やはり、自動マウントできる方が便利なので、"all"に変更しました。但し、"auto"でもRAIDにトラブルが発生した場合には、やはり停止します。途中停止した場合には、コンソールでrootになって、emacsやnanoで/etc/fstabを編集し、RAIDディスクをマウントしないようにすれば、起動できるようになりましたが、ディスプレイ・キーボードなしだとこれができないので、この場合、"none"にして、手動でRAIDを起動した方がよいかもしれません(ディスプレイ・キーボードなしの私の初代ラズパイサーバは、起動がストップして困ったことはありません。fstabのディスクマウントのエラー時の処理の仕様が変わったのでしょうかね)。
(追記:2016/6/6) 初代ラズパイはwheezy、ラズパイ3はjessieですが、jessieではマウント時の取り扱いに変更があり、リムーバブルドライブのマウントオプションはnoauto(自動マウントしない)かnofail(マウント失敗してもbootは継続する)を付けるようにする方がよいとのこと*1。起動が途中停止してしまうのは、この違いでしょうかね。
(追記:2016/6/9) RAIDのresync/recovery完了後の検証ですが、後述のrootdelay=10の設定後は、"none"でも"all"でも、どちらでも自動マウントができました。"none"でも起動完了後にはRAIDはアクティブになっていたので、"none"だからといって、RAIDデバイスが起動されないということではないようです。
mdadmのインストール時の問い合わせ。
"none"で自動マウントを設定すると、RAIDが起動していない状態でディスクをマウントしようとする。タイムアウトするまで待って、その後、起動が途中停止する(sshではアクセスできない)。
3.2 RAIDデバイスの作成
mdadmを使って、RAIDデバイス/dev/md0を構成しました。
$ sudo mdadm --create --auto=yes /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
/bootは入れられないよ、と警告がでますが、/bootは入れないのでyesを回答。
これで、/dev/md0というRAID1デバイスが構成されます。
$ cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
1953382464 blocks super 1.2 [2/2] [UU]
[>....................] resync = 0.8% (16852864/1953382464) finish=1635.4min speed=19734K/sec
bitmap: 15/15 pages [60KB], 65536KB chunk
unused devices:
最後に以下のコマンドの結果を /etc/mdadm/mdadm.confに追加し、デバイスの構成情報を保存します。
$ mdadm --examine --scan
ARRAY /dev/md/0 metadata=1.2 UUID=15735a52:1da65294:0a996f65:f5bbe070 name=raspi3:0
4. RAIDデバイスのマウント
4.1 パーティション、ファイルシステムの作成
作成したRAIDデバイスにパーティション、ファイルシステムを作成し、マウントできるようにします。ファイルシステムはext4で作成しました。
$ sudo fdisk /dev/md0
$ sudo mkfs -t ext4 /dev/md0p1
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 488345360 4k blocks and 122093568 inodes
Filesystem UUID: 4dd6b454-33a5-4746-b86a-9e71ef1e5bda
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
4.2 マウントの設定
4.2.1 mdadmのインストールで、boot時のRAID起動を"none"にした場合
この場合、起動時にmd0にアクセスできませんので、起動完了後に以下を実行します。
$ sudo mdadm --assemble /dev/md0
(あるいは sudo mdadm --assemble --scan この場合、全てのRAIDディスクがアクティブになる)
$ sudo mount /dev/md0p1 /mnt/raspi3-u3/
ラズパイ本体を再起動、動作確認をして設定完了です。
4.2.2 mdadmのインストールで、boot時のRAID起動を"all"にした場合
まず、blkidで/dev/md0p1のUUIDを調べます。
$ sudo blkid /dev/md0p1
/dev/md0p1: UUID="4dd6b454-33a5-4746-b86a-9e71ef1e5bda" TYPE="ext4" PARTUUID="fe3a90ec-01"
このUUIDを用いて、以下の行を/etc/fstabに追加し、自動的にマウントするようにします。マウントポイントは、/mnt/raspi3-u3にしています。
UUID=4dd6b454-33a5-4746-b86a-9e71ef1e5bda /mnt/raspi3-u3 ext4 defaults,nofail 0 0
注:nofailにより、自動マウント失敗した場合でも、bootが停止しない*2。
マウントして、fstabの設定を確認します。
$ sudo mount -a
$ df
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/root 61874300 13033784 46271248 22% /
devtmpfs 469688 0 469688 0% /dev
tmpfs 474004 0 474004 0% /dev/shm
tmpfs 474004 6644 467360 2% /run
tmpfs 5120 4 5116 1% /run/lock
tmpfs 474004 0 474004 0% /sys/fs/cgroup
/dev/mmcblk0p1 61384 20376 41008 34% /boot
tmpfs 94804 0 94804 0% /run/user/1000
tmpfs 94804 0 94804 0% /run/user/109
tmpfs 94804 4 94800 1% /run/user/1002
/dev/md0p1 1922598776 68956 1824844364 1% /mnt/raspi3-u3
自動的にマウントしたい場合には、"none"ではなく、"all"を選択し、RAIDを起動させておく必要がありますが、既にnoneを選択している場合には、dpkg-reconfigureで"all"に再設定できます(dpkg-reconfigureでは、他に、定期的な冗長性のチェックや監視デーモンの起動、メールの通知先の設定もできます)。
$ sudo dpkg-reconfigure mdadm
再起動して、特に問題がなければ、RAIDディスクの設定は終了です。
問題がありました...。通常であれば、再起動して問題なく動作するはずですが、正常に起動しませんでした。コンソールメッセージを見ていると、RAIDのアクティブ化に失敗している模様。いろいろ調べたところ、外付けディスクの起動を待つ必要があるようなので、bootを遅延させることで、解決できました。
bootの遅延は、/boot/cmdline.txtの既存行に以下のように"rootdelay=10"を追加しました*3。
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootdelay=10 rootwait
以上で、1台目のRAID1ディスクの完成です。
5. 2台目のRAIDディスクの構築
2台目のRAIDディスクも1台目と同様に設定を行います。
5.1 デバイス名の確認
1台目のRAID1ディスクが接続している状態で、既存のHDDのデバイス名を確認します。
$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sdb /dev/sdb1
次に、2台目のHDDを接続し、デバイス名を確認します。
$ ls /dev/sd*
/dev/sdc /dev/sdd /dev/sdd1 /dev/sde
あれれ、...。/dev/sda,/dev/sdbが消えている。HDDを3台しか認識していない。その後、いろいろやってみましたが、(リビルド中でHDDの電力消費が多いため?)1つのハブではデバイスの認識が不安定になっているようなので、もう1つハブを加えて、配線し直しました。
$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sdb /dev/sdc /dev/sdc1 /dev/sdd
/dev/sda1, /dev/sdc1が1台目RAIDディスク、/dev/sdb,/dev/sddがUSB2.0のHDDです。同じHDDケース、同じ内蔵HDDだと、さらに混乱するので、hdparmで予めHDDのシリアル番号を調べておいた方がよいかもしれません。
$ sudo hdparm -I /dev/sdb | grep Serial\ Number
Serial Number: S321J9AF907896
$ sudo hdparm -I /dev/sdd | grep Serial\ Number
Serial Number: S321J9AF907882
5.2 2台目のRAIDディスクの設定
デバイス名が確認できたら、あとは1台目のRAIDディスクと同様に設定を行います。
$ sudo fdisk /dev/sdb (Linux raid autodetectで作成)
$ sudo fdisk /dev/sdd (Linux raid autodetectで作成)
$ sudo mdadm --create --auto=yes /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdd1
$ sudo mdadm --examine --scan (md1に対応する記述を/etc/mdadm/mdadm.confに追加)
$ sudo fdisk /dev/md1
$ sudo mkfs -t ext4 /dev/md1p1
---手動マウントの場合---
$ sudo mount /dev/md1p1 /mnt/raspi3-u2
---自動マウントの場合---
$ sudo blkid /dev/md1p1 (出力されるUUIDを用いて /etc/fstabを編集)
$ sudo mount -a
再起動して期待通りの動作をしているか、確認します。2台ともに正常動作していれば、RAIDディスクの設定は完了です。
5.3 RAIDの同期時間
最後に、同期の完了時間を確認してみました。
$ cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdb1[0] sdd1[1]
1953382464 blocks super 1.2 [2/2] [UU]
[=>...................] resync = 7.3% (143416704/1953382464) finish=2875.6min speed=10489K/sec
bitmap: 14/15 pages [56KB], 65536KB chunk
md0 : active raid1 sda1[0] sdc1[1]
1953382464 blocks super 1.2 [2/1] [_U]
[==>..................] recovery = 13.8% (269767488/1953382464) finish=2728.5min speed=10283K/sec
bitmap: 13/15 pages [52KB], 65536KB chunk
unused devices:
finishするのに、約2800min、まるまる2日かかります。RAIDが1台だけだと、1日程度だったので、約2倍になってしまいました。USBの転送速度がネックになっているのでしょうかね。
md0の"recovery"は、ご愛敬。いろいろやっているうちに、修復することになってしまいました。
6. おわりに
今回は、raspberry pi3でのRAID1ディスクの構築についてまとめました。ubuntu+内蔵HDDで構成する場合と違って、多少苦労しました。特に、起動を遅延させること、ハブの給電不足の解消のところでハマりました。2つハブが必要になったり、最近2TBでは窮屈だったりしているので、初代ラズパイとの兼ね合いでHDD3台の4TBのRAID5ディスクに構成し直すかもしれません。
次回は、samba、nfsなどを使ったファイル共有についてまとめる予定です。
(2016/6/6)
(追記:2016/6/9)
ラズパイ3でのRAID設定の注意点をまとめると、
- HDDの起動を待つため、bootを遅延させる(/boot/cmdline.txtにrootdelay=10を追加)。
- 自動マウント失敗での起動停止を避けるなら、/etc/fstabでnofailを追加する。
boot時のRAID起動設定の"none","all"は、少なくともRAIDが正常な状態では、自動マウントを含めて違いはないように見えます。
参考文献
関連記事