Comment démarrer le chargement du noyau en utilisant le chargeur EFI stub (efistub)?

14

J'ai Ubuntu 14.04 fonctionnant en mode UEFI comme seul système d'exploitation, pas de double démarrage ici. La version du noyau est générique 3.13.0-24. Il existe une partition EFI. Dans ce cas, la partition EFI n'est pas à la valeur par défaut /dev/sda1mais à /dev/sda3parce que j'ai effectivement converti le mode BIOS en mode EFI . J'ai utilisé le grub-efi-amd64package, bien que cela charge en fait le menu de démarrage GRUB à partir du menu de démarrage du firmware UEFI (charges de démarrage UEFI \EFI\ubuntu\grubx64.efi).

Je veux ignorer cette étape de chargement du menu de démarrage double et démarrer plus rapidement, directement depuis UEFI dans le noyau. Les noyaux Ubuntu depuis la version 12.10 ont la fonctionnalité "Kernel EFI stub loader" .

Je sais que je dois copier le noyau Ubuntu sur la partition EFI (éventuellement renommer) et 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 ce faire?

Pro Backup
la source

Réponses:

14

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

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. Modifiez le nom du fichier du noyau

Raccourcissez le nom du fichier noyau en le supprimant -genericcar il semble y avoir une limite de chemin d'accès de 39 caractères et Renommez le ou les fichiers noyau pour finir .efi, cela garantit 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 noyau ci-dessus n'est pas suffisant pour un noyau de ligne principaledpkg installé , car par exemple, sans contient toujours 40 caractères./EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efi-generic

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

Remplacez 3.13.0-35dans 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 pourriez ne pas avoir besoin des paramètres de débogage supplémentaires debug, ignore_loglevel, libata.force=dump_idet crashkernel=384M-:128M. Initrddoit être présent, sinon le démarrage se bloque sur " Switched to clocksource tsc. " car le périphérique racine sda1 ne peut pas être ouvert.

Pro Backup
la source
Je ne sais pas comment tu as compris ça, mais tu es incroyable. Il y a étonnamment peu de doc autour de cette fonctionnalité intéressante.
user3549648
Dans le cas où cela ne fonctionne pas, essayez de mettre les arguments de -let -uentre guillemets (ou échappez la barre oblique inverse manuellement). Vous pouvez tester si c'est le problème en exécutant efibootmgr -vaprès avoir ajouté une nouvelle entrée au menu de démarrage EFI. De plus, dans le cas où votre machine possède plus d'un disque (disons un SSD et un disque dur), vous devrez en spécifier un par -ddéfaut /dev/sda(voir man efibootmgr)
Peeyush Kushwaha
5

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

Remarque: cela suppose que vous disposez d'une partition EFI montée sur /boot/efi.

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

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

    Il s'agit d'un hook qui sera exécuté lors de la mise à jour du noyau pour copier la dernière image du noyau et initrd à l'emplacement approprié. Rendez-le ensuite exécutable et exécutez-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 -det en -pfonction de l'emplacement de votre partition système EFI. Dans mon cas, c'est / dev / sdb1, mais cela est probablement différent pour vous. Vous devrez probablement également changer la root=valeur de la ligne de commande du noyau en votre partition racine.

    (Vous pouvez changer l'étiquette comme vous voulez en changeant le -Lparamètre.)

    L'entrée de démarrage que vous venez d'ajouter deviendra l'entrée par défaut. Et il ne se cassera pas après une mise à jour du noyau, car le hook s'assurera vmlinuzet initrd.imgsera toujours mis à jour.

Léo Lam
la source
N'importe quel moyen de le faire fonctionner avec un démarrage sécurisé, car sur mon ordinateur portable HP lorsque j'essaie, cela donne une erreur de démarrage sécurisé (bien sûr, je peux également désactiver le démarrage sécurisé)
Suici Doga
Il semble que vous deviez utiliser cryptboot et certains outils pour signer le noyau en premier . C'est un peu compliqué, surtout si vous n'utilisez pas Arch (car il n'y a pas d'outil prêt à l'emploi), donc je désactiverais simplement le démarrage sécurisé.
Léo Lam
Qu'en est-il de la copie du noyau .signed?
Suici Doga