— Raspberry Pi — 1 min read
Raspberry PiのmicroSDカードでの読み書きの速度と寿命に物足りなさを感じていたため、USBメモリを2本使って RAID0 を組んでみました。
USBメモリは、Amazon で安かった並行輸入の海外パッケージものです。小型なので、Raspberry Pi に付けても邪魔にならなくていいです。
Raspberry PiにはUSBポートが4つあるので、USBメモリでポートが2つ埋まっても、マウスやキーボード等を残りの2つのUSBポートで使えるので大丈夫です。
fdisk
コマンドで、USBメモリをフォーマットします。
流れは以下となります。
p
を入力して、現在のフォーマットされている情報を確認d
を入力して現在のパーティションを削除n
を入力して新たなパーティションを作成t
を入力してパーティションのタイプを変更w
を入力してパーティションテーブルを書き込みポイントは、パーティションタイプで Linux raid autodetect
(下の例ではfd
を入力)を選ぶところです。
USBメモリは、USBポートに挿した順に /dev/sda
, /dev/sdb
と認識されます。/dev/sda
をfdisk
コマンドでフォーマットする場合は以下のようになります。(4GBのUSBメモリを使ってます。)
$ sudo fdisk /dev/sdaWelcome 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): pDisk /dev/sda: 3.8 GiB, 4089446400 bytes, 7987200 sectorsDisk model: Flash DiskUnits: sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisklabel type: dosDisk identifier: 0x0bc34daaDevice Boot Start End Sectors Size Id Type/dev/sda1 2792 7987199 7984408 3.8G b W95 FAT32Command (m for help): dSelected partition 1Partition 1 has been deleted.Command (m for help): nPartition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions)Select (default p): pPartition number (1-4, default 1): 1First 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): tSelected partition 1Hex 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 GPT10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBTHex code (type L to list all codes): fdChanged type of partition 'Linux' to 'Linux raid autodetect'.Command (m for help): wThe partition table has been altered.Calling ioctl() to re-read partition table.Syncing disks.
利用するUSBメモリを2本分、フォーマットします。
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/mdstatPersonalities : [raid0]md0 : active raid0 sdb1[1] sda1[0] 60051456 blocks super 1.2 512k chunksunused devices: <none>$ sudo mdadm --detail --scan >> /etc/mdadm/mdadm.conf
作成したRAIDデバイス /dev/md0
に ext4 ファイルシステムを構築します。
$ sudo mkfs -t ext4 /dev/md0
USBメモリのデバイス名は認識された順に /dev/sda
, /dev/sdb
と自動で割り当てられてしまうため、Raspberry Piを再起動した後に RAID が崩れる危険性があります。
そのため、各USBメモリのデバイス名を固定するようにします。
udevadm
コマンドで挿さっているUSBメモリのデバイス情報を取得します。
$ udevadm info -a -n /dev/sdaUdevadm info starts with the device specified by the devpath and thenwalks up the chain of parent devices. It prints for every devicefound, all possible attributes in the udev rules key format.A rule to match, can be composed by the attributes of the deviceand 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メモリのデバイス名を
に割り当てるように、ファイル /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
を実行するようにします。
1#!/bin/bash23if [ $# -ne 2 ]; then4 echo "Argument Error $#" 1&256 exit 17fi89DEVICE_COUNT=`ls $(echo $1) | wc -l`1011echo $DEVICE_COUNT1213if [[ ${DEVICE_COUNT} -eq $2 ]]; then14 echo 'OK'15 mdadm --assemble --scan16fi1718exit 0
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 3月 28 17:46 /dev/raid_01_001 -> sdalrwxrwxrwx 1 root root 3 3月 28 17:46 /dev/raid_01_0010 -> sg0lrwxrwxrwx 1 root root 4 3月 28 17:46 /dev/raid_01_0011 -> sda1lrwxrwxrwx 1 root root 15 3月 28 17:46 /dev/raid_01_0012 -> bus/usb/001/005lrwxrwxrwx 1 root root 3 3月 28 17:46 /dev/raid_01_002 -> sdblrwxrwxrwx 1 root root 11 3月 28 17:46 /dev/raid_01_0020 -> bsg/1:0:0:0lrwxrwxrwx 1 root root 4 3月 28 17:46 /dev/raid_01_0021 -> sdb1
RAIDデバイスを mount するために、md0
が割り当てられている uuid を確認し、/etc/fstab
に追記します。
$ ls -l /dev/disk/by-uuid/* | grep md0lrwxrwxrwx 1 root root 9 3月 28 17:46 /dev/disk/by-uuid/********-****-****-****-************ -> ../../md0$ sudo echo 'UUID=********-****-****-****-************ /media/usb ext4 nofail 0 2' >> /etc/fstab