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?
Les commandes ci-dessous sont plus génériques que pour la version 3.13.0-35 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'
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.
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.
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
.
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
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.