Raspberry Pi Zero WをUSBメモリとして使えるようにする。
言い換えると、Raspberry Pi Zero WでUSB OTGを使い、Mass Storage Gadget (MSG)を起動するということ。
おそらく、Raspberry Pi 4などでも同じことができると思うけど、現時点では試していない。
これには、イメージファイルを使用する方法と、ディスク(SDカード)のパーティションを使用する方法とある。
今回は、パーティションを使用する編。イメージファイルを使用する方法編と重複した内容が含まれる。
ブート用SDカードの作成
まず、Raspberry Pi OSをRaspberry Pi Imagerを使って書き込んで、それを起動した際の動作を説明する。
Raspberry Pi Imagerで64GBのSDカードで Raspberry Pi OS Lite (32-Bit) のイメージを焼くと、2つのパーティションに分かれて焼かれている。上でいうところのboot (E:)とUSB Drive (F:)
実はこのUSB Drive (F:)ってUSBドライブ全部の容量を確保しているわけではない。
これはWindowsの管理のDisk ManagerでSDカードを表示した様子。Raspberry Pi Imagerが焼いたのは最初の256MBと1.48GBの部分。残りの部分は空いている。
この状態のSDカードで起動すると、1.48GBのパーティションを広げて、空いている部分全部を使えるようにしてくれる。
今回は、USBメモリ用のパーティションを確保したいので、全部を使えるようにされてしまうと困る。
一旦、全部を使えるようになったパーティションを小さくし、空いた領域をUSBメモリ用に確保することも可能は、可能である。が、パーティションを小さくするのは、ちょっと面倒である。
マウントされているパーティションを小さくすることはできないので、他のLinuxで小さくするとか、OSの起動時のマウントされる前に小さくするスクリプトを書くとかすれば可能であるが、面倒。
一方、大きくするのはそれほど面倒ではない。
ということで、この「自動で空いている部分を全部使えるようにする」機能を止めて、手動で大きくすることとする。
ということで、すでに全体を使うように構成されてしまったSDカードは使えないので、Raspberry Pi Imagerでイメージを焼くところからやり直し。
Raspberry Pi Zero Wのセットアップを参考に「ブート用SDカードの作成」の項目までを済ます。で、Raspberry Piを起動する前に以下の作業を追加。
rootfsパーティション自動拡張を止める
bootドライブの直下にcmdline.txtなるファイルがあるので、メモ帳などで開く。
console=serial0,115200 console=tty1 root=PARTUUID=83c4223d-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh
中身はこんな感じ。実際は一行。
この最後の init=/usr/lib/raspi-config/init_resize.sh を削除する。
console=serial0,115200 console=tty1 root=PARTUUID=83c4223d-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet
こんな感じ。で、保存。
これで起動時の自動パーティション拡張が止まる。
USB OTG(On-The-Go)の有効化
bootドライブの直下にconfig.txtなるファイルがあるので、メモ帳などで開き、以下を1行追加する。
dtoverlay=dwc2
通常、USB端子は、Raspberry Piがホストで接続されたものがデバイスとして働くが、この1行を追加すると、Raspberry Piが起動したときUSBがデバイスとして働くことができるようになる。
SDカードの準備ができたので、これを利用してRaspberry Piを起動。
Raspberry PiのUSB端子のうちUSB OTGが使える方、Raspberry Pi Zero WならUSBって書いてある方にケーブルをつなぎ、もう一方をWindows PCに刺して起動する。Raspberry Pi Zero Wならこの接続で共有される電力で十分なので、PWR側に電力を供給する必要はない。
無事起動すると、Windows PCがぴっぴろりん!とUSBの認識がされた音がする。音がすれども、デバイス的には認識は失敗しているはず。なぜなら、USB OTGが有効化されても、デバイス的な設定をまだしてないから。
なにはともあれ、Raspberry Piにログイン。
rootfsパーティションを拡張
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 1499232 1281736 123288 92% /
devtmpfs 187228 0 187228 0% /dev
tmpfs 220208 0 220208 0% /dev/shm
tmpfs 220208 5848 214360 3% /run
tmpfs 5120 0 5120 0% /run/lock
tmpfs 220208 0 220208 0% /sys/fs/cgroup
/dev/mmcblk0p1 258095 48783 209312 19% /boot
tmpfs 44040 0 44040 0% /run/user/1000
作成したSDカードでRaspberry Piを起動し、ログインした直後のdfの様子。自動拡張を止めたため、rootfsの領域がぎりぎり。これだとソフトのアップデートすらままならないので、ちょっと拡張する。
$ sudo parted /dev/mmcblk0
GNU Parted 3.2
Using /dev/mmcblk0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: SD BC2QT (sd/mmc)
Disk /dev/mmcblk0: 64.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 4194kB 273MB 268MB primary fat32 lba
2 273MB 1866MB 1594MB primary ext4
(parted) resizepart 2
End? [1866MB]? 4096MB
(parted) p
Model: SD BC2QT (sd/mmc)
Disk /dev/mmcblk0: 64.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 4194kB 273MB 268MB primary fat32 lba
2 273MB 4096MB 3823MB primary ext4
(parted) q
Information: You may need to update /etc/fstab.
partedコマンドでパーティションをちょっと拡張する。ここでは、4096MBのラインまでを使うように変更。すなわち、容量が1.5GBから3.8GBくらいまで増えたことになる。
$ sudo resize2fs /dev/mmcblk0p2
resize2fs 1.44.5 (15-Dec-2018)
Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mmcblk0p2 is now 933440 (4k) blocks long.
resize2fsをしてオンラインリサイズする。(なんか日本語変かも。)
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 3641884 1282200 2179044 38% /
devtmpfs 187228 0 187228 0% /dev
tmpfs 220208 0 220208 0% /dev/shm
tmpfs 220208 5848 214360 3% /run
tmpfs 5120 0 5120 0% /run/lock
tmpfs 220208 0 220208 0% /sys/fs/cgroup
/dev/mmcblk0p1 258095 48783 209312 19% /boot
tmpfs 44040 0 44040 0% /run/user/1000
ちょっとはましになったかな。
ソフトウエアのアップデートとシステムの設定
Raspberry Pi Zero Wのセットアップを参考に「Raspberry Piをセットアップ」の項目を済ます。 ようするに、raspi-configとapt update/upgradeをやる。
USBメモリの領域を準備
今回は64GBのSDカードを使用しているので、以下の説明はそれに合わせた記述。適宜サイズに合わせて変更が必要。
exfatをUSBメモリのフォーマットとして使用する場合は、
$ sudo apt install exfat-fuse
で、exfatが使えるようにしておく。
$ sudo parted /dev/mmcblk0
GNU Parted 3.2
Using /dev/mmcblk0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: SD BC2QT (sd/mmc)
Disk /dev/mmcblk0: 64.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 4194kB 273MB 268MB primary fat32 lba
2 273MB 4096MB 3823MB primary ext4
(parted) mkpart
Partition type? primary/extended? primary
File system type? [ext2]? ntfs
Start? 4096MB
End? 64GB
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore
(parted) p
Model: SD BC2QT (sd/mmc)
Disk /dev/mmcblk0: 64.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 4194kB 273MB 268MB primary fat32 lba
2 273MB 4096MB 3823MB primary ext4
3 4096MB 64.0GB 59.9GB primary ntfs lba
(parted) q
Information: You may need to update /etc/fstab.
mkpartコマンドを使って新たなパーティションを作成。File system typeとしてとりあえず、ntfsを指定する。Start? 4096MBはすでにあるパーティションの最後のEndの値、End? 64GBは、このSDカードの容量。qコマンドで終了。
次に、イメージファイルのフォーマットだが、ここでフォーマットしなくても、USBメモリをWindows PCに刺してフォーマットしてもよい。
$ sudo mkfs.exfat /dev/mmcblk0p3
mkfs.exfatはexfatでフォーマットした場合。fat32だと、 sudo mkfs.vfat -F 32 /dev/mmcblk0p3
USBマスストレージとして使えるか実験
$ sudo modprobe g_mass_storage file=/dev/mmcblk0p3 removable=y
とすると、おもむろにWindowsの方でUSBドライブが認識される。
$ sudo modprobe -r g_mass_storage
これで、USBマスストレージが解除される。Windows側では、ぴろりん、とUSBドライブが外れた音が鳴る。
マウントについて
今回作成したイメージファイルをRaspberry Pi側から利用するためにマウントする必要があるのだが、これに関してはややこしいので、別記事で記載する。
modprobe g_mass_storageをRaspberry piの起動時に実行するように設定
いくつかの方法がある。ここでは2通りのやりかたを記載する。
/etc/rc.localを使用
/etc/rc.localに以下の行を追加する。
# for USB MASS Storage
modprobe g_mass_storage file=/dev/mmcblk0p3 removable=y
systemdを使用
systemdのOneShotサービスで起動する。
[Unit]
Description = USB MASS Storage Service
After = local-fs.target
[Service]
ExecStart = /sbin/modprobe g_mass_storage file=/dev/mmcblk0p3 removable=y
Type = oneshot
[Install]
WantedBy = multi-user.target
上記の内容で、/lib/systemd/system/usb_storage.serviceとしてファイルを作り、
$ sudo systemctl enable usb_storage.service
と、サービスとして有効化する。
「RASPBERRY PI ZERO WをUSBメモリにする(パーティションを使用編)」への1件のフィードバック