Создание загрузочного кода MBR

0

Что на fdiskсамом деле делает создание нового раздела (с использованием дисковой утилиты )? Создает ли он только таблицу разделов или также код начальной загрузки MBR?

Маллиган
источник

Ответы:

2

Согласно философии Unix, программа должна делать одно и делать это хорошо. Если предполагается, что данный инструмент изменяет таблицы разделов, он не должен беспокоиться об изменении кода начальной загрузки (или создании файловой системы и т. Д.).

Конечно, есть раздутые инструменты со всеми прибамбасами, fdiskэто не одно из них. Вы найдете мой анализ его поведения ниже. Это доказывает, что вполне возможно создать новый раздел, оставив код начальной загрузки MBR без изменений.

Я не знаю всех дисковых утилит на каждой платформе. Этот ответ предназначен только для fdiskутилит Linux .


Случай fdisk

Тестовая площадка: Ubuntu 16.04.2 LTS, fdiskот util-linux 2.27.1.


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, и вы увидите, что это фрагмент от подписи диска к загрузочной подписи . Впоследствии я также установил флаг загрузки, но он также не повлиял на код начальной загрузки. Никакого значимого загрузочного кода не появилось, он не загрузится.


2. 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вывод был точно таким же, как и раньше. Область кода начальной загрузки была обнулена, она не загружается.


3. MBR с мусором, действительная подпись

Тот же файл. Пишем мусор снова:

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создается собственный загрузочный код, который фактически загружается.

Камил Мачоровский
источник
1
Примечание: я написал gdisk, что, как fdiskдля GPT дисков. Я не знаю ни одного инструмента разметки Linux, который записывал бы загрузочный код в MBR, хотя бывают случаи (как в вашем случае № 2), в которых инструменты могут обнулять область кода MBR. Я менее знаком с инструментами разметки для других ОС. Как вы говорите, существует много инструментов для создания разделов, поэтому почти невозможно сказать, что ни один из них не записывает код загрузчика; даже если вы изучите десять, вполне возможно, что одиннадцатое сделает что-то другое. Также обратите внимание, что загрузочный код MBR становится менее актуальным с переключением в режим загрузки EFI.
Род Смит
@RodSmith Мой ответ о том, fdiskпотому что fdiskбыл явно упомянут в вопросе (хотя это может относиться к fdiskDOS, я знаю об этом). Кстати, спасибо за вашу работу gdisk.
Камиль Мачоровски
не было никакой критики; Я просто хотел немного расширить сферу, чтобы указать, что, AFAIK, никакое программное обеспечение для разделения Linux не записывает загрузочный код в MBR.
Род Смит
1

Он создает MBR, если его нет, и внутри него создает таблицы разделов и томов для текущей схемы разделения. Эта информация обновляется по мере изменения схемы.

MBR указывает на загрузочные записи тома (VBR; он же загрузочный сектор) для активных разделов. Когда ОС установлена ​​в этом разделе, она помещает свой код загрузчика в MBR, а код загрузочного сектора в VBR для своего тома. Затем загрузчик представляет загрузочные VBR для выбора пользователем в случае мультизагрузки или загружает VBR по умолчанию в своей конфигурации.

Фрэнк Томас
источник
Значит ли это, что при установке ОС она перезаписывает код начальной загрузки MBR, созданный ранее fdisk?
Маллиган
fdisk не создает загрузочный код.
Давидго