Смонтировать виртуальный диск vfat на raspberry pi

Смонтировать виртуальный диск vfat на raspberry pi

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

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

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

решение1

Эта команда

mkdosfs /dir/to/data/data.bin

создает файловую систему навесь"device" 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 увидит «устройство», которое является супердискетой.

Связанный контент