将虚拟 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

仍然收到两个错误消息之一,但我仍然可以将其安装到 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 会看到一个超级软盘“设备”。

相关内容