Raspberry Pi: USB ストレージを使う

Takami Torao RPi3 Model B+ Raspbian 11 #RaspberryPi
  • このエントリーをはてなブックマークに追加

概要

Raspberry Pi は SD カードから OS 起動する。しかし安価で小さな SD カードは耐久性も低く頻繁な書き込み操作によって寿命が短くなる。データベースのような書き込み操作の多いアプリケーションを動作させるのであれば USB 経由で SSD/HDD ストレージを使用したほうが安心であるし、また書き込み寿命が大きく違わないにしても USB フラッシュメモリをそのような用途にすることでファイルシステム破損時のシステムの再構築の手間を減らすことができる。

Table of Contents

  1. 概要
  2. 操作手順
    1. ファイルシステムの構築
    2. ストレージの自動マウント

操作手順

ここでは既存の 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

続いて systemctlautofs を有効化し、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