UEFI + BIOS arrancable en vivo Debian stretch amd64 con persistencia

20

Toda la información que encuentro actualmente sobre este asunto es insuficiente para mi gusto. Es obsoleto, engañoso o incluso incorrecto, parece demasiado complicado o no cubre esta pregunta específica.

Metas:

  • Unidad USB de arranque (compatible con UEFI y BIOS heredado)
  • (basado en) Debian 9 en vivo (estiramiento)
  • persistencia (por defecto y para UEFI y BIOS heredado)
  • Diseño de teclado alemán por defecto
  • apto para solucionar problemas de otros sistemas GNU / Linux

Razones:

  • tener que configurar la distribución del teclado en cada uso es un verdadero dolor de cabeza
  • cryptsetup y efibootmgr faltan en las imágenes en vivo de Debian predeterminadas
  • gnome-terminal tiene este molesto fondo blanco por defecto

Sin soluciones

  • (re) crear una imagen en vivo de Debian personalizada (parece tedioso, aunque todavía no lo he probado)
  • unetbootin (pide una contraseña desconocida cuando se inicia en Debian Stretch y creo que de todos modos no es compatible con UEFI)
  • algún proceso automatizado extranjero donde no veo lo que está sucediendo

Las imágenes en vivo e instalación de Debian son isohíbridas y se pueden escribir convenientemente para bloquear el uso de dispositivos dd. Y funcionan desde unidades USB como esa, ¡lo cual es muy bueno! Sin embargo, no habrá persistencia ni forma de comenzar con un diseño de teclado que no esté en inglés por defecto sin editar la configuración de grub e isolinux, que se incluye en el sistema de archivos ISO9660 de solo lectura de la imagen ISO en vivo. Entonces, incluso después de escribir el ISO en vivo en una unidad USB, estos parámetros aún no se pueden cambiar.

Schlimmchen
fuente

Respuestas:

30

Aquí hay una manera de crear una unidad USB Debian live con persistencia. Permitirá instalar los paquetes faltantes que estarán disponibles a partir de ese momento en cada arranque en vivo usando la persistencia. Debido a que recreamos el contenido del sistema de archivos de imagen ISO en vivo en un sistema de archivos con capacidad de lectura y escritura, podemos cambiar las configuraciones del cargador de arranque para permitir la persistencia y establecer la distribución del teclado en el arranque.

Los pasos descritos aquí se probaron para trabajar en Debian stretch y buster para crear una imagen en vivo de Debian stretch.

Hay muchos pasos involucrados, pero parece que este método sigue siendo bastante eficiente.

Descargo de responsabilidad: perderá los datos en la unidad USB de destino y si desordena los comandos a continuación, puede sentir lástima después. No soy responsable de tus acciones.

Me siento afortunado

Si se siente particularmente afortunado hoy, puede probar un script bash que automatice el proceso por usted. Déle su ruta de imagen ISO como primer parámetro y el nombre del dispositivo de bloqueo de la unidad USB como el segundo. Tenga en cuenta que este script es increíblemente peligroso y que no debe ejecutarlo sin leerlo y comprenderlo primero.

TL; DR

Obtenga la imagen ISO en vivo de Debian, luego haga lo siguiente:

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

En detalle y con alguna explicación

Deberá ejecutar la mayoría de los siguientes comandos con privilegios elevados, es decir, usar sudoen la mayoría de los sistemas GNU / Linux.

Descargar

Descargue una imagen ISO en vivo de Debian con el administrador de ventanas de su elección:

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

Nos referiremos a la imagen ISO descargada simplemente como "live.iso".

Determinar la unidad de destino

Encuentre el dispositivo que utiliza su unidad USB lsblk. A eso lo llamaremos /dev/sdX.

Desmontar

Desmonta las particiones existentes en tu disco usando umount /dev/sdX*

Crear particiones

Necesitamos una partición de arranque EFI para que las PC UEFI arranquen desde la unidad USB. Luego, necesitamos una partición suficientemente grande para contener el contenido original de la imagen del sistema de archivos ISO en vivo. Esa partición debe tener establecida la legacy_bootbandera. Luego agregamos la partición de persistencia, utilizando todo el espacio restante de la unidad USB. Puede hacerlo con cualquier herramienta de partición compatible con GPT (tenga en cuenta el legacy_bootindicador). Aquí hay un ejemplo 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

Esto crea una tabla de partición GPT y una tabla de partición protectora MBR.

Crear sistemas de archivos

Queremos FAT en el EFI y la partición en vivo y queremos ext4en la partición de persistencia y requerimos la etiqueta persistencepara que la característica de persistencia funcione.

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

Montando los recursos

