почему mkfs.vfat для файла, за которым следует dd в образ диска, не работает?

468
deitch

Я создаю 100M диск img и делю его на разделы, sgdiskчтобы создать загрузочный BIOS и раздел ESP.

dd if=/dev/zero of=file.img bs=1M count=100 sgdisk --clear -n 1:2048:4095 -t 1:ef02 -c 1:'BIOS Boot' -n 2:4096:17983 -t 2:ef00 -c 2:'EFI System Partition' 

Затем я создаю раздел и форматирую его для FAT:

losetup -f file.img -P mkfs.vfat /dev/loop0p2 
  1. Если я смонтирую /dev/loop0p2, нет проблем.
  2. Если я скопирую раздел с диска img и смонтирую его, нет проблем:

    dd if = file.img of = part2.img bs = 512 count = 13888 skip = 4095

Теперь part2.imgмонтируется напрямую. Конечно, если бы я ddего обратно в изображение, оно остается монтируемым

dd if=part2.img of=file.img bs=512 count=13888 seek=4095 conv=notrunc 

Крепление /dev/loop0p2работает отлично.

Однако, если я создаю раздел одинакового размера, img:

mkfs.vfat -C directpart.img 13888 dd if=directpart.img of=file.img bs=512 count=13888 seek=4095 conv=notrunc 

Файл directpart.imgможет быть смонтирован так же, как part2.img(который был извлечен из образа диска). Однако монтаж /dev/loop0p2больше не работает.

Что делает по- mkfs.vfatдругому, когда применяется к разделу в файле img диска (или реального блочного устройства) из автономного файла?

Интересно, что если я losetupполучу полный образ диска, он будет dd if=<new_file> of=/dev/loop0p2работать как с mkfs.vfat -C <new_file> файлом, созданным напрямую, так и с файлом, созданным ddс диска.

0
Что именно вы имеете в виду / вы делали под "dd это в точный раздел в исходном образе диска"? Tom Yan 6 лет назад 0
И как этот file.img упоминается в первом абзаце? Ваш пост довольно запутанный, если честно ... Tom Yan 6 лет назад 0
ОК, я могу обновить его. deitch 6 лет назад 0
Это понятнее? deitch 6 лет назад 0
Вы должны искать = 4096, потому что раздел начинается с LBA 4096, что означает, что перед ним 4096 блоков (LBA 0 - LBA 4095). Tom Yan 6 лет назад 0
Так просто? Опечатка, потому что я смотрел на конец сектора против начала? Я посмотрю... deitch 6 лет назад 0
Я не верю в это! Это действительно настолько просто. @ TomYan опубликовать это как ответ. Я поместил вывод здесь из запуска сценария, и в сценарии была опечатка. Вздох .... Спасибо! deitch 6 лет назад 0
Кроме того, одна вещь не по теме, тип `ef02` в действительности не должна использоваться для ESP. ef00 - это тип для использования. Загрузочный раздел BIOS используется grub только для встраивания своего core.img и, следовательно, не должен форматироваться. Рекомендуемый размер составляет 1 ~ 2 МБ. Tom Yan 6 лет назад 0
Том да, это было просто копирование опечатки. `ef00` - это тип раздела, который я использую для ESP. `ef02` предназначен для загрузочного сектора BIOS (на самом деле, я здесь вообще не использую BIOS, просто модифицированный с более раннего загрузочного диска с несколькими BIOS). deitch 6 лет назад 0
Ах, я неправильно понял вашу команду sgdisk. Виноват. Tom Yan 6 лет назад 0

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

1
Tom Yan

Вы должны использовать 4096 для поиска = и пропуска =, потому что второй раздел начинается с LBA 4096, что означает, что перед ним 4096 блоков, а именно LBA 0 - 4095.

Также известный как PEBKAC, он же «пользователь совершил глупую ошибку при копировании и не понял, что он сделал». Спасибо TomYan за то, что нашли это. deitch 6 лет назад 0

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