Dans le cadre de mon nouveau boulot, je viens de recevoir un nouvel ordinateur portable… sous Windows 10. Je souhaiterais le basculer rapidement sur un Linux. Cependant j’hésite beaucoup entre une Debian et une Ubuntu bien que je pense finalement choisir une Debian.

Au début, je voulais me créer une live-usb Debian et une live-usb Ubuntu pour les comparer un peu… Et puis, étant donné la taille de ma clef USB (128 GB), j’ai réalisé qu’il était préférable de mettre les deux systèmes sur la même clef et de les choisir au démarrage via GRUB.

Ca tombe bien, ça faisait quelques temps que j’avais envie de me familiariser avec GRUB :)

Au début, je n’avais pas trop d’idée sur la façon de procéder. J’imaginais un découpage de la clef avec une partition par système et un GRUB tout au début qui pointerait vers les différents systèmes. Et puis j’ai découvert que GRUB pouvait booter des images iso directement ce qui est super.

Etude des images Debian et Ubuntu

Image Debian

$ file debian-live-11.3.0-amd64-gnome.iso
debian-live-11.3.0-amd64-gnome.iso: DOS/MBR boot sector; partition 2 : ID=0xef, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 1536, 5226 sectors
$ fdisk -l debian-live-11.3.0-amd64-gnome.iso
Disque debian-live-11.3.0-amd64-gnome.iso : 2,6 GiB, 2804809728 octets, 5478144 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x10612bc7

Périphérique                        Amorçage Début     Fin Secteurs Taille Id Type
debian-live-11.3.0-amd64-gnome.iso1 *            0 5478143  5478144   2,6G  0 Vide
debian-live-11.3.0-amd64-gnome.iso2           1536    6761     5226   2,6M ef EFI (FAT-12/16/32)

On peut ensuite monter l’image pour comprendre comment elle démarre :

$ sudo mount -o loop debian-live-11.3.0-amd64-gnome.iso ./Debian
mount: /XXX/Debian: Attention: périphérique protégé en écriture, monté en lecture seule.

Il y a plusieurs fichiers de configuration de Grub, celui qui nous intéresse est boot/grub/grub.cfg, il contient notamment :

menuentry "Debian GNU/Linux Live (kernel 5.10.0-13-amd64)" {
  linux  /live/vmlinuz-5.10.0-13-amd64 boot=live components splash quiet "${loopback}"
  initrd /live/initrd.img-5.10.0-13-amd64
}
$ file vmlinuz-5.10.0-13-amd64 
vmlinuz-5.10.0-13-amd64: Linux kernel x86 boot executable bzImage, version 5.10.0-13-amd64 (debian-kernel@lists.debian.org) #1 SMP Debian 5.10.106-1 (2022-03-17), RO-rootFS, swap_dev 0x6, Normal VGA

$ file initrd.img-5.10.0-13-amd64 
initrd.img-5.10.0-13-amd64: gzip compressed data, was "mkinitramfs-MAIN_pqyD8S", last modified: Sat Mar 26 16:00:28 2022, from Unix, original size 166584320
$ sudo parted /dev/sdh
GNU Parted 3.2
Using /dev/sdh
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
Model:  USB  SanDisk 3.2Gen1 (scsi)
Disk /dev/sdh: 123GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End    Size   Type     File system  Flags
 1      16,4kB  123GB  123GB  primary  fat32        lba

(parted) mklabel msdos                                                    
Warning: The existing disk label on /dev/sdh will be destroyed and all data on this disk will be lost. Do you want to
continue?
Yes/No? Yes                                                               
(parted) p                                                                
Model:  USB  SanDisk 3.2Gen1 (scsi)
Disk /dev/sdh: 123GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start  End  Size  Type  File system  Flags

Puis

(parted) mkpart primary 1MiB 551MiB                                      
  align-check TYPE N                        check partition N for TYPE(min|opt) alignment
  help [COMMAND]                           print general help, or help on COMMAND
  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)
  mkpart PART-TYPE [FS-TYPE] START END     make a partition
  name NUMBER NAME                         name partition NUMBER as NAME
  print [devices|free|list,all|NUMBER]     display the partition table, available devices, free space, all found
        partitions, or a particular partition
  quit                                     exit program
  rescue START END                         rescue a lost partition near START and END
  resizepart NUMBER END                    resize partition NUMBER
  rm NUMBER                                delete partition NUMBER
  select DEVICE                            choose the device to edit
  disk_set FLAG STATE                      change the FLAG on selected device
  disk_toggle [FLAG]                       toggle the state of FLAG on selected device
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER
  toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER
  unit UNIT                                set the default unit to UNIT
  version                                  display the version number and copyright information of GNU Parted
(parted) p                                                                
Model:  USB  SanDisk 3.2Gen1 (scsi)
Disk /dev/sdh: 123GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End    Size   Type     File system  Flags
 1      1049kB  551MB  549MB  primary               lba

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

Number  Start   End    Size   Type     File system  Flags
 1      1049kB  551MB  549MB  primary               boot, lba, esp
$ sudo mkfs.fat -F32 /dev/sdh1
mkfs.fat 4.1 (2017-01-24)


$ sudo parted /dev/sdh
GNU Parted 3.2
Using /dev/sdh
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
Model:  USB  SanDisk 3.2Gen1 (scsi)
Disk /dev/sdh: 123GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

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


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

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

$ sudo mkfs.ext4 /dev/sdh2
mke2fs 1.44.5 (15-Dec-2018)
Creating filesystem with 29900032 4k blocks and 7479296 inodes
Filesystem UUID: 6f43bddf-4f98-4bff-8501-1a400c0d9f16
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done  

Montage des partitions

$ sudo mount /dev/sdh1 /home/pierre/test/mnt/efi
$ sudo mount /dev/sdh2 /home/pierre/test/mnt/data

Puis installation de grub :

sudo grub-install --target=x86_64-efi --recheck --removable --efi-directory="/home/pierre/test/mnt/efi" --boot-directory="/home/pierre/test/mnt/data/boot" /dev/sdh
Installation pour la plate-forme x86_64-efi.
Installation terminée, sans erreur.
$ 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

On copie ensuite les deux images dans data/boot/iso/

https://wiki.archlinux.org/title/EFI_system_partition_(Fran%C3%A7ais)

Image Ubuntu

Création de la clef USB

Premiers tests avec QEMU

Configuration de GRUB aux petis oignons

Création d’une ISO from Scratch

sudo dd if=/dev/zero of=./test.iso bs=1M count=4096
$ file test.iso
test.iso: data
(parted) mklabel gpt

(parted) print
Model:  (file)
Disk /data/work/iso/test.iso: 4295MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End  Size  File system  Name  Flags
$ file test.iso 
test.iso: DOS/MBR boot sector; partition 1 : ID=0xee, start-CHS (0x0,0,1), end-CHS (0x3ff,254,63), startsector 1, 8388607 sectors, extended partition table (last)

Il existe deux types de partitions MBR (historique) et GPT.

MBR 512 premiers octets du disque

GPT fait partie de la spécification UEFI

(parted) mkpart primary 1MiB 551 MiB 
(parted) mkpart primary 551MiB 100%
(parted) p                                                                
Model:  (file)
Disk /data/work/iso/test.iso: 4295MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  551MB   549MB                primary
 2      578MB   4294MB  3716MB               primary

ESP = EFI System Partition

(parted) set 1 esp on
(parted) set 1 boot on                                                 
(parted) p                                                                
Model:  (file)
Disk /data/work/iso/test.iso: 4295MB
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   4294MB  3716MB               primary

On pourrait faire losetup --find --show ./test.iso mais ça ne marcherait pas car l’ISO contient plusieurs partitions

$ sudo mount -o loop test.iso ./toto
[sudo] Mot de passe de pierre : 
mount: /data/work/iso/toto: mauvais type de système de fichiers, option erronée, superbloc erroné sur /dev/loop0, page de code ou programme auxiliaire manquant, ou autre erreur.

$ partx --show test.iso
NR   START     END SECTORS SIZE NAME    UUID
 1    2048 1075199 1073152 524M primary cda59b44-a8fc-49c9-9a9c-f224a7efb4b6
 2 1128448 8386559 7258112 3,5G primary b308e851-99c9-487a-b888-4f61dd17096e
$ sudo partx -a -v test.iso
partition : none, disque : test.iso, première : 0, dernière : 0
Tentative d'utiliser « /dev/loop0 » comme périphérique boucle
/dev/loop0 : type de table de partitions « gpt » détecté
recomptage de l'interval : max numpart=2, prem=0, dern=0
/dev/loop0 : partition nº 1 ajoutée
/dev/loop0 : partition nº 2 ajoutée
$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE               DIO LOG-SEC
/dev/loop0         0      0         0  0 /data/work/iso/test.iso   0     512
$ ll /dev/loop0*
brw-rw---- 1 root disk   7,  0 juin  25 13:25 /dev/loop0
brw-rw---- 1 root disk 259,  9 juin  25 13:25 /dev/loop0p1
brw-rw---- 1 root disk 259, 10 juin  25 13:25 /dev/loop0p2

