Como você escreve um menu do grub.cfg para o Debian Netinst (8.2 a partir da escrita) para inicializar via USB?

3

Eu mantenho várias distribuições do Linux em um pendrive e gerencio-as simplesmente escrevendo as entradas do grub.cfg para cada distro. As outras distros eu mantenho a bota e corro muito bem, mas eu (e outras, parece ) começou a ter problemas com o Debian Jessie (8.x). O Debian Netinst inicializará na interface curses do debian-installer, mas tentará procurar pelo arquivo iso debian correto, mesmo quando o caminho iso for fornecido na linha do kernel em grub.cfg.

Eu tenho sido parcialmente bem-sucedido ao tentar inicializar o "debian-8.2.0-amd64-i386-netinst.iso" de um dispositivo USB. Primeiro configurei meu pendrive usando as instruções de multiboot USB encontradas no ArchWiki .

Aqui está uma estrutura simplificada de arquivos e pastas do dispositivo USB, seguida pelas entradas relevantes do grub.cfg.

USBROOT/
    ----boot/
        ----grub/
            ----grub.cfg
            ----(other grub paraphernalia)

        ----iso/
            ----debian/
                ----debian-8.2.0-amd64-i386-netinst.iso
                ----initrd.gz (special initrd)

Enquanto houver um initramfs dentro do iso, ele não permitirá que o debian seja inicializado corretamente por razões que eu realmente não entendo; isso é explicado brevemente nos dois links que eu dei até agora.

Agora minhas entradas do grub.cfg. Eu sei que este é um iso multiarch i386 / amd64, mas vou me concentrar apenas na parte de 64 bits para simplificar. Se podemos descobrir a parte de 64 bits, eu deveria ser capaz de fazer facilmente outra entrada para i386:

probe -u $root --set=rootuuid
set imgdevpath="/dev/disk/by-uuid/$rootuuid"

menuentry 'Debian 8.2 Multiarch' {
    set isoname='debian-8.2.0-amd64-i386-netinst.iso'
    set isopath='/boot/iso/debian'
    set isofile=${isopath}/${isoname}
    set initrdfile=${isopath}/initrd.gz
    loopback loop $isofile
    linux (loop)/install.amd/vmlinuz iso-scan/ask_second_pass=true iso-scan/filename=${imgdevpath}/${isofile} config quiet
    initrd ${initrdfile}/initrd.gz
}

Como um aparte: alterando a linha initrd para

initrd ${initrdfile}

faz o grub (eu acho) lançar um erro. O Grub faz uma pausa por alguns instantes, depois o Debian tenta inicializar e imediatamente tem um kernel panic - como esperado, porque não consegue encontrar um initramfs. No entanto, isso não acontece quando eu escrevo totalmente o caminho, conforme mostrado no exemplo de código de bloco. Por que lançaria um erro quando eu especifico o caminho com variáveis set, e não quando estou escrevendo o caminho completo manualmente? Mas a minha principal questão é:

Quais parâmetros de inicialização do kernel eu devo fornecer para que nenhuma pesquisa seja realizada e a iso está localizado no caminho que eu especificar. O instalador eventualmente encontra a iso correta pesquisando, mas por que ela precisa procurar?

Estou quase certo de que tem tudo a ver com a linha linux:

linux (loop)/install.amd/vmlinuz iso-scan/ask_second_pass=true iso-scan/filename=${imgdevpath}/${isofile} config quiet

Eu tentei pelo menos 20 variações sobre o tema, como mudar:

iso-scan/filename=${isofile}
findiso=${imgdevpath}/${isofile}
findiso=${isofile}

EDIT: Eu consertei o problema initrd: Eu tinha aspas simples ao definir $ initrdfile. O problema findiso / iso-scan / whatever ainda permanece.

    
por Yankee 20.09.2015 / 08:40

2 respostas

2

Como você está inicializando o netinst, você pode pular o ISO completamente e inicializar o kernel + initrd diretamente do seu sistema de arquivos USB. Este é um netboot d-i, ele apenas carregará o resto dos componentes de um repositório debian.

Sobre a pesquisa iso, o processo é mais ou menos assim:

  • o grub carrega o ISO e lê o kernel e o initrd na memória (no seu caso o initrd já foi extraído para a unidade USB)
  • o controle de mãos do grub para o kernel
  • o kernel controla o script de inicialização do initrd
  • o script de inicialização controla o debian-installer
  • o módulo iso-scan d-i monta todas as unidades disponíveis procurando o iso-scan/filename fornecido
  • uma vez que o ISO é encontrado e montado em loopback, o debian-installer continua com o processo

(veja também a seção 6.3.1.4 na instalação de documentos para mais detalhes)

Quando você dá um caminho como /dev/disk/by-uuid/UUID/debian/debian8.iso , não faz muito sentido, já que /dev/disk/by-uuid/UUID é um dispositivo de bloco e não um sistema de arquivos montado onde os arquivos podem residir.

Se você quiser que o iso-scan reduza a pesquisa, além de usar iso-scan / filename você também pode pré-configurar os valores * shared/ask_device=manual e shared/enter_device=/dev/disk/UUID (apenas adicione-os à sua linha de kernel)

Este deve ser seu grub.cfg então:

set imgdevpath="/dev/disk/by-uuid/UUID"

menuentry 'Debian 8.2 Multiarch' {
    set isofile='/boot/iso/debian/debian-8.2.0-amd64-i386-netinst.iso'
    loopback loop $isofile
    linux (loop)/install.amd/vmlinuz iso-scan/filename=$isofile shared/ask_device=manual shared/enter_device=$imgdevpath no-prompt no-eject
    initrd (loop)/install.amd/initrd.gz
}

Note que eu realmente não testei isso, estou copiando e colando de uma configuração semelhante à minha para uma versão mais antiga do Debian.

Eu recomendo que você comece com isso e somente se ele não funcionar, tente o outro initrd. Também verifique se ele funciona "manualmente" antes de ler o probe para o UUID.

* Estes são os que eu me referi como "dica" antes. Acho que eu lembrei do ubuntu ou de alguma outra distro

    
por 25.09.2015 / 02:43
0

Experimente esta solução.

Edite seu grub.cfg para corresponder aos caminhos corretos para o seu mini.iso . Cada mini.iso é exclusivo da arquitetura.

menuentry "Debian Stable | Testing | Experimental  AMD64 Netinst" {
    set isoname="mini.iso"
    set isopath="/boot/iso/debian/amd64"
    set isofile="${isopath}/${isoname}"
    echo "Using ${isoname}..."
    loopback loop $isofile
    linux (loop)/linux priority=low vga=788 ---
    initrd (loop)/initrd.gz
}

menuentry "Debian Stable | Testing | Experimental i386 Netinst" {
    set isoname="mini.iso"
    set isopath="/boot/iso/debian/i386"
    set isofile="${isopath}/${isoname}"
    echo "Using ${isoname}..."
    loopback loop $isofile
    linux (loop)/linux priority=low vga=788 ---
    initrd (loop)/initrd.gz
}

Faça o download do mini.iso que corresponde à sua arquitetura aqui.

Melhor da sorte.

    
por 10.11.2016 / 20:24