我正在尝试将虚拟 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
仍然收到两个错误消息之一,但我仍然可以将其安装到 USB 并在 Windows 10 中将其读取为 Fat Drive
我们正在运行 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
),定义了一个或多个分区,运行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 会看到一个超级软盘“设备”。