Я пытаюсь смонтировать виртуальный диск vfat на Raspberry Pi. Это решение работало, тогда мы отформатировали диск vritual vfat через USB OTG, теперь я не могу подключить диск обратно к 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

Мы работаем с Raspbian(на основе Debian)

Спасибо за чтение.

1 ответ1

1

Эта команда

mkdosfs /dir/to/data/data.bin

создает файловую систему на всем "устройстве" data.bin . Там нет таблицы разделов внутри него. Такая настройка называется superfloppy. Мое общее мнение - этого следует избегать, если только вы не знаете возможные подводные камни и не принимаете их.

Я ожидаю, что 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 superfloppy. В вашем случае это FAT32 superfloppy, и, хотя у 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 увидит "устройство", которое является суперфлоппи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .