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 :
- du fait de ne pas souhaiter écraser la table GPT
- 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
-
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…
-
Voyez-vous dans mon protocole une raison évidente pour laquelle la clef ne serait pas bootable ?
-
Mon couple table GPT / partition ESP efi me semble correct mais il y a peut-être une subtilité que je n’ai pas vue ?
-
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
Bonne soirée !
Donut