grub: como inicializar na partição ISO

5

Eu copiei um arquivo ISO em uma partição (por exemplo, dd if = isofile of = / dev / sdb1). Como posso iniciar essa partição via GRUB?

Quando eu tento apenas com o chainloader (hd1,0) +1, ele diz o formato do executável desconhecido.

    
por Albert 18.06.2010 / 16:28

2 respostas

3

Veja minha resposta em sua pergunta de inicialização de arquivos ISO . Usando isso como ponto de partida, fiz alguns testes com um disco rígido antigo. Eu anteriormente configurei o Grub2 para inicializar um flash drive multi-ISO , então o que eu fiz foi:

  1. Crie algumas partições em um disco rígido antigo. Isso foi feito usando um adaptador USB para IDE, então a unidade aparece como / dev / sdb.

    • Partição 1: FAT32, ~ 2GB de tamanho
    • Partição 2: não formatada


  2. Montou a primeira partição para / mnt e instalou uma cópia do Grub do meu sistema na unidade:

    sudo grub-install --no-floppy --root-directory=/mnt /dev/sdb
    


  3. "Gravou" um ISO na segunda partição:

    sudo dd if=avg.iso /dev/sdb2
    


  4. Este é um ISO do scanner de vírus AVG; no meu flash drive multi-ISO, eu uso isso para inicializar o ISO diretamente:

    menuentry "AVG Rescue CD" {
       loopback loop /iso/avg.iso
       linux (loop)/isolinux/vmlinuz max_loop=255 vga=791 init=linuxrc iso-scan/filename=/iso/avg.iso
       initrd (loop)/isolinux/initrd.lzm
    }
    

    Para fazer este trabalho a partir de uma partição do disco rígido, precisamos nix o comando loopback e definir o dispositivo raiz e tal. Minhas tentativas de fazer com que o Grub2 descobrisse o dispositivo root automaticamente falharam, então eu apontei para a partição diretamente. Isso funciona, mas cuidado com a enumeração de dispositivos do Grub; a unidade que você está tentando inicializar pode não ser (hd0). Aqui está uma entrada de trabalho para a partição ISO:

    menuentry "AVG Rescue CD" {
       linux (hd0,2)/isolinux/vmlinuz max_loop=255 vga=791 init=linuxrc
       initrd (hd0,2)/isolinux/initrd.lzm
    }
    

    Isso resulta em uma partição ISO inicializável.

Isso funciona porque o Grub2 pode ler sistemas de arquivos ISO9660, porque esse ISO específico está carregando um SO que pode lidar com um ISO em uma partição, e porque praticamente tudo que o kernel carrega está no initrd . / p>

Se você estiver usando o Grub4DOS ou o Grub 1, você pode conseguir um truque semelhante com o chainloader. Presumindo que isso funcione para inicializar o ISO do Win7 diretamente ( source ):

title Windows 7
  map (hd0,0)/win7.iso (hd32)
  map --hook
  chainloader (hd32)

Você pode ter sorte com essa modificação (supondo que você "queimou" o ISO na segunda partição primária, (hd0,1); caso contrário, substitua a partição correta):

title Windows 7
  map (hd0,1) (hd32)
  map --hook
  chainloader (hd32)

Você também pode se safar disso:

title Windows 7
  chainloader (hd0,1)

No entanto, o ISO não está realmente configurado para inicializar a partir de uma unidade, portanto, você pode encontrar outros problemas.

    
por 18.06.2010 / 23:13
0

Veja como eu consegui fazer isso usando Grub4DOS (última compilação oficial):

O Grub4DOS pode imagens iso de inicialização , por isso ele deve ser capaz de fazer isso partições

Nós queremos mapear a partição iso para uma nova unidade e inicializá-la com:

title Boot ISO Partition
    map (hd0,7) (0xff)
    map --hook
    chainloader (0xff)

Mas isso não funciona, todo o disco está sendo mapeado.

Felizmente, map pode usar um "arquivo ou lista de bloqueio" como primeiro argumento.

  1. Descubra quantos blocos sua partição leva:

    $ sudo fdisk -l /dev/sda
    ...
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda8            5948        6087     1124518+   b  W95 FAT32
    

    Eu criei uma partição de 1.1Gb, então eu preciso usar 1124518 * 2 = 2249036 aqui. (tecnicamente é 2249037 mas não importa)

  2. Agora passe a lista de bloqueio para o grub:

    title Boot ISO Partition
        map --heads=0 --sectors-per-track=0 (hd0,7)0+2249036 (0xff)
        map --hook
        chainloader (0xff)
    

    E funciona!

Notas:

  • Se você obtiver o tamanho errado, o grub irá detectá-lo (o comando map falhará além do limite da partição). Se for muito pequeno, provavelmente não inicializará.
  • Pode usar (hd32) em vez de (0xff) também.
  • Ainda não experimentou a versão 4.5b, o problema pode ser corrigido lá.

Para encadear o Grub4DOS a partir do Grub2:

menuentry "Boot ISO Partition" {
        root (hd0,1)
        set opts='map --heads=0 --sectors-per-track=0 (hd0,7)0+2249036 (0xff);
                  map --hook;
                  chainloader (0xff) '
        linux16 /boot/grub4dos/grub.exe --config-file=$opts
}

Adicione isto a /boot/grub/grub.cfg (ou talvez melhor /etc/grub.d/40_custom ).
(assumindo grub.exe em /boot/grub4dos na primeira partição)

Conclusão: é bem legal, na verdade.

  • Chainloads no isolinux / qualquer bootloader que a imagem esteja usando,
    Portanto, a experiência de inicialização é exatamente a mesma do cd ou do pendrive.
  • Tudo o que você precisa fazer para tentar um novo iso é adicioná-lo à partição e reinicializar.
  • Mais rápido que o usb (especialmente com ssd!) e mais eficiente que o loop que monta o iso (baseado no ubuntu isos).
  • A imagem não precisa ser lida no disco como no memdisk .

Isso deve funcionar com qualquer iso híbrido. Funciona muito bem com imagens ao vivo do Ubuntu e outras isos Linux, pois eles conseguem encontrar seus arquivos na partição iso9660. Qualquer coisa em modo real (DOS) também deve estar bem. As isos do Windows não serão capazes de lidar.

Gujin pode fazer isso também btw.

    
por 29.11.2014 / 14:22