RASPBERRY PI ZERO WをUSBメモリにする(パーティションを使用編)

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件のフィードバック

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください