#1 Le 30/05/2026, à 10:16
- iznobe

[ résolu ] grub update fail U26.04
Bonjour , aujourd'hui en mettant à jour :
iznobe@iznobe-PC-U26:~$ up
Réception de : 1 http://security.ubuntu.com/ubuntu resolute-security InRelease [136 kB]
Atteint : 2 http://archive.ubuntu.com/ubuntu resolute InRelease
Réception de : 3 http://security.ubuntu.com/ubuntu resolute-security/main amd64 Components [23,6 kB]
Réception de : 4 http://security.ubuntu.com/ubuntu resolute-security/universe amd64 Components [39,7 kB]
Réception de : 5 http://archive.ubuntu.com/ubuntu resolute-updates InRelease [136 kB]
Atteint : 6 https://ppa.launchpadcontent.net/mozillateam/ppa/ubuntu resolute InRelease
Réception de : 7 https://ppa.launchpadcontent.net/xtradeb/apps/ubuntu resolute InRelease [27,2 kB]
Réception de : 8 https://ppa.launchpadcontent.net/xtradeb/apps/ubuntu resolute/main amd64 Packages [41,1 kB]
Réception de : 9 https://pkgs.tailscale.com/stable/ubuntu resolute InRelease
Atteint : 10 http://archive.ubuntu.com/ubuntu resolute-backports InRelease
Réception de : 11 https://ppa.launchpadcontent.net/xtradeb/apps/ubuntu resolute/main i386 Packages [8060 B]
Réception de : 12 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 Packages [149 kB]
Réception de : 13 http://archive.ubuntu.com/ubuntu resolute-updates/main i386 Packages [47,7 kB]
Réception de : 14 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 Components [29,6 kB]
Réception de : 15 http://archive.ubuntu.com/ubuntu resolute-updates/universe amd64 Packages [78,1 kB]
Réception de : 16 http://archive.ubuntu.com/ubuntu resolute-updates/universe amd64 Components [46,0 kB]
Atteint : 17 https://download.sublimetext.com apt/stable/ InRelease
768 ko réceptionnés en 0s (1647 ko/s)
26 paquets peuvent être mis à jour. Exécutez « apt list --upgradable » pour les voir.
Le paquet suivant a été installé automatiquement et n'est plus nécessaire :
fonts-glyphicons-halflings
Veuillez utiliser « sudo apt autoremove » pour le supprimer.
Get another security update through Ubuntu Pro with 'esm-apps' enabled:
libopenexr-3-1-30
Learn more about Ubuntu Pro at https://ubuntu.com/pro
Mis à jour :
bpftool gir1.2-mutter-18 linux-generic-hwe-24.04 linux-image-generic-hwe-26.04 linux-tools-common openjdk-25-jre php8.5-common php8.5-intl php8.5-xml
firefox libapache2-mod-php8.5 linux-generic-hwe-26.04 linux-libc-dev mutter-common openjdk-25-jre-headless php8.5-curl php8.5-mysql tailscale
firefox-locale-fr libmutter-18-0 linux-headers-generic-hwe-26.04 linux-perf mutter-common-bin php8.5-cli php8.5-gd php8.5-readline
Installation de dépendances :
linux-headers-7.0.0-22 linux-image-7.0.0-22-generic linux-modules-7.0.0-22-generic linux-tools-7.0.0-22-generic
linux-headers-7.0.0-22-generic linux-main-modules-zfs-7.0.0-22-generic linux-tools-7.0.0-22
Paquets suggérés :
linux-tools
Sommaire :
Mise à niveau de : 26. Installation de : 7, Supprimé : 0. Non mis à jour : 0
11 standard LTS security updates
Taille du téléchargement : 407 Mo
Espace nécessaire : 373 Mo / 11,5 Go disponible
Réception de : 1 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 bpftool amd64 7.7.0+7.0.0-22.22 [932 kB]
Réception de : 2 https://pkgs.tailscale.com/stable/ubuntu resolute/main amd64 tailscale amd64 1.98.4 [37,1 MB]
Réception de : 3 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 mutter-common all 50.1-0ubuntu2.1 [38,7 kB]
Réception de : 4 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 mutter-common-bin amd64 50.1-0ubuntu2.1 [54,4 kB]
Réception de : 5 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 gir1.2-mutter-18 amd64 50.1-0ubuntu2.1 [134 kB]
Réception de : 6 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 libmutter-18-0 amd64 50.1-0ubuntu2.1 [1498 kB]
Réception de : 7 https://ppa.launchpadcontent.net/mozillateam/ppa/ubuntu resolute/main amd64 firefox amd64 151.0.2+build1-0ubuntu0.26.04.1~mt1 [82,6 MB]
Réception de : 8 http://archive.ubuntu.com/ubuntu resolute-updates/universe amd64 php8.5-intl amd64 8.5.4-0ubuntu1.1 [174 kB]
Réception de : 9 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 php8.5-xml amd64 8.5.4-0ubuntu1.1 [212 kB]
Réception de : 10 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 php8.5-readline amd64 8.5.4-0ubuntu1.1 [13,9 kB]
Réception de : 11 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 php8.5-mysql amd64 8.5.4-0ubuntu1.1 [131 kB]
Réception de : 12 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 php8.5-gd amd64 8.5.4-0ubuntu1.1 [40,8 kB]
Réception de : 13 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 php8.5-curl amd64 8.5.4-0ubuntu1.1 [46,3 kB]
Réception de : 14 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 libapache2-mod-php8.5 amd64 8.5.4-0ubuntu1.1 [3062 kB]
Réception de : 15 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 php8.5-cli amd64 8.5.4-0ubuntu1.1 [3134 kB]
Réception de : 16 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 php8.5-common amd64 8.5.4-0ubuntu1.1 [815 kB]
Réception de : 17 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-main-modules-zfs-7.0.0-22-generic amd64 7.0.0-22.22 [2420 kB]
Réception de : 18 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-modules-7.0.0-22-generic amd64 7.0.0-22.22 [169 MB]
Réception de : 19 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-image-7.0.0-22-generic amd64 7.0.0-22.22 [17,0 MB]
Réception de : 20 https://ppa.launchpadcontent.net/mozillateam/ppa/ubuntu resolute/main amd64 firefox-locale-fr amd64 151.0.2+build1-0ubuntu0.26.04.1~mt1 [416 kB]
Réception de : 21 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-generic-hwe-26.04 amd64 7.0.0-22.22 [1724 B]
Réception de : 22 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-image-generic-hwe-26.04 amd64 7.0.0-22.22 [2478 B]
Réception de : 23 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-headers-7.0.0-22 all 7.0.0-22.22 [14,8 MB]
Réception de : 24 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-headers-7.0.0-22-generic amd64 7.0.0-22.22 [4136 kB]
Réception de : 25 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-headers-generic-hwe-26.04 amd64 7.0.0-22.22 [2330 B]
Réception de : 26 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-generic-hwe-24.04 amd64 7.0.0-22.22 [1672 B]
Réception de : 27 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-libc-dev amd64 7.0.0-22.22 [1548 kB]
Réception de : 28 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-perf amd64 7.0.0-22.22 [6970 kB]
Réception de : 29 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-tools-common all 7.0.0-22.22 [37,9 kB]
Réception de : 30 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-tools-7.0.0-22 amd64 7.0.0-22.22 [1306 kB]
Réception de : 31 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 linux-tools-7.0.0-22-generic amd64 7.0.0-22.22 [1606 B]
Réception de : 32 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 openjdk-25-jre amd64 25.0.3+9-2~26.04.2 [218 kB]
Réception de : 33 http://archive.ubuntu.com/ubuntu resolute-updates/main amd64 openjdk-25-jre-headless amd64 25.0.3+9-2~26.04.2 [59,0 MB]
407 Mo réceptionnés en 37s (11,0 Mo/s)
Extraction des modèles depuis les paquets : 100%
(Lecture de la base de données... 257600 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../00-bpftool_7.7.0+7.0.0-22.22_amd64.deb ...
Dépaquetage de bpftool (7.7.0+7.0.0-22.22) sur (7.7.0+7.0.0-15.15) ...
Préparation du dépaquetage de .../01-firefox_151.0.2+build1-0ubuntu0.26.04.1~mt1_amd64.deb ...
Dépaquetage de firefox (151.0.2+build1-0ubuntu0.26.04.1~mt1) sur (151.0.1+build1-0ubuntu0.26.04.1~mt1) ...
Préparation du dépaquetage de .../02-firefox-locale-fr_151.0.2+build1-0ubuntu0.26.04.1~mt1_amd64.deb ...
Dépaquetage de firefox-locale-fr (151.0.2+build1-0ubuntu0.26.04.1~mt1) sur (151.0.1+build1-0ubuntu0.26.04.1~mt1) ...
Préparation du dépaquetage de .../03-mutter-common_50.1-0ubuntu2.1_all.deb ...
Dépaquetage de mutter-common (50.1-0ubuntu2.1) sur (50.1-0ubuntu2) ...
Préparation du dépaquetage de .../04-mutter-common-bin_50.1-0ubuntu2.1_amd64.deb ...
Dépaquetage de mutter-common-bin (50.1-0ubuntu2.1) sur (50.1-0ubuntu2) ...
Préparation du dépaquetage de .../05-gir1.2-mutter-18_50.1-0ubuntu2.1_amd64.deb ...
Dépaquetage de gir1.2-mutter-18:amd64 (50.1-0ubuntu2.1) sur (50.1-0ubuntu2) ...
Préparation du dépaquetage de .../06-libmutter-18-0_50.1-0ubuntu2.1_amd64.deb ...
Dépaquetage de libmutter-18-0:amd64 (50.1-0ubuntu2.1) sur (50.1-0ubuntu2) ...
Préparation du dépaquetage de .../07-php8.5-intl_8.5.4-0ubuntu1.1_amd64.deb ...
Dépaquetage de php8.5-intl (8.5.4-0ubuntu1.1) sur (8.5.4-0ubuntu1) ...
Préparation du dépaquetage de .../08-php8.5-xml_8.5.4-0ubuntu1.1_amd64.deb ...
Dépaquetage de php8.5-xml (8.5.4-0ubuntu1.1) sur (8.5.4-0ubuntu1) ...
Préparation du dépaquetage de .../09-php8.5-readline_8.5.4-0ubuntu1.1_amd64.deb ...
Dépaquetage de php8.5-readline (8.5.4-0ubuntu1.1) sur (8.5.4-0ubuntu1) ...
Préparation du dépaquetage de .../10-php8.5-mysql_8.5.4-0ubuntu1.1_amd64.deb ...
Dépaquetage de php8.5-mysql (8.5.4-0ubuntu1.1) sur (8.5.4-0ubuntu1) ...
Préparation du dépaquetage de .../11-php8.5-gd_8.5.4-0ubuntu1.1_amd64.deb ...
Dépaquetage de php8.5-gd (8.5.4-0ubuntu1.1) sur (8.5.4-0ubuntu1) ...
Préparation du dépaquetage de .../12-php8.5-curl_8.5.4-0ubuntu1.1_amd64.deb ...
Dépaquetage de php8.5-curl (8.5.4-0ubuntu1.1) sur (8.5.4-0ubuntu1) ...
Préparation du dépaquetage de .../13-libapache2-mod-php8.5_8.5.4-0ubuntu1.1_amd64.deb ...
Dépaquetage de libapache2-mod-php8.5 (8.5.4-0ubuntu1.1) sur (8.5.4-0ubuntu1) ...
Préparation du dépaquetage de .../14-php8.5-cli_8.5.4-0ubuntu1.1_amd64.deb ...
Dépaquetage de php8.5-cli (8.5.4-0ubuntu1.1) sur (8.5.4-0ubuntu1) ...
Préparation du dépaquetage de .../15-php8.5-common_8.5.4-0ubuntu1.1_amd64.deb ...
Dépaquetage de php8.5-common (8.5.4-0ubuntu1.1) sur (8.5.4-0ubuntu1) ...
Sélection du paquet linux-main-modules-zfs-7.0.0-22-generic précédemment désélectionné.
Préparation du dépaquetage de .../16-linux-main-modules-zfs-7.0.0-22-generic_7.0.0-22.22_amd64.deb ...
Dépaquetage de linux-main-modules-zfs-7.0.0-22-generic (7.0.0-22.22) ...
Sélection du paquet linux-modules-7.0.0-22-generic précédemment désélectionné.
Préparation du dépaquetage de .../17-linux-modules-7.0.0-22-generic_7.0.0-22.22_amd64.deb ...
Dépaquetage de linux-modules-7.0.0-22-generic (7.0.0-22.22) ...
Sélection du paquet linux-image-7.0.0-22-generic précédemment désélectionné.
Préparation du dépaquetage de .../18-linux-image-7.0.0-22-generic_7.0.0-22.22_amd64.deb ...
Dépaquetage de linux-image-7.0.0-22-generic (7.0.0-22.22) ...
Préparation du dépaquetage de .../19-linux-generic-hwe-26.04_7.0.0-22.22_amd64.deb ...
Dépaquetage de linux-generic-hwe-26.04 (7.0.0-22.22) sur (7.0.0-15.15) ...
Préparation du dépaquetage de .../20-linux-image-generic-hwe-26.04_7.0.0-22.22_amd64.deb ...
Dépaquetage de linux-image-generic-hwe-26.04 (7.0.0-22.22) sur (7.0.0-15.15) ...
Sélection du paquet linux-headers-7.0.0-22 précédemment désélectionné.
Préparation du dépaquetage de .../21-linux-headers-7.0.0-22_7.0.0-22.22_all.deb ...
Dépaquetage de linux-headers-7.0.0-22 (7.0.0-22.22) ...
Sélection du paquet linux-headers-7.0.0-22-generic précédemment désélectionné.
Préparation du dépaquetage de .../22-linux-headers-7.0.0-22-generic_7.0.0-22.22_amd64.deb ...
Dépaquetage de linux-headers-7.0.0-22-generic (7.0.0-22.22) ...
Préparation du dépaquetage de .../23-linux-headers-generic-hwe-26.04_7.0.0-22.22_amd64.deb ...
Dépaquetage de linux-headers-generic-hwe-26.04 (7.0.0-22.22) sur (7.0.0-15.15) ...
Préparation du dépaquetage de .../24-linux-generic-hwe-24.04_7.0.0-22.22_amd64.deb ...
Dépaquetage de linux-generic-hwe-24.04 (7.0.0-22.22) sur (7.0.0-15.15) ...
Préparation du dépaquetage de .../25-linux-libc-dev_7.0.0-22.22_amd64.deb ...
Dépaquetage de linux-libc-dev:amd64 (7.0.0-22.22) sur (7.0.0-15.15) ...
Préparation du dépaquetage de .../26-linux-perf_7.0.0-22.22_amd64.deb ...
Dépaquetage de linux-perf (7.0.0-22.22) sur (7.0.0-15.15) ...
Préparation du dépaquetage de .../27-linux-tools-common_7.0.0-22.22_all.deb ...
Dépaquetage de linux-tools-common (7.0.0-22.22) sur (7.0.0-15.15) ...
Sélection du paquet linux-tools-7.0.0-22 précédemment désélectionné.
Préparation du dépaquetage de .../28-linux-tools-7.0.0-22_7.0.0-22.22_amd64.deb ...
Dépaquetage de linux-tools-7.0.0-22 (7.0.0-22.22) ...
Sélection du paquet linux-tools-7.0.0-22-generic précédemment désélectionné.
Préparation du dépaquetage de .../29-linux-tools-7.0.0-22-generic_7.0.0-22.22_amd64.deb ...
Dépaquetage de linux-tools-7.0.0-22-generic (7.0.0-22.22) ...
Préparation du dépaquetage de .../30-openjdk-25-jre_25.0.3+9-2~26.04.2_amd64.deb ...
Dépaquetage de openjdk-25-jre:amd64 (25.0.3+9-2~26.04.2) sur (25.0.3~7ea-2) ...
Préparation du dépaquetage de .../31-openjdk-25-jre-headless_25.0.3+9-2~26.04.2_amd64.deb ...
Dépaquetage de openjdk-25-jre-headless:amd64 (25.0.3+9-2~26.04.2) sur (25.0.3~7ea-2) ...
Préparation du dépaquetage de .../32-tailscale_1.98.4_amd64.deb ...
Dépaquetage de tailscale (1.98.4) sur (1.98.3) ...
Paramétrage de firefox-locale-fr (151.0.2+build1-0ubuntu0.26.04.1~mt1) ...
Paramétrage de firefox (151.0.2+build1-0ubuntu0.26.04.1~mt1) ...
Please restart all running instances of firefox, or you will experience problems.
Paramétrage de bpftool (7.7.0+7.0.0-22.22) ...
Paramétrage de openjdk-25-jre-headless:amd64 (25.0.3+9-2~26.04.2) ...
Paramétrage de linux-libc-dev:amd64 (7.0.0-22.22) ...
Paramétrage de linux-headers-7.0.0-22 (7.0.0-22.22) ...
Paramétrage de mutter-common (50.1-0ubuntu2.1) ...
Paramétrage de linux-perf (7.0.0-22.22) ...
Paramétrage de mutter-common-bin (50.1-0ubuntu2.1) ...
Paramétrage de tailscale (1.98.4) ...
Paramétrage de linux-tools-common (7.0.0-22.22) ...
Paramétrage de php8.5-common (8.5.4-0ubuntu1.1) ...
Paramétrage de php8.5-curl (8.5.4-0ubuntu1.1) ...
Paramétrage de linux-headers-7.0.0-22-generic (7.0.0-22.22) ...
Paramétrage de php8.5-xml (8.5.4-0ubuntu1.1) ...
Paramétrage de php8.5-mysql (8.5.4-0ubuntu1.1) ...
Paramétrage de php8.5-gd (8.5.4-0ubuntu1.1) ...
Paramétrage de linux-tools-7.0.0-22 (7.0.0-22.22) ...
Paramétrage de linux-headers-generic-hwe-26.04 (7.0.0-22.22) ...
Paramétrage de linux-tools-7.0.0-22-generic (7.0.0-22.22) ...
Paramétrage de php8.5-intl (8.5.4-0ubuntu1.1) ...
Paramétrage de php8.5-readline (8.5.4-0ubuntu1.1) ...
Paramétrage de php8.5-cli (8.5.4-0ubuntu1.1) ...
Paramétrage de libapache2-mod-php8.5 (8.5.4-0ubuntu1.1) ...
libapache2-mod-php8.5: not switching MPM - already enabled
Paramétrage de linux-image-7.0.0-22-generic (7.0.0-22.22) ...
I: /boot/vmlinuz.old is now a symlink to vmlinuz-7.0.0-15-generic
I: /boot/initrd.img.old is now a symlink to initrd.img-7.0.0-15-generic
I: /boot/vmlinuz is now a symlink to vmlinuz-7.0.0-22-generic
I: /boot/initrd.img is now a symlink to initrd.img-7.0.0-22-generic
Paramétrage de linux-main-modules-zfs-7.0.0-22-generic (7.0.0-22.22) ...
Paramétrage de linux-modules-7.0.0-22-generic (7.0.0-22.22) ...
Paramétrage de linux-image-generic-hwe-26.04 (7.0.0-22.22) ...
Paramétrage de linux-generic-hwe-26.04 (7.0.0-22.22) ...
Paramétrage de linux-generic-hwe-24.04 (7.0.0-22.22) ...
Traitement des actions différées (« triggers ») pour libglib2.0-0t64:amd64 (2.88.0-1) ...
Paramétrage de libmutter-18-0:amd64 (50.1-0ubuntu2.1) ...
Paramétrage de gir1.2-mutter-18:amd64 (50.1-0ubuntu2.1) ...
Traitement des actions différées (« triggers ») pour desktop-file-utils (0.28-1build1) ...
Traitement des actions différées (« triggers ») pour hicolor-icon-theme (0.18-2build1) ...
Traitement des actions différées (« triggers ») pour gnome-menus (3.38.1-1ubuntu1) ...
Traitement des actions différées (« triggers ») pour libc-bin (2.43-2ubuntu2) ...
Traitement des actions différées (« triggers ») pour man-db (2.13.1-1build1) ...
Traitement des actions différées (« triggers ») pour ca-certificates-java (20260311) ...
done.
Paramétrage de openjdk-25-jre:amd64 (25.0.3+9-2~26.04.2) ...
Traitement des actions différées (« triggers ») pour php8.5-cli (8.5.4-0ubuntu1.1) ...
Traitement des actions différées (« triggers ») pour libapache2-mod-php8.5 (8.5.4-0ubuntu1.1) ...
Traitement des actions différées (« triggers ») pour linux-image-7.0.0-22-generic (7.0.0-22.22) ...
/etc/kernel/postinst.d/dracut:
dracut: Generating /boot/initrd.img-7.0.0-22-generic
/etc/kernel/postinst.d/kdump-tools:
kdump-tools: Generating /var/lib/kdump/initrd.img-7.0.0-22-generic
/etc/kernel/postinst.d/zz-update-grub:
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/kdump-tools.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-7.0.0-22-generic
Found initrd image: /boot/initrd.img-7.0.0-22-generic
Found linux image: /boot/vmlinuz-7.0.0-15-generic
Found initrd image: /boot/initrd.img-7.0.0-15-generic
Found linux image: /boot/vmlinuz-7.0.0-14-generic
Found initrd image: /boot/initrd.img-7.0.0-14-generic
Found memtest86+ 64bit EFI image: /boot/mt86+x64
Found memtest86+ 32bit EFI image: /boot/mt86+ia32
Found memtest86+ 64bit image: /boot/mt86+x64
Found memtest86+ 32bit image: /boot/mt86+ia32
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
erreur : syntax error.
erreur : Incorrect command.
erreur : syntax error.
Erreur de syntaxe à la ligne 359
Syntax errors are detected in generated GRUB config file.
Ensure that there are no errors in /etc/default/grub
and /etc/grub.d/* files or please file a bug report with
/boot/grub/grub.cfg.new file attached.
run-parts: /etc/kernel/postinst.d/zz-update-grub exited with return code 1
dpkg: erreur de traitement du paquet linux-image-7.0.0-22-generic (--configure) :
old linux-image-7.0.0-22-generic package postinst maintainer script subprocess failed with exit status 1
Des erreurs ont été rencontrées pendant l'exécution :
linux-image-7.0.0-22-generic
Erreur : Sub-process /usr/bin/dpkg returned an error code (1)
iznobe@iznobe-PC-U26:~$ iznobe@iznobe-PC-U26:~$ dpkg -l | grep -Ev "rc|ii"
+-- Desired=Unknown/Install/Remove/Purge/Hold
|+- Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
+++-==========================================-==========================================-============-================================================================================
iF linux-image-7.0.0-22-generic 7.0.0-22.22 amd64 Signed kernel image generic
iznobe@iznobe-PC-U26:~$ iznobe@iznobe-PC-U26:~$ sudo dpkg --configure -a
Paramétrage de linux-image-7.0.0-22-generic (7.0.0-22.22) ...
Traitement des actions différées (« triggers ») pour linux-image-7.0.0-22-generic (7.0.0-22.22) ...
/etc/kernel/postinst.d/dracut:
dracut: Generating /boot/initrd.img-7.0.0-22-generic
/etc/kernel/postinst.d/kdump-tools:
kdump-tools: Generating /var/lib/kdump/initrd.img-7.0.0-22-generic
/etc/kernel/postinst.d/zz-update-grub:
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/kdump-tools.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-7.0.0-22-generic
Found initrd image: /boot/initrd.img-7.0.0-22-generic
Found linux image: /boot/vmlinuz-7.0.0-15-generic
Found initrd image: /boot/initrd.img-7.0.0-15-generic
Found linux image: /boot/vmlinuz-7.0.0-14-generic
Found initrd image: /boot/initrd.img-7.0.0-14-generic
Found memtest86+ 64bit EFI image: /boot/mt86+x64
Found memtest86+ 32bit EFI image: /boot/mt86+ia32
Found memtest86+ 64bit image: /boot/mt86+x64
Found memtest86+ 32bit image: /boot/mt86+ia32
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
erreur : syntax error.
erreur : Incorrect command.
erreur : syntax error.
Erreur de syntaxe à la ligne 359
Syntax errors are detected in generated GRUB config file.
Ensure that there are no errors in /etc/default/grub
and /etc/grub.d/* files or please file a bug report with
/boot/grub/grub.cfg.new file attached.
run-parts: /etc/kernel/postinst.d/zz-update-grub exited with return code 1
dpkg: erreur de traitement du paquet linux-image-7.0.0-22-generic (--configure) :
old linux-image-7.0.0-22-generic package postinst maintainer script subprocess failed with exit status 1
Des erreurs ont été rencontrées pendant l'exécution :
linux-image-7.0.0-22-generic
iznobe@iznobe-PC-U26:~$ Dernière modification par iznobe (Le 01/06/2026, à 07:34)
Hors ligne
#2 Le 30/05/2026, à 10:25
- iznobe

Re : [ résolu ] grub update fail U26.04
iznobe@iznobe-PC-U26:~$ echo; dpkg -l | awk '!/^rc/ && / linux-(c|g|h|i|lo|m|si|t)/{print $1,$2,$3,$4 | "sort -k3V | column -t"}' ; echo -e "\nNoyau courant : $(uname -mr)"
ii linux-headers-7.0.0-14 7.0.0-14.14 all
ii linux-headers-7.0.0-14-generic 7.0.0-14.14 amd64
ii linux-image-7.0.0-14-generic 7.0.0-14.14 amd64
ii linux-modules-7.0.0-14-generic 7.0.0-14.14 amd64
ii linux-tools-7.0.0-14 7.0.0-14.14 amd64
ii linux-tools-7.0.0-14-generic 7.0.0-14.14 amd64
ii linux-main-modules-zfs-7.0.0-14-generic 7.0.0-14.14+3 amd64
ii linux-headers-7.0.0-15 7.0.0-15.15 all
ii linux-headers-7.0.0-15-generic 7.0.0-15.15 amd64
ii linux-image-7.0.0-15-generic 7.0.0-15.15 amd64
ii linux-modules-7.0.0-15-generic 7.0.0-15.15 amd64
ii linux-tools-7.0.0-15 7.0.0-15.15 amd64
ii linux-tools-7.0.0-15-generic 7.0.0-15.15 amd64
ii linux-main-modules-zfs-7.0.0-15-generic 7.0.0-15.15+1 amd64
ii linux-headers-7.0.0-22 7.0.0-22.22 all
ii linux-tools-common 7.0.0-22.22 all
iF linux-image-7.0.0-22-generic 7.0.0-22.22 amd64
ii linux-generic-hwe-24.04 7.0.0-22.22 amd64
ii linux-generic-hwe-26.04 7.0.0-22.22 amd64
ii linux-headers-7.0.0-22-generic 7.0.0-22.22 amd64
ii linux-headers-generic-hwe-26.04 7.0.0-22.22 amd64
ii linux-image-generic-hwe-26.04 7.0.0-22.22 amd64
ii linux-main-modules-zfs-7.0.0-22-generic 7.0.0-22.22 amd64
ii linux-modules-7.0.0-22-generic 7.0.0-22.22 amd64
ii linux-tools-7.0.0-22 7.0.0-22.22 amd64
ii linux-tools-7.0.0-22-generic 7.0.0-22.22 amd64
Noyau courant : 7.0.0-15-generic x86_64
iznobe@iznobe-PC-U26:~$ D ' où est ce que peut bien sortir le paquet : linux-generic-hwe-24.04 ???? , surtout que c' est une fresh install ( pas une MAN ).
iznobe@iznobe-PC-U26:~$ cat /etc/default/grub
# If you change this file or any /etc/default/grub.d/*.cfg file,
# run 'update-grub' afterwards to update /boot/grub/grub.cfg.
# For full documentation of the options in these files, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`( . /etc/os-release && echo ${NAME} )`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
# If your computer has multiple operating systems installed, then you
# probably want to run os-prober. However, if your computer is a host
# for guest OSes installed via LVM or raw disk devices, running
# os-prober can cause damage to those guest OSes as it mounts
# filesystems to look for things.
GRUB_DISABLE_OS_PROBER=true
# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
# Uncomment to disable graphical terminal
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE/GOP/UGA
# you can see them in real GRUB with the command `videoinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"
# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
iznobe@iznobe-PC-U26:~$ iznobe@iznobe-PC-U26:~$ for f in /etc/grub.d/*; do echo; echo; echo $f; cat $f ;echo; echo; done
/etc/grub.d/00_header
#! /bin/sh
set -e
# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009,2010 Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
grub_lang=`echo $LANG | cut -d . -f 1`
grubdir="`echo "/boot/grub" | sed 's,//*,/,g'`"
quick_boot="1"
export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"
. "$pkgdatadir/grub-mkconfig_lib"
# Do this as early as possible, since other commands might depend on it.
# (e.g. the `loadfont' command might need lvm or raid modules)
for i in ${GRUB_PRELOAD_MODULES} ; do
echo "insmod $i"
done
if [ "x${GRUB_DEFAULT}" = "x" ] ; then GRUB_DEFAULT=0 ; fi
if [ "x${GRUB_DEFAULT}" = "xsaved" ] ; then GRUB_DEFAULT='${saved_entry}' ; fi
if [ "x${GRUB_TIMEOUT}" = "x" ] ; then GRUB_TIMEOUT=5 ; fi
if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=auto ; fi
if [ "x${GRUB_DEFAULT_BUTTON}" = "x" ] ; then GRUB_DEFAULT_BUTTON="$GRUB_DEFAULT" ; fi
if [ "x${GRUB_DEFAULT_BUTTON}" = "xsaved" ] ; then GRUB_DEFAULT_BUTTON='${saved_entry}' ; fi
if [ "x${GRUB_TIMEOUT_BUTTON}" = "x" ] ; then GRUB_TIMEOUT_BUTTON="$GRUB_TIMEOUT" ; fi
cat << EOF
if [ -s \$prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
if [ "\${env_block}" ] ; then
set env_block="(\${root})\${env_block}"
export env_block
load_env -f "\${env_block}"
fi
EOF
cat <<EOF
if [ "\${initrdfail}" = 2 ]; then
set initrdfail=
elif [ "\${initrdfail}" = 1 ]; then
set next_entry="\${prev_entry}"
set prev_entry=
save_env prev_entry
if [ "\${next_entry}" ]; then
set initrdfail=2
fi
fi
EOF
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
cat <<EOF
if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
set default="${GRUB_DEFAULT_BUTTON}"
elif [ "\${next_entry}" ] ; then
set default="\${next_entry}"
set next_entry=
if [ "\${env_block}" ] ; then
save_env -f "\${env_block}" next_entry
else
save_env next_entry
fi
set boot_once=true
else
set default="${GRUB_DEFAULT}"
fi
EOF
else
cat <<EOF
if [ "\${next_entry}" ] ; then
set default="\${next_entry}"
set next_entry=
if [ "\${env_block}" ] ; then
save_env -f "\${env_block}" next_entry
else
save_env next_entry
fi
set boot_once=true
else
set default="${GRUB_DEFAULT}"
fi
EOF
fi
cat <<EOF
if [ x"\${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "\${prev_saved_entry}" ]; then
set saved_entry="\${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "\${boot_once}" ]; then
saved_entry="\${chosen}"
if [ "\${env_block}" ] ; then
save_env -f "\${env_block}" saved_entry
else
save_env saved_entry
fi
fi
}
EOF
cat <<"EOF"
function initrdfail {
if [ -n "${have_grubenv}" ]; then if [ -n "${partuuid}" ]; then
if [ -z "${initrdfail}" ]; then
set initrdfail=1
if [ -n "${boot_once}" ]; then
set prev_entry="${default}"
save_env prev_entry
fi
fi
save_env initrdfail
fi; fi
}
EOF
if [ "$quick_boot" = 1 ]; then
cat <<EOF
function recordfail {
set recordfail=1
EOF
check_writable () {
abstractions="$(grub-probe --target=abstraction "${grubdir}")"
for abstraction in $abstractions; do
case "$abstraction" in
diskfilter | lvm)
cat <<EOF
# GRUB lacks write support for $abstraction, so recordfail support is disabled.
EOF
return 1
;;
esac
done
FS="$(grub-probe --target=fs "${grubdir}")"
case "$FS" in
btrfs | cpiofs | newc | odc | romfs | squash4 | tarfs | zfs)
cat <<EOF
# GRUB lacks write support for $FS, so recordfail support is disabled.
EOF
return 1
;;
esac
cat <<EOF
if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
EOF
}
if ! check_writable; then
recordfail_broken=1
fi
cat <<EOF
}
EOF
fi
cat <<EOF
function load_video {
EOF
if [ -n "${GRUB_VIDEO_BACKEND}" ]; then
cat <<EOF
insmod ${GRUB_VIDEO_BACKEND}
EOF
else
# For EFI, use EFI video drivers only by default to avoid conflict between
# GRUB Bochs/Cirrus and native EFI drivers. If GRUB_FORCE_EFI_ALL_VIDEO is
# set/true then defer back to all_video even for EFI.
if [ "${GRUB_FORCE_EFI_ALL_VIDEO}" = "1" ]; then
cat <<EOF
if [ x\$feature_all_video_module = xy ]; then
EOF
else # GRUB_FORCE_EFI_ALL_VIDEO is not set true
cat <<EOF
if [ x\$grub_platform = xefi ]; then
insmod efi_gop
elif [ x\$feature_all_video_module = xy ]; then
EOF
fi # end GRUB_FORCE_EFI_ALL_VIDEO
# If all_video.mod isn't available load all modules available
# with versions prior to introduction of all_video.mod
cat <<EOF
insmod all_video
else
insmod efi_gop
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
EOF
fi
cat <<EOF
}
EOF
serial=0;
gfxterm=0;
for x in ${GRUB_TERMINAL_INPUT} ${GRUB_TERMINAL_OUTPUT}; do
if [ xserial = "x$x" ]; then
serial=1;
fi
if [ xgfxterm = "x$x" ]; then
gfxterm=1;
fi
done
if [ "x$serial" = x1 ]; then
if [ "x${GRUB_SERIAL_COMMAND}" = "x" ] ; then
grub_warn "$(gettext "Requested serial terminal but GRUB_SERIAL_COMMAND is unspecified. Default parameters will be used.")"
GRUB_SERIAL_COMMAND=serial
fi
echo "${GRUB_SERIAL_COMMAND}"
fi
if [ "x$gfxterm" = x1 ]; then
if [ -n "$GRUB_FONT" ] ; then
# Make the font accessible
prepare_grub_to_access_device `${grub_probe} --target=device "${GRUB_FONT}"`
cat << EOF
if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT}"` ; then
EOF
else
for dir in "${pkgdatadir}" "`echo '/boot/grub' | sed "s,//*,/,g"`" /usr/share/grub ; do
for basename in unicode unifont ascii; do
path="${dir}/${basename}.pf2"
if is_path_readable_by_grub "${path}" > /dev/null ; then
font_path="${path}"
else
continue
fi
break 2
done
done
if [ -n "${font_path}" ] ; then
cat << EOF
if [ x\$feature_default_font_path = xy ] ; then
font=unicode
else
EOF
# Make the font accessible
prepare_grub_to_access_device `${grub_probe} --target=device "${font_path}"`
cat << EOF
font="`make_system_path_relative_to_its_root "${font_path}"`"
fi
if loadfont \$font ; then
EOF
else
cat << EOF
if loadfont unicode ; then
EOF
fi
fi
cat << EOF
set gfxmode=${GRUB_GFXMODE}
load_video
insmod gfxterm
EOF
# Gettext variables and module
if [ "x${grub_lang}" != "xC" ] && [ "x${LANG}" != "xPOSIX" ] && [ "x${LANG}" != "x" ]; then
cat << EOF
set locale_dir=\$prefix/locale
set lang=${grub_lang}
insmod gettext
EOF
fi
cat <<EOF
fi
EOF
fi
case x${GRUB_TERMINAL_INPUT} in
x)
# Just use the native terminal
;;
x*)
cat << EOF
terminal_input ${GRUB_TERMINAL_INPUT}
EOF
;;
esac
case x${GRUB_TERMINAL_OUTPUT} in
x)
# Just use the native terminal
;;
x*)
cat << EOF
terminal_output ${GRUB_TERMINAL_OUTPUT}
EOF
;;
esac
if [ "x$gfxterm" = x1 ]; then
if [ "x$GRUB_THEME" != x ] && [ -f "$GRUB_THEME" ] \
&& is_path_readable_by_grub "$GRUB_THEME"; then
gettext_printf "Found theme: %s\n" "$GRUB_THEME" >&2
prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_THEME"`
cat << EOF
insmod gfxmenu
EOF
themedir="`dirname "$GRUB_THEME"`"
for x in "$themedir"/*.pf2 "$themedir"/f/*.pf2; do
if [ -f "$x" ]; then
cat << EOF
loadfont (\$root)`make_system_path_relative_to_its_root $x`
EOF
fi
done
if [ x"`echo "$themedir"/*.jpg`" != x"$themedir/*.jpg" ] || [ x"`echo "$themedir"/*.jpeg`" != x"$themedir/*.jpeg" ]; then
cat << EOF
insmod jpeg
EOF
fi
if [ x"`echo "$themedir"/*.png`" != x"$themedir/*.png" ]; then
cat << EOF
insmod png
EOF
fi
if [ x"`echo "$themedir"/*.tga`" != x"$themedir/*.tga" ]; then
cat << EOF
insmod tga
EOF
fi
cat << EOF
set theme=(\$root)`make_system_path_relative_to_its_root $GRUB_THEME`
export theme
EOF
elif [ "x$GRUB_BACKGROUND" != x ] && [ -f "$GRUB_BACKGROUND" ] \
&& is_path_readable_by_grub "$GRUB_BACKGROUND"; then
gettext_printf "Found background: %s\n" "$GRUB_BACKGROUND" >&2
case "$GRUB_BACKGROUND" in
*.png) reader=png ;;
*.tga) reader=tga ;;
*.jpg|*.jpeg) reader=jpeg ;;
*) gettext "Unsupported image format" >&2; echo >&2; exit 1 ;;
esac
prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_BACKGROUND"`
cat << EOF
insmod $reader
background_image -m stretch "`make_system_path_relative_to_its_root "$GRUB_BACKGROUND"`"
EOF
fi
fi
make_timeout ()
{
cat << EOF
if [ "\${recordfail}" = 1 ] ; then
set timeout=${GRUB_RECORDFAIL_TIMEOUT:-30}
else
EOF
if [ "x${3}" != "x" ] ; then
timeout="${2}"
style="${3}"
elif [ "x${1}" != "x" ] && \
([ "$quick_boot" = 1 ] || [ "x${1}" != "x0" ]) ; then
# Handle the deprecated GRUB_HIDDEN_TIMEOUT scheme.
timeout="${1}"
if [ "x${2}" != "x0" ] ; then
grub_warn "$(gettext "Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.")"
fi
if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then
style="hidden"
verbose=
else
style="countdown"
verbose=" --verbose"
fi
else
# No hidden timeout, so treat as GRUB_TIMEOUT_STYLE=menu
timeout="${2}"
style="menu"
fi
cat << EOF
if [ x\$feature_timeout_style = xy ] ; then
set timeout_style=${style}
set timeout=${timeout}
EOF
if [ "x${style}" = "xmenu" ] ; then
cat << EOF
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=${timeout}
EOF
else
cat << EOF
# Fallback hidden-timeout code in case the timeout_style feature is
# unavailable.
elif sleep${verbose} --interruptible ${timeout} ; then
set timeout=0
EOF
fi
cat << EOF
fi
fi
EOF
if [ "$recordfail_broken" = 1 ]; then
cat << EOF
if [ \$grub_platform = efi ]; then
set timeout=${GRUB_RECORDFAIL_TIMEOUT:-30}
if [ x\$feature_timeout_style = xy ] ; then
set timeout_style=menu
fi
fi
EOF
fi
}
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
cat <<EOF
if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
EOF
make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_STYLE_BUTTON}"
echo else
make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}" "${GRUB_TIMEOUT_STYLE}"
echo fi
else
make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}" "${GRUB_TIMEOUT_STYLE}"
fi
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ] && [ "x$GRUB_BUTTON_CMOS_CLEAN" = "xyes" ]; then
cat <<EOF
cmosclean $GRUB_BUTTON_CMOS_ADDRESS
EOF
fi
# Play an initial tune
if [ "x${GRUB_INIT_TUNE}" != "x" ] ; then
echo "play ${GRUB_INIT_TUNE}"
fi
if [ "x${GRUB_BADRAM}" != "x" ] ; then
echo "badram ${GRUB_BADRAM}"
fi
/etc/grub.d/05_debian_theme
#!/bin/sh
set -e
# grub-mkconfig helper script.
# Copyright (C) 2010 Alexander Kurtz <kurtz.alex@googlemail.com>
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
# Include the GRUB helper library for grub-mkconfig.
. /usr/share/grub/grub-mkconfig_lib
# We want to work in /boot/grub/ only.
test -d /boot/grub; cd /boot/grub
# Set the location of a possibly necessary cache file for the background image.
# NOTE: This MUST BE A DOTFILE to avoid confusing it with user-defined images.
BACKGROUND_CACHE=".background_cache"
set_default_theme(){
case $GRUB_DISTRIBUTOR in
Ubuntu|Kubuntu)
# Set a monochromatic theme for Ubuntu.
echo "${1}set menu_color_normal=white/black"
echo "${1}set menu_color_highlight=black/light-gray"
if [ -e /usr/share/plymouth/themes/default.grub ]; then
sed "s/^/${1}/" /usr/share/plymouth/themes/default.grub
fi
# For plymouth backward compatibility. Can be removed
# after xenial.
if [ -e /lib/plymouth/themes/default.grub ]; then
sed "s/^/${1}/" /lib/plymouth/themes/default.grub
fi
;;
*)
# Set the traditional Debian blue theme.
echo "${1}set menu_color_normal=cyan/blue"
echo "${1}set menu_color_highlight=white/blue"
;;
esac
}
module_available(){
local module
for module in "${1}.mod" */"${1}.mod"; do
if [ -f "${module}" ]; then
return 0
fi
done
return 1
}
set_background_image(){
# Step #1: Search all available output modes ...
local output
for output in ${GRUB_TERMINAL_OUTPUT}; do
if [ "x$output" = "xgfxterm" ]; then
break
fi
done
# ... and check if we are able to display a background image at all.
if ! [ "x${output}" = "xgfxterm" ]; then
return 1
fi
# Step #2: Check if the specified background image exists.
if ! [ -f "${1}" ]; then
return 2
fi
# Step #3: Search the correct GRUB module for our background image.
local reader
case "${1}" in
*.jpg|*.JPG|*.jpeg|*.JPEG) reader="jpeg";;
*.png|*.PNG) reader="png";;
*.tga|*.TGA) reader="tga";;
*) return 3;; # Unknown image type.
esac
# Step #4: Check if the necessary GRUB module is available.
if ! module_available "${reader}"; then
return 4
fi
# Step #5: Check if GRUB can read the background image directly and
# it is in the same filesystem as /boot/grub.
# If so, we can remove the cache file (if any). Otherwise the background
# image needs to be cached under /boot/grub/.
if is_path_readable_by_grub "${1}" &&
[ "`${grub_probe} --target=device "${1}"`" = "`${grub_probe} --target=device .`" ]; then
rm --force "${BACKGROUND_CACHE}.jpeg" \
"${BACKGROUND_CACHE}.png" "${BACKGROUND_CACHE}.tga"
elif cp "${1}" "${BACKGROUND_CACHE}.${reader}"; then
set -- "${BACKGROUND_CACHE}.${reader}" "${2}" "${3}"
else
return 5
fi
# Step #6: Prepare GRUB to read the background image.
if ! prepare_grub_to_access_device "`${grub_probe} --target=device "${1}"`"; then
return 6
fi
# Step #7: Everything went fine, print out a message to stderr ...
echo "Found background image: ${1}" >&2
# ... and write our configuration snippet to stdout. Use the colors
# desktop-base specified. If we're using a user-defined background, use
# the default colors since we've got no idea how the image looks like.
# If loading the background image fails, use the default theme.
echo "insmod ${reader}"
echo "if background_image \"`make_system_path_relative_to_its_root "${1}"`\"; then"
if [ -n "${2}" ]; then
echo " set color_normal=${2}"
fi
if [ -n "${3}" ]; then
echo " set color_highlight=${3}"
fi
if [ -z "${2}" ] && [ -z "${3}" ]; then
echo " true"
fi
echo "else"
set_default_theme " "
echo "fi"
}
# Earlier versions of grub-pc copied the default background image to /boot/grub
# during postinst. Remove those obsolete images if they haven't been touched by
# the user. They are still available under /usr/share/images/desktop-base/ if
# desktop-base is installed.
while read checksum background; do
if [ -f "${background}" ] && [ "x`sha1sum "${background}"`" = "x${checksum} ${background}" ]; then
echo "Removing old background image: ${background}" >&2
rm "${background}"
fi
done <<EOF
648ee65dd0c157a69b019a5372cbcfea4fc754a5 debian-blueish-wallpaper-640x480.png
0431e97a6c661084c59676c4baeeb8c2f602edb8 debian-blueish-wallpaper-640x480.png
968ecf6696c5638cfe80e8e70aba239526270864 debian-blueish-wallpaper-640x480.tga
11143e8c92a073401de0b0fd42d0c052af4ccd9b moreblue-orbit-grub.png
d00d5e505ab63f2d53fa880bfac447e2d3bb197c moreblue-orbit-grub.png
f5b12c1009ec0a3b029185f6b66cd0d7e5611019 moreblue-orbit-grub.png
EOF
# Include the configuration of desktop-base if available.
if [ -f "/usr/share/desktop-base/grub_background.sh" ]; then
. "/usr/share/desktop-base/grub_background.sh"
fi
# First check whether the user has specified a background image explicitly.
# If so, try to use it. Don't try the other possibilities in that case
# (#608263).
if [ -n "${GRUB_BACKGROUND+x}" ]; then
set_background_image "${GRUB_BACKGROUND}" || set_default_theme
exit 0
fi
# Next search for pictures the user put into /boot/grub/ and use the first one.
for background in *.jpg *.JPG *.jpeg *.JPEG *.png *.PNG *.tga *.TGA; do
if set_background_image "${background}"; then
exit 0
fi
done
# Next try to use the background image and colors specified by desktop-base.
if set_background_image "${WALLPAPER}" "${COLOR_NORMAL}" "${COLOR_HIGHLIGHT}"; then
exit 0
fi
# If we haven't found a background image yet, use the default from desktop-base.
case $GRUB_DISTRIBUTOR in
Ubuntu|Kubuntu)
;;
*)
if set_background_image "/usr/share/images/desktop-base/desktop-grub.png"; then
exit 0
fi
;;
esac
# Finally, if all of the above fails, use the default theme.
set_default_theme
/etc/grub.d/10_linux
#! /bin/sh
set -e
# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009,2010 Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
ubuntu_recovery="1"
quiet_boot="1"
quick_boot="1"
gfxpayload_dynamic="1"
. "$pkgdatadir/grub-mkconfig_lib"
export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"
CLASS="--class gnu-linux --class gnu --class os"
if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
OS=GNU/Linux
else
case ${GRUB_DISTRIBUTOR} in
Ubuntu|*GNU/Linux)
OS="${GRUB_DISTRIBUTOR}"
;;
*)
OS="${GRUB_DISTRIBUTOR} GNU/Linux"
;;
esac
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"
fi
# loop-AES arranges things so that /dev/loop/X can be our root device, but
# the initrds that Linux uses don't like that.
case ${GRUB_DEVICE} in
/dev/loop/*|/dev/loop[0-9])
GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
;;
esac
if [ -x /lib/recovery-mode/recovery-menu ]; then
: ${GRUB_CMDLINE_LINUX_RECOVERY:=recovery}
else
: ${GRUB_CMDLINE_LINUX_RECOVERY:=single}
fi
# Default to disabling partition uuid support to maintian compatibility with
# older kernels.
: ${GRUB_DISABLE_LINUX_PARTUUID=true}
# get_dm_field_for_dev /dev/dm-0 uuid -> get the device mapper UUID for /dev/dm-0
# get_dm_field_for_dev /dev/dm-1 name -> get the device mapper name for /dev/dm-1
# etc
get_dm_field_for_dev () {
dmsetup info -c --noheadings -o $2 $1 2>/dev/null
}
# Is $1 a multipath device?
is_multipath () {
local dmuuid dmtype
dmuuid="$(get_dm_field_for_dev $1 uuid)"
if [ $? -ne 0 ]; then
# Not a device mapper device -- or dmsetup not installed, and as
# multipath depends on kpartx which depends on dmsetup, if there is no
# dmsetup then there are not going to be any multipath devices.
return 1
fi
# A device mapper "uuid" is always <type>-<uuid>. If <type> is of the form
# part[0-9] then <uuid> is the device the partition is on and we want to
# look at that instead. A multipath node always has <type> of mpath.
dmtype="${dmuuid%%-*}"
if [ "${dmtype#part}" != "$dmtype" ]; then
dmuuid="${dmuuid#*-}"
dmtype="${dmuuid%%-*}"
fi
if [ "$dmtype" = "mpath" ]; then
return 0
else
return 1
fi
}
if test -e "${GRUB_DEVICE}" && is_multipath "${GRUB_DEVICE}"; then
# If / is multipathed, there will be multiple paths to the partition, so
# using root=UUID= exposes the boot process to udev races. In addition
# GRUB_DEVICE in this case will be /dev/dm-0 or similar -- better to use a
# symlink that depends on the multipath name.
GRUB_DEVICE=/dev/mapper/"$(get_dm_field_for_dev $GRUB_DEVICE name)"
GRUB_DISABLE_LINUX_UUID=true
fi
# btrfs may reside on multiple devices. We cannot pass them as value of root= parameter
# and mounting btrfs requires user space scanning, so force UUID in this case.
if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] && [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] ) \
|| ( [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
&& [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ] ) \
|| ( ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
&& ! test -e "/dev/disk/by-partuuid/${GRUB_DEVICE_PARTUUID}" ) \
|| ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then
LINUX_ROOT_DEVICE=${GRUB_DEVICE}
elif [ "x${GRUB_DEVICE_UUID}" = "x" ] \
|| [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ]; then
LINUX_ROOT_DEVICE=PARTUUID=${GRUB_DEVICE_PARTUUID}
else
LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
fi
case x"$GRUB_FS" in
xbtrfs)
rootsubvol="`make_system_path_relative_to_its_root /`"
rootsubvol="${rootsubvol#/}"
if [ "x${rootsubvol}" != x ]; then
GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
fi;;
xzfs)
# We have a more specialized ZFS handler, with multiple system in 10_linux_zfs.
if [ -e "`dirname $(readlink -f $0)`/10_linux_zfs" ]; then
exit 0
fi
rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || zdb -l ${GRUB_DEVICE} | awk -F \' '/ name/ { print $2 }'`
bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`"
LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs%/}"
;;
esac
title_correction_code=
if [ "$ubuntu_recovery" = 1 ]; then
GRUB_CMDLINE_LINUX_RECOVERY="$GRUB_CMDLINE_LINUX_RECOVERY nomodeset"
fi
if [ x"$GRUB_FORCE_PARTUUID" != x ]; then
gettext_printf "GRUB_FORCE_PARTUUID is set, will attempt initrdless boot\n" >&2
cat << EOF
#
# GRUB_FORCE_PARTUUID is set, will attempt initrdless boot
# Upon panic fallback to booting with initrd
EOF
echo "set partuuid=${GRUB_FORCE_PARTUUID}"
fi
linux_entry ()
{
os="$1"
version="$2"
type="$3"
args="$4"
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
fi
if [ x$type != xsimple ] ; then
case $type in
recovery)
title="$(gettext_printf "%s, with Linux %s (%s)" "${os}" "${version}" "$(gettext "${GRUB_RECOVERY_TITLE}")")" ;;
*)
title="$(gettext_printf "%s, with Linux %s" "${os}" "${version}")" ;;
esac
if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")"
fi
echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
else
echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
fi
if [ "$quick_boot" = 1 ]; then
echo " recordfail" | sed "s/^/$submenu_indentation/"
fi
if [ x$type != xrecovery ] ; then
save_default_entry | grub_add_tab
fi
# Use ELILO's generic "efifb" when it's known to be available.
# FIXME: We need an interface to select vesafb in case efifb can't be used.
if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then
echo " load_video" | sed "s/^/$submenu_indentation/"
else
if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then
echo " load_video" | sed "s/^/$submenu_indentation/"
fi
fi
if ([ "$ubuntu_recovery" = 0 ] || [ x$type != xrecovery ]) && \
([ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 1 ]); then
echo " set gfxpayload=\$linux_gfx_mode" | sed "s/^/$submenu_indentation/"
fi
echo " insmod gzio" | sed "s/^/$submenu_indentation/"
echo " if [ x\$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi" | sed "s/^/$submenu_indentation/"
if [ x$dirname = x/ ]; then
if [ -z "${prepare_root_cache}" ]; then
prepare_root_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | grub_add_tab)"
fi
printf '%s\n' "${prepare_root_cache}" | sed "s/^/$submenu_indentation/"
else
if [ -z "${prepare_boot_cache}" ]; then
prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)"
fi
printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
fi
if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then
message="$(gettext_printf "Loading Linux %s ..." ${version})"
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
EOF
fi
# We have initrd and PARTUUID is set - we try to boot without initrd, and fallback to using it
# if it fails.
# "panic=-1" means "on panic reboot immediately". "panic=0" disables the reboot behavior.
if [ x"$GRUB_FORCE_PARTUUID" != x ]; then
linux_root_device_thisversion="PARTUUID=${GRUB_FORCE_PARTUUID}"
fi
message="$(gettext_printf "Loading initial ramdisk ...")"
initrdlessfail_msg="$(gettext_printf "GRUB_FORCE_PARTUUID set, initrdless boot failed. Attempting with initrd.")"
initrdlesstry_msg="$(gettext_printf "GRUB_FORCE_PARTUUID set, attempting initrdless boot.")"
initrd_path=
for i in ${initrd}; do
initrd_path="${initrd_path} ${rel_dirname}/${i}"
done
initrd_path_only_early=
for i in ${initrd_early}; do
initrd_path_only_early="${initrd_path_only_early} ${rel_dirname}/${i}"
done
if test -n "${initrd}" && [ x"$GRUB_FORCE_PARTUUID" != x ]; then
sed "s/^/$submenu_indentation/" << EOF
if [ "\${initrdfail}" = 1 ]; then
echo '$(echo "$initrdlessfail_msg" | grub_quote)'
linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}
EOF
if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
EOF
fi
sed "s/^/$submenu_indentation/" << EOF
initrd $(echo $initrd_path)
else
echo '$(echo "$initrdlesstry_msg" | grub_quote)'
linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args} panic=-1
EOF
if [ -n "$initrd_path_only_early" ]; then
sed "s/^/$submenu_indentation/" << EOF
initrd $(echo $initrd_path_only_early)
EOF
fi
sed "s/^/$submenu_indentation/" << EOF
fi
initrdfail
EOF
else
# We don't have initrd or we don't want to set PARTUUID. Don't try initrd-less boot with fallback.
sed "s/^/$submenu_indentation/" << EOF
linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}
EOF
if test -n "${initrd}"; then
# We do have initrd - let's use it at boot.
# TRANSLATORS: ramdisk isn't identifier. Should be translated.
if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
EOF
fi
sed "s/^/$submenu_indentation/" << EOF
initrd $(echo $initrd_path)
EOF
fi
if test -n "${dtb}" ; then
if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then
message="$(gettext_printf "Loading device tree blob...")"
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
EOF
fi
sed "s/^/$submenu_indentation/" << EOF
devicetree ${rel_dirname}/${dtb}
EOF
fi
fi
sed "s/^/$submenu_indentation/" << EOF
}
EOF
}
machine=`uname -m`
case "x$machine" in
xi?86 | xx86_64)
list=
for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do
if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi
done ;;
*)
list=
for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do
if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi
done ;;
esac
case "$machine" in
i?86) GENKERNEL_ARCH="x86" ;;
mips|mips64) GENKERNEL_ARCH="mips" ;;
mipsel|mips64el) GENKERNEL_ARCH="mipsel" ;;
arm*) GENKERNEL_ARCH="arm" ;;
*) GENKERNEL_ARCH="$machine" ;;
esac
case "$GENKERNEL_ARCH" in
x86*) GRUB_CMDLINE_LINUX_RECOVERY="$GRUB_CMDLINE_LINUX_RECOVERY dis_ucode_ldr";;
esac
prepare_boot_cache=
prepare_root_cache=
boot_device_id=
title_correction_code=
# Use ELILO's generic "efifb" when it's known to be available.
# FIXME: We need an interface to select vesafb in case efifb can't be used.
if [ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 0 ]; then
echo "set linux_gfx_mode=$GRUB_GFXPAYLOAD_LINUX"
else
cat << EOF
if [ "\${recordfail}" != 1 ]; then
if [ -e \${prefix}/gfxblacklist.txt ]; then
if [ \${grub_platform} != pc ]; then
set linux_gfx_mode=keep
elif hwmatch \${prefix}/gfxblacklist.txt 3; then
if [ \${match} = 0 ]; then
set linux_gfx_mode=keep
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=keep
fi
else
set linux_gfx_mode=text
fi
EOF
fi
cat << EOF
export linux_gfx_mode
EOF
# Extra indentation to add to menu entries in a submenu. We're not in a submenu
# yet, so it's empty. In a submenu it will be equal to '\t' (one tab).
submenu_indentation=""
# Perform a reverse version sort on the entire list.
# Temporarily replace the '.old' suffix by ' 1' and append ' 2' for all
# other files to order the '.old' files after their non-old counterpart
# in reverse-sorted order.
reverse_sorted_list=$(echo $list | tr ' ' '\n' | sed -e 's/\.old$/ 1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
if [ "x$GRUB_TOP_LEVEL" != x ]; then
reverse_sorted_list=$(grub_move_to_front "$GRUB_TOP_LEVEL" ${reverse_sorted_list})
fi
is_top_level=true
for linux in ${reverse_sorted_list}; do
gettext_printf "Found linux image: %s\n" "$linux" >&2
basename=`basename $linux`
dirname=`dirname $linux`
rel_dirname=`make_system_path_relative_to_its_root $dirname`
version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
alt_version=`echo $version | sed -e "s,\.old$,,g"`
linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
initrd_early=
for i in ${GRUB_EARLY_INITRD_LINUX_STOCK} \
${GRUB_EARLY_INITRD_LINUX_CUSTOM}; do
if test -e "${dirname}/${i}" ; then
initrd_early="${initrd_early} ${i}"
fi
done
initrd_real=
for i in "initrd.img-${version}" "initrd-${version}.img" \
"initrd-${alt_version}.img.old" "initrd-${version}.gz" \
"initrd-${alt_version}.gz.old" "initrd-${version}" \
"initramfs-${version}.img" "initramfs-${alt_version}.img.old" \
"initrd.img-${alt_version}" "initrd-${alt_version}.img" \
"initrd-${alt_version}" "initramfs-${alt_version}.img" \
"initramfs-genkernel-${version}" \
"initramfs-genkernel-${alt_version}" \
"initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \
"initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}"; do
if test -e "${dirname}/${i}" ; then
initrd_real="${i}"
break
fi
done
initrd=
if test -n "${initrd_early}" || test -n "${initrd_real}"; then
initrd="${initrd_early} ${initrd_real}"
initrd_display=
for i in ${initrd}; do
initrd_display="${initrd_display} ${dirname}/${i}"
done
gettext_printf "Found initrd image: %s\n" "$(echo $initrd_display)" >&2
fi
dtb=
for i in "dtb-${version}" "dtb-${alt_version}" "dtb"; do
if test -e "${dirname}/${i}" ; then
dtb="$i"
break
fi
done
config=
for i in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do
if test -e "${i}" ; then
config="${i}"
break
fi
done
initramfs=
if test -n "${config}" ; then
initramfs=`grep CONFIG_INITRAMFS_SOURCE= "${config}" | cut -f2 -d= | tr -d \"`
fi
if test -z "${initramfs}" && test -z "${initrd_real}" ; then
# "UUID=" and "ZFS=" magic is parsed by initrd or initramfs. Since there's
# no initrd or builtin initramfs, it can't work here.
if [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] \
|| [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ]; then
linux_root_device_thisversion=${GRUB_DEVICE}
else
linux_root_device_thisversion=PARTUUID=${GRUB_DEVICE_PARTUUID}
fi
fi
# The GRUB_DISABLE_SUBMENU option used to be different than others since it was
# mentioned in the documentation that has to be set to 'y' instead of 'true' to
# enable it. This caused a lot of confusion to users that set the option to 'y',
# 'yes' or 'true'. This was fixed but all of these values must be supported now.
if [ "x${GRUB_DISABLE_SUBMENU}" = xyes ] || [ "x${GRUB_DISABLE_SUBMENU}" = xy ]; then
GRUB_DISABLE_SUBMENU="true"
fi
if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
linux_entry "${OS}" "${version}" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
submenu_indentation="$grub_tab"
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
fi
# TRANSLATORS: %s is replaced with an OS name
echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
is_top_level=false
fi
linux_entry "${OS}" "${version}" advanced \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
linux_entry "${OS}" "${version}" recovery \
"${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX}"
fi
done
# If at least one kernel was found, then we need to
# add a closing '}' for the submenu command.
if [ x"$is_top_level" != xtrue ]; then
echo '}'
fi
echo "$title_correction_code"
/etc/grub.d/10_linux_zfs
#! /bin/sh
set -e
# grub-mkconfig helper script.
# Copyright (C) 2019 Canonical Ltd.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
prefix="/usr"
datarootdir="/usr/share"
ubuntu_recovery="1"
quiet_boot="1"
quick_boot="1"
gfxpayload_dynamic="1"
. "${pkgdatadir}/grub-mkconfig_lib"
export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"
## Skip early if zfs utils isn't installed (instead of failing on first zpool list)
if ! `which zfs >/dev/null 2>&1`; then
exit 0
fi
imported_pools=""
MNTDIR="$(mktemp -d ${TMPDIR:-/tmp}/zfsmnt.XXXXXX)"
ZFSTMP="$(mktemp -d ${TMPDIR:-/tmp}/zfstmp.XXXXXX)"
machine="$(uname -m)"
case "${machine}" in
i?86) GENKERNEL_ARCH="x86" ;;
mips|mips64) GENKERNEL_ARCH="mips" ;;
mipsel|mips64el) GENKERNEL_ARCH="mipsel" ;;
arm*) GENKERNEL_ARCH="arm" ;;
*) GENKERNEL_ARCH="${machine}" ;;
esac
RC=0
on_exit() {
# Restore initial zpool import state
for pool in ${imported_pools}; do
zpool export "${pool}"
done
mountpoint -q "${MNTDIR}/boot" && umount "${MNTDIR}/boot" || true
mountpoint -q "${MNTDIR}" && umount "${MNTDIR}" || true
rmdir "${MNTDIR}"
rm -rf "${ZFSTMP}"
exit "${RC}"
}
trap on_exit EXIT INT QUIT ABRT PIPE TERM
# List ONLINE and DEGRADED pools
import_pools() {
# We have to ignore zpool import output, as potentially multiple / will be available,
# and we need to autodetect all zpools this way with their real mountpoints.
local initial_pools="$(zpool list | awk '{if (NR>1) print $1}')"
local all_pools=""
local imported_pools=""
local err=""
set +e
err="$(zpool import -f -a -o cachefile=none -o readonly=on -N 2>&1)"
# Only print stderr if the command returned an error
# (it can echo "No zpool to import" with success, which we don't want)
if [ $? -ne 0 ]; then
echo "Some pools couldn't be imported and will be ignored:\n${err}" >&2
fi
set -e
all_pools="$(zpool list | awk '{if (NR>1) print $1}')"
for pool in ${all_pools}; do
if echo "${initial_pools}" | grep -wq "${pool}"; then
continue
fi
imported_pools="${imported_pools} ${pool}"
done
echo "${imported_pools}"
}
# List all the dataset with a root mountpoint
get_root_datasets() {
local pools="$(zpool list | awk '{if (NR>1) print $1}')"
for p in ${pools}; do
local rel_pool_root=$(zpool get -H altroot ${p} | awk '{print $3}')
if [ "${rel_pool_root}" = "-" ]; then
rel_pool_root="/"
fi
zfs list -H -o name,canmount,mountpoint -t filesystem | grep -E '^'"${p}"'(\s|/[[:print:]]*\s)(on|noauto)\s'"${rel_pool_root}"'$' | awk '{print $1}'
done
}
# find if given datasets can be mounted for directory and return its path (snapshot or real path)
# $1 is our current dataset name
# $2 directory path we look for (cannot contains /)
# $3 is the temporary mount directory to use
# $4 is the optional snapshot name
# return path for directory (which can be a mountpoint)
validate_system_dataset() {
local dataset="$1"
local directory="$2"
local mntdir="$3"
local snapshot_name="$4"
local mount_path="${mntdir}/${directory}"
if ! zfs list "${dataset}" >/dev/null 2>&1; then
return
fi
if ! mount -o noatime,zfsutil -t zfs "${dataset}" "${mount_path}"; then
grub_warn "Failed to find a valid directory '${directory}' for dataset '${dataset}@${snapshot_name}'. Ignoring"
return
fi
local candidate_path="${mount_path}"
if [ -n "${snapshot_name}" ]; then
# WORKAROUND a bug https://github.com/zfsonlinux/zfs/issues/9958
# Reading the content of a snapshot fails if it is not the first mount
# for a given dataset
first_mntdir=$(awk '{if ($1 == "'${dataset}'") {print $2; exit;}}' /proc/mounts)
if [ "${first_mntdir}" = "/" ]; then
# prevents // on candidate_path
first_mntdir=""
fi
candidate_path="${first_mntdir}/.zfs/snapshot/${snapshot_name}"
fi
if [ -n "$(ls "${candidate_path}" 2>/dev/null)" ]; then
echo "${candidate_path}"
return
else
mountpoint -q "${mount_path}" && umount "${mount_path}" || true
fi
}
# Detect system directory relevant to the other, trying to find the ones associated on the current dataset or snapshot/
# System directory should be at most a direct child dataset of main datasets (no recursivity)
# We can fallback trying other zfs pools if no match has been found.
# $1 is our current dataset name (which can have @snapshot name)
# $2 directory path we look for (cannot contains /)
# $3 restrict_to_same_pool (true|false) force looking for dataset with the same basename in the current dataset pool only
# $4 is the temporary mount directory to use
# $5 is the optional etc directory (if not $2 is not etc itself)
# return path for directory (which can be a mountpoint)
get_system_directory() {
local dataset_path="$1"
local directory="$2"
local restrict_to_same_pool="$3"
local mntdir="$4"
local etc_dir="$5"
if [ -z "${etc_dir}" ]; then
etc_dir="${mntdir}/etc"
fi
local candidate_path="${mntdir}/${directory}"
# 1. Look for /etc/fstab first (which will mount even on top of non empty $directory)
local mounted_fstab_entry="false"
if [ -f "${etc_dir}/fstab" ]; then
mount_args=$(awk '/^[^#].*[ \t]\/'"${directory}"'[ \t]/ {print "-t", $3, $1}' "${etc_dir}/fstab")
if [ -n "${mount_args}" ]; then
mounted_fstab_entry="true"
mount -o noatime ${mount_args} "${candidate_path}" || mounted_fstab_entry="false"
fi
fi
# If directory isn't empty. Only count if coming from /etc/fstab. Will be
# handled below otherwise as we are interested in potential snapshots.
if [ "${mounted_fstab_entry}" = "true" -a -n "$(ls ${candidate_path} 2>/dev/null)" ]; then
echo "${candidate_path}"
return
fi
# 2. Handle zfs case, which can be a snapshots.
local base_dataset_path="${dataset_path}"
local snapshot_name=""
# For snapshots we extract the parent dataset
if echo "${dataset_path}" | grep -q '@'; then
base_dataset_path=$(echo "${dataset_path}" | cut -d '@' -f1)
snapshot_name=$(echo "${dataset_path}" | cut -d '@' -f2)
fi
base_dataset_name="${base_dataset_path##*/}"
base_pool="$(echo "${base_dataset_path}" | cut -d'/' -f1)"
# 2.a) Look for child dataset included in base dataset, which needs to hold same snapshot if any
candidate_path=$(validate_system_dataset "${base_dataset_path}/${directory}" "${directory}" "${mntdir}" "${snapshot_name}")
if [ -n "${candidate_path}" ]; then
echo "${candidate_path}"
return
fi
# 2.b) Look for current dataset (which is already mounted as /)
candidate_path="${mntdir}/${directory}"
if [ -n "${snapshot_name}" ]; then
# WORKAROUND a bug https://github.com/zfsonlinux/zfs/issues/9958
# Reading the content of a snapshot fails if it is not the first mount
# for a given dataset
first_mntdir=$(awk '{if ($1 == "'${base_dataset_path}'") {print $2; exit;}}' /proc/mounts)
if [ "${first_mntdir}" = "/" ]; then
# prevents // on candidate_path
first_mntdir=""
fi
candidate_path="${first_mntdir}/.zfs/snapshot/${snapshot_name}/${directory}"
fi
if [ -n "$(ls "${candidate_path}" 2>/dev/null)" ]; then
echo "${candidate_path}"
return
fi
# 2.c) Look for every datasets in every pool which isn't the current dataset which holds:
# - the same dataset name (last section) than our base_dataset_name
# - mountpoint=directory
# - canmount!=off
all_same_base_dataset_name="$(zfs list -H -t filesystem -o name,canmount | awk '/^[^ ]+\/'"${base_dataset_name}"'[ \t](on|noauto)/ {print $1}') "
# order by local pool datasets first
current_pool_same_base_datasets=""
other_pools_same_base_datasets=""
root_pool=$(echo "${dataset_path%%/*}")
for d in ${all_same_base_dataset_name}; do
cur_dataset_pool=$(echo "${d%%/*}")
if echo "${cur_dataset_pool}" | grep -wq "${root_pool}" 2>/dev/null ; then
current_pool_same_base_datasets="${current_pool_same_base_datasets} ${d}"
else
other_pools_same_base_datasets="${other_pools_same_base_datasets} ${d}"
fi
done
ordered_same_base_datasets="${current_pool_same_base_datasets} ${other_pools_same_base_datasets}"
if [ "${restrict_to_same_pool}" = "true" ]; then
ordered_same_base_datasets="${current_pool_same_base_datasets}"
fi
# now, loop over them
for d in ${ordered_same_base_datasets}; do
cur_dataset_pool=$(echo "${d%%/*}")
rel_pool_root=$(zpool get -H altroot ${cur_dataset_pool} | awk '{print $3}')
if [ "${rel_pool_root}" = "-" ]; then
rel_pool_root=""
fi
# check mountpoint match
candidate_dataset=$(zfs get -H mountpoint ${d} | grep -E "mountpoint\s${rel_pool_root}/${directory}\s" | awk '{print $1}')
if [ -z "${candidate_dataset}" ]; then
continue
fi
candidate_path=$(validate_system_dataset "${candidate_dataset}" "${directory}" "${mntdir}" "${snapshot_name}")
if [ -n "${candidate_path}" ]; then
echo "${candidate_path}"
return
fi
done
# 2.d) If we didn't find anything yet: check for persistent datasets corresponding to our mountpoint, with canmount=on without any snapshot associated:
# Note: we go over previous datasets as well, but this is ok, as we didn't include them before.
all_mountable_datasets="$(zfs list -t filesystem -o name,canmount | awk '/^[^ ]+[ \t]+on/ {print $1}')"
# order by local pool datasets first
current_pool_datasets=""
other_pools_datasets=""
root_pool=$(echo "${dataset_path%%/*}")
for d in ${all_mountable_datasets}; do
cur_dataset_pool=$(echo "${d%%/*}")
if echo "${cur_dataset_pool}" | grep -wq "${root_pool}" 2>/dev/null ; then
current_pool_datasets="${current_pool_datasets} ${d}"
else
other_pools_datasets="${other_pools_datasets} ${d}"
fi
done
ordered_datasets="${current_pool_datasets} ${other_pools_datasets}"
if [ "${restrict_to_same_pool}" = "true" ]; then
ordered_datasets="${current_pool_datasets}"
fi
for d in ${ordered_datasets}; do
cur_dataset_pool=$(echo "${d%%/*}")
rel_pool_root=$(zpool get -H altroot ${cur_dataset_pool} | awk '{print $3}')
if [ "${rel_pool_root}" = "-" ]; then
rel_pool_root=""
fi
# check mountpoint match
candidate_dataset=$(zfs get -H mountpoint ${d} | grep -E "mountpoint\s${rel_pool_root}/${directory}\s" | awk '{print $1}')
if [ -z "${candidate_dataset}" ]; then
continue
fi
candidate_path=$(validate_system_dataset "${d}" "${directory}" "${mntdir}" "")
if [ -n "${candidate_path}" ]; then
echo "${candidate_path}"
return
fi
done
grub_warn "Failed to find a valid directory '${directory}' for dataset '${dataset_path}'. Ignoring"
return
}
# Try our default layout bpool as a prefered layout (fast path)
# This is get_system_directory for boot optimized for our default installation layout
# $1 is our current dataset name (which can have @snapshot name)
# $2 is the temporary mount directory to use
# return path for directory (which can be a mountpoint) if found
try_default_layout_bpool() {
local root_dataset_path="$1"
local mntdir="$2"
dataset_basename="${root_dataset_path##*/}"
candidate_dataset="bpool/BOOT/${dataset_basename}"
dataset_properties="$(zfs get -H mountpoint,canmount "${candidate_dataset}" 2>/dev/null | cut -f3 | paste -sd ' ')"
if [ -z "${dataset_properties}" ]; then
return
fi
rel_pool_root=$(zpool get -H altroot bpool | awk '{print $3}')
if [ "${rel_pool_root}" = "-" ]; then
rel_pool_root=""
fi
snapshot_name="${dataset_basename##*@}"
[ "${snapshot_name}" = "${dataset_basename}" ] && snapshot_name=""
if [ -z "${snapshot_name}" ]; then
if ! echo "${dataset_properties}" | grep -Eq "${rel_pool_root}/boot (on|noauto)"; then
return
fi
else
candidate_dataset=$(echo "${candidate_dataset}" | cut -d '@' -f1)
fi
validate_system_dataset "${candidate_dataset}" "boot" "${mntdir}" "${snapshot_name}"
}
# Return if secure boot is enabled on that system
is_secure_boot_enabled() {
if LANG=C mokutil --sb-state 2>/dev/null | grep -qi enabled; then
echo "true"
return
fi
echo "false"
return
}
# Given a filesystem or snapshot dataset, returns dataset|machine id|pretty name|last used
# $1 is dataset we want information from
# $2 is the temporary mount directory to use
get_dataset_info() {
local dataset="$1"
local mntdir="$2"
local base_dataset="${dataset}"
local etc_dir="${mntdir}/etc"
local is_snapshot="false"
# For snapshot we extract the parent dataset
if echo "${dataset}" | grep -q '@'; then
base_dataset=$(echo "${dataset}" | cut -d '@' -f1)
is_snapshot="true"
fi
mount -o noatime,zfsutil -t zfs "${base_dataset}" "${mntdir}"
# read machine-id/os-release from /etc
etc_dir=$(get_system_directory "${dataset}" "etc" "true" "${mntdir}" "")
if [ -z "${etc_dir}" ]; then
grub_warn "Ignoring ${dataset}"
mountpoint -q "${mntdir}/etc" && umount "${mntdir}/etc" || true
umount "${mntdir}"
return
fi
machine_id=""
if [ -f "${etc_dir}/machine-id" ]; then
machine_id=$(cat "${etc_dir}/machine-id")
fi
# We have to use a random temporary id if we don't have any machine-id file or if this one is empty
# (mostly the case of new installations before first boot).
# Let's use the dataset name directly for this.
# Consequence is that all datasets are then separated.
if [ -z "${machine_id}" ]; then
machine_id="${dataset}"
fi
pretty_name=$(. "${etc_dir}/os-release" && echo "${PRETTY_NAME}")
mountpoint -q "${mntdir}/etc" && umount "${mntdir}/etc" || true
# read available kernels from /boot
boot_dir="$(try_default_layout_bpool "${dataset}" "${mntdir}")"
if [ -z "${boot_dir}" ]; then
boot_dir=$(get_system_directory "${dataset}" "boot" "false" "${mntdir}" "${etc_dir}")
fi
if [ -z "${boot_dir}" ]; then
grub_warn "Ignoring ${dataset}"
mountpoint -q "${mntdir}/boot" && umount "${mntdir}/boot" || true
umount "${mntdir}"
return
fi
initrd_list=""
kernel_list=""
candidate_kernel_list="$(find "${boot_dir}" -maxdepth 1 -type f -regex '.*/\(vmlinuz\|vmlinux\|kernel\)-.*')"
# Perform a reverse version sort on the entire list.
# Temporarily replace the '.old' suffix by ' 1' and append ' 2' for all
# other files to order the '.old' files after their non-old counterpart
# in reverse-sorted order.
reverse_sorted_list=$(echo $candidate_kernel_list | tr ' ' '\n' | sed -e 's/\.old$/ 1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
for linux in ${reverse_sorted_list}; do
if ! grub_file_is_not_garbage "${linux}" ; then
continue
fi
# Filters entry if efi/non efi.
# Note that for now we allow kernel without .efi.signed as those are signed kernel
# on ubuntu, loaded by the shim.
case "${linux}" in
*.efi.signed)
if [ "$(is_secure_boot_enabled)" = "false" ]; then
continue
fi
;;
esac
linux_basename=$(basename "${linux}")
linux_dirname=$(dirname "${linux}")
version=$(echo "${linux_basename}" | sed -e "s,^[^0-9]*-,,g")
alt_version=$(echo "${version}" | sed -e "s,\.old$,,g")
gettext_printf "Found linux image: %s in %s\n" "${linux_basename}" "${dataset}" >&2
initrd=""
for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \
"initrd-${version}" "initramfs-${version}.img" \
"initrd.img-${alt_version}" "initrd-${alt_version}.img" \
"initrd-${alt_version}" "initramfs-${alt_version}.img" \
"initramfs-genkernel-${version}" \
"initramfs-genkernel-${alt_version}" \
"initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \
"initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}"; do
if test -e "${linux_dirname}/${i}" ; then
initrd="$i"
break
fi
done
if test -z "${initrd}" ; then
grub_warn "Couldn't find any valid initrd for dataset ${dataset}."
continue
fi
gettext_printf "Found initrd image: %s in %s\n" "${initrd}" "${dataset}" >&2
rel_linux_dirname=$(make_system_path_relative_to_its_root "${linux_dirname}")
initrd_list="${initrd_list}|${rel_linux_dirname}/${initrd}"
kernel_list="${kernel_list}|${rel_linux_dirname}/${linux_basename}"
done
initrd_list="${initrd_list#|}"
kernel_list="${kernel_list#|}"
initrd_device=$(${grub_probe} --target=device "${boot_dir}" | head -1)
mountpoint -q "${mntdir}/boot" && umount "${mntdir}/boot" || true
# We needed to look in / for snapshots on root dataset, umount there before zfs lazily unmount it
case "${boot_dir}" in /boot/.zfs/snapshot/*)
umount "${boot_dir}" || true
;;
esac
# for zsys snapshots: we want to know which kernel we successful last booted with
last_booted_kernel=$(zfs get -H com.ubuntu.zsys:last-booted-kernel "${dataset}" | awk -v FS='\t' '{print $3}')
# snapshot: last_used is dataset creation time
if [ "${is_snapshot}" = "true" ]; then
last_used="$(zfs get -pH creation "${dataset}" | awk -F '\t' '{print $3}')"
# otherwise, last_used is manually marked at boot/shutdown on a root dataset for zsys
else
# if current system, take current time
if zfs mount | awk '/[ \t]+\/$/ {print $1}' | grep -q "${dataset}"; then
last_used=$(date +%s)
else
last_used=$(zfs get -H com.ubuntu.zsys:last-used "${dataset}" | awk '{print $3}')
# case of non zsys, or zsys without annotation, take /etc/machine-id stat (as we mounted with noatime).
# However, as systems can be relatime, if system is current mounted one, set current time (case of clone + reboot
# within the same d).
if [ "${last_used}" = "-" ]; then
last_used=$(stat --printf="%X" "${mntdir}/etc/os-release")
if [ -f "${mntdir}/etc/machine-id" ]; then
last_used=$(stat --printf="%X" "${mntdir}/etc/machine-id")
fi
fi
fi
fi
is_zsys=$(zfs get -H com.ubuntu.zsys:bootfs "${base_dataset}" | awk '{print $3}')
if [ -n "${initrd_list}" -a -n "${kernel_list}" ]; then
echo "${dataset}\t${is_zsys}\t${machine_id}\t${pretty_name}\t${last_used}\t${initrd_device}\t${initrd_list}\t${kernel_list}\t${last_booted_kernel}"
else
grub_warn "didn't find any valid initrd or kernel."
fi
umount "${mntdir}" || true
# We needed to look in / for snapshots on root dataset, umount the snapshot for etc before zfs lazily unmount it
# This process only needs to run if the snapshot contains an .../etc path,
# otherwise the build process may silently fail and produce no kernel lines in grub.cfg
if [ -e "${etc_dir}" ]; then
case "${etc_dir}" in /.zfs/snapshot/*/etc)
snapshot_path="$(findmnt -n -o TARGET -T "${etc_dir}")"
umount "${snapshot_path}" || true
;;
esac
fi
}
# Scan available boot options and returns in a formatted list
# $1 is the temporary mount directory to use
bootlist() {
local mntdir="$1"
local boot_list=""
for dataset in $(get_root_datasets); do
# get information from current root dataset
boot_list="${boot_list}$(get_dataset_info "${dataset}" ${mntdir})\n"
# get information from snapshots of this root dataset
snapshots="$(zfs list -H -o name -t snapshot "${dataset}"|while read snapshot_dataset; do
get_dataset_info "${snapshot_dataset}" ${mntdir}
done)"
[ -n "${snapshots}" ] && boot_list="${boot_list}${snapshots}\n"
done
echo "${boot_list}"
}
# Order machine ids by last_used from their main entry
get_machines_sorted() {
local bootlist="$1"
local machineids="$(echo "${bootlist}" | awk '{print $3}' | sort -u)"
for machineid in ${machineids}; do
echo "${bootlist}" | awk 'BEGIN{FS="\t"} $1 !~ /.*@.*/ {print $5, $3}' | sort -nr | grep -E "[^^]\b${machineid}\b" | head -1
done | sort -nr | awk '{print $2}'
}
# Sort entries by last_used for a given machineid
sort_entries_for_machineid() {
local bootlist="$1"
local machineid="$2"
tab="$(printf '\t')"
echo "${bootlist}" | grep -E "[^^]\b${machineid}\b" | sort -k5,5r -k1,1 -t "${tab}"
}
# Return main entry index
get_main_entry() {
local entries="$1"
echo "${entries}" | awk 'BEGIN{FS="\t"} $1 !~ /.*@.*/ {print}' | head -1
}
# Return specific field at index from entry
get_field_from_entry() {
local entry="$1"
local index="$2"
echo "${entry}" | awk "BEGIN{FS=\"\t\"} {print \$$index}"
}
# Get the main entry metadata
main_entry_meta() {
local main_entry="$1"
initrd=$(get_field_from_entry "${main_entry}" 7 | cut -d'|' -f1)
kernel=$(get_field_from_entry "${main_entry}" 8 | cut -d'|' -f1)
# Take first element (most recent entry) which is not a snapshot
echo "${main_entry}" | awk "BEGIN{ FS=\"\t\"; OFS=\"\t\"} {print \$3, \$2, \"main\", \$4, \$1, \$6, \"$initrd\", \"$kernel\"}"
}
# Get advanced entries metadata
advanced_entries_meta() {
local main_entry="$1"
last_used_kernel="$(get_field_from_entry "${main_entry}" 9 )"
# We must align initrds with kernels.
# Adds initrds to the stack then pop them 1 by 1 as we process the kernels
oldIFS="$IFS"
export IFS='|'
set -- $(get_field_from_entry "${main_entry}" 7)
for kernel in $(get_field_from_entry "${main_entry}" 8); do
# get initrd and pop to the next one
initrd="$1"; shift
was_last_used_kernel="false"
kernel_basename=$(basename "${kernel}")
if [ "${kernel_basename}" = "${last_used_kernel}" ]; then
was_last_used_kernel="true"
fi
echo "${main_entry}" | awk "BEGIN{ FS=\"\t\"; OFS=\"\t\"} {print \$3, \$2, \"advanced\", \$4, \$1, \$6, \"$initrd\", \"$kernel\", \"$was_last_used_kernel\"}"
done
IFS="$oldIFS"
}
# Get history metadata
history_entries_meta() {
local entries="$1"
local main_dataset_name="$2"
local main_dataset_releasename="$3"
if [ -z "${entries}" ]; then
return
fi
# Traverse snapshots and clones
echo "${entries}" | while read entry; do
name=""
# Compute snapshot/filesystem dataset name
snap_dataset_name="$(get_field_from_entry "${entry}" 1)"
snapname="${snap_dataset_name##*@}"
# If, this is a clone, take what is after main_dataset_name
if [ "${snapname}" = "${snap_dataset_name}" ]; then
snapname="${snap_dataset_name##${main_dataset_name}_}"
# Handle manual user clone (not prefixed by "main_dataset_name")
snapname="${snapname##*/}"
fi
# We keep the snapname only if it is not only a zsys auto snapshot
if echo "${snapname}" | grep -q "^autozsys_"; then
snapname=""
fi
# We store the release only if it different from main dataset release (snapshot before a release upgrade)
releasename=$(get_field_from_entry "${entry}" 4)
if [ "${releasename}" = "${main_dataset_releasename}" ]; then
releasename=""
fi
# Snapshot date
foo="$(get_field_from_entry "${entry}" 5)"
snapdate="$(date -d @$(get_field_from_entry "${entry}" 5) "+%x @ %H:%M")"
# For snapshots/clones the name can have the following formats:
# <DATE>: autozsys, same release
# <OLD_RELEASE> on <DATE>: autozsys, different release
# <SNAPNAME> on <DATE>: Manual snapshot, same release
# <SNAPNAME>, <OLD_RELEASE> on <DATE>: Manual snapshot, different release
if [ "${snapname}" = "" -a "${releasename}" = "" ]; then
name="${snapdate}"
elif [ "${snapname}" = "" -a "${releasename}" != "" ]; then
name=$(gettext_printf "%s on %s" "${releasename}" "${snapdate}")
elif [ "${snapname}" != "" -a "${releasename}" = "" ]; then
name=$(gettext_printf "%s on %s" "${snapname}" "${snapdate}")
else # snapname != "" && releasename != ""
name=$(gettext_printf "%s, %s on %s" "${snapname}" "${releasename}" "${snapdate}")
fi
# Choose kernel and initrd if the snapshot was booted successfully on a specific kernel before
# Take latest by default if no match
initrd=$(get_field_from_entry "${entry}" 7 | cut -d'|' -f1)
kernel=$(get_field_from_entry "${entry}" 8 | cut -d'|' -f1)
last_used_kernel="$(get_field_from_entry "${entry}" 9)"
# We must align initrds with kernels.
# Adds initrds to the stack then pop them 1 by 1 as we process the kernels
oldIFS="$IFS"
export IFS='|'
set -- $(get_field_from_entry "${entry}" 7)
for k in $(get_field_from_entry "${entry}" 8); do
# get initrd and pop to the next one
candidate_initrd="$1"; shift
kernel_basename=$(basename -- "${k}")
if [ "${kernel_basename}" = "${last_used_kernel}" ]; then
kernel="${k}"
initrd="${candidate_initrd}"
break
fi
done
IFS="$oldIFS"
echo "${entry}" | awk "BEGIN{ FS=\"\t\"; OFS=\"\t\"} {print \$3, \$2, \"history\", \"$name\", \$1, \$6, \"$initrd\", \"$kernel\"}"
done
}
# Generate metadata from a BOOTLIST that will subsequently used to generate
# the final grub menu entries
generate_grub_menu_metadata() {
local bootlist="$1"
# Sort machineids by last_used from their main entry
for machineid in $(get_machines_sorted "${bootlist}"); do
entries="$(sort_entries_for_machineid "${bootlist}" ${machineid})"
main_entry="$(get_main_entry "${entries}")"
if [ -z "$main_entry" ]; then
continue
fi
main_entry_meta "${main_entry}"
advanced_entries_meta "${main_entry}"
main_dataset_name="$(get_field_from_entry "${main_entry}" 1)"
main_dataset_releasename="$(get_field_from_entry "${main_entry}" 4)"
# grep -v errcode != 0 if there is no match. || true to not fail with -e
other_entries="$(echo "${entries}" | grep -v "${main_entry}" || true)"
history_entries_meta "${other_entries}" "${main_dataset_name}" "${main_dataset_releasename}"
done
}
# Print the configuration part common to all sections
# Note:
# If 10_linux runs these part will be defined twice in grub configuration
print_menu_prologue() {
# Use ELILO's generic "efifb" when it's known to be available.
# FIXME: We need an interface to select vesafb in case efifb can't be used.
GRUB_GFXPAYLOAD_LINUX="${GRUB_GFXPAYLOAD_LINUX:-}"
if [ "${GRUB_GFXPAYLOAD_LINUX}" != "" ] || [ "${gfxpayload_dynamic}" = 0 ]; then
echo "set linux_gfx_mode=${GRUB_GFXPAYLOAD_LINUX}"
else
cat << EOF
if [ "\${recordfail}" != 1 ]; then
if [ -e \${prefix}/gfxblacklist.txt ]; then
if hwmatch \${prefix}/gfxblacklist.txt 3; then
if [ \${match} = 0 ]; then
set linux_gfx_mode=keep
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=keep
fi
else
set linux_gfx_mode=text
fi
EOF
fi
cat << EOF
export linux_gfx_mode
EOF
}
# Cache for prepare_grub_to_access_device call
# $1: boot_device
# $2: submenu_level
prepare_grub_to_access_device_cached() {
local boot_device="$1"
local submenu_level="$2"
local boot_device_idx="$(echo ${boot_device} | tr '/' '_')"
cache_file="${ZFSTMP}/$(echo boot_device${boot_device_idx})"
if [ ! -f "${cache_file}" ]; then
set +u
echo "$(prepare_grub_to_access_device "${boot_device}")" > "${cache_file}"
set -u
for i in 0 1 2; do
submenu_indentation="$(printf %${i}s | tr " " "${grub_tab}")"
sed "s/^/${submenu_indentation} /" "${cache_file}" > "${cache_file}--${i}"
done
fi
cat "${cache_file}--${submenu_level}"
}
# Print a grub menu entry
zfs_linux_entry () {
submenu_level="$1"
title="$2"
type="$3"
dataset="$4"
boot_device="$5"
initrd="$6"
kernel="$7"
kernel_version="$8"
kernel_additional_args="${9:-}"
boot_devices="${10:-}"
submenu_indentation="$(printf %${submenu_level}s | tr " " "${grub_tab}")"
echo "${submenu_indentation}menuentry '$(echo "${title}" | grub_quote)' ${CLASS} \${menuentry_id_option} 'gnulinux-${dataset}-${kernel_version}' {"
if [ "${quick_boot}" = 1 ]; then
echo "${submenu_indentation} recordfail"
fi
if [ "${type}" != "recovery" ] ; then
GRUB_SAVEDEFAULT=${GRUB_SAVEDEFAULT:-}
default_entry="$(save_default_entry)"
if [ -n "${default_entry}" ]; then
echo "${submenu_indentation} ${default_entry}"
fi
fi
# Use ELILO's generic "efifb" when it's known to be available.
# FIXME: We need an interface to select vesafb in case efifb can't be used.
if [ "${GRUB_GFXPAYLOAD_LINUX}" = "" ]; then
echo "${submenu_indentation} load_video"
else
if [ "${GRUB_GFXPAYLOAD_LINUX}" != "text" ]; then
echo "${submenu_indentation} load_video"
fi
fi
if ([ "${ubuntu_recovery}" = 0 ] || [ "${type}" != "recovery" ]) && \
([ "${GRUB_GFXPAYLOAD_LINUX}" != "" ] || [ "${gfxpayload_dynamic}" = 1 ]); then
echo "${submenu_indentation} set gfxpayload=\${linux_gfx_mode}"
fi
echo "${submenu_indentation} insmod gzio"
echo "${submenu_indentation} if [ \"\${grub_platform}\" = xen ]; then insmod xzio; insmod lzopio; fi"
if [ -n "$boot_devices" ]; then
for device in ${boot_devices}; do
echo "${submenu_indentation} if [ "${boot_device}" = "${device}" ]; then"
echo "$(prepare_grub_to_access_device_cached "${device}" $(( submenu_level +1 )) )"
echo "${submenu_indentation} fi"
done
else
echo "$(prepare_grub_to_access_device_cached "${boot_device}" "${submenu_level}")"
fi
if [ "${quiet_boot}" = 0 ] || [ "${type}" != simple ]; then
echo "${submenu_indentation} echo $(gettext_printf "Loading Linux %s ..." ${kernel_version} | grub_quote)"
fi
linux_default_args="${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
if [ ${type} = "recovery" ]; then
linux_default_args="${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX}"
fi
# echo in echo trims end of line spaces
echo "${submenu_indentation} linux \"${kernel}\" root=ZFS=\"${dataset}\" ro $(echo ${linux_default_args} ${kernel_additional_args})"
if [ "${quiet_boot}" = 0 ] || [ "${type}" != simple ]; then
echo "${submenu_indentation} echo '$(gettext_printf "Loading initial ramdisk ..." | grub_quote)'"
fi
echo "${submenu_indentation} initrd \"${initrd}\""
echo "${submenu_indentation}}"
}
# Generate a GRUB Menu from menu meta data
# $1 menu metadata
generate_grub_menu() {
local menu_metadata="$1"
local last_section=""
local main_dataset_name=""
local main_dataset=""
local have_zsys=""
if [ -z "${menu_metadata}" ]; then
return
fi
CLASS="--class gnu-linux --class gnu --class os"
if [ "${GRUB_DISTRIBUTOR}" = "" ] ; then
OS=GNU/Linux
else
case ${GRUB_DISTRIBUTOR} in
Ubuntu|Kubuntu)
OS="${GRUB_DISTRIBUTOR}"
;;
*)
OS="${GRUB_DISTRIBUTOR} GNU/Linux"
;;
esac
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1 | LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"
fi
if [ -x /lib/recovery-mode/recovery-menu ]; then
GRUB_CMDLINE_LINUX_RECOVERY=recovery
else
GRUB_CMDLINE_LINUX_RECOVERY=single
fi
if [ "${ubuntu_recovery}" = 1 ]; then
GRUB_CMDLINE_LINUX_RECOVERY="${GRUB_CMDLINE_LINUX_RECOVERY} nomodeset"
fi
case "$GENKERNEL_ARCH" in
x86*) GRUB_CMDLINE_LINUX_RECOVERY="$GRUB_CMDLINE_LINUX_RECOVERY dis_ucode_ldr";;
esac
print_menu_prologue
cat<<'EOF'
function zsyshistorymenu {
# $1: root dataset (eg rpool/ROOT/ubuntu_2zhm07@autozsys_k56fr6)
# $2: boot device id (eg 411f29ce1557bfed)
# $3: initrd (eg /BOOT/ubuntu_2zhm07@autozsys_k56fr6/initrd.img-5.4.0-21-generic)
# $4: kernel (eg /BOOT/ubuntu_2zhm07@autozsys_k56fr6/vmlinuz-5.4.0-21-generic)
# $5: kernel_version (eg 5.4.0-21-generic)
set root_dataset="${1}"
set boot_device="${2}"
set initrd="${3}"
set kernel="${4}"
set kversion="${5}"
EOF
boot_devices=$(echo "${menu_metadata}" | cut -d"$(printf '\t')" -f6 | sort -u)
title=$(gettext_printf "Revert system only")
zfs_linux_entry 1 "${title}" "simple" '${root_dataset}' '${boot_device}' '${initrd}' '${kernel}' '${kversion}' '' "${boot_devices}"
title="$(gettext_printf "Revert system and user data")"
zfs_linux_entry 1 "${title}" "simple" '${root_dataset}' '${boot_device}' '${initrd}' '${kernel}' '${kversion}' 'zsys-revert=userdata' "${boot_devices}"
GRUB_DISABLE_RECOVERY="${GRUB_DISABLE_RECOVERY:-}"
if [ "${GRUB_DISABLE_RECOVERY}" != "true" ]; then
title="$(gettext_printf "Revert system only (%s)" "$(gettext "${GRUB_RECOVERY_TITLE}")")"
zfs_linux_entry 1 "${title}" "recovery" '${root_dataset}' '${boot_device}' '${initrd}' '${kernel}' '${kversion}' '' "${boot_devices}"
title="$(gettext_printf "Revert system and user data (%s)" "$(gettext "${GRUB_RECOVERY_TITLE}")")"
zfs_linux_entry 1 "${title}" "recovery" '${root_dataset}' '${boot_device}' '${initrd}' '${kernel}' '${kversion}' 'zsys-revert=userdata' "${boot_devices}"
fi
echo "}"
echo
# IFS is set to TAB (ASCII 0x09)
echo "${menu_metadata}" |
{
at_least_one_entry=0
have_zsys="$(which zsysd || true)"
while IFS="$(printf '\t')" read -r machineid iszsys section name dataset device initrd kernel opt; do
# Disable history for non zsys system or if systems is a zsys one and zsys isn't installed.
# In pure zfs systems, we identified multiple issues due to the mount generator
# in upstream zfs which makes it incompatible. Don't show history for now.
if [ "${section}" = "history" ]; then
if [ "${iszsys}" != "yes" ] || [ "${iszsys}" = "yes" -a -z "${have_zsys}" ]; then
continue
fi
fi
if [ "${last_section}" != "${section}" -a -n "${last_section}" ]; then
# Close previous section wrapper
if [ "${last_section}" != "main" ]; then
echo "}" # Add grub_tabs
at_least_one_entry=0
fi
fi
case "${section}" in
main)
title="${name}"
main_dataset_name="${name}"
main_dataset="${dataset}"
kernel_version=$(basename "${kernel}" | sed -e "s,^[^0-9]*-,,g")
zfs_linux_entry 0 "${title}" "simple" "${dataset}" "${device}" "${initrd}" "${kernel}" "${kernel_version}"
at_least_one_entry=1
;;
advanced)
# normal and recovery entries for a given kernel
if [ "${last_section}" != "${section}" ]; then
echo "submenu '$(gettext_printf "Advanced options for %s" "${main_dataset_name}" | grub_quote)' \${menuentry_id_option} 'gnulinux-advanced-${main_dataset}' {"
fi
last_booted_kernel_marker=""
if [ "${opt}" = "true" ]; then
last_booted_kernel_marker="* "
fi
kernel_version=$(basename "${kernel}" | sed -e "s,^[^0-9]*-,,g")
title="$(gettext_printf "%s%s, with Linux %s" "${last_booted_kernel_marker}" "${name}" "${kernel_version}")"
zfs_linux_entry 1 "${title}" "advanced" "${dataset}" "${device}" "${initrd}" "${kernel}" "${kernel_version}"
GRUB_DISABLE_RECOVERY=${GRUB_DISABLE_RECOVERY:-}
if [ "${GRUB_DISABLE_RECOVERY}" != "true" ]; then
title="$(gettext_printf "%s%s, with Linux %s (%s)" "${last_booted_kernel_marker}" "${name}" "${kernel_version}" "$(gettext "${GRUB_RECOVERY_TITLE}")")"
zfs_linux_entry 1 "${title}" "recovery" "${dataset}" "${device}" "${initrd}" "${kernel}" "${kernel_version}"
fi
at_least_one_entry=1
;;
history)
# Revert to a snapshot
# revert system, revert system and user data and associated recovery entries
if [ "${last_section}" != "${section}" ]; then
echo "submenu '$(gettext_printf "History for %s" "${main_dataset_name}" | grub_quote)' \${menuentry_id_option} 'gnulinux-history-${main_dataset}' {"
fi
if [ "${iszsys}" = "yes" ]; then
title="$(gettext_printf "Revert to %s" "${name}" | grub_quote)"
else
title="$(gettext_printf "Boot on %s" "${name}" | grub_quote)"
fi
echo " submenu '${title}' \${menuentry_id_option} 'gnulinux-history-${dataset}' {"
kernel_version=$(basename "${kernel}" | sed -e "s,^[^0-9]*-,,g")
# Zsys only: let revert system without destroying snapshots
if [ "${iszsys}" = "yes" ]; then
echo "${grub_tab}${grub_tab}zsyshistorymenu" \"${dataset}\" \"${device}\" \"${initrd}\" \"${kernel}\" \"${kernel_version}\"
# Non-zsys: boot temporarly on snapshots or rollback (destroying intermediate snapshots)
else
title="$(gettext_printf "One time boot")"
zfs_linux_entry 2 "${title}" "simple" "${dataset}" "${device}" "${initrd}" "${kernel}" "${kernel_version}"
GRUB_DISABLE_RECOVERY="${GRUB_DISABLE_RECOVERY:-}"
if [ "${GRUB_DISABLE_RECOVERY}" != "true" ]; then
title="$(gettext_printf "One time boot (%s)" "$(gettext "${GRUB_RECOVERY_TITLE}")")"
zfs_linux_entry 2 "${title}" "recovery" "${dataset}" "${device}" "${initrd}" "${kernel}" "${kernel_version}"
fi
title="$(gettext_printf "Revert system (all intermediate snapshots will be destroyed)")"
zfs_linux_entry 2 "${title}" "simple" "${dataset}" "${device}" "${initrd}" "${kernel}" "${kernel_version}" "rollback=yes"
fi
echo " }"
at_least_one_entry=1
;;
*)
grub_warn "unknown section: ${section}. Ignoring entry ${name} for ${dataset}"
;;
esac
last_section="${section}"
done
if [ "${at_least_one_entry}" -eq 1 ]; then
echo "}"
fi
}
}
# don't add trailing newline of variable is empty
# $1: content to write
# $2: destination file
trailing_newline_if_not_empty() {
content="$1"
dest="$2"
if [ -z "${content}" ]; then
rm -f "${dest}"
touch "${dest}"
return
fi
echo "${content}" > "${dest}"
}
GRUB_LINUX_ZFS_TEST="${GRUB_LINUX_ZFS_TEST:-}"
case "${GRUB_LINUX_ZFS_TEST}" in
bootlist)
# Import all available pools on the system and return imported list
imported_pools=$(import_pools)
boot_list="$(bootlist ${MNTDIR})"
trailing_newline_if_not_empty "${boot_list}" "${GRUB_LINUX_ZFS_TEST_OUTPUT}"
break
;;
metamenu)
boot_list="$(cat ${GRUB_LINUX_ZFS_TEST_INPUT})"
menu_metadata="$(generate_grub_menu_metadata "${boot_list}")"
trailing_newline_if_not_empty "${menu_metadata}" "${GRUB_LINUX_ZFS_TEST_OUTPUT}"
break
;;
grubmenu)
menu_metadata="$(cat ${GRUB_LINUX_ZFS_TEST_INPUT})"
grub_menu=$(generate_grub_menu "${menu_metadata}")
trailing_newline_if_not_empty "${grub_menu}" "${GRUB_LINUX_ZFS_TEST_OUTPUT}"
break
;;
*)
# Import all available pools on the system and return imported list
imported_pools=$(import_pools)
# Generate the complete list of boot entries
boot_list="$(bootlist ${MNTDIR})"
# Create boot menu meta data from the list of boot entries
menu_metadata="$(generate_grub_menu_metadata "${boot_list}")"
# Create boot menu meta data from the list of boot entries
grub_menu="$(generate_grub_menu "${menu_metadata}")"
if [ -n "${grub_menu}" ]; then
# We want the trailing newline as a marker will be added
echo "${grub_menu}"
fi
;;
esac
/etc/grub.d/20_linux_xen
#! /bin/sh
set -e
# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009,2010 Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
. "$pkgdatadir/grub-mkconfig_lib"
export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"
CLASS="--class gnu-linux --class gnu --class os --class xen"
if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
OS=GNU/Linux
else
OS="${GRUB_DISTRIBUTOR} GNU/Linux"
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"
fi
# loop-AES arranges things so that /dev/loop/X can be our root device, but
# the initrds that Linux uses don't like that.
case ${GRUB_DEVICE} in
/dev/loop/*|/dev/loop[0-9])
GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
;;
esac
: ${GRUB_CMDLINE_LINUX_RECOVERY:=single}
# Default to disabling partition uuid support to maintian compatibility with
# older kernels.
: ${GRUB_DISABLE_LINUX_PARTUUID=true}
# btrfs may reside on multiple devices. We cannot pass them as value of root= parameter
# and mounting btrfs requires user space scanning, so force UUID in this case.
if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] && [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] ) \
|| ( [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
&& [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ] ) \
|| ( ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
&& ! test -e "/dev/disk/by-partuuid/${GRUB_DEVICE_PARTUUID}" ) \
|| ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then
LINUX_ROOT_DEVICE=${GRUB_DEVICE}
elif [ "x${GRUB_DEVICE_UUID}" = "x" ] \
|| [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ]; then
LINUX_ROOT_DEVICE=PARTUUID=${GRUB_DEVICE_PARTUUID}
else
LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
fi
# Allow overriding GRUB_CMDLINE_LINUX and GRUB_CMDLINE_LINUX_DEFAULT.
if [ "${GRUB_CMDLINE_LINUX_XEN_REPLACE}" ]; then
GRUB_CMDLINE_LINUX="${GRUB_CMDLINE_LINUX_XEN_REPLACE}"
fi
if [ "${GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT}" ]; then
GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT}"
fi
case x"$GRUB_FS" in
xbtrfs)
rootsubvol="`make_system_path_relative_to_its_root /`"
rootsubvol="${rootsubvol#/}"
if [ "x${rootsubvol}" != x ]; then
GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
fi;;
xzfs)
rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || zdb -l ${GRUB_DEVICE} | awk -F \' '/ name/ { print $2 }'`
bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`"
LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs%/}"
;;
esac
title_correction_code=
linux_entry ()
{
linux_entry_xsm "$@" false
linux_entry_xsm "$@" true
}
linux_entry_xsm ()
{
os="$1"
version="$2"
entry_xen_version="$3"
type="$4"
args="$5"
xen_args="$6"
xsm="$7"
# If user wants to enable XSM support, make sure there's
# corresponding policy file.
xenpolicy=
if ${xsm} ; then
xenpolicy="xenpolicy-$entry_xen_version"
if test ! -e "${xen_dirname}/${xenpolicy}" ; then
return
fi
xen_args="$xen_args flask=enforcing"
entry_xen_version="$(gettext_printf "%s (XSM enabled)" "$entry_xen_version")"
# entry_xen_version is used for messages only; actual file is xen_basename
fi
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
fi
if [ x$type != xsimple ] ; then
if [ x$type = xrecovery ] ; then
title="$(gettext_printf "%s, with Xen %s and Linux %s (%s)" "${os}" "${entry_xen_version}" "${version}" "$(gettext "${GRUB_RECOVERY_TITLE}")")"
else
title="$(gettext_printf "%s, with Xen %s and Linux %s" "${os}" "${entry_xen_version}" "${version}")"
fi
replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
if [ x"Xen ${entry_xen_version}>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")"
fi
echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'xen-gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
else
title="$(gettext_printf "%s, with Xen hypervisor" "${os}")"
echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'xen-gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
fi
if [ x$type != xrecovery ] ; then
save_default_entry | grub_add_tab | sed "s/^/$submenu_indentation/"
fi
if [ -z "${prepare_boot_cache}" ]; then
prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)"
fi
printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
xmessage="$(gettext_printf "Loading Xen %s ..." ${entry_xen_version})"
lmessage="$(gettext_printf "Loading Linux %s ..." ${version})"
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$xmessage" | grub_quote)'
if [ "\$grub_platform" = "pc" -o "\$grub_platform" = "" ]; then
xen_rm_opts=
else
xen_rm_opts="no-real-mode edd=off"
fi
${xen_loader} ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts}
echo '$(echo "$lmessage" | grub_quote)'
${module_loader} ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args}
EOF
if test -n "${initrd}" ; then
# TRANSLATORS: ramdisk isn't identifier. Should be translated.
message="$(gettext_printf "Loading initial ramdisk ...")"
initrd_path=
for i in ${initrd}; do
initrd_path="${rel_dirname}/${i}"
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
${module_loader} --nounzip $(echo $initrd_path)
EOF
done
fi
if ${xsm} && test -n "${xenpolicy}" ; then
message="$(gettext_printf "Loading XSM policy ...")"
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
${module_loader} ${rel_dirname}/${xenpolicy}
EOF
fi
sed "s/^/$submenu_indentation/" << EOF
}
EOF
}
linux_list=
for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* /boot/kernel-*; do
if grub_file_is_not_garbage "$i"; then
basename=$(basename $i)
version=$(echo $basename | sed -e "s,^[^0-9]*-,,g")
dirname=$(dirname $i)
config=
for j in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do
if test -e "${j}" ; then
config="${j}"
break
fi
done
if (grep -qx "CONFIG_XEN_DOM0=y" "${config}" 2> /dev/null || grep -qx "CONFIG_XEN_PRIVILEGED_GUEST=y" "${config}" 2> /dev/null); then linux_list="$linux_list $i" ; fi
fi
done
if [ "x${linux_list}" = "x" ] ; then
exit 0
fi
file_is_not_xen_garbage () {
case "$1" in
*/xen-syms-*)
return 1;;
*/xenpolicy-*)
return 1;;
*/*.config)
return 1;;
*)
return 0;;
esac
}
xen_list=
for i in /boot/xen*; do
if grub_file_is_not_garbage "$i" && file_is_not_xen_garbage "$i" ; then xen_list="$xen_list $i" ; fi
done
prepare_boot_cache=
boot_device_id=
title_correction_code=
machine=`uname -m`
case "$machine" in
i?86) GENKERNEL_ARCH="x86" ;;
mips|mips64) GENKERNEL_ARCH="mips" ;;
mipsel|mips64el) GENKERNEL_ARCH="mipsel" ;;
arm*) GENKERNEL_ARCH="arm" ;;
*) GENKERNEL_ARCH="$machine" ;;
esac
# Extra indentation to add to menu entries in a submenu. We're not in a submenu
# yet, so it's empty. In a submenu it will be equal to '\t' (one tab).
submenu_indentation=""
# Perform a reverse version sort on the entire xen_list and linux_list.
# Temporarily replace the '.old' suffix by ' 1' and append ' 2' for all
# other files to order the '.old' files after their non-old counterpart
# in reverse-sorted order.
reverse_sorted_xen_list=$(echo ${xen_list} | tr ' ' '\n' | sed -e 's/\.old$/ 1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
reverse_sorted_linux_list=$(echo ${linux_list} | tr ' ' '\n' | sed -e 's/\.old$/ 1/; / 1$/! s/$/ 2/' | version_sort -r | sed -e 's/ 1$/.old/; s/ 2$//')
if [ "x$GRUB_TOP_LEVEL_XEN" != x ]; then
reverse_sorted_xen_list=$(grub_move_to_front "$GRUB_TOP_LEVEL_XEN" ${reverse_sorted_xen_list})
fi
if [ "x$GRUB_TOP_LEVEL" != x ]; then
reverse_sorted_linux_list=$(grub_move_to_front "$GRUB_TOP_LEVEL" ${reverse_sorted_linux_list})
fi
is_top_level=true
for current_xen in ${reverse_sorted_xen_list}; do
xen_basename=`basename ${current_xen}`
xen_dirname=`dirname ${current_xen}`
rel_xen_dirname=`make_system_path_relative_to_its_root $xen_dirname`
xen_version=`echo $xen_basename | sed -e "s,.gz$,,g;s,^xen-,,g"`
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
fi
if [ "x$is_top_level" != xtrue ]; then
echo " submenu '$(gettext_printf "Xen hypervisor, version %s" "${xen_version}" | grub_quote)' \$menuentry_id_option 'xen-hypervisor-$xen_version-$boot_device_id' {"
fi
if ($grub_file --is-arm64-efi $current_xen); then
xen_loader="xen_hypervisor"
module_loader="xen_module"
else
if ($grub_file --is-x86-multiboot2 $current_xen); then
xen_loader="multiboot2"
module_loader="module2"
else
xen_loader="multiboot"
module_loader="module"
fi
fi
initrd_early=
for i in ${GRUB_EARLY_INITRD_LINUX_STOCK} \
${GRUB_EARLY_INITRD_LINUX_CUSTOM}; do
if test -e "${xen_dirname}/${i}" ; then
initrd_early="${initrd_early} ${i}"
fi
done
for linux in ${reverse_sorted_linux_list}; do
gettext_printf "Found linux image: %s\n" "$linux" >&2
basename=`basename $linux`
dirname=`dirname $linux`
rel_dirname=`make_system_path_relative_to_its_root $dirname`
version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
alt_version=`echo $version | sed -e "s,\.old$,,g"`
linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
initrd_real=
for i in "initrd.img-${version}" "initrd-${version}.img" \
"initrd-${alt_version}.img.old" "initrd-${version}.gz" \
"initrd-${alt_version}.gz.old" "initrd-${version}" \
"initramfs-${version}.img" "initramfs-${alt_version}.img.old" \
"initrd.img-${alt_version}" "initrd-${alt_version}.img" \
"initrd-${alt_version}" "initramfs-${alt_version}.img" \
"initramfs-genkernel-${version}" \
"initramfs-genkernel-${alt_version}" \
"initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \
"initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}" ; do
if test -e "${dirname}/${i}" ; then
initrd_real="$i"
break
fi
done
initrd=
if test -n "${initrd_early}" || test -n "${initrd_real}"; then
# Xen assumes the real initrd is the first module after the kernel.
# Additional (later) initrds can also be used for microcode update,
# with Xen option 'ucode=<scan|module number> (non-default anyway).
initrd="${initrd_real} ${initrd_early}"
initrd_display=
for i in ${initrd}; do
initrd_display="${initrd_display} ${dirname}/${i}"
done
gettext_printf "Found initrd image: %s\n" "$(echo $initrd_display)" >&2
fi
if test -z "${initrd_real}"; then
# "UUID=" magic is parsed by initrds. Since there's no initrd, it can't work here.
if [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] \
|| [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ]; then
linux_root_device_thisversion=${GRUB_DEVICE}
else
linux_root_device_thisversion=PARTUUID=${GRUB_DEVICE_PARTUUID}
fi
fi
# The GRUB_DISABLE_SUBMENU option used to be different than others since it was
# mentioned in the documentation that has to be set to 'y' instead of 'true' to
# enable it. This caused a lot of confusion to users that set the option to 'y',
# 'yes' or 'true'. This was fixed but all of these values must be supported now.
if [ "x${GRUB_DISABLE_SUBMENU}" = xyes ] || [ "x${GRUB_DISABLE_SUBMENU}" = xy ]; then
GRUB_DISABLE_SUBMENU="true"
fi
if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
linux_entry "${OS}" "${version}" "${xen_version}" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT}"
submenu_indentation="$grub_tab$grub_tab"
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
fi
# TRANSLATORS: %s is replaced with an OS name
echo "submenu '$(gettext_printf "Advanced options for %s (with Xen hypervisor)" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
echo " submenu '$(gettext_printf "Xen hypervisor, version %s" "${xen_version}" | grub_quote)' \$menuentry_id_option 'xen-hypervisor-$xen_version-$boot_device_id' {"
is_top_level=false
fi
linux_entry "${OS}" "${version}" "${xen_version}" advanced \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT}"
if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
linux_entry "${OS}" "${version}" "${xen_version}" recovery \
"${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX}" "${GRUB_CMDLINE_XEN}"
fi
done
if [ x"$is_top_level" != xtrue ]; then
echo ' }'
fi
done
# If at least one kernel was found, then we need to
# add a closing '}' for the submenu command.
if [ x"$is_top_level" != xtrue ]; then
echo '}'
fi
echo "$title_correction_code"
/etc/grub.d/20_memtest86+
#!/bin/sh
set -e
# We can't cope with loop-mounted devices here.
case ${GRUB_DEVICE_BOOT} in
/dev/loop/*|/dev/loop[0-9]) exit 0 ;;
esac
if [ -f /usr/lib/grub/grub-mkconfig_lib ]; then
. /usr/lib/grub/grub-mkconfig_lib
else
# no grub file, so we notify and exit gracefully
echo "Cannot find grub config file, exiting." >&2
exit 0
fi
# read value from /etc/default/grub and /etc/default/grub.d/*.cfg
# (borrowed from grub postinst script)
config_item()
{
for x in /etc/default/grub /etc/default/grub.d/*.cfg; do
if [ -f "$x" ]; then
# Lose any output here so we don't confuse our caller
. "$x" > /dev/null
fi
done
eval echo "\$$1"
}
# With GRUB_DISABLE_MEMTEST=true don't add memtest entries
if [ "x$(config_item GRUB_DISABLE_MEMTEST)" = "xtrue" ] ; then
exit 0
fi
GRUB_MEMTEST_DISABLE_SERIAL="$(config_item GRUB_MEMTEST_DISABLE_SERIAL)"
if [ "x${GRUB_MEMTEST_DISABLE_SERIAL}" != "xtrue" ]; then
GRUB_MEMTEST_SERIAL_PARAMS="$(config_item GRUB_MEMTEST_SERIAL_PARAMS)"
if [ "x${GRUB_MEMTEST_SERIAL_PARAMS}" = "x" ] ; then
GRUB_MEMTEST_SERIAL_PARAMS="ttyS0,115200"
fi
fi
# All memtest images are expected to be in /boot
prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t\t/")"
create_menu_entry() {
local label id relpath options
label="$1"
id="$2"
relpath="$3"
options="$4"
printf '\tmenuentry "Memory test (%s)" --class memtest $menuentry_id_option "%s" {\n' "$label" "$id"
printf '%s\n' "${prepare_boot_cache}"
printf '\t\tlinux %s %s\n\t}\n' "$relpath" "$options"
}
menu_entries_for_image() {
local file filepath relpath variant test_begin test_end
file="$1"
filepath="/boot/$file"
if [ -f "$filepath" ]; then
relpath=$(make_system_path_relative_to_its_root "$filepath")
variant="$2"
test_begin="$3"
test_end="$4"
echo "Found memtest86+ $variant image: $filepath" >&2
printf '%s\n' "$test_begin"
create_menu_entry "$file" 'memtest86+' "$relpath"
# With GRUB_MEMTEST_DISABLE_SERIAL=true don't add serial console entries
if [ "x${GRUB_MEMTEST_DISABLE_SERIAL}" != "xtrue" ]; then
create_menu_entry "$file, serial console" 'memtest86+-serial' "$relpath" "console=${GRUB_MEMTEST_SERIAL_PARAMS}"
fi
printf '%s\n' "$test_end"
fi
}
menu_entries_for_image mt86+x64 "64bit EFI" \
'if [ "$grub_platform" = efi -a "$grub_cpu" = x86_64 ]; then' \
'fi'
menu_entries_for_image mt86+ia32 "32bit EFI" \
'if [ "$grub_platform" = efi -a "$grub_cpu" = i386 ]; then' \
'fi'
menu_entries_for_image mt86+x64 "64bit" \
'if [ "$grub_platform" = pc ]; then if cpuid -l ; then' \
'fi ; fi'
menu_entries_for_image mt86+ia32 "32bit" \
'if [ "$grub_platform" = pc ]; then if ! cpuid -l ; then' \
'fi ; fi'
/etc/grub.d/30_os-prober
#! /bin/sh
set -e
# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009 Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
quick_boot="1"
export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"
. "$pkgdatadir/grub-mkconfig_lib"
found_other_os=
adjust_timeout () {
if [ "$quick_boot" = 1 ] && [ "x${found_other_os}" != "x" ]; then
cat << EOF
set timeout_style=menu
if [ "\${timeout}" = 0 ]; then
set timeout=10
fi
EOF
fi
}
if ! command -v os-prober > /dev/null || ! command -v linux-boot-prober > /dev/null ; then
# missing os-prober and/or linux-boot-prober
exit 0
elif [ "x${GRUB_DISABLE_OS_PROBER}" = "xauto" ]; then
# UBUNTU: We do not want to disable os-prober on upgrades if we found items before.
if test -e /boot/grub/grub.cfg && ! grep -q osprober /boot/grub/grub.cfg; then
grub_warn "$(gettext_printf "os-prober will not be executed to detect other bootable partitions.\nSystems on them will not be added to the GRUB boot configuration.\nCheck GRUB_DISABLE_OS_PROBER documentation entry.")"
exit 0
fi
fi
if [ "x${GRUB_DISABLE_OS_PROBER}" = "xtrue" ]; then
grub_warn "$(gettext_printf "os-prober will not be executed to detect other bootable partitions.\nSystems on them will not be added to the GRUB boot configuration.\nCheck GRUB_DISABLE_OS_PROBER documentation entry.")"
exit 0
fi
grub_warn "$(gettext_printf "os-prober will be executed to detect other bootable partitions.\nIts output will be used to detect bootable binaries on them and create new boot entries.")"
OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`"
if [ -z "${OSPROBED}" ] ; then
# empty os-prober output, nothing doing
exit 0
fi
osx_entry() {
found_other_os=1
if [ x$2 = x32 ]; then
# TRANSLATORS: it refers to kernel architecture (32-bit)
bitstr="$(gettext "(32-bit)")"
else
# TRANSLATORS: it refers to kernel architecture (64-bit)
bitstr="$(gettext "(64-bit)")"
fi
# TRANSLATORS: it refers on the OS residing on device %s
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
cat << EOF
menuentry '$(echo "${LONGNAME} $bitstr $onstr" | grub_quote)' --class osx --class darwin --class os \$menuentry_id_option 'osprober-xnu-$2-$(grub_get_device_id "${DEVICE}")' {
EOF
save_default_entry | grub_add_tab
prepare_grub_to_access_device ${DEVICE} | grub_add_tab
cat << EOF
load_video
set do_resume=0
if [ /var/vm/sleepimage -nt10 / ]; then
if xnu_resume /var/vm/sleepimage; then
set do_resume=1
fi
fi
if [ \$do_resume = 0 ]; then
xnu_uuid ${OSXUUID} uuid
if [ -f /Extra/DSDT.aml ]; then
acpi -e /Extra/DSDT.aml
fi
if [ /kernelcache -nt /System/Library/Extensions ]; then
$1 /kernelcache boot-uuid=\${uuid} rd=*uuid
elif [ -f /System/Library/Kernels/kernel ]; then
$1 /System/Library/Kernels/kernel boot-uuid=\${uuid} rd=*uuid
xnu_kextdir /System/Library/Extensions
else
$1 /mach_kernel boot-uuid=\${uuid} rd=*uuid
if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then
xnu_mkext /System/Library/Extensions.mkext
else
xnu_kextdir /System/Library/Extensions
fi
fi
if [ -f /Extra/Extensions.mkext ]; then
xnu_mkext /Extra/Extensions.mkext
fi
if [ -d /Extra/Extensions ]; then
xnu_kextdir /Extra/Extensions
fi
if [ -f /Extra/devprop.bin ]; then
xnu_devprop_load /Extra/devprop.bin
fi
if [ -f /Extra/splash.jpg ]; then
insmod jpeg
xnu_splash /Extra/splash.jpg
fi
if [ -f /Extra/splash.png ]; then
insmod png
xnu_splash /Extra/splash.png
fi
if [ -f /Extra/splash.tga ]; then
insmod tga
xnu_splash /Extra/splash.tga
fi
fi
}
EOF
}
used_osprober_linux_ids=
if [ "x$GRUB_TOP_LEVEL_OS_PROBER" != x ]; then
OSPROBED=$(grub_move_to_front "$GRUB_TOP_LEVEL_OS_PROBER" ${OSPROBED})
fi
case "$GRUB_OS_PROBER_SKIP_LIST" in *@/[dD][eE][vV]/*)
grub_warn "$(gettext_printf "GRUB_OS_PROBER_SKIP_LIST contains deprecated <UUID>@/dev/* notation. The @/dev/* suffix is ignored.")"
esac
for OS in ${OSPROBED} ; do
DEVICE="`echo ${OS} | cut -d ':' -f 1`"
LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`"
BOOT="`echo ${OS} | cut -d ':' -f 4`"
unset UUID
if [ -n "${GRUB_OS_PROBER_SKIP_LIST}" ] && UUID="`${grub_probe} --target=fs_uuid --device ${DEVICE%@*}`"; then
SPACE='[[:space:],;]' # regex matching spaces and common separators
if [ x"${DEVICE##*@*}" = x ] ; then
EXPUUID="$UUID@${DEVICE#*@}"
else
EXPUUID="$UUID(@/dev/.*)?"
fi
if printf %s " ${GRUB_OS_PROBER_SKIP_LIST} " | grep -Eqie "${SPACE}${EXPUUID}${SPACE}" ; then
echo "Skipped ${LONGNAME} on ${DEVICE} by user request." >&2
continue
fi
fi
BTRFS="`echo ${OS} | cut -d ':' -f 5`"
if [ "x$BTRFS" = "xbtrfs" ]; then
BTRFSuuid="`echo ${OS} | cut -d ':' -f 6`"
BTRFSsubvol="`echo ${OS} | cut -d ':' -f 7`"
fi
if [ -z "${LONGNAME}" ] ; then
LONGNAME="${LABEL}"
fi
# os-prober returns text string followed by optional counter
CLASS="--class $(echo "${LABEL}" | LC_ALL=C sed 's,[[:digit:]]*$,,' | cut -d' ' -f1 | tr 'A-Z' 'a-z' | LC_ALL=C sed 's,[^[:alnum:]_],_,g')"
gettext_printf "Found %s on %s\n" "${LONGNAME}" "${DEVICE}" >&2
case ${BOOT} in
chain)
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
cat << EOF
# This menu entry is supported only on PC BIOS platforms.
if [ "\$grub_platform" = "pc" ]; then
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' $CLASS --class os \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}")' {
EOF
save_default_entry | grub_add_tab
prepare_grub_to_access_device ${DEVICE} | grub_add_tab
if [ x"`${grub_probe} --device ${DEVICE} --target=partmap`" = xmsdos ]; then
cat << EOF
parttool \${root} hidden-
EOF
fi
case ${LONGNAME} in
Windows\ Vista*|Windows\ 7*|Windows\ Server\ 2008*)
;;
*)
cat << EOF
drivemap -s (hd0) \${root}
EOF
;;
esac
cat <<EOF
chainloader +1
}
fi
EOF
;;
efi)
found_other_os=1
EFIPATH=${DEVICE#*@}
DEVICE=${DEVICE%@*}
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
cat << EOF
# This menu entry is supported only on EFI platforms.
if [ "\$grub_platform" = "efi" ]; then
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' $CLASS --class os \$menuentry_id_option 'osprober-efi-$(grub_get_device_id "${DEVICE}")' {
EOF
save_default_entry | sed -e "s/^/\t/"
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
cat <<EOF
chainloader ${EFIPATH}
}
fi
EOF
;;
linux)
if [ "x$BTRFS" = "xbtrfs" ]; then
LINUXPROBED="`linux-boot-prober btrfs ${BTRFSuuid} ${BTRFSsubvol} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`"
else
LINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`"
fi
prepare_boot_cache=
boot_device_id=
is_top_level=true
title_correction_code=
OS="${LONGNAME}"
for LINUX in ${LINUXPROBED} ; do
LROOT="`echo ${LINUX} | cut -d ':' -f 1`"
LBOOT="`echo ${LINUX} | cut -d ':' -f 2`"
LLABEL="`echo ${LINUX} | cut -d ':' -f 3 | tr '^' ' '`"
LKERNEL="`echo ${LINUX} | cut -d ':' -f 4`"
LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"
LPARAMS="`echo ${LINUX} | cut -d ':' -f 6- | tr '^' ' '`"
if [ -z "${LLABEL}" ] ; then
LLABEL="${LONGNAME}"
fi
if [ "${LROOT}" != "${LBOOT}" ]; then
LKERNEL="${LKERNEL#/boot}"
LINITRD="${LINITRD#/boot}"
fi
found_other_os=1
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
recovery_params="$(echo "${LPARAMS}" | grep 'single\|recovery')" || true
counter=1
while echo "$used_osprober_linux_ids" | grep 'osprober-gnulinux-$LKERNEL-${recovery_params}-$counter-$boot_device_id' > /dev/null; do
counter=$((counter+1));
done
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${DEVICE}")"
fi
used_osprober_linux_ids="$used_osprober_linux_ids 'osprober-gnulinux-$LKERNEL-${recovery_params}-$counter-$boot_device_id'"
if [ -z "${prepare_boot_cache}" ]; then
prepare_boot_cache="$(prepare_grub_to_access_device ${LBOOT} | grub_add_tab)"
fi
# The GRUB_DISABLE_SUBMENU option used to be different than others since it was
# mentioned in the documentation that has to be set to 'y' instead of 'true' to
# enable it. This caused a lot of confusion to users that set the option to 'y',
# 'yes' or 'true'. This was fixed but all of these values must be supported now.
if [ "x${GRUB_DISABLE_SUBMENU}" = xyes ] || [ "x${GRUB_DISABLE_SUBMENU}" = xy ]; then
GRUB_DISABLE_SUBMENU="true"
fi
if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
cat << EOF
menuentry '$(echo "$OS $onstr" | grub_quote)' $CLASS --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-simple-$boot_device_id' {
EOF
save_default_entry | grub_add_tab
printf '%s\n' "${prepare_boot_cache}"
cat << EOF
linux ${LKERNEL} ${LPARAMS}
EOF
if [ -n "${LINITRD}" ] ; then
cat << EOF
initrd ${LINITRD}
EOF
fi
cat << EOF
}
EOF
echo "submenu '$(gettext_printf "Advanced options for %s" "${OS} $onstr" | grub_quote)' \$menuentry_id_option 'osprober-gnulinux-advanced-$boot_device_id' {"
is_top_level=false
fi
title="${LLABEL} $onstr"
cat << EOF
menuentry '$(echo "$title" | grub_quote)' --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-$LKERNEL-${recovery_params}-$boot_device_id' {
EOF
save_default_entry | sed -e "s/^/$grub_tab$grub_tab/"
printf '%s\n' "${prepare_boot_cache}" | grub_add_tab
cat << EOF
linux ${LKERNEL} ${LPARAMS}
EOF
if [ -n "${LINITRD}" ] ; then
cat << EOF
initrd ${LINITRD}
EOF
fi
cat << EOF
}
EOF
if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
replacement_title="$(echo "Advanced options for ${OS} $onstr" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")"
fi
done
if [ x"$is_top_level" != xtrue ]; then
echo '}'
fi
echo "$title_correction_code"
;;
macosx)
if [ "${UUID=`${grub_probe} --target=fs_uuid --device ${DEVICE}`}" ]; then
OSXUUID="${UUID}"
osx_entry xnu_kernel 32
osx_entry xnu_kernel64 64
fi
;;
hurd)
found_other_os=1
onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
cat << EOF
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class hurd --class gnu --class os \$menuentry_id_option 'osprober-gnuhurd-/boot/gnumach.gz-false-$(grub_get_device_id "${DEVICE}")' {
EOF
save_default_entry | grub_add_tab
prepare_grub_to_access_device ${DEVICE} | grub_add_tab
grub_device="`${grub_probe} --device ${DEVICE} --target=drive`"
mach_device="`echo "${grub_device}" | sed -e 's/(\(hd.*\),msdos\(.*\))/\1s\2/'`"
grub_fs="`${grub_probe} --device ${DEVICE} --target=fs`"
case "${grub_fs}" in
*fs) hurd_fs="${grub_fs}" ;;
*) hurd_fs="${grub_fs}fs" ;;
esac
cat << EOF
multiboot /boot/gnumach.gz root=device:${mach_device}
module /hurd/${hurd_fs}.static ${hurd_fs} --readonly \\
--multiboot-command-line='\${kernel-command-line}' \\
--host-priv-port='\${host-port}' \\
--device-master-port='\${device-port}' \\
--exec-server-task='\${exec-task}' -T typed '\${root}' \\
'\$(task-create)' '\$(task-resume)'
module /lib/ld.so.1 exec /hurd/exec '\$(exec-task=task-create)'
}
EOF
;;
minix)
cat << EOF
menuentry "${LONGNAME} (on ${DEVICE}, Multiboot)" {
EOF
save_default_entry | sed -e "s/^/\t/"
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
cat << EOF
multiboot /boot/image_latest
}
EOF
;;
*)
# TRANSLATORS: %s is replaced by OS name.
gettext_printf "%s is not yet supported by grub-mkconfig.\n" " ${LONGNAME}" >&2
;;
esac
done
adjust_timeout
/etc/grub.d/30_uefi-firmware
#! /bin/sh
set -e
# grub-mkconfig helper script.
# Copyright (C) 2020 Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"
. "$pkgdatadir/grub-mkconfig_lib"
LABEL="UEFI Firmware Settings"
gettext_printf "Adding boot menu entry for UEFI Firmware Settings ...\n" >&2
cat << EOF
if [ "\$grub_platform" = "efi" ]; then
fwsetup --is-supported
if [ "\$?" = 0 ]; then
menuentry '$LABEL' \$menuentry_id_option 'uefi-firmware' {
fwsetup
}
fi
fi
EOF
/etc/grub.d/35_fwupd
#! /bin/sh
# SPDX-License-Identifier: LGPL-2.1-or-later
set -e
[ -d ${pkgdatadir:?} ]
# shellcheck source=/dev/null
. "$pkgdatadir/grub-mkconfig_lib"
if [ -f /var/lib/fwupd/uefi_capsule.conf ] &&
ls /sys/firmware/efi/efivars/fwupd-*-0abba7dc-e516-4167-bbf5-4d9d1c739416 1>/dev/null 2>&1; then
. /var/lib/fwupd/uefi_capsule.conf
if [ "${EFI_PATH}" != "" ] && [ "${ESP}" != "" ]; then
echo "Adding Linux Firmware Updater entry" >&2
cat <<EOF
menuentry 'Linux Firmware Updater' \$menuentry_id_option 'fwupd' {
EOF
${grub_probe:?} --version >/dev/null
prepare_grub_to_access_device "$(${grub_probe} --target=device ${ESP})" | sed -e "s/^/\t/"
cat <<EOF
chainloader ${EFI_PATH}
}
EOF
fi
fi
/etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 /usr/bin/bash
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry 'Windows ( nvme0n1p1 ) ' {
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root 853D-995A # UUID de la partition EFI
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
menuentry 'ArchLinux SSD ( nvme0n1p3 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'Arch_SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root 224086d1-a670-4587-ad74-604b39bd7444
configfile /boot/grub/grub.cfg
#linux /vmlinuz-linux root=UUID=224086d1-a670-4587-ad74-604b39bd7444 rw zswap.enabled=0 rootfstype=ext4 loglevel=3 quiet
#initrd /intel-ucode.img /initramfs-linux.img
}
menuentry 'Linux Mint 22.3 Zena SSD ( nvme0n1p5 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'LM_22.3_SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root eb18366b-2ac9-4a7e-8f93-ba2caa30e90e
configfile /boot/grub/grub.cfg
}
menuentry 'Ubuntu 20.04 LTS ( nvme0n1p6 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'Ubuntu 20.04 SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root 06bc0f51-50e8-4ed4-8090-903acdb7df3f
configfile /boot/grub/grub.cfg
}
menuentry 'Ubuntu Budgie 22.04 ( nvme0n1p7 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'U-Budgie 22.04 SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root 8ab22881-60b3-47aa-a0bf-54c292afae81
configfile /boot/grub/grub.cfg
}
menuentry 'Ubuntu 24.04 ( nvme0n1p8 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'Ubuntu 24.04 SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root dca54497-1ab2-4c12-bc82-53b817300288
configfile /boot/grub/grub.cfg
}
menuentry 'Linux Mint 22.3 Zena NEW ( nvme0n1p9 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'LM_22.3_NEW_SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root df3cd676-80e7-46ef-a28e-5dbe3ea5ddf7
configfile /boot/grub/grub.cfg
}
menuentry 'Debian Trixie ( nvme0n1p10 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'debian 13_SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root 50149f7c-d2c3-4119-b937-328b22a577d4
configfile /boot/grub/grub.cfg
}
menuentry 'Ubuntu 26.04_SSD ( nvme0n1p12 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'Ubuntu 26.04 SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root a2c52fb5-3581-49f0-8651-1684d4de6376
configfile /boot/grub/grub.cfg
}
menuentry 'Ubuntu 26.04 ( sda3 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'Ubuntu 26.04' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root 87eeac5a-1891-4e55-b4e1-9f84e7952b83
configfile /boot/grub/grub.cfg
}
/etc/grub.d/41_custom
#!/bin/sh
cat <<EOF
if [ -f \${config_directory}/custom.cfg ]; then
source \${config_directory}/custom.cfg
elif [ -z "\${config_directory}" -a -f \$prefix/custom.cfg ]; then
source \$prefix/custom.cfg
fi
EOF
/etc/grub.d/README
All executable files in this directory are processed in shell expansion order.
00_*: Reserved for 00_header.
10_*: Native boot entries.
20_*: Third party apps (e.g. memtest86+).
The number namespace in-between is configurable by system installer and/or
administrator. For example, you can add an entry to boot another OS as
01_otheros, 11_otheros, etc, depending on the position you want it to occupy in
the menu; and then adjust the default setting via /etc/default/grub.
iznobe@iznobe-PC-U26:~$ Dernière modification par iznobe (Le 30/05/2026, à 10:35)
Hors ligne
#3 Le 30/05/2026, à 11:18
- xubu1957

Re : [ résolu ] grub update fail U26.04
Bonjour,
C'est pas clair > ubuntu.pkgs.org/26.04/ubuntu-updates-main-amd64/linux-generic-hwe-24.04_7.0.0-22.22_amd64.deb.
Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [ Résolu ] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci. Membre de Linux-Azur
Hors ligne
#4 Le 30/05/2026, à 11:19
- ar barzh paour

Re : [ résolu ] grub update fail U26.04
bonjour
je suis en 7.0.0.15.15 , j'ai aussi un paquet 24.04
c'est une installation de 26.04 effectuée à la sortie de 26.04 vers avril
jpb@jpb-B760M-U26: ~ $ uname -a
Linux jpb-B760M-U26.04 7.0.0-15-generic #15-Ubuntu SMP PREEMPT_DYNAMIC Wed Apr 22 16:06:43 UTC 2026 x86_64 GNU/Linux
jpb@jpb-B760M-U26: ~ $
jpb@jpb-B760M-U26: ~ $ dpkg -l *26.04*
+-- Desired=Unknown/Install/Remove/Purge/Hold
|+- Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
||+ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||| Nom Version Architecture Description
+++-================================-============-============-=========================================
ii linux-generic-hwe-26.04 7.0.0-15.15 amd64 Complete Generic Linux kernel and headers
ii linux-headers-generic-hwe-26.04 7.0.0-15.15 amd64 Generic Linux kernel headers
un linux-image-fb-generic-hwe-26.04 <aucune> <aucune> (aucune description n'est disponible)
ii linux-image-generic-hwe-26.04 7.0.0-15.15 amd64 Generic Linux kernel imagejpb@jpb-B760M-U26: ~ $ dpkg -l *24.04*
+-- Desired=Unknown/Install/Remove/Purge/Hold
|+- Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
||+ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||| Nom Version Architecture Description
+++-=======================-============-============-================================================================
ii linux-generic-hwe-24.04 7.0.0-15.15 amd64 Complete Generic Linux kernel and headers (transitional package)PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 24.04, 22.04, 20.04,18.04,16.04 et 26.04 en test
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 24.04, 22.04 ,26.04 W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#5 Le 30/05/2026, à 12:05
- iznobe

Re : [ résolu ] grub update fail U26.04
bonjour
...
c'est une installation de 26.04 effectuée à la sortie de 26.04 vers avril
Salut , idem pour moi.
Merci pour les infos .
Hors ligne
#6 Le 30/05/2026, à 13:39
- ylag
Re : [ résolu ] grub update fail U26.04
Bonjour,
Sur la 26.04, linux-generic-hwe-24.04 est un paquet de transition pointant vers linux-generic-hwe-26.04 :
Paquet : linux-generic-hwe-24.04 - Resolute 26.04.
Curieux que ça soit présent sur un système installé en neuf.
Il semblerait y avoir un souci à la ligne 359 du fichier /boot/grub/grub.cfg
Faudrait examiner le contenu du fichier /boot/grub/grub.cfg.new, et voir ce qu'il y a vers la ligne 359 ?
A+
Dernière modification par ylag (Le 30/05/2026, à 17:16)
Hors ligne
#7 Le 30/05/2026, à 13:59
- xubu1957

Re : [ résolu ] grub update fail U26.04
Dans linuxcapable.com/how-to-install-hwe-kernel-on-ubuntu-linux :
Installer le noyau HWE pour Ubuntu 26.04
Ubuntu 26.04 prend actuellement en charge la famille de noyaux 7.0 via les métapaquets GA et HWE. L'installation du métapaquet HWE est facultative pour le moment, mais elle permet au système d'utiliser le paquet de suivi HWE spécifique à cette version pour les futures mises à jour d'activation de la compatibilité avec Ubuntu 26.04.
Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [ Résolu ] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci. Membre de Linux-Azur
Hors ligne
#8 Le 30/05/2026, à 19:53
- iznobe

Re : [ résolu ] grub update fail U26.04
Bonjour,
Il semblerait y avoir un souci à la ligne 359 du fichier /boot/grub/grub.cfg
Faudrait examiner le contenu du fichier /boot/grub/grub.cfg.new, et voir ce qu'il y a vers la ligne 359 ?A+
Tout à fait , mais je ne sais quoi penser de ce fichier , je n ' en donne que la fin , je n' arrive pas a en avoir le début :
iznobe@iznobe-PC-U26:~$ sudo cat -n /boot/grub/grub.cfg.new
...
...
{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{0{
Т
%
@
д
P
`%
bbb? -
,<L\l
7053
7054
X
$4DTdt␦ "H#x$%'8()*+8,P--l--.P./`/01234,5@6P7h89:x;<=>X?@[\@\]^P_`{{8|p}}~holopotoxo|oQoo o o
7055 e
7056 o
o
o
o
hoooooooooooo␦ooOopp
7057 pVWH_ p!p".p#:p$Fp%Sp&]p'hp(yp)p*p+p,p-p-p-p-p.p.cq/qq/p0V1p2p3p4p5F6p7p8p9p:p;q<q=q>/q?=q@Kq[_q\iq\yq]q^q^q_q`q{q{q|q}q}z~ri@dWBB/~B>~2I~"^`T~`\~`g~@S@tc^πNXnҀހހ4 ҂92b52b679fb438b940f1c17e2e4951ac52ac89.debug<k.shstrtab.note.gnu.build-id.interp.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.got.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.note.ABI-tag.note.package.init_array.fini_array.data.rel.ro.dynamic.data.bss.gnu_debuglink
PP$tt&o0
8R8RP8OOB@oMo`fBhhp v@-@-T
@@l llM@@l خخlh-hhzhhxx x4x+### END /etc/grub.d/40_custom ### @99
7058
7059 ### BEGIN /etc/grub.d/41_custom ###
7060 if [ -f ${config_directory}/custom.cfg ]; then
7061 source ${config_directory}/custom.cfg
7062 elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
7063 source $prefix/custom.cfg
7064 fi
7065 ### END /etc/grub.d/41_custom ###
iznobe@iznobe-PC-U26:~$
iznobe@iznobe-PC-U26:~$ Pour ça que je ne l ' avais pas mis auparavant ![]()
on dirait que le fichier suivant n ' est pas correctement interprété ?
c' est le même dans tous mes OS pourtant :
iznobe@iznobe-PC-U26:~$ cat /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 /usr/bin/bash
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry 'Windows ( nvme0n1p1 ) ' {
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root 853D-995A # UUID de la partition EFI
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
menuentry 'ArchLinux SSD ( nvme0n1p3 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'Arch_SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root 224086d1-a670-4587-ad74-604b39bd7444
configfile /boot/grub/grub.cfg
#linux /vmlinuz-linux root=UUID=224086d1-a670-4587-ad74-604b39bd7444 rw zswap.enabled=0 rootfstype=ext4 loglevel=3 quiet
#initrd /intel-ucode.img /initramfs-linux.img
}
menuentry 'Linux Mint 22.3 Zena SSD ( nvme0n1p5 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'LM_22.3_SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root eb18366b-2ac9-4a7e-8f93-ba2caa30e90e
configfile /boot/grub/grub.cfg
}
menuentry 'Ubuntu 20.04 LTS ( nvme0n1p6 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'Ubuntu 20.04 SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root 06bc0f51-50e8-4ed4-8090-903acdb7df3f
configfile /boot/grub/grub.cfg
}
menuentry 'Ubuntu Budgie 22.04 ( nvme0n1p7 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'U-Budgie 22.04 SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root 8ab22881-60b3-47aa-a0bf-54c292afae81
configfile /boot/grub/grub.cfg
}
menuentry 'Ubuntu 24.04 ( nvme0n1p8 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'Ubuntu 24.04 SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root dca54497-1ab2-4c12-bc82-53b817300288
configfile /boot/grub/grub.cfg
}
menuentry 'Linux Mint 22.3 Zena NEW ( nvme0n1p9 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'LM_22.3_NEW_SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root df3cd676-80e7-46ef-a28e-5dbe3ea5ddf7
configfile /boot/grub/grub.cfg
}
menuentry 'Debian Trixie ( nvme0n1p10 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'debian 13_SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root 50149f7c-d2c3-4119-b937-328b22a577d4
configfile /boot/grub/grub.cfg
}
menuentry 'Ubuntu 26.04_SSD ( nvme0n1p12 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'Ubuntu 26.04 SSD' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root a2c52fb5-3581-49f0-8651-1684d4de6376
configfile /boot/grub/grub.cfg
}
menuentry 'Ubuntu 26.04 ( sda3 )' --class ubuntu --class gnu-linux --class gnu --class os --id 'Ubuntu 26.04' {
insmod part_gpt
insmod part_msdos
insmod ext2
search --no-floppy --fs-uuid --set=root 87eeac5a-1891-4e55-b4e1-9f84e7952b83
configfile /boot/grub/grub.cfg
}
iznobe@iznobe-PC-U26:~$et je précise qu ' auparavant , les installations de noyaux précédents ont correctement fonctionné , jusqu ' a aujourd ' hui .
Dernière modification par iznobe (Le 30/05/2026, à 20:07)
Hors ligne
#9 Le 31/05/2026, à 12:50
- ylag
Re : [ résolu ] grub update fail U26.04
Bonjour,
Il y a certainement un souci avec au moins un script du répertoire /etc/grub.d, mais je manque de compétences pour diagnostiquer, désolé ...
Si je lis correctement les retours au #8, ton fichier /boot/grub/grub.cfg.new ferait plus de 7000 lignes ? Ça semble hors du commun ...
Combien de lignes pour le fichier /boot/grub/grub.cfg ?
J'y crois moyennement, mais peut-être qu'un redémarrage suivi d'une tentative de mise à jour arriverait à installer ce noyau récalcitrant ?
Sinon, as-tu songé à une réinstallation de grub, avec, si possible, une réinitialisation des scripts dans /etc/grub.d ?
En espérant que les poids lourds du forum passent par ici ... ![]()
A+
Hors ligne
#10 Le 31/05/2026, à 14:29
- steph810

Re : [ résolu ] grub update fail U26.04
Bonjour,
regarde @iznobe ton /etc/grub.d/40_custom
iznobe@iznobe-PC-U26:~$ cat /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 /usr/bin/bash
Normalement ca devrait être $0 et non /usr/bin/bash, c'est ça qui compile le binaire dans le .new
exec tail -n +3 $0remplacer et
sudo grub-mkconfig -o /boot/grub/grub.cfg.newcontrole:
sudo file /boot/grub/grub.cfg.new
sudo wc -l /boot/grub/grub.cfg.newEDIT:
Regarde les autres tu veraa $0
grep "exec tail" /etc/grub.d/*Dernière modification par steph810 (Le 31/05/2026, à 14:37)
En ligne
#11 Le 01/06/2026, à 07:33
- iznobe

Re : [ résolu ] grub update fail U26.04
Bonjour,
regarde @iznobe ton /etc/grub.d/40_customNormalement ca devrait être $0 et non /usr/bin/bash, c'est ça qui compile le binaire dans le .new
Bonjour , effectivement , c ' était bien le problème . Pourtant ça fait un bon moment que je n ' ai pas modifié ce fichier , depuis que j ' ai installé 26.04 en fait .
Curieux que ce n' est que maintenant que se déclare le soucis .
Hors ligne