UEFI + BIOS bootable live Debian stretch amd64 avec persistance

20

Toutes les informations que je trouve actuellement à ce sujet sont insuffisantes à mon goût. Elle est soit dépassée, trompeuse ou même erronée, semble trop compliquée ou ne couvre pas cette question spécifique.

Buts:

  • clé USB amorçable (UEFI et BIOS hérité pris en charge)
  • (basé sur) Debian 9 en direct (stretch)
  • persistance (par défaut et pour UEFI et BIOS hérité)
  • Disposition du clavier allemand par défaut
  • apte à dépanner d'autres systèmes GNU / Linux

Les raisons:

  • avoir à configurer la disposition du clavier à chaque utilisation est un vrai casse-tête
  • cryptsetup et efibootmgr sont manquants dans les images live Debian par défaut
  • gnome-terminal a ce fond blanc ennuyeux par défaut

Pas de solutions:

  • (re) construire une image live Debian personnalisée (cela semble fastidieux, même si je ne l'ai pas encore essayé)
  • unetbootin (demande un mot de passe inconnu lors du démarrage sur Debian Stretch et je pense qu'il ne prend pas en charge l'UEFI de toute façon)
  • un processus automatisé étranger où je ne vois pas ce qui se passe

Les images en direct et d'installation de Debian sont isohybrides et peuvent être facilement écrites pour bloquer les périphériques utilisant dd. Et ils fonctionnent à partir de clés USB comme ça, ce qui est très bien! Cependant, il n'y aura aucune persistance et aucun moyen de commencer avec une disposition de clavier non anglais par défaut sans modifier la configuration grub et isolinux, qui est incluse dans le système de fichiers ISO9660 très en lecture seule de l'image ISO en direct. Ainsi, même après avoir écrit l'ISO en direct sur une clé USB, ces paramètres ne peuvent toujours pas être modifiés.

schlimmchen
la source

Réponses:

30

Voici un moyen de créer une clé USB Debian live avec persistance. Il permettra d'installer les packages manquants qui seront désormais disponibles à chaque démarrage en direct en utilisant la persistance. Étant donné que nous recréons le contenu du système de fichiers d'image ISO en direct sur un système de fichiers compatible en lecture-écriture, nous pouvons modifier les configurations du chargeur de démarrage pour activer la persistance et définir la disposition du clavier au démarrage.

Les étapes décrites ici ont été testées pour fonctionner sur Debian stretch et buster afin de créer une image live Debian stretch.

Il y a beaucoup d'étapes impliquées, mais il semble que cette méthode soit encore assez efficace.

Avertissement: vous perdrez les données sur le lecteur USB cible et si vous gâchez les commandes ci-dessous, vous pourriez être très désolé par la suite. Je ne suis pas responsable de tes actions.

Se sentir chanceux

Si vous vous sentez particulièrement chanceux aujourd'hui, vous pouvez essayer un script bash automatisant le processus pour vous. Donnez-lui votre chemin d'image ISO comme premier paramètre et le nom du périphérique de bloc de lecteur USB comme deuxième. Notez que ce script est incroyablement dangereux et que vous ne devez pas l'exécuter sans l'avoir lu et compris au préalable.

TL; DR

Obtenez l'image ISO en direct de Debian, puis procédez comme suit:

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 détail et avec quelques explications

Vous devrez exécuter la plupart des commandes suivantes avec des privilèges élevés, c'est-à-dire en les utilisant sudosur la plupart des systèmes GNU / Linux.

Télécharger

Téléchargez une image ISO Debian en direct avec le gestionnaire de fenêtres de votre choix:

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

Nous désignerons simplement l'image ISO téléchargée par "live.iso".

Déterminer le lecteur cible

Recherchez l'appareil utilisé par votre clé USB lsblk. Nous appellerons cela /dev/sdX.

Démonter

Démontez les partitions existantes sur votre lecteur à l'aide de umount /dev/sdX*

Créer des partitions

Nous avons besoin d'une partition de démarrage EFI pour que les PC UEFI démarrent à partir du lecteur USB. Ensuite, nous avons besoin d'une partition suffisamment grande pour contenir le contenu original de l'image du système de fichiers ISO. Cette partition doit avoir le legacy_bootdrapeau défini. Ensuite, nous ajoutons la partition de persistance, en utilisant tout l'espace restant du lecteur USB. Vous pouvez le faire avec n'importe quel outil de partitionnement compatible GPT (attention à l' legacy_bootindicateur). Voici un exemple d'utilisation 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

Cela crée une table de partition GPT et une table de partition MBR protectrice.

Créer des systèmes de fichiers

Nous voulons FAT sur la partition EFI et live et nous voulons ext4sur la partition de persistance et nous avons besoin de l'étiquette persistencepour que la fonctionnalité de persistance fonctionne.

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

Monter les ressources

Nous devrons monter l'ISO source et les partitions cibles à des points de montage temporaires.

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

