Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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


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 image
jpb@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

ar barzh paour a écrit :

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

ylag a écrit :

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 roll

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

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 a écrit :

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 $0

remplacer et

sudo grub-mkconfig -o /boot/grub/grub.cfg.new

controle:

sudo file /boot/grub/grub.cfg.new
sudo wc -l /boot/grub/grub.cfg.new

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

steph810 a écrit :

Bonjour,
regarde @iznobe ton /etc/grub.d/40_custom

Normalement 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