Как справиться с добавлением новых файлов и каталогов в образ дискеты FAT12 из Ubuntu 16.04?

323
Yos

Мне нужно написать программу, которая создает образ дискеты 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; 
0
Вам просто нужно создать файловую систему или вам нужно включить файлы? Файловая система тупа и в большинстве случаев ничего не знает о том, как добавлять файлы, поскольку эта логика реализуется в ОС и драйвере файловой системы. Seth 6 лет назад 1
@ Мне нужно создать систему, но я должен поддерживать добавление файлов, как в примере с echo. Yos 6 лет назад 0
Будет ли это более подходящим для StackOverflow, поскольку он по сути связан с программированием? Пользователь (даже «суперпользователь» ;-) просто монтирует & echo. А вы уже просмотрели исходный код толстого драйвера, все ответы "как" должны быть где-то там. Xen2050 6 лет назад 0
@ Xen2050 Я фактически отправил этот вопрос в начале в StackOverflow, но они сказали, что он не принадлежит SO и предложили разместить его здесь. В любом случае на мой фундаментальный вопрос теперь дан ответ. Yos 6 лет назад 0

1 ответ на вопрос

3
grawity

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

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

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

да, но как насчет добавления файлов в эту систему? родительская ОС (linux) знает, когда назначать файл `foo` в моем примере? Или эта логика должна быть внутри образа дискеты? Yos 6 лет назад 0
Эта логика находится внутри драйвера файловой системы, используемой ОС. Драйвер понимает записи каталога и знает, как добавить новую. grawity 6 лет назад 0
Так что, если мне нужно написать FAT12, мне нужно также написать эту логику? Yos 6 лет назад 0
Если ваша программа хочет создать всю файловую систему «вручную», то да, она должна делать все то же, что обычно делают драйверы файловой системы. (Но вы, вероятно, можете найти библиотеку для этого.) grawity 6 лет назад 1
Что я не понимаю, так это связь между ОС и FAT12. Когда пользователь в Linux вводит строку `echo" Hellow World "> mntpoint / test / foo`, как драйвер FAT12 сначала получает файл` foo`, а затем решает, где разместить его внутри FAT12. Yos 6 лет назад 0
Вам нужно будет изучить специфику этого драйвера и стандарт того, как с этим обращаться. С вашей вышеупомянутой операцией уже достаточно много операций. Для вашего приложения это простая запись, но FS должна быть смонтирована, она должна быть распознана как смонтированное местоположение, FD должны быть открыты соответственно, и данные должны быть переданы в / через драйвер FS. Seth 6 лет назад 1

Похожие вопросы