Ответы:
Согласно философии 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
И я удостоверился, что нет загрузочной подписи (правильная будет 0xAA55
little 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
На этот раз я установил правильную подпись при загрузке ( 0xAA55
little endian):
echo -ne "\x55\xAA" | dd of=mydisk bs=1 count=2 seek=510 conv=notrunc
Затем fdisk mydisk
позволил мне изучить полу-допустимую таблицу разделов. Я удалил все разделы и создал только один точно так же, как и раньше. Я запустил hexdump -C mydisk
и обнаружил, что, хотя область таблицы разделов была изменена, мусор в области начальной загрузки все еще был там. Не было никаких изменений в области кода начальной загрузки.
Я не тестировал fdisk
MBR, содержащий не мусорный, абсолютно нормальный загрузочный код. Я твердо верю, что инструмент не анализирует код. Это позволяет мусору быть в этом случае, поэтому он должен делать то же самое с любыми данными.
fdisk
Поведение зависит от наличия начальной загрузки подписи - значение 0xAA55
записывается в виде маленькой Endian в самом конце 512 байт MBR.
Когда fdisk
находит подпись, он считает, что уже есть действительный MBR подарок. Он оставляет область кода начальной загрузки нетронутой, даже если вносятся некоторые изменения в таблицу разделов.
Когда не fdisk
находит действительной подписи, он считает, что нет действительной MBR, поэтому он создает ее во время записи новой таблицы разделов. В этом случае область кода начальной загрузки обнуляется (она не загружается).
Ни в том, ни в другом случае не fdisk
создается собственный загрузочный код, который фактически загружается.
fdisk
потому что fdisk
был явно упомянут в вопросе (хотя это может относиться к fdisk
DOS, я знаю об этом). Кстати, спасибо за вашу работу gdisk
.
Он создает MBR, если его нет, и внутри него создает таблицы разделов и томов для текущей схемы разделения. Эта информация обновляется по мере изменения схемы.
MBR указывает на загрузочные записи тома (VBR; он же загрузочный сектор) для активных разделов. Когда ОС установлена в этом разделе, она помещает свой код загрузчика в MBR, а код загрузочного сектора в VBR для своего тома. Затем загрузчик представляет загрузочные VBR для выбора пользователем в случае мультизагрузки или загружает VBR по умолчанию в своей конфигурации.
gdisk
, что, какfdisk
для GPT дисков. Я не знаю ни одного инструмента разметки Linux, который записывал бы загрузочный код в MBR, хотя бывают случаи (как в вашем случае № 2), в которых инструменты могут обнулять область кода MBR. Я менее знаком с инструментами разметки для других ОС. Как вы говорите, существует много инструментов для создания разделов, поэтому почти невозможно сказать, что ни один из них не записывает код загрузчика; даже если вы изучите десять, вполне возможно, что одиннадцатое сделает что-то другое. Также обратите внимание, что загрузочный код MBR становится менее актуальным с переключением в режим загрузки EFI.