Quais etapas estou faltando na minha tentativa de criar uma imagem de distribuição Linux inicializável?

6

Estou tentando criar uma imagem de distribuição (via comando dd do Linux) para um SO que trabalhar com discos rígidos e mídia flash. Tenho tido sucesso na criação da imagem, mas não consigo inicializá-la corretamente. Vou layout dos passos abaixo:

  1. Isso cria um arquivo em branco para conter a imagem inteira:

    dd if=/dev/zero of=/tmp/test.img bs=512 count=1250000
    
  2. Associa um arquivo de dispositivo de loopback ao arquivo de imagem:

    losetup /dev/loop0 /tmp/test.img
    
  3. Antes de podermos manipular com parted , DEVEMOS definir um tipo de etiqueta de mídia:

    parted -s /dev/loop0 mklabel msdos
    
  4. Faça a primeira partição 512MB dentro do arquivo de imagem:

    parted -s -a opt /dev/loop0 mkpart primary ext2 '0%' 512MB
    
  5. Defina a primeira partição como "inicializável":

    parted -s /dev/loop0 set 1 boot on
    
  6. Cria um sistema de arquivos Ext2 na primeira partição:

    mkfs.ext2 -b 1024 /dev/loop0p1
    
  7. Instala o stage1 do código de inicialização do grub, preservando a tabela de partições criada acima:

    dd if=/boot/grub/stage1 of=/dev/loop0 bs=446 count=1
    
  8. Instala o stage2 do código de inicialização do grub após os primeiros 512 bytes da mídia (ignorando o stage1 e a tabela de partições):

    dd if=/boot/grub/stage2 of=/dev/loop0 bs=512 seek=1
    
  9. Monte a primeira partição do arquivo de imagem em um ponto de montagem:

    mount /dev/loop0p1 /mnt/image
    
  10. Copie todos os dados para a partição e umount.

  11. dd do arquivo de imagem para qualquer disco rígido ou mídia flash.

Usando essas etapas, posso dd do arquivo de imagem em um disco rígido ou unidade flash e inicializar em um console herdado do grub onde posso inicializar, mas apenas especificando as root , kernel e initrd valores. Se eu tentar instalar o grub legado através dos comandos root e setup , não receberei erros, mas o dispositivo inicializará sem sentido. Em execução e fdisk -l produz:

Partition 1 has different physical/logical beginnings (non-Linux?):
phys(0,32,33) logical(0,37,14)
Partition 1 has different physical/logical endings:
phys(62,53,55) logical(336,27,19)

Eu acho que há um problema com o modo como o arquivo de imagem está sendo criado, já que ele é responsável pela criação da tabela de partição (confusa). Alguém consegue usar essas etapas (modificadas) para produzir uma mídia inicializável ativa?

    
por user1646428 24.09.2015 / 17:48

1 resposta

1
  1. Make the first partition 512MB within the image file

    parted -s -a opt /dev/loop0 mkpart primary ext2 '0%' 512MB

Na etapa 4, você usa um utilitário para modificar a primeira entrada da Tabela de Partições, que está no final do setor / bloco que também contém o carregador de inicialização do MBR.

  1. Installs the stage1 of grub’s bootstrap code while preserving the partition table created above:

    dd if=/boot/grub/stage1 of=/dev/loop0 bs=446 count=1

Na etapa 7, você tenta instalar o gerenciador de inicialização no primeiro setor / bloco, que já contém uma tabela de partições vailid. Mas o dd é um utilitário de transferência de bloco, que lê blocos da origem, e grava esses blocos no destino.

Neste caso, o dispositivo de destino é um HDD ou SSD, que é presumivelmente baseado em setores 512 (ou 4096) bytes. Uma operação de leitura ou gravação em um dispositivo de bloco deve ser para todo o setor.
Quando uma gravação "curta" de apenas 446 bytes é tentada, o controlador de disco (ou o SO) irá obrigar, mas anexar 66 (ou 3650) bytes de zeros para preencher o setor em sua extensão adequada / completa.
Uma gravação de bloco simplesmente não se destina a modificação parcial do setor e preservação da "porção não escrita".

Esta operação de gravação, portanto, irá sobrescrever a Tabela de Partição instalada anteriormente.

A solução simples é executar o passo 7 antes do passo 4. Isso gravará todo o setor do MBR com uma Partition Table vazia e, em seguida, editará apenas uma entrada.

    
por 25.09.2015 / 00:40