Como posso simular um sistema de arquivos FAT12 com nomes de arquivos em maiúsculas 8.3?

7

Eu tenho um aplicativo da web que deve ser hospedado em um controlador incorporado.

Este controlador (não meu) tem um sistema de arquivos de nomes de arquivo 8.3 FAT12, como o FAT12.

Meu sistema de compilação é executado no Linux e pode usar qualquer nome de arquivo permitido no ext4 (UTF-8).

O problema é: eu não posso construir e assinar o firmawarearchive sozinho, eu tenho que distribuir arquivos compactados para o dono da chave.

Se algo se infiltrar no arquivo, é um monte de problemas e discussões, porque o processo só quebra depois de criar o arquivo de firmware assinado, quando é enviado para um controlador de teste.

Devido a esse incômodo, quero detectar esses erros o mais cedo possível no meu sistema de criação.

Eu tentei montar um sistema de arquivos VFAT contido em um arquivo montado via dispositivo loop no modo FAT12 no meu diretório build / com mode = strict, mas nenhuma restrição parece funcionar além da restrição de espaço para o arquivo de loopback.

Existe outra maneira de adicionar restrições aos sistemas de arquivos para simular sistemas de arquivos limitados?

Editar 19.Dez2012: Talvez eu deva mostrar o que tentei antes: (meu script de shell de teste no modo de depuração -vx)

export LANG=C
+ export LANG=C
+ LANG=C
export LC_ALL=C
+ export LC_ALL=C
+ LC_ALL=C

IMAGE=$(mktemp --quiet --suffix=fat12.img 8dot3XXXXXXXX)
mktemp --quiet --suffix=fat12.img 8dot3XXXXXXXX)
mktemp --quiet --suffix=fat12.img 8dot3XXXXXXXX
++ mktemp --quiet --suffix=fat12.img 8dot3XXXXXXXX
+ IMAGE=8dot3C2CGojhZfat12.img

MOUNTPOINT=${HOME}/fat-test
+ MOUNTPOINT=/home/human/fat-test

dd if=/dev/zero of=${IMAGE} bs=1M count=1
+ dd if=/dev/zero of=8dot3C2CGojhZfat12.img bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00500883 s, 209 MB/s

mkfs.vfat -F 12 -n flashfs ${IMAGE}
+ mkfs.vfat -F 12 -n flashfs 8dot3C2CGojhZfat12.img
mkfs.vfat 3.0.12 (29 Oct 2011)

file ${IMAGE}
+ file 8dot3C2CGojhZfat12.img
8dot3C2CGojhZfat12.img: x86 boot sector, mkdosfs boot message display, code offset 0x3c, OEM-ID " mkdosfs", sectors/cluster 4, root entries 512, sectors 2048 (volumes <=32 MB) , Media descriptor 0xf8, sectors/FAT 2, heads 64, serial number 0xc02d5e98, label: "flashfs    ", FAT (12 bit)

mkdir -p ${MOUNTPOINT}
+ mkdir -p /home/human/fat-test
\sudo mount ${IMAGE} ${MOUNTPOINT} -t vfat -o fat=12,check=strict,shortname=win95,uid=1000,gid=1000,debug
+ sudo mount 8dot3C2CGojhZfat12.img /home/human/fat-test -t vfat -o fat=12,check=strict,shortname=win95,uid=1000,gid=1000,debug

cd ${MOUNTPOINT}
+ cd /home/human/fat-test
df -h ${MOUNTPOINT}
+ df -h /home/human/fat-test
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop1     1004K     0 1004K   0% /home/human/fat-test

## test suite

# is 8.3 and uppercase, should work
mkdir TEST
+ mkdir TEST
touch TEST/TEST.TXT
+ touch TEST/TEST.TXT

# is 8.3, but wrong case, should fail
mkdir trial
+ mkdir trial
mkdir trial/trial.txt
+ mkdir trial/trial.txt

# should fail
mkdir muchtoolong
+ mkdir muchtoolong
touch muchtoolong/muchtoolong.with.triple.extension
+ touch muchtoolong/muchtoolong.with.triple.extension

find  ${MOUNTPOINT} -ls
+ find /home/human/fat-test -ls
     1   16 drwxr-xr-x   5 human    human       16384 Dec 19 18:40 /home/human/fat-test
    21    2 drwxr-xr-x   2 human    human        2048 Dec 19 18:40 /home/human/fat-test/TEST
    22    0 -rwxr-xr-x   1 human    human           0 Dec 19 18:40 /home/human/fat-test/TEST/TEST.TXT
    23    2 drwxr-xr-x   3 human    human        2048 Dec 19 18:40 /home/human/fat-test/trial
    24    2 drwxr-xr-x   2 human    human        2048 Dec 19 18:40 /home/human/fat-test/trial/trial.txt
    25    2 drwxr-xr-x   2 human    human        2048 Dec 19 18:40 /home/human/fat-test/muchtoolong
    26    0 -rwxr-xr-x   1 human    human           0 Dec 19 18:40 /home/human/fat-test/muchtoolong/muchtoolong.with.triple.extension

cd
+ cd
\sudo umount  ${MOUNTPOINT}
+ sudo umount /home/human/fat-test
rm ${IMAGE}
+ rm 8dot3C2CGojhZfat12.img

Se alguém conseguir identificar o erro: TIA, porque não consigo encontrá-lo.

    
por Peter 13.12.2012 / 15:23

1 resposta

2

Você parece lutar com a presença de nomes longos no FS que você espera restringir por convenções MSDOS puras. Em seguida, use " -t msdos " em vez de " -t vfat ". Caso contrário, o VFAT armazenará apenas nomes longos para arquivos "impossíveis", juntamente com a construção de alternativas curtas para eles.

Você terá que remover a opção " shortname " como " msdos " O FS não está ciente do significado dos "nomes abreviados".

BTW, há outro erro no seu script tornando-o impraticável como você pretende: você perdeu a opção " loop " no comando mount, por isso ele reportará com erro e todas as outras operações ocorrerão em < em> $ {MOUNTPOINT} diretório do FS subjacente, em vez do FS testado no seu arquivo de teste. Você parecia editar o seu script / saída antes de postar, porque há uma barra invertida "\", bem clara, antes do comando " sudo mount ". Então, o comando de montagem correto será assim:

sudo mount ${IMAGE} ${MOUNTPOINT} -t msdos -o loop,fat=12,check=strict,uid=1000,gid=1000,debug

Mais uma observação: no modo MSDOS, os nomes no disco são armazenados apenas em maiúsculas. Então, " msdos " os desenvolvedores do FS Linux tomaram a decisão de converter e exibir todos os nomes somente para / de letras minúsculas enquanto os armazenavam em maiúsculas. Isso significa que seus testes para casos funcionarão do oposto: permitindo apenas nomes todos em letras minúsculas, mas rejeitando quaisquer caracteres maiúsculos. Embora possa causar inconveniências para seus testes, os nomes em seu arquivo sempre serão criados corretamente e todos os duplicados misturados serão rejeitados (assim como outras anomalias não-8.3), então acredito que você será capaz de adaptar sua situação a este particular peculiaridade da montagem do MSDOS FS no Linux.

    
por 23.12.2012 / 02:39