Descobrir a localização exata do GRUB / GRUB que não funciona depois de copiar a imagem do disco

1

Eu preparei uma imagem do servidor Ubuntu com o VirtualBox. Para transferir a imagem para o SSD do servidor eu primeiro dd ed o MBR (512 bytes) e, em seguida, a partição LVM (PV contendo a partição raiz encolhida para 3GB). O servidor falhou ao inicializar porque algumas partes do GRUB estavam ausentes. O prompt de resgate do grub estava aparecendo.

Como aprendi com a documentação do GRUB, isso faz sentido, porque partes dele são (geralmente) armazenadas no espaço em disco entre o MBR e a primeira partição.

Mas como descobri exatamente onde?

Estou ciente de que poderia copiar o espaço inteiro na frente da primeira partição, mas estou curioso para saber se existe algum comando que mostre os locais exatos das várias partes do GRUB.

Esclarecimento : Não há partição de inicialização separada. Existe apenas o volume físico do LVM contendo apenas a partição raiz (com a pasta / boot). O problema de inicialização também pode ser corrigido por chroot ing na imagem copiada e executando grub-install .

    
por code_onkel 11.02.2018 / 01:10

1 resposta

2

No MBR criado pelo GRUB2, iniciando no deslocamento 0x5c, há um valor de 64 bits little-endian indicando o número do próximo bloco de disco a ser carregado. Este é frequentemente o bloco 0x00000000 00000001, isto é, o bloco seguinte depois do MBR.

(Por antiga convenção DOS, a primeira partição começará no início do cilindro # 1, então normalmente há um número de blocos não utilizados disponíveis no cilindro # 0 após o MBR. Em sistemas modernos, a primeira partição é tipicamente alinhada para iniciar a partir do bloco # 2048, ou seja, exatamente 1 MB a partir do início do disco. Isso gera ainda mais blocos livres antes do início da primeira partição.)

Este segundo bloco contém mais um código do kernel do GRUB, e uma lista de bloqueio que especifica os blocos para carregar o restante da imagem principal do GRUB. A lista de bloqueio está localizada no final desse bloco. Cada entrada da lista de bloqueio tem 12 bytes de comprimento e é estruturada da seguinte forma:

struct __attribute__ ((packed)) g2_blist_entry {
  uint64_t start_lba;  # the LBA block number of the first block covered by this entry
  uint16_t num_blocks; # number of blocks to read
  uint16_t startseg;   # segment address in memory to write them to
};

Normalmente, a lista de bloqueio tem apenas uma entrada que abrange todos os blocos restantes para ler, a partir do bloco 0x00000000 00000002.

O comprimento da imagem principal do GRUB varia de acordo com a versão do GRUB e o número de módulos anexados ao kernel do GRUB.

Por exemplo, no meu sistema Debian 9 que usa boot MBR legado, o GRUB engloba um total de 103 blocos após o MBR. Em uma VM do RHEL 7.4, o comprimento total é de 107 blocos após o MBR.

    
por 11.02.2018 / 12:31