Skip to content
Htkyama Blog

Raspberry PiにUSBメモリでRAID0を組む

Raspberry Pi1 min read

Raspberry Pi

Raspberry PiのmicroSDカードでの読み書きの速度と寿命に物足りなさを感じていたため、USBメモリを2本使って RAID0 を組んでみました。

使ったもの

  • Raspberry Pi 3B+
  • SanDisk: Cruzer Fit SDCZ33-032G-G35 2本

USBメモリは、Amazon で安かった並行輸入の海外パッケージものです。小型なので、Raspberry Pi に付けても邪魔にならなくていいです。

Raspberry PiにはUSBポートが4つあるので、USBメモリでポートが2つ埋まっても、マウスやキーボード等を残りの2つのUSBポートで使えるので大丈夫です。

USBメモリのフォーマット

fdiskコマンドで、USBメモリをフォーマットします。

流れは以下となります。

  1. pを入力して、現在のフォーマットされている情報を確認
  2. dを入力して現在のパーティションを削除
  3. nを入力して新たなパーティションを作成
  4. tを入力してパーティションのタイプを変更
  5. wを入力してパーティションテーブルを書き込み

ポイントは、パーティションタイプで Linux raid autodetect (下の例ではfdを入力)を選ぶところです。

USBメモリは、USBポートに挿した順に /dev/sda, /dev/sdb と認識されます。/dev/sdafdiskコマンドでフォーマットする場合は以下のようになります。(4GBのUSBメモリを使ってます。)

$ sudo fdisk /dev/sda
Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/sda: 3.8 GiB, 4089446400 bytes, 7987200 sectors
Disk model: Flash Disk
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: 0x0bc34daa
Device Boot Start End Sectors Size Id Type
/dev/sda1 2792 7987199 7984408 3.8G b W95 FAT32
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): p
Partition number (1-4, default 1): 1
First sector (2048-7987199, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-7987199, default 7987199):
Created a new partition 1 of type 'Linux' and of size 3.8 GiB.
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 or 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 ea Rufus alignment
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT
10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto
1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep
1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT
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.

利用するUSBメモリを2本分、フォーマットします。

mdadm による RAID の設定

RAID を管理するためのソフトウェア mdadm をインストールします。

$ sudo apt install mdadm

2本のUSBメモリのパーティション /dev/sda1/dev/sdb1 をRAID0で、RAIDデバイス /dev/md0 に割り当てます。

$ sudo mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sda1 /dev/sdb1

md0 が作成されているのを確認した後に、/etc/mdadm/mdadm.conf に設定情報を書き込みます。 (mdadm --create で作成された情報は再起動すると消えてしまいます。)

$ cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 sdb1[1] sda1[0]
60051456 blocks super 1.2 512k chunks
unused devices: <none>
$ sudo mdadm --detail --scan >> /etc/mdadm/mdadm.conf

作成したRAIDデバイス /dev/md0 に ext4 ファイルシステムを構築します。

$ sudo mkfs -t ext4 /dev/md0

USBメモリのデバイス名固定

USBメモリのデバイス名は認識された順に /dev/sda, /dev/sdb と自動で割り当てられてしまうため、Raspberry Piを再起動した後に RAID が崩れる危険性があります。 そのため、各USBメモリのデバイス名を固定するようにします。

USBメモリのデバイス情報取得

udevadmコマンドで挿さっているUSBメモリのデバイス情報を取得します。

