
Estou tentando montar uma unidade vfat virtual no Raspberry Pi. Esta solução estava funcionando, então formatamos a unidade vritual vfat via USB OTG, agora não consigo montar a unidade de volta no pi, mas ainda posso montá-la em outro dispositivo USB.
Aqui está a configuração.
Execute apenas uma vez para configuração
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
Execute em cada inicialização após a configuração inicial
kpartx -a /dir/to/data/data.bin
Os demais comandos são executados por um aplicativo de gerenciamento OTG USB
Para montar em si mesmo
mount -o rw,umask=0000 -t vfat /dev/mapper/loop0p1 /mnt/data
Desmontar de si mesmo
umount /mnt/data
Montar em USB
modprobe g_mass_storage file=/dir/to/data/data.bin stall=0
Desmontar do USB
modprobe g_mass_storage file=/dir/to/data/data.bin stall=0
Quando o disco virtual vfat foi montado no USB OTG, nós o formatamos a partir do dispositivo ao qual estava conectado para ver o que aconteceria.
E agora não podemos montar o drive virtual de volta nele mesmo. Mesmo depois de excluir a unidade virtual e reconstruí-la.
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.
ou
mount -o rw,umask=0000 -t vfat /dev/mapper/loop0p1 /mnt/data
mount: special device /dev/mapper/loop0p1 does not exist
O que eu tentei
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
Ainda recebo uma das duas mensagens de erro, mas ainda consigo montá-lo no USB e lê-lo como uma unidade gorda com o Windows 10
Estamos rodando Raspbian (baseado em Debian)
Obrigado por ler.
Responder1
Este comando
mkdosfs /dir/to/data/data.bin
cria um sistema de arquivos nointeiro"dispositivo" data.bin
. Não há tabela de partição dentro dele. Essa configuração é chamada de superfloppy. Minha opinião geral édeve ser evitado, a menos que você conheça possíveis armadilhas e as aceite.
Espero que o Windows mantenha assim enquanto formata um superdisquete compartilhado via g_mass_storage
módulo.
Não há tabela de partições, portanto kpartx
é desnecessário.Você deve montar o arquivo inteiro.Implementações modernas mount
devem associar um dispositivo de loop automaticamente:
mount -o rw,umask=0000 -t vfat /dir/to/data/data.bin /mnt/data
(Se mount
não, use losetup
ou mesmo kpartx
. Mas o dispositivo resultante será como loop0
, por exemplo /dev/loop0
; monte este, não loop0p1
).
Estou surpreso mount ... /dev/mapper/loop0p1 /mnt/data
que funcionou quando você o executou pela primeira vez. É suspeito. Desde o início você deve montar o arquivo inteiro porque mkdosfs
operou no arquivo inteiro.
Acredito que abordei a questão raiz. A explicação abaixo do que aconteceu a seguir pode estar totalmente errada.
Observe que esse tipo de problema é possível:O Windows não monta superdisquete USB NTFS. No seu caso, é um superdisquete FAT32 e, embora o Windows pareça não ter problemas com isso, kpartx
pode.
Isto é porqueRegistro de inicialização FAT32armazena código executável onde estaria uma tabela de partição no MBR. Este código pode ser qualquer coisa. Você executa kpartx
e espera MBR com uma tabela de partição válida. Em vez disso, obtém o registro de inicialização FAT32. Então:
- ou não encontra nada parecido com tabela de partição
special device /dev/mapper/loop0p1 does not exist
depois; - ou encontra uma semi-válida, cria
/dev/mapper/loop0p1
(e talvezloop0p2
etc.) que aponta para alguma parte do seu arquivo, mas como o sistema de arquivos está no arquivo inteiro, essa "partição" não faz sentido, temwrong fs type, bad option, bad superblock
.
A história é semelhante aminha resposta para a pergunta já vinculada. Acho que no seu caso é kpartx
isso que fica confuso.
Se você criou uma tabela de partições dentro do arquivo (por exemplo, com fdisk data.bin
), definiu uma ou mais partições, executou kpartx -a ...
e criou um sistema de arquivos /dev/mapper/loop0p1
- então você deve montá-lo como mount ... /dev/mapper/loop0p1 /mnt/data
.
Eu acho que neste caso você poderia corrermodprobe g_mass_storage
- com
file=/dir/to/data/data.bin
e o Windows veria todo o "dispositivo" com sua tabela de partições; - ou com
file=/dev/mapper/loop0p1
e o Windows veria um "dispositivo" que é um superdisquete.