LoginSignup
4
7

More than 5 years have passed since last update.

Raspberry PiでUSBメモリを使ってRAID1を構築する

Posted at

はじめに

作業メモです。

用意

  • Raspberry Pi 3 Model B
  • microSDカード 8GB
  • USBメモリ 2本

目標・ゴール

  • USBメモリ 32GB 2本をRAID1:ミラーリングで構築する。
  • 書き込みが多いと思われる/tmp, /var, /homeをUSBメモリのボリュームに移動する

セットアップとインストール

作業の前にUSBメモリをチェック

ddで書き込みテスト

基本的にエラーは出ないはずですが、念の為に書き込みテストします。最後までddコマンドが完走すれば問題ありません。もしエラーが発生する場合、USBメモリの状態がよろしくない(物理ディスク容量と論理ディスク容量が一致しない)ので、SDメモリカードフォーマッターで上書きフォーマットします。

$ sudo dd if=/dev/zero of=/dev/sdc bs=128M status=progress

bsオプションをつけたほうがよいですよ!と@hidaoさんにアドバイスもらいコマンド実行しました。status=progressddの進捗表示できます。

USBメモリの状態がよろしくない状態で作業を進めていくと、RAIDの構築中にエラーメッセージが出て止まります。このときのエラーメッセージはざっくりとしたもので原因特定できるものでは無かったです。(もしかして、/var/log/あたりにログファイルができているのかもしれない。)

SDメモリカードフォーマッターで上書きフォーマット

ddコマンドが完走できなかったなどの問題があった場合、SDメモリカードフォーマッターを使って上書きフォーマット初期化します。ちょっと時間がかかるのでRaspberry Piのパッケージアップデートと平行作業で進めるといいかもしれません。

OS:raspbianの準備

microSDカードにraspbianを書き込む

公式サイトからイメージをダウンロードして、2018-03-13-raspbian-stretch-lite.imgをmicroSDカード書き込む。

microSDカードのbootドライブに"ssh"ファイルを置く

ssh接続ができるようになります。

パッケージのアップデート

$ sudo apt update
$ sudo apt upgrade
$ sudo reboot

IPアドレスの固定

LAN内のみの利用のためIPv4のみ設定してIPv6は設定しない。

/etc/dhcpcd.conf
# Example static IP configuration:
- #interface eth0
- #static ip_address=192.168.0.10/24
+ interface eth0
+ static ip_address=192.168.110.32/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
- #static routers=192.168.0.1
- #static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1
+ #static routers=192.168.110.1
+ #static domain_name_servers=192.168.110.1 8.8.8.8

Raspberry PiにUSBメモリを挿してから

ディスクの状態確認

$ sudo fdisk -l

作業前

Disk /dev/sda: 29.4 GiB, 31541166080 bytes, 61603840 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: 0xc3072e18

Device     Boot Start      End  Sectors  Size Id Type
/dev/sda1         480 61603839 61603360 29.4G  c W95 FAT32 (LBA)


Disk /dev/sdb: 29.4 GiB, 31576817664 bytes, 61673472 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: 0xc3072e18

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdb1         224 61673471 61673248 29.4G  c W95 FAT32 (LBA)

同じメーカーのUSBメモリの別ロットを買いましたが、大体おなじ容量ですが、細かい数字でみると微妙に容量が違うようです。容量が違うディスクをRAID1:ミラーリングすることができないので、容量を揃えて置く必要があるかな?と思ったけど、そのままでも大丈夫なようです。

USBメモリの初期化(fdisk)

USBメモリのデバイスをそれぞれ初期化します。今回の対象は/dev/sda/dev/sdb。USBメモリのサイズは2TB未満なので、fdiskで初期化しました。2TB以上(HDD?)を対象とするときは、こちらのRaspberry PiにUSBメモリ4本でRAID10を組むを参照するといい感じに。

$ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.29.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): 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-61603839, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-61603839, default 61603839): 

Created a new partition 1 of type 'Linux' and of size 29.4 GiB.

Command (m for help): t
Selected partition 1
Partition type (type L to list all types): 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.

上記のパーテーション設定作業を、USBメモリの数だけ繰り返します。

もう一回、ディスクの状況確認。

sudo fdisk -l

実行結果

Disk /dev/sda: 29.4 GiB, 31541166080 bytes, 61603840 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: 0xbece4ca8

Device     Boot Start      End  Sectors  Size Id Type
/dev/sda1        2048 61603839 61601792 29.4G fd Linux raid autodetect


Disk /dev/sdb: 29.4 GiB, 31576817664 bytes, 61673472 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: 0x066b3594

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdb1        2048 61673471 61671424 29.4G fd Linux raid autodetect

初期化されました。

ソフトウェアRAIDツールのインストール

$ sudo apt update
$ sudo apt install mdadm

ソフトウェアRAIDツールの実行

$ sudo mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sd[ab]1
mdadm: array /dev/md0 started.

進捗確認。USBメモリ32GB 2本のミラーリング、大体30分くらいかかります。

$ sudo watch -n5 cat /proc/mdstat

ソフトウェアRAIDの設定を保存する

$ sudo mdadm --detail --scan >> /etc/mdadm/mdadm.conf

初期化してマウント

$ sudo mkfs -t ext4 /dev/md0
$ sudo mkdir /mnt/usbmemory
$ sudo mount /dev/md0 /mnt/usbmemory

起動時に自動マウントするために

RAIDボリュームのUUIDを確認。

$ sudo blkid
/dev/md0: UUID="0a70920a-279e-46e8-8e0f-3690c118ffd3" TYPE="ext4"

/dev/md0のUUIDをメモします。UUIDを/etc/fstabに記録

/etc/fstab
+ UUID=0a70920a-279e-46e8-8e0f-3690c118ffd3  /mnt/usbmemory    ext4   defaults,nofail 0 0

データのコピー

シングルユーザーモードに切り替えてrsyncする。

$ sudo init 1
$ sudo rsync -aAXv --exclude={"/boot/*","/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /mnt/usbmemory

参考:Rsync によるフルシステムバックアップ - ArchWiki

後作業

お好みで /var, /tmp, /home などを新しいボリュームにシンボリックリンクを作成する

最後に

下記のパターンをやろうとしたのですが、いろいろチャレンジしてみたところ、うまくいかなかったので諦めました。

  • SDカードを抜いてUSBメモリから起動
  • USBメモリから起動してRAID1を構築

コマンドを見直したら全コマンドでsudoしていたので、suでrootユーザーで作業をしてもよかったかもしれない。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7