Partition Système EFI (ESP)

De ArchwikiFR


Attention : Cette page s'adresse uniquement aux possesseurs de carte-mère disposant d'un UEFI, ainsi que d'un disque avec une table de partitionnement GUID (dit GPT). Elle a pour but de donner les informations relatives à la création de la partition pour le système EFI (appelée ESP).

L'ESP, pour EFI System Partition en anglais, est une partition spéciale apparue avec l'UEFI. Cette partition contient tous les fichiers nécessaires au démarrage des systèmes d'exploitation installés sur la machine.

Traditionnellement, on y trouve un répertoire nommé EFI, qui contient des sous-répertoires propres à chacun des systèmes d'exploitation. Ces sous-répertoires contiennent, au minimum, un fichier exécutable dont l'extension est .efi. Le noyau Linux sera donc vmlinuz-linux.efi dans le cas d'Arch Linux, et il sera accompagné de ses initramfs.

Création de l'ESP

Astuce : Si une partition d'ESP est déjà présente sur votre machine (cas d'un dual-boot avec Windows par exemple), il n'est pas utile de créer un nouvel ESP. Réutilisez celle déjà présente, l'ESP étant conçu pour supporter plusieurs système.

Si vous avez acheté un ordinateur avec un système d'exploitation pré-installé, vérifiez que cette partition n'existe pas déjà. Sinon, si elle n'existe pas, il faut créer une partition en FAT16 ou FAT32 (ce dernier étant conseillé). La taille de l'ESP varie en fonction de vos besoins (n'oubliez pas que l'ESP est unique, et donc commun à tous les systèmes présents sur votre machine). En général, la taille du noyau dans les distributions est d'environ 5Mo ; le taille de l'initramfs est variable (cela dépend de la compression ainsi que du nombre du modules), cela peut aller de 5Mo à plusieurs dizaines de Mo. On peut donc choisir comme taille :

  • 128Mo, au minimum
  • Jusqu'à 512Mo, en cas de multiboot (on peut compter environ 100Mo par système, pour être large)

Pour créer cette partition, il existe quelques méthodes :

  • En utilisant GNU Parted/GParted puis en créant une partition de type FAT32. Il ne faut pas oublier de mettre le drapeau boot (différent de legacy_boot) sur cette partition.
  • En utilisant fdisk puis en créant une partition de type EFI System
  • En utilisant gdisk puis en créant une partition avec le Hex code : ef00

Ensuite il faudra la formater en FAT32 en utilisant la commande :

mkfs.fat -F32 /dev/sdXY
Note : Si vous obtenez le message WARNING: Not enough clusters for a 32 bit FAT!, il faut réduire la taille des clusters avec mkfs.fat -s2 -F32 ... ou -s1, sinon la partition sera illisible par l'UEFI.

Montage de l'ESP

Cette nouvelle partition va venir se monter dans votre /boot, dans le dossier efi. Si le dossier efi n'existe pas, on le crée de la manière suivante :

mkdir /boot/efi

Puis on monte la partition nouvellement créée dedans :

mount /dev/sdXY /boot/efi
Attention : Si la création de l'ESP n'est pas faite durant l'installation d'Arch Linux, n'oubliez pas d'ajouter le point de montage dans le fichier /etc/fstab.

Mise en place manuelle des fichiers de boot dans l'ESP

Astuce : Cette partie manuelle sert à mieux comprendre quels fichiers doivent être mis en place dans l'ESP. Vous pouvez sauter cette partie si vous désirez automatiser cette tâche.

L'UEFI aura besoin des initramfs (initramfs-linux*.img) ainsi que du noyau (vmlinuz-*, qu'on renomme en vmlinuz-*.efi dans l'ESP) pour démarrer.

Création d'un répertoire propre à Arch Linux

On a besoin de créer un sous-répertoire dans /boot/efi/EFI ; il contiendra tous les fichiers propres à cette installation d'Arch Linux. Donnez-lui le nom que vous voulez Dans la suite, nous utiliserons le nom arch.

mkdir -p /boot/efi/EFI/arch/

On peut manuellement placer les fichiers cités plus haut dans le répertoire créé, mais il est préférable d'opter pour une synchronisation automatique afin éviter bien des ennuis (voir les sections suivantes) :

cp /boot/vmlinuz-linux /boot/efi/EFI/arch/vmlinuz-linux.efi
cp /boot/initramfs-linux.img /boot/initramfs-linux-fallback.img /boot/efi/EFI/arch

Mise en place automatique des fichiers de boot dans l'ESP

Afin d'éviter de démarrer avec l'ancien noyau suite à une mise à jour, il est intéressant que la manipulation précédente soit automatisée.

Avec Systemd

Systemd est capable de copier ou bien de déplacer ces fichiers pour vous, pour cela il suffit de créer les deux fichiers suivants (reportez-vous à la section qui vous intéresse) :

