仮想 vfat ドライブをラズベリーパイにマウントする

仮想 vfat ドライブをラズベリーパイにマウントする

仮想 vfat ドライブを Raspberry Pi にマウントしようとしています。この解決策は機能していましたが、USB OTG 経由で仮想 vfat ドライブをフォーマットしました。現在、ドライブを Pi にマウントすることはできませんが、別の USB デバイスにマウントすることはできます。

設定は次のとおりです。

設定のために一度だけ実行

dd if=/dev/zero of=/dir/to/data/data.bin bs=512 count=7680000
mkdosfs /dir/to/data/data.bin
kpartx -a /dir/to/data/data.bin

初期設定後の起動ごとに実行

kpartx -a /dir/to/data/data.bin

残りのコマンドはOTG USB管理アプリケーションによって実行されます。

自分自身にマウントする

mount -o rw,umask=0000 -t vfat /dev/mapper/loop0p1 /mnt/data

自身からアンマウントする

umount /mnt/data

USBにマウント

modprobe g_mass_storage file=/dir/to/data/data.bin stall=0

USBからアンマウント

modprobe g_mass_storage file=/dir/to/data/data.bin stall=0

vfat 仮想ディスクが USB OTG にマウントされたら、接続されているデバイスからフォーマットして、何が起こるかを確認しました。

そして、仮想ドライブを削除して再構築した後でも、仮想ドライブをマウントし直すことはできません。

mount -o rw,umask=0000 -t vfat /dev/mapper/loop0p1 /mnt/data
mount: wrong fs type, bad option, bad superblock on /dev/mapper/loop0p1,
   missing codepage or helper program, or other error

   In some cases useful info is found in syslog - try
   dmesg | tail or so.

または

mount -o rw,umask=0000 -t vfat /dev/mapper/loop0p1 /mnt/data
mount: special device /dev/mapper/loop0p1 does not exist

私が試したこと

modprobe -r g_mass_storage //Unmount from usb
umount /mnt/data //Unmount from itself
kpartx -dv /dir/to/data.bin //unmap virtual drive
rm /dir/to/data.bin //delete the virtual file system
dd if=/dev/zero of=/dir/to/data.bin bs=512 count=7680000 //Create a new virtual drive
mkdosfs /dir/to/data/data.bin //Format to vfat
kpartx -av /dir/to/data.bin //Map to dev
mount -o rw,umask=0000 -t vfat /dev/mapper/loop0p1 /mnt/data //Mount to itself

2つのエラーメッセージのうちの1つはまだ表示されますが、Windows 10でUSBにマウントしてファットドライブとして読み取ることができます。

Raspbian(Debianベース)を実行しています

読んでくれてありがとう。

答え1

このコマンド

mkdosfs /dir/to/data/data.bin

ファイルシステムを作成します全体「デバイス」data.bin。その中にはパーティションテーブルはありません。このような設定はスーパーフロッピーと呼ばれます。私の一般的な意見はそれは避けるべきであるただし、起こり得る落とし穴を知っていて、それを受け入れない限りは。

Windows は、モジュール経由で共有されるスーパーフロッピーをフォーマットする間、この状態を維持するものと予想されますg_mass_storage

パーティションテーブルがないのでkpartx不要です。ファイル全体をマウントする必要があります。最新のmount実装では、ループ デバイスが自動的に関連付けられるはずです。

mount -o rw,umask=0000 -t vfat /dir/to/data/data.bin /mnt/data

( がmountそうでない場合は、losetupまたは を使用しますkpartx。ただし、結果として得られるデバイスは のようになりますloop0。たとえば/dev/loop0、 ではなく、これをマウントしますloop0p1)。

mount ... /dev/mapper/loop0p1 /mnt/data初めて実行したときに動作したことに驚きました。怪しいですね。最初からファイルmkdosfs全体を操作したので、ファイル全体をマウントする必要があります。


根本的な問題には対処できたと思います。その後に何が起こったかについての以下の説明は完全に間違っている可能性があります。

次のような問題が発生する可能性があることに注意してください:WindowsはUSB NTFSスーパーフロッピーをマウントしませんあなたの場合は FAT32 スーパーフロッピーであり、Windows では問題はないようですkpartx

それの訳はFAT32 ブートレコードMBR のパーティション テーブルがある場所に実行可能コードを格納します。このコードは何でもかまいません。実行するkpartxと、有効なパーティション テーブルを持つ MBR が想定されます。代わりに、FAT32 ブート レコードが取得されます。次に、次のようになります。

  • パーティション テーブルのようなものが見つからないため、special device /dev/mapper/loop0p1 does not existその後;
  • または、半有効なパーティションが見つかり、ファイルの一部を指すパーティションが作成されます/dev/mapper/loop0p1(おそらく、など)。ただし、ファイルシステムはファイル全体にあるため、この「パーティション」は意味をなさず、 になります。loop0p2wrong fs type, bad option, bad superblock

この話はすでにリンクされている質問に対する私の回答kpartxあなたの場合はそれが混乱するのだと思います。


ファイル内にパーティション テーブルを作成し ( などを使用fdisk data.bin)、1 つ以上のパーティションを定義し、 を実行して--kpartx -a ...にファイルシステムを作成した場合は/dev/mapper/loop0p1、 のようにマウントする必要がありますmount ... /dev/mapper/loop0p1 /mnt/data

この場合は実行できると思いますmodprobe g_mass_storage

  • いずれの場合もfile=/dir/to/data/data.bin、Windows はパーティション テーブルを含む「デバイス」全体を参照します。
  • またはfile=/dev/mapper/loop0p1、Windows はスーパーフロッピーである「デバイス」を認識します。

関連情報