Ответы:
Согласно философии Unix, программа должна делать одно и делать это хорошо. Если предполагается, что данный инструмент изменяет таблицы разделов, он не должен беспокоиться об изменении кода начальной загрузки (или создании файловой системы и т. Д.).
Конечно, есть раздутые инструменты со всеми прибамбасами, fdiskэто не одно из них. Вы найдете мой анализ его поведения ниже. Это доказывает, что вполне возможно создать новый раздел, оставив код начальной загрузки MBR без изменений.
Я не знаю всех дисковых утилит на каждой платформе. Этот ответ предназначен только для fdiskутилит Linux .
fdiskТестовая площадка: Ubuntu 16.04.2 LTS, fdiskот util-linux 2.27.1.
Я создал пустой файл с
dd if=/dev/zero of=mydisk bs=1M count=1
Тогда я бег fdisk mydiskи добавил один раздел из сектора 63к 2047, я написал таблицу разделов.
Выход из hexdump -C mydisk:
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001b0 00 00 00 00 00 00 00 00 bb 50 d8 1d 00 00 00 01 |.........P......|
000001c0 01 00 83 20 20 00 3f 00 00 00 c1 07 00 00 00 00 |... .?.........|
000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00100000
Как вы можете видеть, первый ненулевой байт находится в 0x1b8; последний в 0x1ff. Сравните это со структурой современного стандартного MBR, и вы увидите, что это фрагмент от подписи диска к загрузочной подписи . Впоследствии я также установил флаг загрузки, но он также не повлиял на код начальной загрузки. Никакого значимого загрузочного кода не появилось, он не загрузится.
Имея тот же файл, я переписал его MBR с мусором:
dd if=/dev/urandom of=mydisk bs=512 count=1 conv=notrunc
И я удостоверился, что нет загрузочной подписи (правильная будет 0xAA55little endian, я использовал 0x1234):
echo -ne "\x34\x12" | dd of=mydisk bs=1 count=2 seek=510 conv=notrunc
Затем я создал раздел, как и раньше. Весь мусор был перезаписан fdiskи hexdump -C mydiskвывод был точно таким же, как и раньше. Область кода начальной загрузки была обнулена, она не загружается.
Тот же файл. Пишем мусор снова:
dd if=/dev/urandom of=mydisk bs=512 count=1 conv=notrunc
На этот раз я установил правильную подпись при загрузке ( 0xAA55little endian):
echo -ne "\x55\xAA" | dd of=mydisk bs=1 count=2 seek=510 conv=notrunc
Затем fdisk mydiskпозволил мне изучить полу-допустимую таблицу разделов. Я удалил все разделы и создал только один точно так же, как и раньше. Я запустил hexdump -C mydiskи обнаружил, что, хотя область таблицы разделов была изменена, мусор в области начальной загрузки все еще был там. Не было никаких изменений в области кода начальной загрузки.
Я не тестировал fdiskMBR, содержащий не мусорный, абсолютно нормальный загрузочный код. Я твердо верю, что инструмент не анализирует код. Это позволяет мусору быть в этом случае, поэтому он должен делать то же самое с любыми данными.
fdiskПоведение зависит от наличия начальной загрузки подписи - значение 0xAA55записывается в виде маленькой Endian в самом конце 512 байт MBR.
Когда fdiskнаходит подпись, он считает, что уже есть действительный MBR подарок. Он оставляет область кода начальной загрузки нетронутой, даже если вносятся некоторые изменения в таблицу разделов.
Когда не fdiskнаходит действительной подписи, он считает, что нет действительной MBR, поэтому он создает ее во время записи новой таблицы разделов. В этом случае область кода начальной загрузки обнуляется (она не загружается).
Ни в том, ни в другом случае не fdiskсоздается собственный загрузочный код, который фактически загружается.
fdiskпотому что fdiskбыл явно упомянут в вопросе (хотя это может относиться к fdiskDOS, я знаю об этом). Кстати, спасибо за вашу работу gdisk.
Он создает MBR, если его нет, и внутри него создает таблицы разделов и томов для текущей схемы разделения. Эта информация обновляется по мере изменения схемы.
MBR указывает на загрузочные записи тома (VBR; он же загрузочный сектор) для активных разделов. Когда ОС установлена в этом разделе, она помещает свой код загрузчика в MBR, а код загрузочного сектора в VBR для своего тома. Затем загрузчик представляет загрузочные VBR для выбора пользователем в случае мультизагрузки или загружает VBR по умолчанию в своей конфигурации.
gdisk, что, какfdiskдля GPT дисков. Я не знаю ни одного инструмента разметки Linux, который записывал бы загрузочный код в MBR, хотя бывают случаи (как в вашем случае № 2), в которых инструменты могут обнулять область кода MBR. Я менее знаком с инструментами разметки для других ОС. Как вы говорите, существует много инструментов для создания разделов, поэтому почти невозможно сказать, что ни один из них не записывает код загрузчика; даже если вы изучите десять, вполне возможно, что одиннадцатое сделает что-то другое. Также обратите внимание, что загрузочный код MBR становится менее актуальным с переключением в режим загрузки EFI.