Что на самом деле делает создание нового раздела (с использованием дисковой утилиты, такой как fdisk
)? Создает ли он только таблицу разделов или также код начальной загрузки MBR?
2 ответа
Согласно философии Unix, программа должна делать что-то одно и делать это хорошо. Если предполагается, что данный инструмент модифицирует таблицы разделов, он не должен беспокоиться об изменении кода начальной загрузки (или создании файловой системы и т.д.).
Конечно, есть раздутые инструменты со всеми прибамбасами, fdisk
не входит в их число. Вы найдете мой анализ его поведения ниже. Это доказывает, что вполне возможно создать новый раздел, оставив код начальной загрузки MBR без изменений.
Я не знаю всех дисковых утилит на каждой платформе. Этот ответ предназначен только для утилиты Linux fdisk
.
Дело 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
И я убедился, что нет загрузочной подписи (правильной будет 0xAA55
little 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
На этот раз я установил правильную подпись загрузки (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
записывается как little-endian в самом конце 512-байтовой MBR.
Когда
fdisk
находит подпись, он считает, что уже есть действительный MBR. Он оставляет область кода начальной загрузки нетронутой, даже если вносятся некоторые изменения в таблицу разделов.Когда
fdisk
находит действительной подписи, он считает, что нет действительной MBR, поэтому он создает ее при записи новой таблицы разделов. В этом случае область кода начальной загрузки обнуляется (она не загружается).
Ни в том, ни в другом случае fdisk
создает собственный загрузочный код, который фактически загружается.
Он создает MBR, если его нет, и внутри него создает таблицы разделов и томов для текущей схемы разделения. Эта информация обновляется по мере изменения схемы.
MBR указывает на загрузочные записи тома (VBR; он же загрузочный сектор) для активных разделов. Когда в этом разделе установлена ОС, она помещает свой код загрузчика в MBR, а код загрузочного сектора в VBR для своего тома. Затем загрузчик представляет загрузочные VBR для выбора пользователем в случае мультизагрузки или загружает VBR по умолчанию в своей конфигурации.