23 Sep 2022, 00:00

Création manuelle d'une clé bootable USB en EFI et en BIOS avec GRUB

Détruit toutes les données sur la clé !
On repère le chemin de la clé USB et on le stocke dans une variable (à adapter) :
DEVICE=/dev/sdX

Avec table GPT :

Préparation des partitions

Créer table de partition GPT. Créer 3 partitions :

  • 500M FAT32 - drapeau esp (sdX1)
  • 1M non formaté - drapeau bios_grub (sdX2)
  • le reste en fat32 (sdX3)

Puis on les monte :
pmount ${DEVICE}1 efi
pmount ${DEVICE}3 boot

Installation de GRUB pour le mode EFI

Pour l’EFI 64 bits :
sudo grub-install --removable --no-nvram --root-directory=/media/boot --boot-directory=/media/boot --efi-directory=/media/efi --target=x86_64-efi

Ceci installe les exécutables efi SHIM (BOOTX64.efi) et GRUB (grubx64.efi) dans la partition EFI, avec un fichier de configuration minimaliste (grub.cfg) qui va définir le chemin des ressources et configuration de GRUB sur la 3e partition.
Ceci installe aussi les ressources (modules, police etc) de GRUB dans le dossier /boot/grub de la partition principale.

Je n’ai pas réussi à faire fonctionner shim (écran bleu “Boot restoration)”, donc je le désactive pour l’instant, et tant pis pour le secureboot :
mv /media/efi/EFI/BOOT/BOOTX64.EFI /media/efi/EFI/BOOT/BOOTX64.EFI.SHIM && mv /media/efi/EFI/BOOT/grubx64.efi /media/efi/EFI/BOOT/BOOTX64.EFI

Installation de GRUB pour le mode BIOS

Ceci semble fonctionner sans créer une table hybrid-mbr. On installe donc simplement GRUB sur le disque :
sudo grub-install --removable --no-nvram --root-directory=/media/boot --boot-directory=/media/boot --target=i386-pc ${DEVICE}

S’il y’a une erreur liée aux listes de blocs, c’est que le drapeau bios_grub n’a pas été positionné sur la 2e partition.

Configuration

Grub devrait alors pouvoir démarrer, mais n’est pas configuré ! On va donc créer un fichier de configuration minimaliste, simplement pour vérifier que la clé est bien démarrable :

cat > /media/boot/grub/grub.cfg <<EOF
insmod efi_gop
insmod font
insmod gfxterm
insmod png
loadfont /grub/fonts/unicode.pf2
set gfxmode=auto
set gfxpayload=keep
terminal_output gfxterm

search.fs_uuid AAAA-AAAA efi
search.fs_uuid BBBB-BBBB root

menuentry "Tetrefis" {
        insmod chain
        chainloader (\$root)/grub/EFI-loaders/tetris.efi
}
EOF

On met les bonnes valeurs d’UUID :

sed "s/AAAA-AAAA/$(/usr/sbin/blkid -s UUID -o value ${DEVICE}1)/" /media/boot/grub/grub.cfg -i
sed "s/BBBB-BBBB/$(/usr/sbin/blkid -s UUID -o value ${DEVICE}3)/" /media/boot/grub/grub.cfg -i

On peut enfin démonter les 2 partitions :
pumount efi && pumount boot
et tester la clé.

GRUB devrait alors être bootable et afficher le menu (même si l’entrée est actuellement non-fonctionnelle). Pour plus de détails sur la configuration de GRUB et le démarrage de différents systèmes (exécutables EFI, noyaux linux, ISOs etc), voir un prochain article.

29 Aug 2019, 00:00

Reconfiguration GRUB2 sur système EFI, avec partition slash chiffrée via LUKS et partition boot séparée

Se fait via un live-cd démarré en EFI, de la même architecture que le système à dépanner (pour que le chroot fonctionne)

  • sdX1 : ESP (EFI System Partition)
  • sdX2 : partition slash chiffré par LUKS
  • sdX3 : partition boot
# On déchiffre et monte slash
cryptsetup open /dev/sdX2 slash
mount /dev/mapper/slash /mnt
cd /mnt

