Questão Como lidar com a adição de novos arquivos e diretórios para a imagem de disquete FAT12 do Ubuntu 16.04?


Eu preciso escrever um programa que cria uma imagem de disquete de FAT12. As instruções incluem a criação de um setor de inicialização, certificando-se de reservar espaço para duas tabelas FAT, configurando espaço para o diretório raiz e, finalmente, para os dados. No entanto, as instruções não mencionam nada sobre como lidar com novos arquivos / diretórios.

Por exemplo, digamos que eu tenha uma imagem floopy pronta chamada "floppy". Então eu posso montar o disquete no terminal do Ubuntu:

sudo mount -o loop,uid=user, gid=user floppy mntpoint/

mkdir mntpoint/test

echo "Hello World" > mntpoint/test/foo

O mount reconhece automaticamente as informações contidas no setor de boot e entende que é o FAT12? Se sim como mount sabe onde colocar foo arquivo dentro da imagem de disquete? Eu suponho que devo de alguma forma lidar com isso. Mas como posso lidar com essa linha, por exemplo, que tipo de funções eu teria que ter:

echo "Hello World" > mntpoint/test/foo

Eu estou escrevendo em C. Eu não estou adicionando o código porque a minha pergunta não é específica do código, mas sim conceitual. Apenas no caso estou adicionando o código para a estrutura do setor de inicialização:

typedef struct {
    uint8_t     bootjmp[3];  /* 0  Jump to boot code */
    uint8_t     oem_id[8];   /* 3  OEM name & version */
    uint16_t    sector_size; /* 11 Bytes per sector hopefully 512 */
    uint8_t     sectors_per_cluster;    /* 13 Cluster size in sectors */
    uint16_t    reserved_sector_count;  /* 14 Number of reserved (boot) sectors */
    uint8_t     number_of_fats;         /* 16 Number of FAT tables hopefully 2 */
    uint16_t    number_of_dirents;      /* 17 Number of directory slots */

    /*
     * If 0, look in sector_count_large
     */
    uint16_t    sector_count;           /* 19 Total sectors on disk */
    uint8_t     media_type;             /* 21 Media descriptor=first byte of FAT */

    /*
     * Set for FAT12/16 only.
     *
     * The number of blocks occupied by one copy of the File Allocation Table.
     */
    uint16_t    fat_size_sectors;       /* 22 Sectors in FAT */
    uint16_t    sectors_per_track;      /* 24 Sectors/track */
    uint16_t    nheads;                 /* 26 Heads */
    uint32_t    sectors_hidden;         /* 28 number of hidden sectors */
    uint32_t    sector_count_large;     /* 32 big total sectors */  

} __attribute__ ((packed)) boot_record_t;

0


origem


Você só precisa criar o sistema de arquivos ou precisa incluir arquivos? Um sistema de arquivos é burro e na maioria dos casos não sabe nada sobre como adicionar arquivos, já que a lógica é implementada no sistema operacional e no driver do sistema de arquivos. - Seth
@Seth Eu preciso criar o sistema, mas eles eu preciso apoiar a adição de arquivos como no exemplo de eco. - Yos
Isso seria mais adequado ao StackOverflow, já que é essencialmente relacionado à programação? Um usuário (até mesmo um "superusuário" ;-) apenas montaria e ecoaria. E você já examinou o código-fonte do driver, todas as respostas "como" devem estar em algum lugar. - Xen2050
@ Xen2050 Na verdade, eu postei essa pergunta no começo para StackOverflow, mas eles disseram que não pertence a SO e sugeriu que eu postar aqui. De qualquer forma, minha questão fundamental agora foi respondida. - Yos


Respostas:


mount apenas usa o mesmo driver do sistema de arquivos que ao montar seus discos reais e pen drives USB. Então, sim, reconhece o FAT12.

Você pode explicitamente dizer para usar o driver FAT usando -t vfat (ou -t msdos). Se você não fizer isso, ele tentará reconhecer automaticamente qual sistema de arquivos está dentro (usando libblkid, se bem me lembro) e ainda chamar vfat.

Alternativamente, em vez de montar a imagem, você pode usar o pacote "mtools" (mcopy, mdir, etc.) para atualizá-la diretamente.


3



sim, mas e quanto a adicionar arquivos a esse sistema? o sistema operacional pai (linux) sabe quando atribuir foo arquivo no meu exemplo? Ou essa lógica precisa estar dentro da imagem de disquete? - Yos
Essa lógica está dentro do driver do sistema de arquivos usado pelo sistema operacional. O driver entende as entradas do diretório e sabe como adicionar um novo. - grawity
Então, se eu precisar escrever FAT12, também preciso escrever essa lógica? - Yos
Se o seu programa quer tornar o sistema de arquivos inteiro "à mão", então sim, ele precisa fazer as mesmas coisas que os drivers do sistema de arquivos normalmente fazem. (Mas você provavelmente pode encontrar uma biblioteca para isso.) - grawity
Você teria que olhar para as especificidades desse driver e o padrão sobre como isso deve ser tratado. Com sua operação acima já existem algumas operações envolvidas. Para sua aplicação é uma simples gravação, mas o FS deve ser montado, ele deve ser reconhecido como um local montado, os FDs devem ser abertos adequadamente e os dados devem ser passados ​​para / através do driver FS. - Seth