Мне нужно написать программу, которая создает образ дискеты FAT12. Инструкции включают создание загрузочного сектора, убедитесь, что я выделил место для двух таблиц FAT, настроил пространство для корневого каталога и, наконец, для данных. Однако в инструкциях ничего не говорится об обработке новых файлов / каталогов.

Например, допустим, у меня есть готовое изображение с именем floppy. Затем я могу смонтировать дискету в терминал Ubuntu:

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

mkdir mntpoint/test

echo "Hello World" > mntpoint/test/foo

Может ли mount автоматически распознавать информацию, содержащуюся в загрузочном секторе, и понимает, что это FAT12? Если да, как mount знает, куда поместить файл foo в образ дискеты? Я предполагаю, что должен как-то справиться с этим. Но как я могу обработать эту строку, например, какие функции я должен иметь:

echo "Hello World" > mntpoint/test/foo

Я пишу на C. Я не добавляю код, потому что мой вопрос не специфический, а скорее концептуальный. На всякий случай я добавляю код для структуры загрузочного сектора:

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;

1 ответ1

3

mount только использует тот же драйвер файловой системы, что и при монтировании ваших реальных дисков и USB-флешек. Так что, да, он распознает FAT12.

Вы можете явно указать ему использовать драйвер FAT, используя -t vfat (или -t msdos). Если вы этого не сделаете, он попытается автоматически распознать, какая файловая система находится внутри (используя libblkid, если я правильно помню), и по-прежнему вызывает vfat.

В качестве альтернативы, вместо монтирования образа вы можете использовать пакет "mtools" (mcopy, mdir и т.д.), Чтобы обновить его напрямую.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .