Debian ao vivo inicializável UEFI + BIOS stretch amd64 com persistência

20

Todas as informações que atualmente encontro sobre esse assunto são insuficientes para o meu gosto. Está desatualizado, enganoso ou até errado, parece excessivamente complicado ou não cobre essa questão específica.

Objetivos:

  • unidade USB inicializável (UEFI e BIOS herdado)
  • (baseado em) live Debian 9 (extensão)
  • persistência (por padrão e para UEFI e BIOS herdado)
  • Layout do teclado alemão por padrão
  • apto para solucionar problemas de outros sistemas GNU / Linux

Razões:

  • ter que configurar o layout do teclado em todos os usos é uma verdadeira dor de cabeça
  • cryptsetup e efibootmgr estão ausentes nas imagens ao vivo padrão do Debian
  • O gnome-terminal possui esse fundo branco irritante por padrão

Sem soluções:

  • (re) construção de imagem ao vivo do debian personalizada (parece tedioso, embora eu ainda não tenha experimentado)
  • unetbootin (solicita uma senha desconhecida ao iniciar no debian stretch e acho que não suporta UEFI de qualquer maneira)
  • algum processo automatizado estrangeiro onde eu não vejo o que está acontecendo

As imagens ao vivo e de instalação do Debian são iso-híbridas e podem ser convenientemente gravadas para bloquear dispositivos usando dd. E eles funcionam a partir de drives USB como esse, o que é muito bom! No entanto, não haverá persistência e nenhuma maneira de começar com um layout de teclado que não seja o inglês por padrão sem editar a configuração do grub e do isolinux, que está incluída no sistema de arquivos ISO9660 muito somente leitura da imagem ISO ao vivo. Portanto, mesmo depois de gravar o ISO ao vivo em uma unidade USB, esses parâmetros ainda não podem ser alterados.

Schlimmchen
fonte

Respostas:

30

Aqui está uma maneira de criar uma unidade USB ao vivo Debian com persistência. Ele permitirá instalar os pacotes ausentes, que a partir de então estarão disponíveis em cada inicialização ao vivo usando a persistência. Como recriamos o conteúdo do sistema de arquivos de imagem ISO ao vivo em um sistema de arquivos com capacidade de leitura e gravação, podemos alterar as configurações do carregador de inicialização para permitir persistência e definir o layout do teclado na inicialização.

As etapas descritas aqui foram testadas para trabalhar no alongamento e buster do Debian para criar uma imagem ao vivo do alongamento do Debian.

Existem muitas etapas envolvidas, mas parece que esse método ainda é bastante eficiente.

Isenção de responsabilidade: você perderá os dados na unidade USB de destino e, se você estragar os comandos abaixo, poderá sentir muito depois. Eu não sou responsável por suas ações.

Sentindo-se sortudo

Se você se sente particularmente sortudo hoje, pode tentar um script bash automatizando o processo para você. Dê a ele o caminho da imagem ISO como primeiro parâmetro e o nome do dispositivo do bloco da unidade USB como o segundo. Observe que esse script é incrivelmente perigoso e que você não deve executá-lo sem ler e entender primeiro.

TL; DR

Obtenha a imagem ISO ao vivo da Debian e faça o seguinte:

umount /dev/sdX*
parted /dev/sdX --script mktable gpt
parted /dev/sdX --script mkpart EFI fat16 1MiB 10MiB
parted /dev/sdX --script mkpart live fat16 10MiB 3GiB
parted /dev/sdX --script mkpart persistence ext4 3GiB 100%
parted /dev/sdX --script set 1 msftdata on
parted /dev/sdX --script set 2 legacy_boot on
parted /dev/sdX --script set 2 msftdata on

mkfs.vfat -n EFI /dev/sdX1
mkfs.vfat -n LIVE /dev/sdX2
mkfs.ext4 -F -L persistence /dev/sdX3

mkdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
mount /dev/sdX1 /tmp/usb-efi
mount /dev/sdX2 /tmp/usb-live
mount /dev/sdX3 /tmp/usb-persistence
mount -oro live.iso /tmp/live-iso

cp -ar /tmp/live-iso/* /tmp/usb-live

echo "/ union" > /tmp/usb-persistence/persistence.conf

grub-install --no-uefi-secure-boot --removable --target=x86_64-efi --boot-directory=/tmp/usb-live/boot/ --efi-directory=/tmp/usb-efi /dev/sdX

dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/mbr/gptmbr.bin of=/dev/sdX
syslinux --install /dev/sdX2

mv /tmp/usb-live/isolinux /tmp/usb-live/syslinux
mv /tmp/usb-live/syslinux/isolinux.bin /tmp/usb-live/syslinux/syslinux.bin
mv /tmp/usb-live/syslinux/isolinux.cfg /tmp/usb-live/syslinux/syslinux.cfg

sed --in-place 's#isolinux/splash#syslinux/splash#' /tmp/usb-live/boot/grub/grub.cfg

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 persistence/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 keyboard-layouts=de locales=en_US.UTF-8,de_DE.UTF-8/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

umount /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
rmdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso

Em detalhes e com alguma explicação

Você precisará executar a maioria dos comandos a seguir com privilégios elevados, ou seja, usar sudona maioria dos sistemas GNU / Linux.

Baixar

Faça o download de uma imagem ISO ao vivo do Debian com o gerenciador de janelas de sua escolha:

https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/

Vamos nos referir à imagem ISO baixada simplesmente como "live.iso".

Determinar unidade de destino

Encontre o dispositivo que sua unidade USB está usando lsblk. Vamos ligar assim /dev/sdX.

Desmontar

Desmonte as partições existentes na sua unidade usando umount /dev/sdX*

Criar partições

Precisamos de uma partição de inicialização EFI para PCs UEFI para inicializar a partir da unidade USB. Então precisamos de uma partição suficientemente grande para armazenar o conteúdo original da imagem do sistema de arquivos ISO ao vivo. Essa partição deve ter o legacy_bootsinalizador definido. Em seguida, adicionamos a partição de persistência, utilizando todo o espaço restante da unidade USB. Você pode fazer isso com qualquer ferramenta de particionamento compatível com GPT (lembre-se do legacy_bootsinalizador). Aqui está um exemplo usando parted:

parted /dev/sdX --script mktable gpt
parted /dev/sdX --script mkpart EFI fat16 1MiB 10MiB
parted /dev/sdX --script mkpart live fat16 10MiB 3GiB
parted /dev/sdX --script mkpart persistence ext4 3GiB 100%
parted /dev/sdX --script set 1 msftdata on
parted /dev/sdX --script set 2 legacy_boot on
parted /dev/sdX --script set 2 msftdata on

Isso cria uma tabela de partição GPT e uma tabela de partição protetora MBR.

Criar sistemas de arquivos

Queremos o FAT na partição EFI e ao vivo e queremos ext4na partição de persistência e exigimos o rótulo persistencepara que o recurso de persistência funcione.

mkfs.vfat -n EFI /dev/sdX1
mkfs.vfat -n LIVE /dev/sdX2
mkfs.ext4 -F -L persistence /dev/sdX3

Montando os Recursos

Precisamos montar o ISO de origem e as partições de destino em pontos de montagem temporários.

mkdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
mount /dev/sdX1 /tmp/usb-efi
mount /dev/sdX2 /tmp/usb-live
mount /dev/sdX3 /tmp/usb-persistence
mount -oro live.iso /tmp/live-iso

Instalar sistema ativo

Copie o conteúdo do sistema de arquivos ISO ativo para a partição LIVE.

cp -ar /tmp/live-iso/* /tmp/usb-live

persistence.conf

Prepare o sistema de arquivos de persistência com o arquivo de configuração necessário. O recurso de persistência não funcionará sem esse arquivo.

echo "/ union" > /tmp/usb-persistence/persistence.conf

Grub para suporte UEFI

Instale o grub2 para suporte à inicialização UEFI (isso requer o grub-efi-amd64-binpacote no Debian). Nós forçamos grub-installa não usar a inicialização segura UEFI, que aparentemente não funciona com a --removableopção.

grub-install --no-uefi-secure-boot --removable --target=x86_64-efi --boot-directory=/tmp/usb-live/boot/ --efi-directory=/tmp/usb-efi /dev/sdX

Syslinux para suporte a BIOS herdado

Instale o gptmbr.bincarregador de inicialização syslinux na unidade (faça o download do syslinux ou instale o pacote syslinux-common). Em seguida, instale o syslinux na partição ativa.

dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/mbr/gptmbr.bin of=/dev/sdX
syslinux --install /dev/sdX2

Fixação do Isolinux

Reutilize a configuração do isolinux da ISO ao vivo original para trabalhar com o syslinux.

mv /tmp/usb-live/isolinux /tmp/usb-live/syslinux
mv /tmp/usb-live/syslinux/isolinux.bin /tmp/usb-live/syslinux/syslinux.bin
mv /tmp/usb-live/syslinux/isolinux.cfg /tmp/usb-live/syslinux/syslinux.cfg

Parâmetros do kernel

Agora que copiamos os arquivos do sistema ativo para um sistema de arquivos de leitura / gravação real, podemos manipular a configuração do grub e do syslinux.

Adicione o parâmetro do persistence kernel a menu.cfge grub.cfg. Nos dois arquivos, adicione a palavra persistence- chave no final da respectiva primeira linha boot=live.

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 persistence/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

Defina o parâmetro do kernel do layout do teclado. Nos dois arquivos, adicione as palavras-chave no final da respectiva primeira linha boot=live.

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 keyboard-layouts=de locales=en_US.UTF-8,de_DE.UTF-8/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

Respingo de Grub

Corrija a imagem inicial do grub (opcional; a movemos para outro diretório).

sed --in-place 's#isolinux/splash#syslinux/splash#' /tmp/usb-live/boot/grub/grub.cfg

Desmontagem e Limpeza

umount /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
rmdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso

Por que isso deve funcionar para UEFI e BIOS

Ao iniciar no modo UEFI, o PC varrerá as partições FAT definidas na tabela de partições GPT. A primeira partição FAT carrega o UEFI grub bootloader, encontrado porque está localizado no caminho especificado pela UEFI para unidades removíveis (a --removableopção para grub-installisso). Nenhuma entrada de inicialização UEFI é necessária para que isso funcione, precisamos apenas fazer o PC tentar inicializar a partir da unidade USB. Esse grub está configurado para levá-lo a partir daí (carregue o grub.cfg, mostre o menu etc.).

Ao iniciar no modo BIOS e selecionar a inicialização a partir da unidade USB, o PC executará o gptmbr.bincódigo do carregador de inicialização que escrevemos no MBR de proteção da unidade USB. Esse carregador de inicialização procura a partição GPT marcada com o legacy_bootsinalizador e o syslinux de carregamento em cadeia dessa partição. O Syslinux assume o controle (carrega menu.cfg, mostra o menu etc.).

Persistência Criptografada

Em vez de usar ext4 simples na partição de persistência, é possível primeiro criptografar a partição de persistência com LUKS (usando cryptsetup) e depois formatar isso com ext4 (usando o rótulo apropriado). No entanto, como diz a documentação , o sistema ativo deve incluir o cryptsetuppacote. Caso contrário, a partição criptografada não poderá ser descriptografada pelo sistema ativo. Isso significa que é preciso criar um ISO ao vivo personalizado primeiro. Isso está, no entanto, fora do escopo desta resposta.

História

A --no-uefi-secure-bootopção anteriormente não fazia parte da chamada para grub-install. O stick funcionou bem para mim, mas isso parou com o Debian buster, mesmo que a inicialização segura ainda esteja desativada na minha máquina.

Schlimmchen
fonte
1
Acabei de criar uma conta aqui para agradecer por isso. Excelente manual. Pequena sugestão - seria bom ter a partição de persistência criptografada.
precisa saber é o seguinte
1
@PetrHavlicek True. Eu acho que isso é fácil, mas passei meu tempo livre desde a criação desta sessão de perguntas e respostas com outras questões, por isso ainda preciso revisitar essa ideia (e obrigado por sua apreciação :).
schlimmchen
Funciona bem! Alguma explicação extra seria legal, no entanto. (se você pode olhar tudo para cima nas páginas homem, mas por exemplo mktable, enquanto o mesmo que mklable, não é realmente documentado como tal, etc.)
mikuszefski
É possível ter apenas um arquivo no pen drive formatado em FAT, que contém o volume de persistência? Isso deve ser possível montando o arquivo em loop. Mas como dizer ao Debians initrd para pegar um arquivo em vez de uma partição?
ceving
Veja debian-live.alioth.debian.org/live-manual/stable/manual/html/… para isso. Resumindo: Crie um arquivo de imagem (esparso) na raiz de qualquer sistema de arquivos, nomeie o arquivo como 'persistência' e formate-o, por exemplo, com ext4.
schlimmchen