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

2 ответа2

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

1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .