ESP : Différence entre versions

De ArchwikiFR
m (Avec Mkinitcpio : Suppression du déplacement total avec Mkinitcpio (il faudrait que le noyau soit déplacé avant l'utilisation de 'mkinitcpio' avec cette méthode))
(Copie automatiquement des fichiers dans l'ESP : Annulation changement diff=6328&oldid=6327)
Ligne 120 : Ligne 120 :
  
 
==== Copie automatiquement des fichiers dans l'ESP ====
 
==== Copie automatiquement des fichiers dans l'ESP ====
Pour rentrer dans les détails, lors de l'appel de la commande précédente, un hook va s'occuper de copier les 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 et ensuite le rendre exécutable :
+
Il faut en premier créer un nouveau hook :
{{file|name=/usr/lib/initcpio/install/esp-update|content=
+
{{file|name=/usr/lib/initcpio/install/efistub-update|content=
 
#!/usr/bin/env bash
 
#!/usr/bin/env bash
 
build() {
 
build() {
cp /boot/vmlinuz-linux "${ESP_DIR}/vmlinuz-linux.efi"
+
/root/copie-initramfs-esp.sh &
cp /boot/initramfs-linux.img /boot/initramfs-linux-fallback.img "${ESP_DIR}/"
 
# ligne pour la copie du ucode si utilisé...
 
<nowiki>[[ -f /boot/intel-ucode.img ]]</nowiki> && cp /boot/intel-ucode.img "${ESP_DIR}/"
 
 
}
 
}
  
 
help() {
 
help() {
 
cat <<HELPEOF
 
cat <<HELPEOF
Ce hook copie le kernel et les initramfs dans la partition ESP
+
Ce hook attend que mkinitcpio se termine puis il copie les nouveaux initramfs ainsi que le noyau dans l'ESP
 
HELPEOF
 
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 :
 +
{{file|name=/root/copie-initramfs-esp.sh|content=<nowiki>
 +
#!/usr/bin/env bash
 +
 +
while [[ -d "/proc/$PPID" ]]; do
 +
sleep 1
 +
done
 +
 +
/usr/bin/cp -f /boot/vmlinuz-linux /boot/efi/EFI/arch/vmlinuz-linux.efi
 +
/usr/bin/cp -f /boot/initramfs-linux.img /boot/initramfs-linux-fallback.img /boot/efi/EFI/arch
  
Maintenant, vous pouvez éditer le fichier {{Filename|/etc/mkinitcpio.conf}} et modifier la ligne '''HOOKS='''"..." pour y ajouter à la fin le nouveau hook '''esp-update'''.
+
echo "Noyau et initramfs synchronisés avec l'ESP"
 +
</nowiki>}}
 +
Maintenant, vous pouvez éditer le fichier {{Filename|/etc/mkinitcpio.conf}} et modifier la ligne '''HOOKS='''"..." pour y ajouter à la fin le nouveau hook '''efistub-update'''.
 
En utilisant la commande {{Codeline|mkinitcpio -p linux}}, le noyau et les initramfs seront automatiquement copiés dans l'ESP.
 
En utilisant la commande {{Codeline|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 {{filename|/etc/mkinitcpio.d/linux.preset}} et d'ajouter à tous les initramfs '''sauf''' au dernier l'option suivante :
 
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 {{filename|/etc/mkinitcpio.d/linux.preset}} et d'ajouter à tous les initramfs '''sauf''' au dernier l'option suivante :
  *_options="-S esp-update"
+
  *_options="-S efistub-update"
  
 
==== Déplacement automatiquement partiel des fichiers dans l'ESP ====
 
==== Déplacement automatiquement partiel des fichiers dans l'ESP ====

Version du 21 août 2015 à 09:41


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

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).

  • 150Mo au minimum (un noyau + 2 initramfs dont un fallback)
  • 300-500Mo en cas de dualboot ou en cas d'utilisation de plusieurs noyaux et de nombreux initramfs

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

  1. 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.
  2. En utilisant fdisk puis en créant une partition de type EFI System puis en la formant 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 quls 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=Copy EFISTUB Kernel to UEFISYS Partition

[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=Copy EFISTUB Kernel to UEFISYS Partition

[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 :

Fichier: /etc/systemd/system/efistub-update.path
[Unit]
Description=Copy EFISTUB Kernel to UEFISYS Partition

[Path]
PathChanged=/boot/vmlinuz-linux

[Install]
WantedBy=multi-user.target
Fichier: /etc/systemd/system/efistub-update.service
[Unit]
Description=Copy EFISTUB Kernel to UEFISYS Partition

[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

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

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

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 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

Boot en EFI

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

Il est aussi possible que l'UEFI démarre sans passer par un bootloader, pour cela voir la page EFI Boot Stub (bien que c'est page soit placée dans la catégorie bootloader, la méthode STUB n'est pas un bootloader en soi).