EFI system partition (Français)
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
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
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
/etc/fstab
.Mise en place manuelle des fichiers de boot dans l'ESP
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
/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
/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/
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 :
/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
/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
:
/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 :
/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 :
/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
:
/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 :
/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é... <nowiki>[[ -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 } </nowiki>
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
/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) :
/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.
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 Arch boot process (Français)#Chargeur de démarrage.
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.