RaspberryPi
raspbian
USBGadget

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

More than 1 year has passed since last update.

概要

  • Simple guide for setting up OTG modes on the Raspberry Pi Zerog_mass_storage
  • ファイルを作って、それをマスストレージのディスクイメージとするらしい。
  • ISOイメージのファイルをつかって、CD-ROMもできるらしい(要確認)。
  • /etc/modulesに記述しての、自動起動はできないので、起動スクリプトを書かないといけないと思う...
  • (2017-3-20追記)

    • 単純に/etc/rc.localで、ウェイトを入れて、modprobeすればよいみたい。

      /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ホスト側での変更は再起動後に反映される。

      /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
    設定: /boot/config.txtdtoverlay=dwc2追加

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

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

    /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ケーブルを接続
    => マスストーレジドライブが出てくる。。なんか、フロッピードライブ。。
    PiZero-MassStorage01.png

  8. 使い終わったら、PC側で イジェクトして、PiZero側は、sudo sync; sudo rmmod g_mass_storageでもしておく。

  9. (2017-3-20追記) loopback、msdos形式でファイルpiusb.binマウントすれば、中身を見れる。

    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
    
実行例
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となるには(要確認)
    modprobe g_mass_storage file=/path/to/iso-image-file.iso cdrom=y
  • フロッピーとしてマウントされたのは、サイズのせい?(1.44MB)
  • HDDイメージ作成 ~ パーティションを作ってフォーマットする

    例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目がパーティション1のスタート
    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
    
    実行例
    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デバイスのメモ