Raspberry Pi: USB ストレージの接続
概要
Raspberry Pi は SD カードから OS 起動する。しかし安価で小さな SD カードは耐久性も低く頻繁な書き込み操作によって寿命が短くなる。データベースのような書き込み操作の多いアプリケーションを動作させるのであれば USB 経由で SSD/HDD ストレージを使用したほうが安心であるし、また書き込み寿命が大きく違わないにしても USB フラッシュメモリをそのような用途にすることでファイルシステム破損時のシステムの再構築の手間を減らすことができる。
Table of Contents
操作手順
ここでは既存の USB フラッシュメモリを exFAT 形式で初期化して Raspberry Pi で使えるようにすることをゴールとする。操作手順は他の Linux ベースのシステムでもほぼ同じであろう。
ファイルシステムの構築
Linux はディストリビューションごとに採用しているファイルシステムが異なり、exFAT ファイルシステムに対応していないことも多いが、追加の導入は容易である。
$ sudo apt-get install -y exfat-fuse
USB フラッシュメモリを本体に刺した後、システムが正しく認識すれば lsusb
コマンド実行時のリストにデバイスが表示される。以下の例では KIOXIA TransMemory の項目が該当する。
$ lsusb
Bus 001 Device 004: ID 30de:6545 KIOXIA TransMemory
Bus 001 Device 006: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC)
Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
続いて lsblk -f
コマンドを実行してフラッシュメモリがどのデバイスに割り当てられているかを確認する。以下の例では、目的のフラッシュメモリは /dev/sda
に割り当てられ、フラッシュメモリ内の (唯一の) パーティションは FAT32 の /dev/sda1
として認識されている。
$ lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
└─sda1 vfat FAT32 KIOXIA 1565-19D2
mmcblk0
├─mmcblk0p1 vfat FAT32 boot C839-E506 203.9M 19% /boot
└─mmcblk0p2 ext4 1.0 rootfs 568caafd-bab1-46cb-921b-cd257b61f505 11.9G 13% /
この構成では FAT32 ファイルシステムとなっているため (FAT32 のまま使用しても問題があるわけではないが) 目的の exFAT ファイルシステムで再構築するためにすべてのパーティションを削除して全領域を 1 つの exFAT パーティションで作成する。注意: この操作はフラッシュメモリに保存されているすべてのデータを削除する。
$ sudo fdisk /dev/sda
...
# 一つだけ存在するパーティションを削除 (複数ある場合は選択肢が出る)
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):
First sector (2048-244039679, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-244039679, default 244039679):
Created a new partition 1 of type 'Linux' and of size 116.4 GiB.
Partition #1 contains a vfat signature.
Do you want to remove the signature? [Y]es/[N]o: y
The signature will be removed by a write command.
# ここまでの操作を実行して終了
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
fdisk
実行後に lsblk -f
を実行すると /dev/sda1
にフォーマットされていないパーティションが存在することが確認できる。
$ lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
└─sda1
mmcblk0
├─mmcblk0p1 vfat FAT32 boot C839-E506 203.9M 19% /boot
└─mmcblk0p2 ext4 1.0 rootfs 568caafd-bab1-46cb-921b-cd257b61f505 11.9G 13% /
続いて mkfs
コマンドを実行して /dev/sda1
パーティション上に exFAT 形式のファイルシステムを構築する。-n
で指定するラベルは何でもよいが、後でマウントするときに指定するので分かりやすい名前を付けておくとよい。
$ sudo mkfs -t exfat -n storage01 /dev/sda1
mkexfatfs 1.3.0
Creating... done.
Flushing... done.
File system created successfully.
$ lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
└─sda1 exfat 1.0 storage01 2D3B-4853
mmcblk0
├─mmcblk0p1 vfat FAT32 boot C839-E506 203.9M 19% /boot
└─mmcblk0p2 ext4 1.0 rootfs 568caafd-bab1-46cb-921b-cd257b61f505 11.9G 13% /
なお -t
オプションで exfat
以外に指定できるファイルシステムは ls -l /usr/sbin/mkfs.*
を見れば確認できる。
ストレージの自動マウント
/etc/fstab
に記述するストレージはシステム起動時に接続されていなければならない。一般に USB ストレージは取り外し可能であることが前提であるため、ここでは autofs を使用してディレクトリが使用されるときに自動でマウントを行うように構成する。
exfat でフォーマットした先述の USB ストレージ (UUID: 2D3B-4853) を /mnt/usb01
に自動マウントするように設定しよう。システムに autofs
をインストールし、/etc/auto.master.d/mnt.autofs
から /mnt
に自動マウントするデバイスの定義ファイルを指す。
pi@pirite:~ $ sudo apt install -y autofs
pi@pirite:~ $ sudo vim /etc/auto.master.d/mnt.autofs
/mnt /etc/auto.mnt
pi@pirite:~ $ sudo vim /etc/auto.mnt
usb01 -fstype=exfat,rw :/dev/disk/by-uuid/2D3B-4853
続いて systemctl
で autofs
を有効化し、automount -m
で認識していることを確認する。
pi@pirite:~ $ sudo systemctl enable autofs --now
Synchronizing state of autofs.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable autofs
pi@pirite:~ $ sudo automount -m
...
Mount point: /mnt
source(s):
instance type(s): file
map: /etc/auto.mnt
usb01 | -fstype=exfat,rw :/dev/disk/by-uuid/2D3B-4853
autofs
が起動しただけではまだマウントされていないことに注意。/mnt/usb01
に移動してみると自動でマウントされることが確認できる。
pi@pirite:~ $ cd /mnt/usb01
pi@pirite:/mnt/usb01 $ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 15026928 2179012 12205904 16% /
...
/dev/sda1 122014976 384 122014592 1% /mnt/usb01