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

0

Eu preciso escrever um programa que crie uma imagem de disquete do 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 o arquivo foo 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

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

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;
    
por Yos 09.01.2018 / 11:10

1 resposta

3
O

mount usa apenas 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 o libblkid, se bem me lembro) e ainda chamar vfat.

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

    
por 09.01.2018 / 11:24

Tags