Подключите виртуальный диск vfat к Raspberry Pi

389
serv92

Я пытаюсь смонтировать виртуальный диск 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)

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

0

1 ответ на вопрос

1
Kamil Maciorowski

Эта команда

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 увидит «устройство», которое является суперфлоппи.

Похожие вопросы