Meu entendimento é que um MBR tem 512 bytes. Oprimeiros 440 bytes(daroupegaraalguns bytes, dependendo da implementação) contêm a área de código do carregador de boot/bootstrap. Os bytes restantes contêm informações sobre a tabela de partição.
Se eu zerar o MBR de um disco...
# Zero out the MBR
dd if=/dev/zero of=/dev/sdX bs=1 count=512
Em seguida, use fdisk
para escrever uma tabela de partição em /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
E então leia os primeiros 440 bytes ...
dd if=/dev/sdX bs=1 count=440
Os primeiros 440
bytes ainda são todos zero. fdisk
não toquei neles, o que faz sentido com base nos links que postei acima. fdisk
está gravando informações de partição, portanto, não deveria/precisaria tocar no primeiro arquivo 440
.
Os próximos 6
bytes são diferentes de zero. Estou assumindo que esses bytes fazem parte doassinatura de disco de um MBR padrão moderno.
$ dd if=/dev/sdX bs=1 count=6 skip=440 | hexdump -e '4/1 "%02x " "\n"'
9a 29 97 e7
Até agora, isso faz sentido com a minha compreensão de como o MBR é definido. Esses primeiros 440
bytes são ignorados fdisk
porque são o domínio do bootloader e fdisk
se preocupam apenas com tabelas de partição.
No entanto, parted
está me deixando confuso.
Se eu zerar o MBR desse mesmo disco novamente...
# Zero out the MBR
dd if=/dev/zero of=/dev/sdX bs=1 count=512
Em seguida, use o parted para criar um rótulo de disco (o que fdisk
pareceu acontecer automaticamente para mim acima) ...
parted /dev/sdX mklabel msdos
E então leia os primeiros 440
bytes ...
$ 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
Existem bytes diferentes de zero!Isso não parece fazer sentido com o meu entendimento atual de como o MBR deve ser organizado e o que o GNU parte édeveria realizar.
GNU Parted é um programa para criar e manipular tabelas de partição.
Por que está parted
gravando dados nesses primeiros 440
bytes? Esses bytes não são destinados a um bootloader? O parted não deveria deixar esses bytes em paz como fdisk
fez?
Responder1
Parece que estounãooapenasum paraperceberesse comportamento. Parece ser um problema especialmente para alguns arm
ambientes onde ter um bootloader no disco pode causar problemas.
O problema é que o próprio parted (e silenciosamente) coloca o código lá e, portanto, o sistema embarcado pensa que existe um código de bootloader válido e trava felizmente.
...e...
Existe alguma opção de parted para evitar adicionar este código (e se comportar como fdisk)?
Parece que esse comportamento parted
éintencional. Como um usuário na parted
mailing list pergunta:
O problema é que o parted está gerando o seguinte código desde o início do MBR:
...
Qual é o propósito deste código? Por que foi colocado lá?
E a resposta parece ser:
Esse é o código de inicialização MBR normalmente usado para inicializar um sistema BIOS. Se causar problemas em um sistema não x86, você deve zerá-lo (ou gravar o gerenciador de inicialização do sistema após o particionamento).
Parece que mklabel
foi projetado para gravar um gerenciador de inicialização genérico no disco. Pelo menos, quando um rótulo de msdos
está sendo usado. EUsuponhaisso faz sentido, mas vindo de fdisk
e syslinux
, parece um pouco incomum para um gerenciador de partição modificar setores do bootloader.
Istoparececomo parted
deverianãosubstituir esses setores se dados diferentes de zero estiverem presentes.
Não, a única vez que não será escrito é se já houver algo lá (por exemplo, não 0x00). Então, se você conseguir que o SDK escreva seu bootloader primeiro e depois particione-o, o parted o deixará intacto.
No entanto, isso énãoo comportamento que estou vendo. Se eu escrever lixo de /dev/urandom
e executar parted mklabel
, meus dados diferentes de zero serão definitivamente destruídos.
Se eu montar o mbr.s
arquivo a libparted
partir dorepositório separado, posso ver de onde vêm esses bytes.
$ 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
Aquilo éexatamentea sequência de bytes que parted
parece gerar no meu disco.