criação de código de bootstrap MBR

0

O que a criação de uma nova partição (usando o utilitário de disco como fdisk ) realmente faz? Ele cria apenas Partition Table ou também o código de bootstrap do MBR?

    
por Mulligan 05.05.2017 / 17:20

2 respostas

2

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.

    
por 05.05.2017 / 19:20
1

Ele cria um MBR se nenhum existir, e dentro dele, cria tabelas de partição e volume para o esquema de particionamento atual . Esta informação é atualizada conforme o esquema muda.

O MBR aponta para registros de inicialização de volume (VBR; também conhecido como o setor de inicialização) para partições ativas. Quando um sistema operacional é instalado nessa partição, ele coloca seu código de bootloader no MBR e seu código de setor de inicialização dentro do VBR para seu volume. O bootloader então apresenta VBRs inicializáveis para o usuário escolher no caso de uma inicialização múltipla, ou inicializa com o VBR padrão em sua configuração.

    
por 05.05.2017 / 17:53