Tendremos que montar el ISO de origen y las particiones de destino en puntos de montaje temporales.

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 en vivo

Copie el contenido del sistema de archivos ISO en vivo en la partición LIVE.

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

persistencia.conf

Prepare el sistema de archivos de persistencia con el archivo de configuración requerido. La característica de persistencia no funcionará sin este archivo.

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

Grub para soporte UEFI

Instale grub2 para el soporte de arranque UEFI (esto requiere el grub-efi-amd64-binpaquete en Debian). Obligamos grub-installa no usar el arranque seguro UEFI, que aparentemente no funciona con la --removableopción.

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 soporte de BIOS heredado

Instale el gptmbr.bingestor de arranque syslinux en la unidad (descargue syslinux o instale el paquete syslinux-common). Luego instale syslinux en la partición en vivo.

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

Reparación de Isolinux

Reutilice la configuración isolinux del ISO en vivo original para trabajar con 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 del núcleo

Ahora que copiamos los archivos del sistema en vivo en un sistema de archivos de lectura y escritura real, podemos manipular la configuración de grub y syslinux.

Agregue el parámetro del núcleo de persistencia a menu.cfgy grub.cfg. En ambos archivos, agregue la palabra clave persistenceal final de la primera línea respectiva con boot=liveella.

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

Establezca el parámetro del kernel de distribución del teclado. En ambos archivos, agregue las palabras clave al final de la primera línea respectiva que contiene 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

Salpicadura de la comida

Arregle la imagen de inicio de grub (opcional; la trasladamos a otro directorio).

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

Desmontaje y limpieza

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 qué esto debería funcionar tanto para UEFI como para BIOS

Cuando se inicia en modo UEFI, la PC escaneará las particiones FAT que definimos en la tabla de particiones GPT. La primera partición FAT lleva el cargador de arranque grub UEFI, que se encuentra porque está ubicado en la ruta especificada por UEFI para unidades extraíbles (el --removablecambio a grub-installhizo esto). No es necesaria una entrada de arranque UEFI para que eso funcione, solo necesitamos hacer que la PC intente arrancar desde la unidad USB. Ese grub está configurado para tomarlo desde allí (cargue el grub.cfg, muestre el menú, etc.).

Al iniciar en modo BIOS y seleccionar arrancar desde la unidad USB, la PC ejecutará el gptmbr.bincódigo del cargador de arranque que hemos escrito en el MBR protector de la unidad USB. Ese gestor de arranque busca la partición GPT marcada con la legacy_bootbandera y la cadena de carga syslinux de esa partición. Syslinux se hace cargo (carga menu.cfg, muestra el menú, etc.).

Persistencia Encriptada

En lugar de usar ext4 simple en la partición de persistencia, primero se podría encriptar la partición de persistencia con LUKS (usando cryptsetup), luego formatearla con ext4 (usando la etiqueta adecuada). Sin embargo, como dice la documentación , el sistema en vivo debe incluir el cryptsetuppaquete. De lo contrario, la partición cifrada no puede ser descifrada por el sistema en vivo. Esto significa que primero hay que construir un ISO en vivo personalizado. Sin embargo, eso está fuera del alcance de esta respuesta.

Historia

La --no-uefi-secure-bootopción anteriormente no formaba parte de la llamada a grub-install. El dispositivo funcionó bien para mí, pero eso se detuvo con Debian Buster, a pesar de que el arranque seguro todavía está desactivado en mi máquina.

Schlimmchen
fuente
1
Acabo de crear una cuenta aquí para agradecerles por esto. Excelente manual. Pequeña sugerencia: sería bueno tener la partición de persistencia encriptada.
Petr Havlicek
1
@PetrHavlicek Verdadero. Creo que es bastante fácil de hacer, pero pasé mi tiempo libre desde que creé este Q&A con otros problemas, así que todavía tengo que volver a visitar esta idea (y gracias por su apreciación :).
schlimmchen
¡Funciona genial! Sin embargo, alguna explicación adicional sería agradable. (seguro que puede buscarlo todo en las páginas del manual, pero por ejemplo, mktable, aunque es lo mismo que mklable, no está realmente documentado como tal, etc.)
mikuszefski
¿Es posible tener solo un archivo en la memoria USB con formato FAT, que contiene el volumen de persistencia? Debería ser posible montando en bucle el archivo. Pero, ¿cómo decirle a Debians initrd que tome un archivo en lugar de una partición?
ceving
Ver debian-live.alioth.debian.org/live-manual/stable/manual/html/… para eso. En resumen: cree un archivo de imagen (disperso) en la raíz de cualquier sistema de archivos, nombre ese archivo 'persistencia' y formatee, por ejemplo, con ext4.
schlimmchen