# EFI system partition (Français)

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Related articles

- Unified Extensible Firmware Interface
- Boot loader

Cet article ou section a besoin d'être traduit(e).

Notes: Cet article ne respecte pas la structure de sa version anglophone, merci de le réécrire en conséquence. Vous pouvez aussi ajouter à la version anglophone les informations à-jour et dignes d’intérêt qui ne seraient portées que par la version francophone. Voir Archwiki:Translation_Team_(Français) (Discuss in Talk:EFI system partition (Français)#)
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

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

Attention: Si vous avez installé l'application UEFI GRUB dans /boot/efi/EFI/arch_grub/ comme dit dans la GRUB (Français)#Mise en place_2, 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 :

    /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

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

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

Category:

- Boot process (Français)

Hidden category:

- Pages or sections flagged with Template:Translateme