# On monte l'ESP et la partition /boot
mount /dev/sdX3 ./boot
mount /dev/sdX1 ./boot/efi

# On monte les fichiers systèmes temporaires
mount --rbind /sys ./sys
mount --rbind /dev ./dev
mount --rbind /proc ./proc
mount --rbind /run ./run


chroot /mnt
grub-install /dev/sdX --target x86_64-efi
update-grub

# On recrée l'initramfs, afin qu'il demande le mot de passe LUKS
update-initramfs -k all -u

13 Mar 2017, 00:00

Installer Windows 8.1 x64 sur un disque externe USB3

Le tuto suivant a pour but d’installer Windows 8.1 sur un disque externe. En effet, bien que ce soit impossible via une install traditionnelle (par DVD ou clé USB), il est possible de déployer une install Windows sur un disque externe via l’utilitaire DISM, et le disque acceptera alors de booter.

Il est probable, mais non testé, que ce tuto fonctionne avec Windows 10, et il est adaptable pour Windows 7 (avec l’utilitaire Imagex.exe au lieu de DISM).

Prérequis :

  • Un DVD d’install de Windows 8.1 x64 (ou une image montée)
  • Un disque externe USB3 (ce devrait fonctionner en USB2, mais nous perdons beaucoup, beaucuop de performances). TOUTES LES DONNÉES PRÉSENTES SERONT EFFACÉES
  • Un système Windows 8.1 x64 en cours de fonctionnement

Etapes (penser à adapter les lettres des commandes si nécessaire) :

  • Commencer par monter le DVD d’install de Windows 8.1 x64. Dans mon exemple, il sera monté sur le lecteur G:
  • Lancer une invite de commande en tant qu’administrateur
  • Dans mon cas, j’ai un DVD qui contient à la fois l’édition Core et Pro. Il faut commencer par identifier les index de ces éditions via la commande
    dism /get-wiminfo /wimfile=G:\sources\install.wim
    Souhaitant installer la version Pro, j’utiliserai l’index 1.
  • On lance ensuite la commande diskpart pour partitionner le disque externe.
  • Avec
    list disk
    on identifie le bon disque. Dans mon cas, c’est le disque 1. D’où :
    select disk 1
    puis
    clean
    qui va supprimer toute la table de partition.
  • On crée une partition de boot en FAT32, ayant l’avantage d’être accessible aussi pour les Mac :
    create partition primary size=350
    puis
    format fs=fat32 quick
  • On la rend bootable via
    active
    puis on lui donne une lettre via
    assign letter=B
  • On crée la partition contenant le système Windows lui-même :
    create partition primary
    puis
    format fs=ntfs quick
    puis
    assign letter=Z
  • On quitte Diskpart via exit.
  • On va ensuite déployer l’image Windows sur la aprtition assignée en Z via
    dism /Apply-Image /ImageFile:G:\sources\install.wim /Index:1 /ApplyDir:Z:\
    Adapter l’index repéré précedemment. Cela devrait mettre quelques minutes, puis apparaîtra le message “L’opération a réussi”.
  • On copie les fichiers de démarrage via
    bcdboot Z:\Windows /s B: /f all
    Le paramètre /f sert à spécifier le type de démarrage. Avec ALL, on install aussi bien un boot BIOS qu’un boot UEFI.

Il n’y a plus qu’à démarrer sur le disque externe ! (en espérant que le BIOS/UEFI de votre pc soit suffisamment clair et souple pour permettre le démarrage sur n’importe quel disque, y compris externe, ce qui n’est pas toujours gagné…)

Sources : Article sur Slice42 et article sur Bleeptobleep

12 Aug 2014, 00:00

Booter un système Linux en mode UEFI ou en mode BIOS

Le but de la manipulation est de pouvoir, aisément, booter un système Linux Debian aussi bien en mode UEFI que MBR, sans avoir à faire de reconfiguration particulière en passant de l’un à l’autre, avec un disque dur partitionné en GPT. Ceci me permet de pouvoir, à la volée, grâce au menu de démarrage (sur un HP DM1-4332sf), booter mon OS linux en mode BIOS, permettant un meilleur support du matériel (la mise en veille ne fonctionnant actuellement pas en mode EFI), tout en conservant les systèmes Windows 7, Windows 8 et mon système Debian bootables en mode EFI.

N’ayant actuellement pas réussi à faire cohabiter grub-pc et grub-efi sur une même installation, le démarrage par efi se fera via GRUB et le démarrage par MBR se fera via EXTLINUX.

Cette démarche fonctionne aussi en cas de multiboot, mais ce multiboot ne sera possible qu’en mode EFI (via GRUB pour EFI). Le système Syslinux ne sera capable de démarrer que la Debian. Cet article ne parlera toutefois pas du tout de la configuration du dual-boot en EFI, celui-ci étant de toute façon totalement indépendant de la coexistence avec un Syslinux pour BIOS.

Le disque /dev/sda est supposé partitionné comme ceci :

/dev/sda1 : FAT32, EFI System Partition (label EFI)
/dev/sda2 : NTFS Partition (label WIN_7)
/dev/sda3 : Ext4 partition (label SLASH)
/dev/sda4 : Ext4 partition (label HOME)
/dev/sda5 : swap partiton
/dev/sda6 : NTFS partition (label DATA)

Il faut ensuite rajouter le flag legacy_boot à la partition SLASH (/dev/sda3 ici). Ceci peut se faire via GParted. Dans le cas d’une partiton /boot séparée, il faut probablement positionner ce flag sur la partition /boot .

Le système est présupposé fonctionnel en mode EFI, via GRUB (soit par une installation directement en mode EFI, soit en rendant le système bootable en EFI après une installation classique, comme détaillé ici). Comme les labels l’indiquent, /dev/sda3 est monté sur / , /dev/sda4 est monté sur /home/ . Le setup ne contient PAS de partiton /boot/ séparée. La partition EFI System Partition est montée sur /boot/efi/.

Il faut d’abord installer le paquet extlinux. sudo aptitude install extlinux syslinux-common Il crée automatiquement un répertoire /boot/extlinux/ avec la configuration nécessaire. Il install également extlinux sur le MBR du disque (commande extlinux-install), or celui-ci ne convient pas à l’installation actuelle, car il est conçu pour les partitons natives en MBR. On écrase donc ce mbr avec le extlinux prévu pour les partitions GPT :

dd if=/usr/lib/syslinux/gptmbr.bin of=/dev/sda

Et voilà ! Si on choisit de démarrer l’ordinateur en mode BIOS, sur le disque dur, on aura la liste de nos noyaux bootables via Extlinux. D’après mes tests, l’ajout et la suppression de noyaux peuvent être faits à partir du mode BIOS ou EFI, GRUB et Extlinux auront tous les 2 leur configuration mise à jour.

02 Jul 2014, 00:00

L'UEFI et GPT en vrac

Généralités

Legacy Mode = Compatibility Support Module (CSM) = BIOS Mode . Utilisé pour qu’un système UEFI se comporte comme un BIOS traditionnel.

Pour savoir si l’on a bien booté en mode efi : Sous Linux : dmesg | grep -i EFI ne renverra presque rien si l’on est en mode BIOS, mais plein d’infos (gestion mémoire etc) si on est en mode efi.
Sous Windows, il suffit de se repérer à la table de partition du disque système : il ne peut booter en mode BIOS que sur disque MBR, et en mode EFI que sur disque GPT.

À une certaine époque, fdisk ne gèrait pas les disques GPT. Aujourd’hui oui. gdisk les gère aussi, et permet un certain nombre d’actions dessus.

Les tables de partition GPT sont dupliquées ; en début ET en fin de disque. Pour cette raison, dumper un disque vers un disque plus grand ne fonctionne plus, car la table de secours ne sera pas correctement placée. Il faut copier la table de partition (sudo sgdisk /dev/sdX -R /dev/sdY pour copier la table de sdX vers sdY), puis dumper chacune des partitions une à une.

Une table de partition GPT contient une zone réservée habituellement au MBR, avec plusieurs états possibles : cette zone MBR peut-être en protective (non utilisée, montre une seule grosse fausse partition de max 2To), en hybrid (une pseudo-table MBR devant concorder avec la table gpt sur 4 partitions) ou en MBR-only (c’est nativement un disque MBR). Le rôle de cette zone est d’éviter la modification/création d’une table MBR par des outils ne connaissant pas le GPT.
gdisk peut (ré)écrire une table hybrid-MBR pour qu’elle concorde avec l’état actuel de la table GPT. L’utilisation d’un hybrid-MBR est toutefois un hack étant aujourd’hui plutôt déconseillé.

On peut voir l’état de ce mbr avec l’outil gdisk :
sudo gdisk -l /dev/sdX

gparted gère sans problème les disques GPT, sauf dans le cas d’un disque en Hybrid-MBR. Les modifications seraient dans ce cas faites uniquement sur la pseudo-table mbr, sans tenir compte de la gpt, et donc de l’agencement réel des partitions, ce qui risque très probablement de casser toute la table. (edit : probablement plus vrai aujourd’hui)

Lors de la création d’une table de partition, va être créé un “Disk identifier” (sous forme d’UUID pour du GPT, et de 8 caractères hexadécimaux pour du MBR). Cet identifiant est purement logiciel.

Flags, types de partition

Une table de partition GPT associe à chaque partition un type, qui permet de donner une indication sur le rôle de la partition. Ce type est un UUID, qui se traduit en une appellation (qui peut être différente selon les programmes). Un fdisk -l affiche le type de chaque partition existante. On peut voir la liste complète des types de partition avec fdisk /dev/sdX puis l.

On peut également voir/modifier facilement les types de partition avec cfdisk .

La partition sera accessible, même si le type ne concorde pas avec le formatage. Toutefois, certains types peuvent ne pas apparaître dans l’explorateur, et nécessiter un montage à la main (par exemple esp).

Sous GParted, un certain nombre de ces types de partition sont représentés par des drapeaux (flags). Par exemple,

  • absence de drapeau = Linux Filesystem (ou Inconu sous diskpart) = UUID 0fc…de4
  • drapeau “esp” (également “boot”) = type EFI System Partition (ou Système sous diskpart) = c12…93b
  • swap = Linux Swap = 065…f4f
  • bios_grub = BIOS boot
  • diag = Windows recovery environment
  • msftdata = Microsoft Basic Data (ou Principale sous diskpart) = ebd…9c7
  • msftres = Microsoft reserved (ou Réservé sous diskpart) = e3c…5ae

Lors du formatage vers certains systèmes de fichiers (par exemple ext4 ou ntfs), GParted assigne automatiquement le type “évident” à la partition (par exemple “Linux filesystem” ou “Microsoft basic data”). Un formatage en FAT32 ne semble pas modifier le type déjà existant.

Certains drapeaux sont toutefois indépendants du type ; par exemple “hidden” et “legacy_boot”.
Il y’a une explication de nombreux drapeaux ici.

Types en table MRB

Les partitions ont également un type dans les partitions MBR. L’identifiant est sur 2 octets et Par exemple

Démarrage

L’UEFI ne peut démarrer un périphérique (disque dur, clé usb etc) qu’à partir d’une partition en fat32 (en réalité, certaines cartes-mères sont capables de lire le NTFS aussi). Généralement, elle est nommée “EFI System Partition” (ESP) et elle a le flag “boot” dans GParted (et le flag “esp” si la table de partition est GPT).

Le chemin par défaut où l’UEFI va chercher un bootloader (exécutable EFI) est ${ESP}/boot/BOOT${ARCH}.efi , typiquement /efi/boot/BOOTX64.efi. Si l’exécutable est ailleurs, on peut aller le chercher à la main lors du choix de boot (bien que ceci dépende de l’implémentation sur la carte-mère).

L’UEFI supporte aussi l’enregistrement d’entrées de démarrage au sein-même de l’UEFI. Ceci permet d’avoir plusieurs bootloaders en parallèle, avec un chemin et un nom associés. Par exemple ${ESP}/Microsoft\bootmgrfw.efi (Windows Boot Manager) et ${ESP}/debian/grubx64.efi (debian). Ces entrées peuvent se visualiser et se gérer sous Linux avec la commande efibootmgr. Si définies, elles sont prioritaires sur le chemin par défaut.
Ces entrées comportent le chemin absolu de l’exécutable, avec l’UUID de la partition (PARTUUID dans blkid) le contenant. Par conséquent, une fois enregistrée dans l’UEFI, il est possible de démarrer depuis une partition n’ayant PAS le flag boot/esp. Cette partition doit toutefois être en FAT32.

Les CD et DVD sont bootables en UEFI via le format ElTorito, comme les BIOS auparavant.

Les disques au format MBR sont bootables aussi sans problème par un système UEFI, tant que la partition à booter est en fat32. La limitation de Windows qui ne peut booter en UEFI que sur GPT vient de Windows et non de la norme UEFI.
(note : Windows n’accepte de s’installer que sur une table de partition correspondant à son type de démarrage, mais il est possible de le faire démarrer sur une table non-prévue en installant les fichiers à la main).

À l’inverse, les disques GPT peuvent être démarrés sur un système BIOS. Si GRUB est utilisé, il a besoin d’une partition dédiée (1Mo, non formatée) avec le flag “bios_grub”. Ceci lui permet de stocker les infos qui sont habituellement stockées dans un espace libre de la MBR (qui est ici utilisé par la table de partition GPT elle-même). Sans quoi la commande grub-install /dev/sdX renverra une erreur de “listes de blocs”. Une fois utilisée, cette partition apparaîtra avec le système de fichiers “grub2 core.img”.
Dans ce cas, la partition ESP ainsi que les flags “boot” et “esp” ne sont pas nécessaires. Ils peuvent toutefois être positionnés, pour faciliter une migration future vers un système EFI. Ceci nécessitera toutefois le remplacement du paquet grub-pc par le paquet grub-efi.

La plupart des UEFI sont de nature 64 bits, mais certains (souvent des PCs assez bas-de-gamme) ont un EFI uniquement en 32 bits. Ceci n’empêche pas le chargement d’un système en 64 bits, mais l’exécutable EFI (grub-efi, syslinux-efi etc) doit être en 32 bits.

Bien que déconseillé, il est possible d’avoir 2 (ou + ?) partitions ESP en même temps sur un disque interne. On peut aussi positionner/enlever les flags boot pour alterner entre 2 ESP.

efibootmgr

Pour lister les entrées, lancer simplement efibootmgr. On peut avoir plus de détails avec efibootmgr -v.

Pour supprimer l’entrée “BootABCD”, on entre
sudo efibootmgr -b ABCD -B

Utilitaires

Le comportement de certains programmes est le suivant :

grub-update : os-prober ne référencera que les exécutables UEFI situés sur la (les ?) partitions ESP (comportant le flag boot)

grub : peut booter sur une partition qui n’est PAS la partition ESP ; peut aussi lancer des OS/noyaux qui sont sur une partition non-ESP

Install Windows : si pas de partition flaggée ESP lors de l’install, il va en créer une dans le premier espace libre sur le disque ; si pas d’espace libre, message “Nous n’avons pas pu créer de partition…” et l’install ne pourra pas continuer.
Si la partition ESP est en NTFS, l’installation échouera en demandant de la formater en FAT32 (toutefois certaines cartes-mères sont capables de démarrer depuis une partition NTFS si on recrée les fichiers manuellement).

Windows : si absent de la liste de démarrage UEFI et que la partition contenant son bootloader est flaggée ESP, alors il s’enregistre dans l’UEFI lors du démarrage et se place en priorité

bcdboot : crée les fichiers de démarrage sur la partition ESP, sauf si le flag /s X: est spécifié, X: étant la lettre assignée à la partition où l’on souhaite créer ces fichiers

veracrypt : lors du chiffrement de la partition système (et du pre-test qui va avec), les fichiers EFI de veracrypt sont écrits sur la partition flaggée ESP
Lors du déchiffrement, les fichiers sont aussi écrits sur la partition flaggée ESP

Ordre des partitions

Si on aime avoir le numéro des partitions qui correspond à leur ordre sur le disque, on peut utiliser la commande
sudo sgdisk -s /dev/sdX

Ou aussi la commande gdisk :

sudo gdisk /dev/sdX
s
p
w
Y