Et maintenant, nous pouvons créé les systèmes de fichiers.

Rappelons-nous qu’il faut du FAT32 sur la partition EFI

$ sudo mkfs.fat -F32 /dev/loop0p1
mkfs.fat 4.1 (2017-01-24)
$ sudo mkfs.ext4 /dev/loop0p2
mke2fs 1.44.5 (15-Dec-2018)
Discarding device blocks: done                            
Creating filesystem with 907264 4k blocks and 227136 inodes
Filesystem UUID: 832a535a-1fbc-459b-b076-33355f24b71f
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done 
$ sudo partx -d /dev/loop0
$ sudo losetup -D
$ sudo losetup -l
$

Ca a marché, les systèmes de fichier ont bien été créés (FAT32 pour la première et EXT4 pour la seconde) :

$ sudo parted test.iso print
Model:  (file)
Disk /data/work/iso/test.iso: 4295MB
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   4294MB  3716MB  ext4         primary

On monte ensuite ces deux partitions, en vue d’y installer GRUB :

$ mkdir {efi,boot}
$ sudo mount /dev/loop0p1 ./efi
$ sudo mount /dev/loop0p2 ./boot
$ mount | grep loop0
/dev/loop0p1 on /XXX/iso/efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
/dev/loop0p2 on /XXX/iso/boot type ext4 (rw,relatime)

Installation de Grub :

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

Sur mon disque système :

Je suis bien en EFI 64 bits :

$ more /sys/firmware/efi/fw_platform_size 
64
$ sudo parted /dev/nvme1n1 print
Model: LDLC F8+M.2 120 (nvme)
Disk /dev/nvme1n1: 120GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  538MB   537MB   fat32                 boot, esp
 ...

On a donc une petite partition de 537 MB commençant à la position 1049 kB, formattée en FAT32 et ayant les flags boot et esp

Cette petite partition est montée dans /boot/efi :

$ mount | grep nvme1n1p1
/dev/nvme1n1p1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)

A l’intérieur de /boot/efi se trouve un fichier grub.cfg minimal dont le but est (me semble-t-il) de pointer vers un fichier grub.cfg plus conséquent et stocké dans /boot/grub/grub.cfg (et ce fichier n’appartient pas à la partition FAT32).

Attention : qemu par défaut en bios pas efi https://papy-tux.legtux.org/doc1310/index.html

IMPORTANT

losetup /dev/loopX pour associer un loop à l’iso ???

–efi-directory=/mnt/efi –boot-directory=/mnt/boot

et rajouter l’option -v

flag : esp, boot et un truc style grub_on ???

A lire : https://wiki.archlinux.fr/ESP

TEST INSTALL FEDORA

https://linuxconfig.org/how-to-create-multiboot-usb-with-linux

$ wget -O /media/data/boot/iso/Fedora-Workstation-netinst-x86_64-28-1.1.iso
https://download.fedoraproject.org/pub/fedora/linux/releases/28/Workstation/x86_64/iso/Fedora-Workstation-netinst-x86_64-28-1.1.iso

La release 28 (qui date de 2019) est vide, je prends la dernière (36)

Tuto install grub ENS ??? https://www.normalesup.org/~george/comp/live_iso_usb/grub_hybrid.html

Références

Un résumé sur linuxconfig.org

La documentation de GRUB

Un tuto complet sur GRUB % NEW

Le même tuto en version ancienne »> à lire !! https://www.dedoimedo.com/computers/grub.html

La documentation de QEMU

https://github.com/antiagainst/grub2-themes

https://palc.fr/linux-monter-un-fichier-iso-contenant-plusieurs-partitions/

Bonne intro à Grub, fonctionnement général https://www.malekal.com/grub-la-configuration-grub-cfg-commande-et-dossier-boot/

Doc GRUB commande par commande https://www.gnu.org/software/grub/manual/grub/grub.html#set https://www.gnu.org/software/grub/manual/grub/grub.html#search https://www.gnu.org/software/grub/manual/grub/grub.html#gfxmode https://www.gnu.org/software/grub/manual/grub/grub.html#initrd https://www.gnu.org/software/grub/manual/grub/grub.html#linux https://www.gnu.org/software/grub/manual/grub/grub.html#loopback

Doc UEFI sur ArchLinux : https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface https://wiki.archlinux.org/title/Arch_boot_process#Boot_loader

Choisir une image custom pour Grub : http://sdz.tdct.org/sdz/installation-et-configuration-de-grub.html $ sudo aptitude install ovmf $ sudo qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd -cdrom /dev/sdc