De acordo com a filosofia Unix , um programa deve fazer uma coisa e fazê-lo bem. Se uma determinada ferramenta deve modificar tabelas de partição, ela não deve se preocupar em modificar o código de bootstrap (ou criar sistemas de arquivos, etc.).
Claro que existem ferramentas inchadas com todos os sinos e assobios, fdisk
não é uma delas. Você encontrará minha análise de seu comportamento abaixo. Prova que é totalmente possível criar uma nova partição enquanto deixa o código de inicialização do MBR inalterado.
Eu não conheço todos os utilitários de disco em todas as plataformas. Esta resposta destina-se a cobrir apenas o utilitário Linux fdisk
.
O caso de fdisk
Testbed: Ubuntu 16.04.2 LTS, fdisk
de util-linux 2.27.1
.
1. Arquivo de zeros
Eu criei um arquivo vazio com
dd if=/dev/zero of=mydisk bs=1M count=1
Em seguida, executo fdisk mydisk
e adicionei uma única partição do setor 63
a 2047
, escrevi a tabela de partições.
A saída de 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
Como você pode ver, o primeiro byte diferente de zero está em 0x1b8
; o último está em 0x1ff
. Compare isso com a estrutura de um MBR padrão moderno e você verá que é o fragmento da assinatura de disco para inicializar assinatura . Eu também configurei o sinalizador inicializável depois, mas também não teve impacto no código de inicialização. Nenhum código de bootstrap significativo apareceu, ele não será inicializado.
2. MBR com lixo, assinatura inválida
Tendo o mesmo arquivo, eu sobrei seu MBR com lixo:
dd if=/dev/urandom of=mydisk bs=512 count=1 conv=notrunc
E me certifiquei de que não há assinatura de inicialização (a mais adequada seria 0xAA55
little endian, usei 0x1234
):
echo -ne "\x34\x12" | dd of=mydisk bs=1 count=2 seek=510 conv=notrunc
Depois criei uma partição como antes. Todo o lixo foi substituído por fdisk
e a saída hexdump -C mydisk
foi exatamente como antes. A área de código do bootstrap foi zerada, não será inicializada.
3. MBR com lixo, assinatura válida
O mesmo arquivo. Escrever lixo novamente:
dd if=/dev/urandom of=mydisk bs=512 count=1 conv=notrunc
Desta vez, configurei a assinatura de inicialização adequada ( 0xAA55
, little endian):
echo -ne "\x55\xAA" | dd of=mydisk bs=1 count=2 seek=510 conv=notrunc
Em seguida, fdisk mydisk
me permitiu examinar a tabela de partições semi-válida. Eu apaguei todas as partições e criei apenas uma exatamente como antes. Eu corro hexdump -C mydisk
e descobri que enquanto a área da tabela de partição foi alterada, o lixo na área de bootstrap ainda estava lá. Não houve alteração na área do código de bootstrap.
Eu não testei fdisk
com MBR contendo código bootstrap não-lixo e perfeitamente sadio. Eu acredito strongmente que a ferramenta não analisa o código. Ele permite que o lixo esteja neste caso, então ele deve fazer o mesmo com qualquer dado.
Conclusão
O comportamento fdisk
depende da existência de assinatura de inicialização - o valor 0xAA55
escrito como little endian no final do MBR de 512 bytes.
-
Quando
fdisk
encontra a assinatura, acredita que já existe um MBR válido presente. Ele deixa a área do código de inicialização intocada, mesmo que algumas alterações na tabela de partição sejam feitas. -
Quando
fdisk
não encontra nenhuma assinatura válida, acredita que não há nenhum MBR válido, portanto, cria um ao gravar a nova tabela de partição. Neste caso, a área do código de inicialização é zerada (não inicializa).
Em nenhum dos casos, fdisk
cria seu próprio código de inicialização que inicializa.