
仮想 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
(おそらく、など)。ただし、ファイルシステムはファイル全体にあるため、この「パーティション」は意味をなさず、 になります。loop0p2
wrong 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 はスーパーフロッピーである「デバイス」を認識します。