Edited at

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

More than 1 year has passed since last update.


概要



  • Simple guide for setting up OTG modes on the Raspberry Pi Zero
    g_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デバイスのメモ