Copie automatiquement des fichiers dans l'ESP

Fichier: /etc/systemd/system/efistub-update.path
[Unit]
Description=Copie du noyau dans l'ESP

[Path]
PathChanged=/boot/vmlinuz-linux
PathChanged=/boot/initramfs-linux.img
PathChanged=/boot/initramfs-linux-fallback.img

[Install]
WantedBy=multi-user.target
Fichier: /etc/systemd/system/efistub-update.service
[Unit]
Description=Copie du noyau dans l'ESP

[Service]
Type=oneshot
ExecStart=/usr/bin/cp -f /boot/vmlinuz-linux /boot/efi/EFI/arch/vmlinuz-linux.efi
ExecStart=/usr/bin/cp -f /boot/initramfs-linux.img /boot/initramfs-linux-fallback.img /boot/efi/EFI/arch/
Attention : Si vous avez installé l'application UEFI GRUB dans /boot/efi/EFI/arch_grub/ comme dit dans le Wiki, modifiez le chemin ci-dessus en conséquence

Puis on active ces services :

systemctl enable efistub-update.path

Lorsque efistub-update.path détectera un changement des fichiers spécifiés, il lancera automatiquement le service efistub-update.service.

Déplacement automatiquement des fichiers dans l'ESP

Si aucun programme a besoin de ces fichiers dans le /boot), alors vous pouvez opter pour le déplacement de ces fichiers. Sautez cette partie si vous avez utilisé la méthode de copie.

Pour cela, il faut modifier les deux fichiers de la section ci-dessus comme ceci :

Fichier: /etc/systemd/system/efistub-update.path
[Unit]
Description=Déplacement du noyau dans l'ESP

[Path]
PathChanged=/boot/vmlinuz-linux

[Install]
WantedBy=multi-user.target
Fichier: /etc/systemd/system/efistub-update.service
[Unit]
Description=Déplacement du noyau dans l'ESP

[Service]
Type=oneshot
ExecStart=/usr/bin/mv -f /boot/vmlinuz-linux /boot/efi/EFI/arch/vmlinuz-linux.efi

Puis il faut modifier le fichier /etc/mkinitcpio.d/linux.preset :

Fichier: /etc/mkinitcpio.d/linux.preset
# mkinitcpio preset file for the 'linux' package

ALL_config="/etc/mkinitcpio.conf"
ALL_kver="/boot/efi/EFI/arch/vmlinuz-linux.efi"

PRESETS=('default' 'fallback')

#default_config="/etc/mkinitcpio.conf"
default_image="/boot/efi/EFI/arch/initramfs-linux.img"
#default_options=""

#fallback_config="/etc/mkinitcpio.conf"
fallback_image="/boot/efi/EFI/arch/initramfs-linux-fallback.img"
fallback_options="-S autodetect"

Sans oublier de faire un :

mkinitcpio -p linux

Avec Mkinitcpio

Une alternative au service Systemd est de faire cette copie grâce à un hook, invoqué lorsqu'on appelle la commande mkinitcpio -p linux. Tout comme la section avec Systemd, cette méthode permet soit la copie ou soit le déplacement des fichiers.

Copie automatiquement des fichiers dans l'ESP

Pour rentrer dans les détails, lors de l'appel de la commande précédente, un script va être lancé en arrière plan, et il va attendre que la création des nouveaux initramfs soit finie pour les copier dans l'ESP.

Il faut en premier créer un nouveau hook :

Fichier: /usr/lib/initcpio/install/efistub-update
#!/usr/bin/env bash
build() {
	/root/copie-initramfs-esp.sh &
}

help() {
	cat <<HELPEOF
Ce hook attend que mkinitcpio se termine puis il copie les nouveaux initramfs ainsi que le noyau dans l'ESP
HELPEOF
}

Puis le fameux script (nommez-le comme vous voulez et placez-le où vous voulez, du moment que vous adaptez en conséquence le fichier créé précédemment), qu'il faudra rendre exécutable :

Fichier: /root/copie-initramfs-esp.sh
#!/usr/bin/env bash

ESP_DIR="/boot/efi/EFI/arch"

while [[ -d "/proc/$PPID" ]]; do
	sleep 1
done

/usr/bin/cp -f /boot/vmlinuz-linux "${ESP_DIR}/vmlinuz-linux.efi"
/usr/bin/cp -f /boot/initramfs-linux.img /boot/initramfs-linux-fallback.img "${ESP_DIR}/"
[[ -f /boot/intel-ucode.img ]] && /usr/bin/cp -f /boot/intel-ucode.img "${ESP_DIR}/"

echo "Noyau et initramfs synchronisés avec l'ESP"

Maintenant, vous pouvez éditer le fichier /etc/mkinitcpio.conf et modifier la ligne HOOKS="..." pour y ajouter à la fin le nouveau hook efistub-update. En utilisant la commande mkinitcpio -p linux, le noyau et les initramfs seront automatiquement copiés dans l'ESP.

