Raspberry Pi Zero 2 W を使って、外付けHDDを必要とするデバイスに仮想化したHDDを割り当てる。
今回はNASのストレージの一部を、TVの録画用外付けHDDとして割り当てることでシンプル化を目指す。
内容としては、TVにOTG化したPiZero2Wを接続しPiZero2WにマウントしたNASのストレージを、あたかもTVからは直接接続されたHDDとしてみえるように構成する。
あくまで興味本位で試しているだけなので連続運用、安定性は不明。
/boot/config.txt への dtoverlay=dwc2 追記。機材は Raspberry Pi Zero 2 W(BCM2710A1、4コア、Wi-Fiは2.4GHzのみ)。OTGのUSBポートが1つしかないので、給電とデータを同じポートで扱う。
microSDカードは16GB以上を推奨。イメージファイルをSD内に置くならその分の空きも見込む。
Raspberry Pi OS は Bullseye(Legacy)。Bookworm以降はガジェットまわりの追加設定が要る。
/boot/config.txt に dtoverlay=dwc2 を書く。dwc2 はOTGコントローラのドライバで、これを読ませないとガジェットにならない。
相手側(TV)がUSBマスストレージとして認識できる機種であること。録画用途ならexFATかFAT32でフォーマットする。
TVからの給電で足りない場合は、セルフパワーのUSBハブを挟むと安定しやすい。
🛒 Amazon: Raspberry Pi Zero 2 W を探す(Amazon)(ボード単体とスターターキットでASINが分かれるため検索リンクにしている)
Bookwormだと面倒らしいので、Bullseye(Legacy)でセットアップする。

/boot/config.txtに追記
dtoverlay=dwc2
再起動
すでにこの状態で、PCからはOTGデバイス(機能無し)で認識できるようになっているはず。
OTG側のケーブルをPCに挿抜するといつもの音が出る。
exfatを使えるようにする。
$ sudo apt install exfat-fuse
SD内にUSBメモリ用のイメージファイルを作成する。countがMB単位の容量。
時間がかかるので1GBでお試し。
$ dd if=/dev/zero of=/home/pi/test_storage.img bs=1M count=1000
USBメモリ領域をexfatでフォーマット。
# exfatの場合
$ mkfs.exfat /home/pi/test_storage.img
# FAT32の場合
$ mkfs.vfat -F 32 /home/pi/test_storage.img
PCからマスストレージデバイスが見えるように有効化、無効化のテスト。
有効化
$ sudo modprobe g_mass_storage file=/home/pi/test_storage.img removable=y
無効化
$ sudo modprobe -r g_mass_storage
smbclientをインストール
$ sudo apt install smbclient
NASに作った共有フォルダをRPiにマウントしてみる
mount -t cifs //{NASのIPアドレス}/{NASの共有フォルダ名} /home/pi/nas_storage -o user={nasのログインユーザー名},password={nasのログインパスワード},vers=3.0,iocharset=utf8
マウントポイントを覗いて、NASのファイルが見えればOK
とりあえず起動時にマウントをトライするように設定する(基本ダメだけど、あとのcrontabで再接続させる)
# cifs
//{NASのIPアドレス}/{NASの共有フォルダ名} /home/pi/nas_storage cifs username={nasのログインユーザー名},password={nasのログインパスワード},vers=3.0,iocharset=utf8 0 2
NASのマウント領域内にストレージ用のイメージファイルを作成する。countがMB単位の容量。
超時間がかかる上に、1GBだと少なすぎるので、SD内に確保できる容量ならSD内に作成したあとにNAS領域にコピーした方がいいかも。というかRPiじゃなくてNAS側のターミナルで作った方が早い。
$ dd if=/dev/zero of=/home/pi/nas_storage/test_hdd.img bs=1M count=1000
USBメモリ領域をexfatでフォーマット。
# exfatの場合
$ mkfs.exfat /home/pi/nas_storage/test_hdd.img
# FAT32の場合
$ mkfs.vfat -F 32 /home/pi/nas_storage/test_hdd.img
$ crontab -e
@reboot sleep 5; mount -a && sudo modprobe g_mass_storage file=/home/pi/nas_storage/test_hdd.img removable=1
とりあえずこの作業で、LG(2023)ではストレージとして認識し、録画もできるようになった。

でも、ストレージのアクセス速度としては心もとない感じ。
今回は、お手軽さ重視でPiZero2WのWifi経由なので、スリープから再接続までの復帰時間や安定性などに不安が残る。数回の録画は試したが、連用はしていないので各自ご確認を。

/boot/config.txt の dtoverlay=dwc2 の書式と再起動を確認する。行末の余計な空白でも効かなくなる。modprobe g_mass_storage が「Device or resource busy」で失敗するのは、同じイメージファイルを別プロセスが掴んでいるか、すでにモジュールが読まれている場合だ。modprobe -r g_mass_storage で外してから入れ直す。dd で作ると非常に遅い。先にSD内で作ってNASへコピーするか、NAS側のターミナルで作る方が現実的だ。mount -a が効いていない。@reboot の1行にまとめているのはそのためだ。removable=y(crontabでは removable=1)を付けると、TV側で「取り外し可能なUSBメモリ」として見える。固定ディスク扱いにしたい場合はここを外す。Q. Raspberry Pi Zero 2 W でもUSB-HDDの仮想化はできるか?
A. できる。dwc2 を有効にして g_mass_storage を読ませるだけなので、Pi 4と同じ考え方で組める。ただしWi-Fiは2.4GHzのみで速度は控えめだ。
Q. 録画用には何GBのイメージを作ればよいか?
A. まず1GBで手順を通し、うまくいってから必要容量で作り直すのが安全だ。dd は容量に比例して時間がかかる。
Q. Bookwormではなぜ面倒なのか?
A. カーネルやパッケージ構成が変わり、ガジェットまわりの追加設定が要る。このページは実績のあるBullseye(Legacy)前提で書いた。
Q. NASのファイルをそのまま見せる方法は?
A. g_mass_storage が見せられるのはイメージファイル(ブロックデバイス)だけだ。共有フォルダをそのままUSB-HDDに見せるには、iSCSIやNBDの併用が要る。
### 参考サイト
ラズパイを録画用HDDにエミュレートする
https://synrock-tech.com/hardware/single_board/raspberry-pi-emulate-hdd/
趣味のプログラム工房 : Raspberry Pi4でUSB-OTGを使って、Regzaの外付けHDD化
https://studio.sites-mall.com/blog/entry/2020080301.html
Raspberry Pi 4BをOTG設定してUSBストレージとして使う
https://qiita.com/Saito5656/items/5f369ba8a8d419e3cbff
大画面テレビの録画用HDDの代わりにRasberry Pi4のUSB OTG機能を生かしてUSBtoLAN(NAS)なストレージゲートウェイを構成する
https://qiita.com/kthrtty/items/7243d59bb418de50f732
※ 本ページのAmazonリンクにはアフィリエイトタグ(toobf6-22)が付いている。
🤖 このページにはAIエージェント(ノア)による編集・加筆が含まれます。内容の正確性は保証できないため、重要な判断は一次情報でご確認ください。