web-dev-qa-db-fra.com

Comment amorcer le chargement du noyau avec le chargeur EFI Stub (efistub)?

Ubuntu 14.04 fonctionne en mode UEFI en tant que système d’exploitation uniquement, pas de double démarrage ici. La version du noyau est 3.13.0-24-generic. Il y a une partition EFI. Dans ce cas, la partition EFI ne se trouve pas à la valeur par défaut /dev/sda1 mais à /dev/sda3 car je l’ai fait convertir le mode BIOS en mode EFI . J'ai utilisé le paquetage grub-efi-AMD64, bien que cela charge réellement le menu de démarrage GRUB à partir du menu de démarrage du microprogramme UEFI (le démarrage de UEFI charge \EFI\ubuntu\grubx64.efi).

Je souhaite ignorer cette étape de chargement du double menu de démarrage et démarrer plus rapidement, directement depuis UEFI dans le noyau. Les les noyaux Ubuntu depuis 12.10 ont "le chargeur de stub EFI du noyau" .

Je sais que j'ai besoin de copier le noyau Ubuntu sur la partition EFI (éventuellement le renommer) et de créer une entrée dans le menu de démarrage UEFI (par exemple, en utilisant efibootmgr). Quelles commandes de terminal exactes sont nécessaires pour faire cela?

14
Pro Backup

Les commandes ci-dessous sont plus génériques que pour la version 3.13.0-35 du noyau.

1. Montez la partition efi et copiez-y les fichiers du noyau

$ mount /dev/sda3 /boot/efi

$ mkdir -pv /boot/efi/EFI/ubuntu/

$ cp -uv /boot/vmlinuz-* /boot/initrd.img-* /boot/efi/EFI/ubuntu/
'/boot/vmlinuz-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic'
'/boot/initrd.img-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/initrd.img-3.13.0-35-generic'

2. Changer le nom du fichier du noyau

Raccourcissez le nom du fichier du noyau en supprimant -generic car il semble y avoir une limite de chemin d'accès de 39 caractères et renommer le (s) fichier (s) du noyau pour qu'il se termine par .efi, ceci assure la compatibilité avec la plupart des systèmes.

$ for f in /boot/efi/EFI/ubuntu/vmlinuz-*-generic; do mv -uv -- "$f" "${f//-generic/}.efi"; done
'/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic.efi'`

Le raccourcissement du nom du fichier de noyau ci-dessus n'est pas suffisant pour un noyau dpkg installé car, par exemple, /EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efi sans -generic contient toujours 40 caractères.

3. Ajouter une nouvelle entrée au menu de démarrage EFI

Remplacez 3.13.0-35 dans cet exemple par votre version de noyau spécifique

$ kv=3.13.0-35;efibootmgr -c -p 3 -L $kv -l \EFI\ubuntu\vmlinuz-$kv.efi -u root=/dev/sda1 initrd=\\EFI\\ubuntu\\initrd.img-$kv-generic ro rootfstype=ext4 debug ignore_loglevel libata.force=dump_id crashkernel=384M-:128M

Cette nouvelle entrée du menu de démarrage deviendra votre nouveau choix de démarrage par défaut.

Vous n’avez peut-être pas besoin des paramètres de débogage supplémentaires debug, ignore_loglevel, libata.force=dump_id et crashkernel=384M-:128M. Initrd doit être présent, sinon le démarrage s'arrête à ". Basculé sur clocksource tsc. " car le périphérique racine sda1 ne peut pas être ouvert.

14
Pro Backup

Selon le wiki Debian , cela peut être fait en quelques étapes simples qui survivront à une mise à jour du noyau .

Remarque: cela suppose que vous avez une partition EFI montée à /boot/efi.

  1. Créez /etc/kernel/postinst.d/zz-update-efistub avec le contenu suivant:

    #!/bin/sh
    cp /vmlinuz /initrd.img /boot/efi/EFI/ubuntu/
    

    Ceci est un crochet qui sera exécuté lors de la mise à jour du noyau pour copier la dernière image du noyau et initrd à l'emplacement approprié. Ensuite, rendez-le exécutable et lancez-le:

    Sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    Sudo /etc/kernel/postinst.d/zz-update-efistub
    
  2. Ajoutez l'entrée de démarrage:

    Sudo efibootmgr -c -d /dev/sdb -p 1 -L "Ubuntu (efistub)" -l /EFI/ubuntu/vmlinuz -u "root=/dev/sdb2 rw initrd=/EFI/ubuntu/initrd.img quiet splash"
    

    N'oubliez pas de modifier les arguments -d et -p en fonction de l'emplacement de votre partition système EFI. Dans mon cas, il s’agit de/dev/sdb1, mais c’est probablement différent pour vous. Vous devrez probablement également remplacer la valeur root= dans la ligne de commande du noyau par votre partition racine.

    (Vous pouvez modifier l'étiquette comme vous le souhaitez en modifiant le paramètre -L.)

    L'entrée de démarrage que vous venez d'ajouter deviendra l'entrée par défaut. Et cela ne se cassera pas après une mise à jour du noyau, car le crochet s'assurera que vmlinuz et initrd.img sont toujours mis à jour.

5
Léo Lam