[メモ] Raspberry Pi ZeroをUSBマスストレージデバイスとして使う

## 概要

- [Simple guide for setting up OTG modes on the Raspberry Pi Zero](https://gist.github.com/gbaman/50b6cca61dd1c3f88f41)
の `g_mass_storage`
- ファイルを作って、それをマスストレージのディスクイメージとするらしい。
- ISOイメージのファイルをつかって、CD-ROMもできるらしい(要確認)。
- `/etc/modules`に記述しての、自動起動はできないので、起動スクリプトを書かないといけないと思う...
- (2017-3-20追記)
    - 単純に`/etc/rc.local`で、ウェイトを入れて、`modprobe`すればよいみたい。

		```bash:/etc/rc.local
		# Print the IP address
		_IP=$(hostname -I) || true
		if [ "$_IP" ]; then
		  printf "My IP address is %s\n" "$_IP"
		fi

		# --- MassStorage ---
		/bin/sleep 5
		sudo modprobe g_mass_storage file=/piusb.bin stall=0
		# --- MassStorage ---

		exit 0
		```

    - 起動時に `loop,ro`で、マウント。USBホスト側での変更は再起動後に反映される。

		```txt:/etc/fstab
		proc            /proc           proc    defaults          0       0
		/dev/mmcblk0p1  /boot           vfat    defaults          0       2
		/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
		# a swapfile is not a swap partition, no line here
		#   use  dphys-swapfile swap[on|off]  for that

		# MassStorage マウント先(/mnt/msd)を作成しておくこと!!
		/piusb.bin      /mnt/msd        vfat    loop,ro,auto　　　　　　0       0
		```


## 環境
- Raspberry Pi Zero
- `2016-05-27-raspbian-jessie-lite`
- UART-USBケーブル (らずぱいのUARTと、PCをつないで、コンソールで操作する)
- microUSBケーブル (PC接続用)
- microUSBの口のAC電源(PiZeroの電源 - Power ON中に、microUSBを抜き差しする)
- Windows 7 (64bit)

## 手順
1. Raspbianを焼く
2. 起動 (PWRから電源供給)
3. UART-USBケーブルを使って、ログイン
4. ` echo 'dtoverlay=dwc2' | sudo tee -a /boot/config.txt dtoverlay=dwc2`<br>設定: `/boot/config.txt`に`dtoverlay=dwc2`追加

5. `sudo reboot`<br>=> 再起動 - microUSBケーブルははずしておく。

6. MassStorageのイメージファイル(`/piusb.bin`)を作成、g_mass_storageモジュールのロード

    ```bash:/piusb.binを作成
# 1.44MBサイズで、パーティションなしなので、フロッピー？
sudo dd if=/dev/zero of=/piusb.bin bs=512 count=2880
sudo mkdosfs /piusb.bin
# モジュールのロード
sudo modprobe g_mass_storage file=/piusb.bin
```
7. microUSBケーブルを接続<br>=> マスストーレジドライブが出てくる。。なんか、フロッピードライブ。。
![PiZero-MassStorage01.png](https://qiita-image-store.s3.amazonaws.com/0/75594/cbcedff2-72f0-09ca-4d9e-00284ec700fb.png)

8. 使い終わったら、PC側で イジェクトして、PiZero側は、`sudo sync; sudo rmmod g_mass_storage`でもしておく。
9. (2017-3-20追記) loopback、msdos形式でファイル`piusb.bin`マウントすれば、中身を見れる。

    ```bash:例
sudo mkdir /mnt/msd
sudo mount -o loop -t msdos /piusb.bin /mnt/msd
ls -l /mnt/msd
cd
sync
sudo umount /mnt/msd
sudo rmdir /mnt/msd
```

 
```shell-session:実行例
pi@raspberrypi:~$ sudo dd if=/dev/zero of=/piusb.bin bs=512 count=2880
2880+0 records in
2880+0 records out
1474560 bytes (1.5 MB) copied, 0.109404 s, 13.5 MB/s
pi@raspberrypi:~$ sudo mkdosfs /piusb.bin
mkfs.fat 3.0.27 (2014-11-12)
pi@raspberrypi:~$ lsmod
Module                  Size  Used by
snd_bcm2835            23163  0
snd_pcm                95441  1 snd_bcm2835
snd_timer              22396  1 snd_pcm
snd                    68368  3 snd_bcm2835,snd_timer,snd_pcm
dwc2                  109939  0
udc_core               12769  1 dwc2
bcm2835_gpiomem         3823  0
bcm2835_wdt             4133  0
uio_pdrv_genirq         3718  0
uio                    10230  1 uio_pdrv_genirq
ipv6                  367607  20
pi@raspberrypi:~$ sudo modprobe g_mass_storage file=/piusb.bin
pi@raspberrypi:~$ lsmod
Module                  Size  Used by
g_mass_storage          4555  0
usb_f_mass_storage     39457  2 g_mass_storage
libcomposite           49383  2 usb_f_mass_storage,g_mass_storage
snd_bcm2835            23163  0
snd_pcm                95441  1 snd_bcm2835
snd_timer              22396  1 snd_pcm
snd                    68368  3 snd_bcm2835,snd_timer,snd_pcm
dwc2                  109939  0
udc_core               12769  2 dwc2,libcomposite
bcm2835_gpiomem         3823  0
bcm2835_wdt             4133  0
uio_pdrv_genirq         3718  0
uio                    10230  1 uio_pdrv_genirq
ipv6                  367607  20
pi@raspberrypi:~$
...
...

~~~ PCに接続して、ファイル操作行い、メディアの取り外しを行う。

...
...
pi@raspberrypi:~$ sudo sync; sudo rmmod g_mass_storage
pi@raspberrypi:~$ sudo mkdir /mnt/msd
pi@raspberrypi:~$ sudo mount -o loop -t vfat /piusb.bin /mnt/msd
pi@raspberrypi:~$ ls -l /mnt/msd
total 1
drwxr-xr-x 2 root root 512 Mar 19  2017 test
pi@raspberrypi:~$ cat /mnt/msd/test/test.txt
ABCDEFG
pi@raspberrypi:~$ cd
pi@raspberrypi:~$ sync
pi@raspberrypi:~$ sudo umount /mnt/msd
pi@raspberrypi:~$ sudo rmdir /mnt/msd
```


## その他
- CD-ROMとなるには(要確認)<br>`modprobe g_mass_storage file=/path/to/iso-image-file.iso cdrom=y`
- フロッピーとしてマウントされたのは、サイズのせい？(1.44MB)
- HDDイメージ作成 ～ パーティションを作ってフォーマットする

    ```bash:例14.4MBのHDDイメージ
# 512 * 28800 bytes = 14.4MB
sudo dd if=/dev/zero of=/piusb.bin bs=512 count=28800
# fdisk で、スタートセクタを2048にする。
sudo fdisk /piusb.bin
n
p
1
2048

    t
c
w
# パーティションを作ったら、/dev/loop0にマウント(?).
# オフセット 512bytes/セクタ * 2048セクタ => 1024kbytes目がパーティション１のスタート
sudo losetup -o 1024k /dev/loop0 /piusb.bin
# フォーマット
sudo mkfs.vfat /dev/loop0
sudo losetup -d /dev/loop0
sync
# マスストレージモジュールロード
sudo modprobe g_mass_storage file=/piusb.bin
#
#終わったら、PCでイジェクトして、
# sudo sync; sudo rmmod g_mass_storage
```

    ```shell-session:実行例
pi@raspberrypi:~$ sudo dd if=/dev/zero of=/piusb.bin bs=512 count=28800
28800+0 records in
28800+0 records out
14745600 bytes (15 MB) copied, 0.78584 s, 18.8 MB/s
pi@raspberrypi:~$ sudo fdisk /piusb.bin

    Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

    Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xbac5a697.

    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): 1
First sector (2048-28799, default 2048): 2048
Last sector, +sectors or +size{K,M,G,T,P} (2048-28799, default 28799):

    Created a new partition 1 of type 'Linux' and of size 13.1 MiB.

    Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): c
If you have created or modified any DOS 6.x partitions, please see the fdisk documentation for additional information.
Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'.

    Command (m for help): w
The partition table has been altered.
Syncing disks.

    pi@raspberrypi:~$ sudo losetup -o 1024k /dev/loop0 /piusb.bin
pi@raspberrypi:~$ sudo mkfs.vfat /dev/loop0
mkfs.fat 3.0.27 (2014-11-12)
Loop device does not match a floppy size, using default hd params
pi@raspberrypi:~$ sudo losetup -d /dev/loop0
pi@raspberrypi:~$ sync
pi@raspberrypi:~$ sudo modprobe g_mass_storage file=/piusb.bin
pi@raspberrypi:~$
pi@raspberrypi:~$ sudo sync; sudo rmmod g_mass_storage
pi@raspberrypi:~$
```


- ↑を書いたけど、`dd`直後のまっさらなイメージファイルを使うと、未フォーマット状態で、Windowsに認識されるので、そこでパーティション切り、フォーマットしてもいいかも。

---
### PiZeroのUSBデバイスのメモ
- [Ethernet(g_ether)](http://qiita.com/mt08/items/ce5e3911d74d7fad4563)
- [COM port(g_serial)](http://qiita.com/mt08/items/84d3d3053bee92609c2d)
- [USBマスストレージ(g_mass_storage)](http://qiita.com/mt08/items/838a2a0e42d4dbc9fba7)


<!--
https://zigsow.jp/item/314011/review/333619
-->