Pour éviter que plusieurs copies soient effectuées lorsqu'il y a au moins deux initramfs pour un noyau, il est futé de lancer une seule fois la copie, dès que tous les initramfs seront recréés. Il suffit d'éditer le fichier /etc/mkinitcpio.d/linux.preset et d'ajouter à tous les initramfs sauf au dernier (généralement le fallback) l'option suivante :

*_options="-S efistub-update"

Déplacement automatiquement partiel des fichiers dans l'ESP

Une autre alternative aux solutions ci-dessus, qui est potentiellement plus propre car limite les recopies de fichiers. La logique est inversée, les initramfs sont directement enregistrées dans la partition EFI, aucune copie dans /boot. Puis le kernel ainsi que tout autre fichier supplémentaire sont copiés dans la partition ESP grâce à un hook de mkinitcpio.

Modifier le fichier /etc/mkinitcpio.d/linux.preset :

Fichier: /etc/mkinitcpio.d/linux.preset
# mkinitcpio preset file for the 'linux' package

# Directory to copy the kernel, the initramfs...
ESP_DIR="/boot/efi/EFI/arch"

ALL_config="/etc/mkinitcpio.conf"
ALL_kver="/boot/vmlinuz-linux"

PRESETS=('default' 'fallback')

#default_config="/etc/mkinitcpio.conf"
default_image="${ESP_DIR}/initramfs-linux.img"
default_options="-A esp-update-linux"

#fallback_config="/etc/mkinitcpio.conf"
fallback_image="${ESP_DIR}/initramfs-linux-fallback.img"
fallback_options="-S autodetect"

Puis créer le fichier /usr/lib/initcpio/install/esp-update-linux qu'il faudra rendre exécutable :

Fichier: /usr/lib/initcpio/install/esp-update-linux
# Directory to copy the kernel, the initramfs...
ESP_DIR="/boot/efi/EFI/arch"

build() {
	cp /boot/vmlinuz-linux "${ESP_DIR}/vmlinuz-linux.efi"
	# ligne pour la copie du ucode si utilisé...
	[[ -f /boot/intel-ucode.img ]] && mv /boot/intel-ucode.img "${ESP_DIR}/"
}

help() {
	cat <<HELPEOF
Ce hook copie le kernel dans la partition ESP
HELPEOF
}

Une fois ceci configuré, pour le tester, il suffit de faire :

 rm /boot/initramfs-linux-fallback.img
 rm /boot/initramfs-linux.img
 mkinitcpio -p linux

Avec un bind

Cette dernière option, contrairement aux autres ci-dessus, ne déplace pas directement les fichiers. On monte le bon répertoire directement dans /boot.

Installation automatique des fichiers dans l'ESP

Attention : Cette méthode est valable uniquement si votre /boot ne contient pas le répertoire d'un bootloader (comme /boot/grub) !

Tout d'abord, il faut créer un nouveau répertoire dans lequel on montera l'ESP (par exemple /esp) :

mkdir /esp

Pensez à démonter l'ESP de l'ancien point de montage s'il est monté automatiquement :

umount /boot/efi

En utilisant cette méthode, le répertoire /boot/efi n'est plus utile; on peut le supprimer.

On peut maintenant monter l'ESP dans le nouveau répertoire :

mount /dev/sdXY /esp

Il est maintenant le temps de faire du ménage et de vider le /boot (c'est pour cela que vous devez passer votre chemin si vous utilisez GRUB par exemple) :

mv /boot/* /esp/EFI/arch/

On peut maintenant mettre en place le bind :

mount --bind /esp/EFI/arch/ /boot

Il est nécessaire que ce répertoire soit toujours monté au boot pour assurer un fonctionnement correct. Il faut éditer le fichier /etc/fstab (adaptez à votre configuration) :

Fichier: /etc/fstab
...
/dev/sdXY      	/esp	vfat	rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro	0 2
/esp/EFI/arch	/boot	none	defaults,bind	0 0

Et c'est terminé, il n'y a rien à faire de plus, les fichiers étant placés directement au bon endroit lors de leur création.

Note : Soyez vigilent, le Wiki réfère souvent au fichier vmlinuz-linux.efi, or avec cette méthode, vu que le noyau n'est pas renommé, il reste sous le nom vmlinuz-linux (sans extension). Il faudra donc penser à ne pas mettre le .efi pour que cela fonctionne dans les commandes que vous trouverez.

Boot en EFI

Le boot en EFI peut se faire à l'aide d'un bootloader, voir la catégorie bootloader.

Si vous ne voulez pas utiliser de bootloader (c'est un des avantages des UEFI), vous pouvez voir la page EFI Boot Stub, qui permet d'indiquer directement à l'UEFI où se trouvent les fichiers nécessaires au démarrage d'Arch Linux.