$ udevadm info -a -n /dev/sda
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
... 中略 ...
looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2':
KERNELS=="1-1.1.2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bNumInterfaces}==" 1"
ATTRS{urbnum}=="128521"
ATTRS{bcdDevice}=="0100"
ATTRS{devnum}=="5"
ATTRS{busnum}=="1"
ATTRS{maxchild}=="0"
ATTRS{bDeviceSubClass}=="00"
ATTRS{devpath}=="1.1.2"
ATTRS{ltm_capable}=="no"
ATTRS{speed}=="480"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{idProduct}=="5571"
ATTRS{devspec}==" (null)"
ATTRS{bmAttributes}=="80"
ATTRS{authorized}=="1"
ATTRS{version}==" 2.00"
ATTRS{bConfigurationValue}=="1"
ATTRS{manufacturer}=="SanDisk'"
ATTRS{bMaxPower}=="200mA"
ATTRS{tx_lanes}=="1"
ATTRS{rx_lanes}=="1"
ATTRS{serial}=="4C530000230910104442"
ATTRS{configuration}==""
ATTRS{removable}=="removable"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bNumConfigurations}=="1"
ATTRS{idVendor}=="0781"
ATTRS{product}=="Cruzer Fit"
... 以下略 ...

シリアル番号 ATTRS{serial} と製品名 ATTRS{product} を組み合わせれば、それぞれのUSBメモリを一意に特定できそうです。

USBメモリのデバイス名割り当て

USBメモリのデバイス名を

  • /dev/raid_01_001
  • /dev/raid_01_002

に割り当てるように、ファイル /etc/udev/rules.d/mdadmcheck.sh/etc/udev/rules.d/10-local.rules を作成します。

USBメモリを認識して、ATTRS{serial}の値が"Cruzer Fit"でかつ、ATTRS{product}の値が上記で調べたシリアル番号と一致した場合に /etc/udev/rules.d/mdadmcheck.sh を実行するようにします。

/etc/udev/rules.d/mdadmcheck.sh
1#!/bin/bash
2
3if [ $# -ne 2 ]; then
4 echo "Argument Error $#" 1&2
5
6 exit 1
7fi
8
9DEVICE_COUNT=`ls $(echo $1) | wc -l`
10
11echo $DEVICE_COUNT
12
13if [[ ${DEVICE_COUNT} -eq $2 ]]; then
14 echo 'OK'
15 mdadm --assemble --scan
16fi
17
18exit 0
/etc/udev/rules.d/10-local.rules
1ACTION=="add" SUBSYSTEMS=="usb", ATTRS{product}=="Cruzer Fit", ATTRS{serial}=="4C530000230910104442", SYMLINK="raid_01_001%n" RUN+="/etc/udev/rules.d/mdadmcheck.sh '/dev/raid_01_00[1234]1' 4"
2ACTION=="add" SUBSYSTEMS=="usb", ATTRS{product}=="Cruzer Fit", ATTRS{serial}=="4C530000220910104442", SYMLINK="raid_01_002%n" RUN+="/etc/udev/rules.d/mdadmcheck.sh '/dev/raid_01_00[1234]1' 4"

再起動後、以下のように割り当てられているのが確認できます。

$ ls -l /dev/raid*
lrwxrwxrwx 1 root root 3 328 17:46 /dev/raid_01_001 -> sda
lrwxrwxrwx 1 root root 3 328 17:46 /dev/raid_01_0010 -> sg0
lrwxrwxrwx 1 root root 4 328 17:46 /dev/raid_01_0011 -> sda1
lrwxrwxrwx 1 root root 15 328 17:46 /dev/raid_01_0012 -> bus/usb/001/005
lrwxrwxrwx 1 root root 3 328 17:46 /dev/raid_01_002 -> sdb
lrwxrwxrwx 1 root root 11 328 17:46 /dev/raid_01_0020 -> bsg/1:0:0:0
lrwxrwxrwx 1 root root 4 328 17:46 /dev/raid_01_0021 -> sdb1

RAIDデバイスのマウント

RAIDデバイスを mount するために、md0 が割り当てられている uuid を確認し、/etc/fstab に追記します。

$ ls -l /dev/disk/by-uuid/* | grep md0
lrwxrwxrwx 1 root root 9 328 17:46 /dev/disk/by-uuid/********-****-****-****-************ -> ../../md0
$ sudo echo 'UUID=********-****-****-****-************ /media/usb ext4 nofail 0 2' >> /etc/fstab

参考

© 2023 All rights reserved.
RSS