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