Clef USB Grub

Tags: #<Tag:0x00007f63f285d3f8> #<Tag:0x00007f63f285d218> #<Tag:0x00007f63f285d128>

Edit : la solution a été trouvée par PascalHambourg en #2, il fallait spécifier certaines options dans grub-install

Bonsoir à tous,

j’ai une clef USB 128 Gb que j’aimerais bidouiller afin, à terme, d’avoir un amorceur Grub qui me permettrait de lancer différentes live-sessions stockées sur la clef (Ubuntu, Debian, …). Il s’agit pour moi d’un projet pédagogique, j’aimerais apprendre à manipuler Grub sur un système non critique (si je flingue la clef, je pourrais toujours la formater). Dans cette optique, je ne cherche pas de solution clef en main mais j’aimerais bien faire ça avec des outils « atomiques » (parted, grub-install etc…).

Mon système supporte l’EFI 64 bits et je souhaite donc ne pas m’encombrer avec les éventuelles compatibilités avec du matériel ancien et partir :

  • sur un démarrage UEFI (donc pas BIOS)
  • sur une table des partitions GPT (donc pas MBR)
$ more /sys/firmware/efi/fw_platform_size 
64

Ma première étape est simplement d’installer Grub sur la clef pour faire en sorte qu’il s’exécute lorsqu’on boote sur la clef (je verrai comment rajouter les images des live-sessions dans un second temps).

J’ai suivi différents tuto (voir par exemple celui-ci sur linuxconfig.org) mais, in fine , je n’arrive pas à obtenir une clef bootable.

Puis-je vous présenter les différentes étapes que j’ai suivi, si jamais l’un d’entre vous (plus familier que moi avec Grub) trouve une erreur manifeste dans ma démarche ?

Je vois qu’il existe des sujets récurrents sur ce thème dans le forum, mais hélas rien qui ne me permette de débloquer ma situation.

1) Installer une table des partitions GPT

$ sudo parted /dev/sdc
(parted) mklabel gpt
(parted) print                                                            
Model:  USB  SanDisk 3.2Gen1 (scsi)
Disk /dev/sdc: 123GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size   File system  Name     Flags

2) Créer une première partition qui contiendra /efi

(parted) mkpart primary 1MiB 551 MiB 

Les valeurs de départ (1MiB) et de fin (551 MiB) sont issues des différents tuto que j’ai pu lire et je pense que cela provient :

  1. du fait de ne pas souhaiter écraser la table GPT
  2. d’avoir une taille suffisamment grande pour contenir /efi/

On positionne ensuite les flags esp et boot à ON

(parted) set 1 esp on
(parted) set 1 boot on                                                 
(parted) print
Model:  USB  SanDisk 3.2Gen1 (scsi)
Disk /dev/sdc: 123GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 


Number  Start   End     Size    File system  Name     Flags
 1      1049kB  551MB   549MB                primary  boot, esp

3) Créer une seconde partition qui contiendra /boot

Ici j’aurai la place dans un second temps de rajouter toutes les images que je souhaite…

Ce sera une partition EXT4

(parted) mkpart primary 551MiB 100%
(parted) print
Model:  USB  SanDisk 3.2Gen1 (scsi)
Disk /dev/sdc: 123GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size   File system  Name     Flags
 1      1049kB  551MB  549MB                  primary  boot, esp
 2      578MB   123GB  122GB                  primary

4) On créé les systèmes de fichiers
Donc FAT32 pour /efi et EXT4 pour /boot

$ sudo mkfs.fat -F32 /dev/sdc1
$ sudo mkfs.ext4 /dev/sdc2

On vérifie avec parted que tout est bien pris en compte :

(parted) print                                                            
Model:  USB  SanDisk 3.2Gen1 (scsi)
Disk /dev/sdc: 123GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size   File system  Name     Flags
 1      1049kB  551MB  549MB  fat32        primary  boot, esp
 2      578MB   123GB  122GB  ext4         primary

5) On installe Grub

Comme c’est une installation sur un disque amovible, il est nécessaire de monter les partitions /efi et /boot afin d’indiquer à grub où installer les données.

$ sudo mount /dev/sdc1 ./test/efi/
$ sudo mount /dev/sdc2 ./test/boot/

On lance ensuite grub-install :

$ sudo grub-install --target=x86_64-efi --recheck --removable --efi-directory="./efi" --boot-directory="./boot" /dev/sdc
Installation pour la plate-forme x86_64-efi.
Installation terminée, sans erreur.

Une fois ceci effectué, j’ai bien mes partitions /efi et /boot qui sont remplies :

$ tree efi/
efi/
└── EFI
    └── BOOT
        ├── BOOTX64.CSV
        ├── BOOTX64.EFI
        ├── fbx64.efi
        ├── grub.cfg
        ├── grubx64.efi
        └── mmx64.efi

2 directories, 6 files
$ tree data/
data/
├── boot
│   └── grub
│       ├── fonts
│       │   └── unicode.pf2
│       ├── grubenv
│       ├── locale
│       │   ├── ast.mo
│       │   ├── ...
│       │   ├── fr.mo
│       │   ├── ...
│       │   └── zh_TW.mo
│       └── x86_64-efi
│           ├── acpi.mod
│           ├── ...
│           ├── gfxmenu.mod
│           ├── gfxterm_background.mod
│           ├── gfxterm_menu.mod
│           ├── gfxterm.mod
│           ├── gptsync.mod
│           ├── grub.efi
│           ├── ...
│           └── zfs.mod
└── lost+found [error opening dir]

6 directories, 308 files

A ce stade, je pense donc avoir un Grub fonctionnel et une clef USB bootable.

6) Test de la clef USB

Hélas, quand je fais :

$ sudo qemu-system-x86_64 -cdrom /dev/sdc

Il m’affiche un laconique « No bootable device. ».

Idem quand je redémarre mon pc en bootant sur la clef, j’ai un magnifique écran noir sans rien qui s’affiche…

7) Pistes de résolutions

  1. Peut-être mon installation de grub est trop minimale et il est attendu qu’il ne se passe rien ?? Par défaut j’imaginais avoir au moins accès à un terminal grub… Mais je ne suis sûr de rien…

  2. Voyez-vous dans mon protocole une raison évidente pour laquelle la clef ne serait pas bootable ?

  3. Mon couple table GPT / partition ESP efi me semble correct mais il y a peut-être une subtilité que je n’ai pas vue ?

  4. Un problème de paramètrage du « BIOS/UEFI » de ma carte mère (qui pourtant arrive bien à exécuter Grub avec un dual boot Debian/Windows sur mon disque dur) ?

Merci par avance pour toute idée ou suggestion :slight_smile:

Bonne soirée !

Donut

550 Mio pour une partition EFI qui ne contiendra que GRUB, c’est 10 fois trop grand. Mais avec une clé de 128 Go, pas besoin d’être économe…
« primary », c’est nul comme nom de partition, ça ne donne aucune information. En plus, donner le même nom aux deux partitions…

Pas besoin d’activer les deux en GPT, c’est le même (type=EFI).

J’ai vu des firmwares UEFI qui attendaient une certaine variante FAT12/FAT16/FAT32 en fonction de la taille de la partition. Du coup je laisse mkfs.fat choisir automatiquement.

Le paramètre « /dev/sdc » ne sert à rien en mode EFI.

A moins que tu aies changé de répertoire courant entre le montage des partitions et l’installation de GRUB, les chemins ne correspondent pas.

D’où vient ce répertoire « data » qui n’apparaît dans aucune des commandes précédentes ?

Est-ce que qemu utilise un firmware UEFI ?
Je ne suis pas sûr que l’émulation de type cdrom fonctionne avec une clé USB. L’amorçage à partir d’un disque optique demande un format spécifique (ISO 9660 avec extension El Torito).

Pour tester, tu peux démarrer sur le disque, lancer le shell de GRUB depuis le menu avec la touche « c », vérifier si la clé USB est détectée avec « ls » qui devrait afficher un (hdX) avec deux partitions gpt1 et gpt2. Tu peux ensuit explorer la partition EFI avec

set root=hdX,gpt1
ls /efi/boot

chaîner le chargeur avec

chainloader /efi/boot/bootx64.efi
boot

et voir ce qui se passe.

J’ai eu un comportement bizarre avec l’image de GRUB signée pour le secure boot installée par l’option --removable, qui est différente de l’image par défaut et semble prévue pour CD (pourtant ce n’est pas celle qui est utilisée dans les images d’installation de Debian). Du coup je préfère installer l’image normale avec « –force-extra-removable --no-nvram » (pour ne pas toucher aux variables de boot EFI) puis en supprimant les fichiers fbx64.efi et bootx64.csv.

Bonsoir PascalHambourg et merci beaucoup pour toutes tes suggestions de recherche !

  • j’ai enlevé l’option -F32 pour mkfs.fat
  • j’ai donné des noms de partitions plus adaptés
  • j’ai supprimé l’argument final /dev/sdc de la commande grub-install

Mais rien n’y a fait, quand je boote sur la clef il ne se passe rien (ou plus précisément, l’ordinateur semble rebooter de lui même).

Au passage, bien vu pour qemu. Effectivement, le mode UEFI ne semble pas être pris en compte par défaut (voir par exemple cette page sur papy-tux). C’est donc un problème XY, je laisse de côté pour le moment ^^

Sinon, j’ai bien accédé au shell Grub de mon système. Ma clef USB est bien vue comme hd1 et je vois bien mes deux partitions.

Voici ce qui s’affiche lorsque je tente la commande chainloader comme suggéré.

grub> chainloader /efi/boot/bootx64.efi
/EndEntire
file parth : /ACPI(a0341d0,0)/PCI(2,1)/PCI(0,0)/PCI(0,8)/PCI(3,0)/USB(9,0)/HD(1,800,113000,2d799831104c6fc4b,2,2)
/File(\efi\boot)/File(bootx64.efi)/EndEntire
grub>

Je ne sais pas trop interpréter ce retour de commande… Est-ce normal ?

Merci par avance :slight_smile:

Donut

Oui c’est normal. Mais j’ai oublié de mentionner qu’il faut exécuter la commande « boot » ensuite.

Bonsoir PascalHambourg,
en exécutant ensuite la commande boot, j’arrive bien à une invite de commande type Grub shell, qui semble bien correspondre au Grub installé sur ma clef !

Le problème se situerait donc au niveau du boot de la clef USB qui ne fonctionne pas ?
En particulier, dans la liste des options de boot de mon UEFI, j’ai :

  • « USB » → affiche un texte du style « no boot device found »
  • « UEFI: USB, Partition 1 » → affiche un écran noir et redémarre aussitôt (si je laisse faire, j’arrive au Grub système puis à Debian, qui est le choix par défaut)

Peut-être y’a-t-il une option de mon bios UEFI qui m’empêche de booter en uefi sur ma clef ??

Je viens de vérifier et mon disque nvme interne sur lequel Grub est installé possède bien une table gpt.

Merci beaucoup pour ton aide en tout cas, je progresse ^^

Bonne soirée à tous,

Donut

Ça doit être pour l’amorçage en mode BIOS/legacy.

C’est pourtant l’option pour l’amorçage en mode EFI. Peut-être un bug du firmware UEFI.

Je propose deux expériences :
1 .Refaire la clé en GPT avec la partition EFI en n° 2.
2. Refaire la clé avec une table DOS/MBR. Peu importe le numéro de la partition EFI.

Dans les deux cas, comparer l’intitulé de l’option UEFI USB et tester si ça boote.

Bonsoir Pascal,
merci pour ces suggestions, je vais tester cela.

Pour compléter mon message, voici les paramètres actuellement défini dans mon bios uefi :

  • Fast Boot : Disabled
  • CSM Support : Enabled
  • LAN PXE Boot Option ROM : Disabled
  • Storage Boot Option Control : UEFI Only
  • Other PCI Device ROM Priority : UEFI Only

En première lecture, rien qui me choque. CSM c’est l’acronyme de « Compatibility Support Module ». Si je comprends bien, avec cela on accepte de booter en Bios classique (via des tables de partitions MBR donc). Fast Boot, j’ai cru comprendre que cela pouvait poser pb mais là de toute façon il est désactivé.

Bonne soirée,

Donut

Plus ou moins. Cela peut aussi signifier que des services BIOS sont disponibles en amorçage EFI.

En principe il n’y a aucun rapport entre le mode d’amorçage et le type de table de partition.

Bonjour,
bon j’ai eu l’occasion de tester sur un autre PC et j’ai observé le même comportement : le PC reboote lorsqu’on démarre sur la clef USB en UEFI.

Je vais tester tes suggestions ce soir.

A bientôt,

D.

Bonsoir,

je viens de tester la suggestion n°1.
Voici mes partitions :

$ sudo parted /dev/sdc print
Model:  USB  SanDisk 3.2Gen1 (scsi)
Disk /dev/sdc: 123GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name    Flags
 1      1049kB  4295MB  4294MB  ext4         dmboot
 2      5369MB  6442MB  1074MB  fat32        dmuefi  boot, esp

J’observe exactement le même comportement qu’auparavant (à savoir, reboot de la machine).

Deux informations nouvelles :

  1. Lorsque, depuis mon « grub système » (ie pas celui de la clef, mais celui qui est sur mon disque interne) je fais :

set root=hd1,gpt1 # Ou hd1,gpt2 dans le cas de la suggestion n°1
chainloader /ef/boot/bootx64.efi
boot

