虎之助の徒然記

Raspberry Pi3でサーバを構築する (2) RAID1ディスクの構築

 今回の記事では、前回、設置した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デバイスが起動されないということではないようです。

f:id:toranosuke_blog:20160606003847p:plain
mdadmのインストール時の問い合わせ。

f:id:toranosuke_blog:20160606084109j:plain
"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が正常な状態では、自動マウントを含めて違いはないように見えます。

参考文献

関連記事

*1:http://qiita.com/Cinosura/items/6ab435331ea2b3671a1d

*2:https://www.debian.org/releases/jessie/i386/release-notes/ch-information.ja.html#systemd-auto-mounts-incompat

*3:http://blog.drewwithers.com/2013/11/raspberry-pi-usb-raid1-root-partition.html
このブログの記事はRAIDブートの方法ですが、SSDブートにも応用できそうですね。後々、問題が生じそうなので、やりませんけど...。