Почему GNU разделил запись данных в первые 440 байтов MBR?
Насколько я понимаю, MBR составляет 512 байт. Первые 440 байтов ( дают или берут несколько байтов, в зависимости от реализации) содержат область кода загрузчика / загрузчика. Остальные байты содержат информацию о таблице разделов.
Если я обнулю MBR диска...
# Zero out the MBR
dd if=/dev/zero of=/dev/sdX bs=1 count=512
Затем используйте fdisk
записать таблицу разделов в /dev/sdX
...
# Create a 2GiB partition starting at 2048 (default).
fdisk /dev/sdX
...
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier ...
...
(fdisk) n
(fdisk) p
(fdisk) 1
(fdisk) 2048
(fdisk) +2G
(fdisk) w
А затем прочитать первые 440 байт...
dd if=/dev/sdX bs=1 count=440
Первый 440
все байты все еще равны нулю. fdisk
не трогал их, что имеет смысл исходя из ссылок, которые я разместил выше. fdisk
записывает информацию о разделах, поэтому она должна / не должна касаться первой 440
,
Следующий 6
байты ненулевые. Я предполагаю, что эти байты являются частью сигнатуры диска современного стандартного MBR.
$ dd if=/dev/sdX bs=1 count=6 skip=440 | hexdump -e '4/1 "%02x " "\n"'
9a 29 97 e7
Пока что это имеет смысл с моим пониманием того, как устроен MBR. Те первые 440
байты игнорируются fdisk
потому что они являются доменом загрузчика, и fdisk
касается только таблиц разделов.
Тем не мение, parted
бросает меня за петлю.
Если я снова обнулю MBR этого же диска...
# Zero out the MBR
dd if=/dev/zero of=/dev/sdX bs=1 count=512
Затем используйте parted для создания метки диска (которая fdisk
Казалось, сделать автоматически для меня выше)...
parted /dev/sdX mklabel msdos
А потом перечитать первый 440
байт...
$ dd if=/dev/sdX bs=1 count=440 | hexdump -e '16/1 "%02x " "\n"'
fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0
fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00
00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75
f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b
4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Есть ненулевые байты! Это, кажется, не имеет смысла с моим текущим пониманием того, как MBR должен быть размечен и что предполагается разделить GNU.
GNU Parted - это программа для создания и управления таблицами разделов.
Почему parted
запись данных в тех, кто первым 440
байт? Разве эти байты не предназначены для загрузчика? Не следует расставаться, оставить эти байты в одиночестве, как fdisk
сделал?
1 ответ
Казалось бы, я не единственный, кто заметил это поведение. Это, кажется, особенно проблема для некоторых arm
окружение, где наличие загрузчика на диске может вызвать проблемы.
Проблема в том, что parted сам (и молча) помещает туда код, и, следовательно, встроенная система думает, что код корректного загрузчика есть, и благополучно зависает.
...а также...
Есть ли опция parted, чтобы избежать добавления этого кода (и вести себя как fdisk)?
Кажется, что это поведение parted
намеренно Как пользователь на parted
почтовый лиск спрашивает:
Проблема в том, что parted генерирует следующий код с самого начала MBR:
...
Какова цель этого кода? Почему это было положено там?
И ответ, кажется, таков:
Это загрузочный код MBR, обычно используемый для загрузки системы BIOS. Если это вызывает проблемы в системе, отличной от x86, вы должны обнулить ее (или записать системный загрузчик после разбиения).
Кажется, что mklabel
предназначен для записи общего загрузчика на диск. По крайней мере, когда ярлык msdos
используется. Я полагаю, это имеет смысл, но исходя из fdisk
а также syslinux
Для менеджера разделов кажется немного необычным модифицировать секторы загрузчика.
Похоже parted
не следует перезаписывать эти сектора, если присутствуют ненулевые данные.
Нет, единственный раз, когда он не будет писать, это если что-то уже есть (например, не 0x00). Так что если вы можете заставить SDK сначала написать свой загрузчик, а затем разбить его на части, parted оставит его нетронутым.
Тем не менее, это не то поведение, которое я вижу. Если я пишу мусор из /dev/urandom
затем беги parted mklabel
Мои ненулевые данные определенно засорены.
Если я соберу mbr.s
файл в libparted
из разделенного репо я вижу, откуда берутся эти байты.
$ as86 -b /dev/stdout mbr.s | hexdump -e '16/1 "%02x " "\n"'
fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0
fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00
00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75
f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b
4c 02 cd 13 ea 00 7c 00 00 eb fe
Это именно та последовательность байтов, которая parted
кажется, генерирует на моем диске.