Avant d’arriver à l’invite de commande grub minimale (sur fond noir, sans le fond d’écran Debian de mon « grub système »), il y a un message d’erreur qui s’affiche très brièvement (que ce soit dans la configuration initiale de la clef ou dans la configuration de la suggestion n°1) :

error: file '/boot/' not found.
error: no such device: /.disk/info.
error: no such device: /.disk/mini-info.

Du coup, je me demande si le grub sur fond noir que j’obtiens est bien celui de la clef et non pas mon « grub système » par défaut…

  1. Lorsqu’au démarrage, je choisis de booter sur la clef en cliquant sur « UEFI: USB, Partition 1 » (qui au passage devient « UEFI: USB, Partition 2 » dans le cas de la suggestion n°1), JUSTE AVANT le reboot, j’ai vu passer ce message d’erreur :

    System BootOrder not found. Initializing defaults.
    Reset System.

Tout ceci me laisse à penser que ce ne sont pas mes partitions qui posent problème mais plutôt l’installation de grub.

Par exemple :

$ sudo mount /dev/sdc1 ./boot/ # Je suis dans le cas de figure de la suggestion n°1
$ sudo mount /dev/sdc2 ./efi/
$ sudo find ./boot -name core.img
$ sudo find ./efi -name core.img
$ sudo find ./efi -name boot.img
$ sudo find ./boot -name boot.img

Par ailleurs :

$ cat ./efi/EFI/BOOT/grub.cfg 
search.fs_uuid bdc7041d-b5f8-4e3a-8652-909fe8cf1bd4 root hd2,gpt1 
set prefix=($root)'/grub'
configfile $prefix/grub.cfg
$ ls ./boot/grub/grub.cfg
ls: impossible d'accéder à './boot/grub/grub.cfg': Aucun fichier ou dossier de ce type

J’ai supposé qu’en l’absence de grub.cfg, il allait m’afficher l’invite de commande grub mais c’est peut-être faux…

Bon j’ai des choses à creuser, il faut que je comprenne la structure des fichiers générés par grub-install

A bientôt,

Donut

Ça fait partie des comportements bizarres de l’image signée de GRUB installée avec --removable que j’ai évoqués à la fin de mon premier message. Cette image semble prévue pour l’installateur car les fichiers recherchés sont présents dans des images ISO d’installation, mais pourtant ce n’est pas cette image de GRUB qui est présente dans les images ISO.

Oui. Celui du système afficherait le menu.

Donc le firmware UEFI a bien pris en compte la table de partition GPT et identifié la bonne partition EFI.

Il me semble que ceci est un message du firmware UEFI, pas de shim ou GRUB. Qu’affiche efibootmgr ?

core.img est spécifique à la plate-forme PC BIOS (i386-pc), il n’existe pas dans les plates-formes UEFI. C’est le fichier grubx64.efi qui contient l’image pour la plate-forme PC UEFI 64 bits.

Correct.

Bonsoir PascalHambourg, bonsoir le forum,
super ça a marché !!

Effectivement, j’aurais du lire plus attentivement ton premier message, car c’est ce qui a résolu mon problème :slight_smile:

In fine, la commande grub-install posait problème et voici celle qui a permis de résoudre mon soucis :

sudo grub-install --target=x86_64-efi --bootloader-id="Donut-UEFI" --recheck --force-extra-removable --no-nvram --efi-directory="./efi" --boot-directory="./boot"

En revanche, aucune idée de pourquoi les deux options --force-extra-removable et --no-nvram ont résolu le soucis.