Installer le système en direct

Copiez le contenu du système de fichiers ISO en direct sur la partition LIVE.

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

persistence.conf

Préparez le système de fichiers de persistance avec le fichier de configuration requis. La fonction de persistance ne fonctionnera pas sans ce fichier.

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

Grub pour le support UEFI

Installez grub2 pour la prise en charge du démarrage UEFI (cela nécessite le grub-efi-amd64-binpaquet sur Debian). Nous forçons grub-installà ne pas utiliser le démarrage sécurisé UEFI, ce qui ne fonctionne apparemment pas avec l' --removableoption.

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 pour la prise en charge du BIOS hérité

Installez syslinux gptmbr.binbootloader sur le lecteur (téléchargez syslinux ou installez le package syslinux-common). Installez ensuite syslinux sur la partition live.

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

Correction d'Isolinux

Réutilisez la configuration isolinux de l'ISO en direct d'origine pour travailler avec 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

Paramètres du noyau

Maintenant que nous avons copié les fichiers système en direct dans un système de fichiers en lecture-écriture, nous pouvons manipuler la configuration grub et syslinux.

Ajoutez le paramètre de noyau de persistance à menu.cfget grub.cfg. Dans les deux fichiers, ajoutez le mot-clé persistenceà la fin de la première ligne respective avec 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

Définissez le paramètre de noyau de disposition de clavier. Dans les deux fichiers, ajoutez les mots clés à la fin de la première ligne respective avec 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

Grub splash

Correction de l'image de démarrage de grub (facultatif; nous l'avons déplacée dans un autre répertoire).

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

Démontage et nettoyage

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

Pourquoi cela devrait fonctionner à la fois pour UEFI et le BIOS

Lors du démarrage en mode UEFI, le PC analysera les partitions FAT que nous avons définies dans la table de partition GPT. La première partition FAT porte le chargeur de démarrage grub UEFI, qui se trouve car il est situé dans le chemin spécifié par UEFI pour les lecteurs amovibles (le --removablecommutateur a grub-installfait cela). Aucune entrée de démarrage UEFI n'est nécessaire pour que cela fonctionne, il suffit de faire en sorte que le PC essaie de démarrer à partir du lecteur USB. Ce grub est configuré pour le prendre à partir de là (charger le grub.cfg, afficher le menu, etc.).

Lors du démarrage en mode BIOS et de la sélection pour démarrer à partir du lecteur USB, le PC exécutera le gptmbr.bincode du chargeur de démarrage que nous avons écrit sur le MBR protecteur du lecteur USB. Ce chargeur de démarrage recherche la partition GPT marquée avec l' legacy_bootindicateur et syslinux chainload de cette partition. Syslinux prend alors le relais (charger menu.cfg, afficher le menu, etc.).

Persistance cryptée

Au lieu d'utiliser plain ext4 sur la partition de persistance, on pourrait d'abord crypter la partition de persistance avec LUKS (en utilisant cryptsetup), puis formater celle-ci avec ext4 (en utilisant l'étiquette appropriée). Cependant, comme l' indique la documentation , le système en direct doit inclure le cryptsetuppackage. Sinon, la partition chiffrée ne peut pas être déchiffrée par le système en direct. Cela signifie que l'on doit d'abord créer une image ISO personnalisée en direct. Cela sort cependant du cadre de cette réponse.

Histoire

L' --no-uefi-secure-bootoption ne faisait auparavant pas partie de l'appel à grub-install. Le stick a bien fonctionné pour moi, mais cela s'est arrêté avec Debian Buster, même si le démarrage sécurisé est toujours désactivé sur ma machine.

schlimmchen
la source
1
Je viens de créer un compte ici pour vous en remercier. Excellent manuel. Petite suggestion - ce serait bien d'avoir la partition de persistance chiffrée.
Petr Havlicek
1
@PetrHavlicek True. Je pense que c'est assez facile à faire, mais j'ai passé mon temps libre depuis la création de cette Q&A avec d'autres problèmes, donc je dois encore revoir cette idée (et merci pour votre appréciation :).
schlimmchen
Fonctionne très bien! Une explication supplémentaire serait cependant intéressante. (bien sûr, vous pouvez tout consulter dans les pages de manuel, mais par exemple mktable, bien que identique à mklable, n'est pas vraiment documenté en tant que tel, etc.)
mikuszefski
Est-il possible d'avoir juste un fichier sur la clé USB au format FAT, qui contient le volume de persistance? Cela devrait être possible en montant le fichier en boucle. Mais comment dire à Debians initrd de prendre un fichier au lieu d'une partition?
ceving
Voir debian-live.alioth.debian.org/live-manual/stable/manual/html/… pour cela. En bref: créez un fichier image (clairsemé) à la racine de tout système de fichiers, nommez ce fichier «persistance» et formatez-le, par exemple, avec ext4.
schlimmchen