Une clef USB multi-OS
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
- Création de la clef USB
- Premiers tests avec QEMU
- Configuration de GRUB aux petis oignons
- Création d’une ISO from Scratch
- TEST INSTALL FEDORA
- Références
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 tuto complet sur GRUB % NEW
Le même tuto en version ancienne »> à lire !! https://www.dedoimedo.com/computers/grub.html
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