Le man indique à leur sujet :

   --force-extra-removable
          force installation to the removable media path also. This option is only available on EFI.
   --no-nvram
          don't update the `boot-device'/`Boot*' NVRAM variables. This option is only available on EFI and IEEE1275 targets.

Bon en tout cas, merci beaucoup pour ton aide ! Et ça m’a forcé de me plonger plus en profondeur dans la doc, c’est dans ces moments qu’on apprend le plus ^^

Les étapes suivantes seront :

  • peaufinage du grub.cfg pour avoir un truc joli (et si on pouvait charger automatiquement le clavier FR ce serait top)
  • ajout des isos de plusieurs distributions de linux
  • éventuellement vérifier dans quelle mesure ces images peuvent être persistantes (si ce sont des iso, j’en doute). On pourrait aussi envisager d’avoir une partition data de la clef pour stocker des choses dessus…

En tout cas, le sujet de ce fil est clôt !

Bonne soirée à tous :slight_smile:

Pourquoi cette option ?

–force-extra-removable installe l’image « normale » de GRUB, la même que celle qui est installée par grub-install sans option ou incluse dans les images ISO.
–no-nvram ne sert qu’à éviter de modifier les variables de boot EFI. Cette option est implicite avec --removable mais pas avec --force-extra-removable.

C’est une grosse galère et c’est trop aléatoire selon les machines, j’ai laissé tomber.

En cherchant à résoudre mon soucis initial, j’étais tombé sur des exemples de commandes qui incluait cette option.

   --bootloader-id=ID
          the ID of bootloader. This option is only available on  EFI  and
          Macs.

Je crois comprendre que ça permet de spécifier une chaîne de caractère pour identifier facilement le bootloader installé sur la clef. Je m’étais dit que c’était une bonne idée pour différencier le grub installé sur la clef de mon grub système.

Mais je n’ai pas encore vu où ce bootloader-id pouvait apparaître par la suite.
Ou alors j’ai mal compris l’utilité de cette option…

Bonne journée à tous !

L’option --bootloader-id, dont la valeur par défaut est « Debian » dans le cas de Debian, affecte deux points :

  • le nom de la variable de boot EFI créée pour GRUB dans la NVRAM de la carte mère. Cela peut être utile pour ne pas interférer avec la variable de boot EFI créée pour le système installé. Mais ici l’option --no-nvram empêche la modification des variables de boot EFI ;
  • le nom du répertoire où GRUB est installé dans la partition EFI spécifiée par --efi-directory . Là encore, cela peut être utile pour ne pas écraser une installation de GRUB existante dans cette partition EFI. Mais ici il n’y a pas d’autre instance de GRUB dans cette partition EFI.

Concernant le second point, il est important de noter que si on installe l’image de GRUB signée par Debian pour le secure boot (ce qui est le cas par défaut dans une installation normale de Debian), celle-ci va chercher un fichier grub.cfg initial dans le répertoire « debian » de la partition EFI (ce fichier va chercher ensuite le fichier grub.cfg principal à l’emplacement spécifié par --boot-directory) . Or grub-install installe le fichier grub.cfg initial dans le répertoire spécifié par --efi-directory, donc s’il diffère de « debian » GRUB ne le trouvera pas et ne pourra pas afficher le menu du fichier grub.cfg principal. Il faut donc créer le répertoire EFI/debian dans la partition EFI et y copier le fichier grub.cfg initial.

Hello,
je me permets de revenir sur cette remarque, qui me fait réfléchir depuis quelques temps :

Cette valeur de 550 MiO provient de ce tutorial de linuxconfig.org. Il y est écrit :

After this step, we can create the EFI partition and format it with a fat32 filesystem. The recommended size for the partition is 550 MiB : on smaller partitions we could receive an error such as “not enough clusters for 32 bit FAT”

Donc c’est une façon implicite de signifier que la partition doit être en FAT32.
J’ai testé avec une partition beaucoup plus petite (10 MiB soit à peine plus que ce que prend Grub) et formatée en FAT16 : ça démarre tout aussi bien.

Et en regardant les spécifications de l’UEFI, section 13.3.1.1 « File System Format », il est écrit noir sur blanc :

The EFI firmware must support the FAT32, FAT16, and FAT12 variants of the EFI file system. What variant of EFI FAT to use is defined by the size of the media.

Donc pas de soucis à utiliser de petites partitions en FAT16 pour l’amorçage UEFI. L’article de linuxconfig.org est donc incorrect… sauf si, en pratique, il s’avère que certains firmwares ont du mal avec le FAT16 ?

Si tous les firmwares UEFI respectaient à la lettre les spécifications de l’UEFI, ça se saurait. En fait c’est plutôt le contraire : d’après mon expérience, tous les firmwares UEFI sont plus ou moins buggés en ce qui concerne la gestion de l’amorçage.

L’expérience m’a aussi appris que la phrase « What variant of EFI FAT to use is defined by the size of the media » ne doit pas être prise à la légère. J’ai constaté que certains firmwares ne reconnaissaient pas n’importe quelle combinaison de format FAT et de taille pour une partition EFI.

Je pense que toutes les recommandations qu’on peut lire ici et là et qui vont bien au-delà des spécifications de l’UEFI ont pour but d’assurer une compatibilité avec un maximum de firmwares et de configurations. Comme celle d’utiliser une table de partition au format GPT.

1 J'aime

Et donc, autant utiliser le démarrage à l’ancienne (legacy) ?

Oui à 100% tant que le firmware supporte l’amorçage legacy et quand l’amorçage EFI n’apporte rien voire complique tout. Notamment avec du RAID logiciel.

1 J'aime

OK, je regarderai ça quand j’aurais mon nouveau payçay (one of these days).