EN démarrant mon pc tout à l'heure j'ai constaté que Manjaro n'apparaissait pas dasn le grub, seulement mes autres os (win11, kde NEon, Kubuntu).
Depuis Kubuntu j'ai installé boot repair et l'ai fait tourner.
Mais ça ne marche pas toujours pas de Manjaro dans mon menu Grub.
Ci-joint une copie du boot-info.
Si qq'un a une idée.
Merci d'avance,
Aloun
boot-repair-4ppa2056 [20230414_1842]
============================== Boot Info Summary ===============================
=> Windows 7/8/10/11/2012 is installed in the MBR of /dev/nvme0n1.
nvme0n1p1: _____________________________________________________________________
File system: vfat
Boot sector type: Windows 8/10/11/2012: FAT32
Boot sector info: No errors found in the Boot Parameter Block.
Operating System:
Boot files: /efi/Boot/bkpbootx64.efi /efi/Boot/bootx64.efi
/efi/Boot/fbx64.efi /efi/Boot/mmx64.efi
/efi/geckolinux/grubx64.efi /efi/mageia/grubx64.efi
/efi/Manjaro/grubx64.efi /efi/MX21/grubx64.efi
/efi/neon/grubx64.efi /efi/neon/mmx64.efi
/efi/neon/shimx64.efi /efi/ubuntu/grubx64.efi
/efi/ubuntu/mmx64.efi /efi/ubuntu/shimx64.efi
/efi/neon/grub.cfg /efi/ubuntu/grub.cfg
/efi/Microsoft/Boot/bootmgfw.efi
/efi/Microsoft/Boot/bootmgr.efi
/efi/Microsoft/Boot/cbmr_driver.efi
nvme0n1p2: _____________________________________________________________________
File system:
Boot sector type: -
Boot sector info:
nvme0n1p3: _____________________________________________________________________
File system: ntfs
Boot sector type: Windows 8/10/11/2012: NTFS
Boot sector info: No errors found in the Boot Parameter Block.
Operating System: Windows 10 or 11
Boot files: /Windows/System32/winload.exe
nvme0n1p4: _____________________________________________________________________
File system: ntfs
Boot sector type: Windows 8/10/11/2012: NTFS
Boot sector info: No errors found in the Boot Parameter Block.
Operating System:
Boot files:
nvme0n1p5: _____________________________________________________________________
File system: ext4
Boot sector type: -
Boot sector info:
Operating System: KDE neon 5.27
Boot files: /boot/grub/grub.cfg /etc/fstab
nvme0n1p6: _____________________________________________________________________
File system: ext4
Boot sector type: -
Boot sector info:
Operating System: Manjaro Linux
Boot files: /boot/grub/grub.cfg /etc/fstab /etc/default/grub
nvme0n1p7: _____________________________________________________________________
File system: ntfs
Boot sector type: Windows 8/10/11/2012: NTFS
Boot sector info: No errors found in the Boot Parameter Block.
Operating System:
Boot files:
nvme0n1p8: _____________________________________________________________________
File system: ext4
Boot sector type: -
Boot sector info:
Operating System: Ubuntu 22.04.2 LTS
Boot files: /boot/grub/grub.cfg /etc/fstab /etc/default/grub
================================ 4 OS detected =================================
OS#1: KDE neon 5.27 (22.04) on nvme0n1p5
OS#2: Manjaro Linux (22.1.0) on nvme0n1p6
OS#3: Ubuntu 22.04.2 LTS on nvme0n1p8
OS#4: Windows 10 or 11 on nvme0n1p3
================================ Host/Hardware =================================
CPU architecture: 64-bit
Video: TU106 [GeForce RTX 2060 Rev. A] EFI VGA from NVIDIA Corporation
BOOT_IMAGE of the installed session in use:
/boot/vmlinuz-5.15.0-69-generic root=UUID=37727857-6e69-4a10-a635-a5be91cf1fe2 ro quiet splash vt.handoff=7
df -Th / : /dev/nvme0n1p8 ext4 79G 54G 21G 73% /
===================================== UEFI =====================================
BIOS/UEFI firmware: F15a(5.17) from American Megatrends International, LLC.
The firmware is EFI-compatible, and is set in EFI-mode for this installed-session.
SecureBoot disabled (confirmed by mokutil).
BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0002,0008,0004,0003,0000,0001,0005
Boot0000* Windows Boot Manager HD(1,GPT,e156fee5-6860-4259-86a8-85d4e967c55c,0x800,0x32000)/File(\EFI\MICROSOFT\BOOT\BOOTMGFW.EFI)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}...d................
Boot0001 MX21 HD(1,GPT,e156fee5-6860-4259-86a8-85d4e967c55c,0x800,0x32000)/File(\EFI\MX21\GRUBX64.EFI)
Boot0002* ubuntu HD(1,GPT,e156fee5-6860-4259-86a8-85d4e967c55c,0x800,0x32000)/File(\EFI\UBUNTU\SHIMX64.EFI)
Boot0003* neon HD(1,GPT,e156fee5-6860-4259-86a8-85d4e967c55c,0x800,0x32000)/File(\EFI\NEON\SHIMX64.EFI)
Boot0004* mageia HD(1,GPT,e156fee5-6860-4259-86a8-85d4e967c55c,0x800,0x32000)/File(\EFI\MAGEIA\GRUBX64.EFI)
Boot0005 geckolinux HD(1,GPT,e156fee5-6860-4259-86a8-85d4e967c55c,0x800,0x32000)/File(\EFI\GECKOLINUX\GRUBX64.EFI)
Boot0008* Manjaro HD(1,GPT,e156fee5-6860-4259-86a8-85d4e967c55c,0x800,0x32000)/File(\EFI\MANJARO\GRUBX64.EFI)
64349b3622c65f495a99dbf6102496e3 nvme0n1p1/Boot/bkpbootx64.efi
64349b3622c65f495a99dbf6102496e3 nvme0n1p1/Boot/bootx64.efi
a9c517741ac31962d7feb152948ad1ee nvme0n1p1/Boot/fbx64.efi
a660182adef313615746a665966d2ccc nvme0n1p1/Boot/mmx64.efi
d2e4145806552e570667e02850566990 nvme0n1p1/geckolinux/grubx64.efi
b99467ba3e5c70382406599fc97a766b nvme0n1p1/mageia/grubx64.efi
edd5a6ae81f17d441887d323aacee263 nvme0n1p1/Manjaro/grubx64.efi
4c3ed3bea0bc26ed9faa3ecea12668b0 nvme0n1p1/MX21/grubx64.efi
3795ef72a4ed0369ca44e711527904bf nvme0n1p1/neon/grubx64.efi
fdafb5eece6caeccb788c946a28e6872 nvme0n1p1/neon/mmx64.efi
728124f6ec8e22fbdbe7034812c81b95 nvme0n1p1/neon/shimx64.efi
5ddf997e8b025bfbc2009e85b32f60dc nvme0n1p1/ubuntu/grubx64.efi
a660182adef313615746a665966d2ccc nvme0n1p1/ubuntu/mmx64.efi
64349b3622c65f495a99dbf6102496e3 nvme0n1p1/ubuntu/shimx64.efi
1218b32286c5a2baf0537f8502c8e64f nvme0n1p1/Microsoft/Boot/bootmgfw.efi
d99f2df7850c1d370e73b3214660ff5d nvme0n1p1/Microsoft/Boot/bootmgr.efi
b8796e68099026aabcebb8fcf75b21f6 nvme0n1p1/Microsoft/Boot/cbmr_driver.efi
============================= Drive/Partition Info =============================
Disks info: ____________________________________________________________________
nvme0n1 : is-GPT, no-BIOSboot, has---ESP, not-usb, not-mmc, has-os, has-win, 2048 sectors * 512 bytes
Partitions info (1/3): _________________________________________________________
nvme0n1p8 : is-os, 64, apt-get, signed grub-pc grub-efi , grub2, grub-install, grubenv-ok, update-grub, farbios
nvme0n1p7 : no-os, 64, nopakmgr, no-docgrub, nogrub, nogrubinstall, no-grubenv, noupdategrub, farbios
nvme0n1p5 : is-os, 64, apt-get, signed grub-pc grub-efi , grub1, grub-install, grubenv-ok, update-grub, farbios
nvme0n1p3 : is-os, 64, nopakmgr, no-docgrub, nogrub, nogrubinstall, no-grubenv, noupdategrub, farbios
nvme0n1p1 : no-os, 64, nopakmgr, no-docgrub, nogrub, nogrubinstall, no-grubenv, noupdategrub, not-far
nvme0n1p6 : is-os, 64, pacman, grub1 , grub2, grub-install, grubenv-ng, update-grub, farbios
nvme0n1p4 : no-os, 64, nopakmgr, no-docgrub, nogrub, nogrubinstall, no-grubenv, noupdategrub, farbios
Partitions info (2/3): _________________________________________________________
nvme0n1p8 : isnotESP, fstab-has-goodEFI, no-nt, no-winload, no-recov-nor-hid, no-bmgr, notwinboot
nvme0n1p7 : isnotESP, part-has-no-fstab, no-nt, no-winload, recovery-or-hidden, no-bmgr, notwinboot
nvme0n1p5 : isnotESP, fstab-has-goodEFI, no-nt, no-winload, no-recov-nor-hid, no-bmgr, notwinboot
nvme0n1p3 : isnotESP, part-has-no-fstab, no-nt, haswinload, no-recov-nor-hid, no-bmgr, notwinboot
nvme0n1p1 : is---ESP, part-has-no-fstab, no-nt, no-winload, no-recov-nor-hid, no-bmgr, notwinboot
nvme0n1p6 : isnotESP, fstab-has-goodEFI, no-nt, no-winload, no-recov-nor-hid, no-bmgr, notwinboot
nvme0n1p4 : isnotESP, part-has-no-fstab, no-nt, no-winload, no-recov-nor-hid, no-bmgr, notwinboot
Partitions info (3/3): _________________________________________________________
nvme0n1p8 : not--sepboot, with-boot, fstab-without-boot, not-sep-usr, with--usr, fstab-without-usr, std-grub.d, nvme0n1
nvme0n1p7 : not--sepboot, no---boot, part-has-no-fstab, not-sep-usr, no---usr, part-has-no-fstab, no--grub.d, nvme0n1
nvme0n1p5 : not--sepboot, with-boot, fstab-without-boot, not-sep-usr, with--usr, fstab-without-usr, std-grub.d, nvme0n1
nvme0n1p3 : not--sepboot, no---boot, part-has-no-fstab, not-sep-usr, no---usr, part-has-no-fstab, no--grub.d, nvme0n1
nvme0n1p1 : not--sepboot, no---boot, part-has-no-fstab, not-sep-usr, no---usr, part-has-no-fstab, no--grub.d, nvme0n1
nvme0n1p6 : not--sepboot, with-boot, fstab-without-boot, not-sep-usr, with--usr, fstab-without-usr, std-grub.d, nvme0n1
nvme0n1p4 : not--sepboot, no---boot, part-has-no-fstab, not-sep-usr, no---usr, part-has-no-fstab, no--grub.d, nvme0n1
fdisk -l (filtered): ___________________________________________________________
Disk nvme0n1: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk identifier: 94A27434-CF0E-41A4-8CD7-5362DD0C74BE
Start End Sectors Size Type
nvme0n1p1 2048 206847 204800 100M EFI System
nvme0n1p2 206848 239615 32768 16M Microsoft reserved
nvme0n1p3 239616 1024514047 1024274432 488.4G Microsoft basic data
nvme0n1p4 1024514048 1172994048 148480001 70.8G Microsoft basic data
nvme0n1p5 1745410048 1952258047 206848000 98.6G Linux filesystem
nvme0n1p6 1172994050 1321474047 148479998 70.8G Linux filesystem
nvme0n1p7 1952258048 1953521663 1263616 617M Windows recovery environment
nvme0n1p8 1576644608 1745410047 168765440 80.5G Linux filesystem
Partition table entries are not in disk order.
parted -lm (filtered): _________________________________________________________
nvme0n1:1000GB:nvme:512:512:gpt:CT1000P2SSD8:;
1:1049kB:106MB:105MB:fat32:EFI system partition:boot, esp;
2:106MB:123MB:16.8MB::Microsoft reserved partition:msftres;
3:123MB:525GB:524GB:ntfs:WIndows:msftdata;
4:525GB:601GB:76.0GB:ntfs:Disque dur:msftdata;
6:601GB:677GB:76.0GB:ext4:Manjaro:;
8:807GB:894GB:86.4GB:ext4:Kubuntu:;
5:894GB:1000GB:106GB:ext4:KDE Neon:;
7:1000GB:1000GB:647MB:ntfs::hidden, diag;
Free space >10MiB: ______________________________________________________________
nvme0n1: 645251MiB:769846MiB:124595MiB
blkid (filtered): ______________________________________________________________
NAME FSTYPE UUID PARTUUID LABEL PARTLABEL
nvme0n1
├─nvme0n1p1 vfat 58E3-4E2B e156fee5-6860-4259-86a8-85d4e967c55c EFI system partition
├─nvme0n1p2 9c8705e9-1e3e-4a30-998c-8d4224e34d7b Microsoft reserved partition
├─nvme0n1p3 ntfs 0646E43B46E42D5D 74fd7f14-01e7-44aa-a6c8-291f499d808b WIndows
├─nvme0n1p4 ntfs 5826F8A426F88472 bd272e26-5700-47b2-8614-08e59f6ee9a3 Disque dur Disque dur
├─nvme0n1p5 ext4 36eca5f9-c15c-4a03-8f2e-effa252f6371 5d3f612f-96d2-f54e-8ad4-e17e3c4167b2 KDE Neon
├─nvme0n1p6 ext4 d79d9b2b-2e9f-401a-9aac-34d82b29e10e 68946c52-429b-ac4b-bfbb-836fa7619377 Manjaro
├─nvme0n1p7 ntfs C0D0F14DD0F149E4 519b61e5-a057-46f7-b699-3274ca186c97
└─nvme0n1p8 ext4 37727857-6e69-4a10-a635-a5be91cf1fe2 85f2a19f-ea89-408a-948f-f5199223da0d Kubuntu
Mount points (filtered): _______________________________________________________
Avail Use% Mounted on
/dev/nvme0n1p1 56M 42% /mnt/boot-sav/nvme0n1p1
/dev/nvme0n1p3 234.1G 52% /media/alain/0646E43B46E42D5D
/dev/nvme0n1p4 40.8G 42% /media/alain/Disque dur
/dev/nvme0n1p5 60.1G 33% /media/alain/36eca5f9-c15c-4a03-8f2e-effa252f6371
/dev/nvme0n1p6 36.4G 42% /media/alain/d79d9b2b-2e9f-401a-9aac-34d82b29e10e
/dev/nvme0n1p7 91.1M 85% /mnt/boot-sav/nvme0n1p7
/dev/nvme0n1p8 20.8G 68% /
Mount options (filtered): ______________________________________________________
==================== nvme0n1p1/efi/neon/grub.cfg (filtered) ====================
search.fs_uuid 36eca5f9-c15c-4a03-8f2e-effa252f6371 root
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg
=================== nvme0n1p1/efi/ubuntu/grub.cfg (filtered) ===================
search.fs_uuid 37727857-6e69-4a10-a635-a5be91cf1fe2 root
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg
=================== nvme0n1p5/boot/grub/grub.cfg (filtered) ====================
GNU/Linux 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.19.0-35-generic 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.19.0-32-generic 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.15.0-67-generic 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.15.0-60-generic 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.15.0-58-generic 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.15.0-57-generic 36eca5f9-c15c-4a03-8f2e-effa252f6371
Windows Boot Manager (on nvme0n1p1) osprober-efi-58E3-4E2B
Ubuntu 22.04.2 LTS (22.04) (on nvme0n1p8) 37727857-6e69-4a10-a635-a5be91cf1fe2
Ubuntu (on nvme0n1p8) 37727857-6e69-4a10-a635-a5be91cf1fe2
Ubuntu, with Linux 5.15.0-67-generic (on nvme0n1p8) 37727857-6e69-4a10-a635-a5be91cf1fe2
Ubuntu, with Linux 5.15.0-60-generic (on nvme0n1p8) 37727857-6e69-4a10-a635-a5be91cf1fe2
Ubuntu, with Linux 5.15.0-58-generic (on nvme0n1p8) 37727857-6e69-4a10-a635-a5be91cf1fe2
### END /etc/grub.d/30_os-prober ###
UEFI Firmware Settings uefi-firmware
### END /etc/grub.d/30_uefi-firmware ###
======================== nvme0n1p5/etc/fstab (filtered) ========================
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=58E3-4E2B /boot/efi vfat defaults,noatime 0 2
UUID=36eca5f9-c15c-4a03-8f2e-effa252f6371 / ext4 defaults,noatime,discard 0 1
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
================= nvme0n1p5: Location of files loaded by Grub ==================
GiB - GB File Fragment(s)
879,067398071 = 943,891431424 boot/grub/grub.cfg 1
879,081050873 = 943,906091008 boot/vmlinuz 2
911,927745819 = 979,174961152 boot/vmlinuz-5.15.0-57-generic 1
877,544937134 = 942,256701440 boot/vmlinuz-5.15.0-58-generic 1
884,662124634 = 949,898723328 boot/vmlinuz-5.15.0-60-generic 2
879,081050873 = 943,906091008 boot/vmlinuz-5.15.0-67-generic 2
888,670528412 = 954,202714112 boot/vmlinuz-5.19.0-32-generic 1
892,217403412 = 958,011142144 boot/vmlinuz-5.19.0-35-generic 2
892,217403412 = 958,011142144 boot/vmlinuz.old 2
863,476116180 = 927,150419968 boot/initrd.img 5
861,026363373 = 924,520017920 boot/initrd.img-5.15.0-57-generic 3
863,026363373 = 926,667501568 boot/initrd.img-5.15.0-58-generic 2
864,893550873 = 928,672378880 boot/initrd.img-5.15.0-60-generic 3
863,476116180 = 927,150419968 boot/initrd.img-5.15.0-67-generic 5
864,901363373 = 928,680767488 boot/initrd.img-5.19.0-32-generic 7
860,651363373 = 924,117364736 boot/initrd.img-5.19.0-35-generic 2
=================== nvme0n1p5: ls -l /etc/grub.d/ (filtered) ===================
-rwxr-xr-x 1 root root 18683 Dec 2 16:18 10_linux
-rwxr-xr-x 1 root root 43031 Dec 2 16:18 10_linux_zfs
-rwxr-xr-x 1 root root 14180 Dec 2 16:18 20_linux_xen
-rwxr-xr-x 1 root root 13369 Dec 2 16:18 30_os-prober
-rwxr-xr-x 1 root root 1372 Dec 2 16:18 30_uefi-firmware
-rwxr-xr-x 1 root root 700 Sep 20 2022 35_fwupd
-rwxr-xr-x 1 root root 214 Dec 2 16:18 40_custom
-rwxr-xr-x 1 root root 215 Dec 2 16:18 41_custom
=================== nvme0n1p6/boot/grub/grub.cfg (filtered) ====================
Manjaro Linux d79d9b2b-2e9f-401a-9aac-34d82b29e10e
Manjaro Linux (Kernel: 6.2.10-1-MANJARO x64) d79d9b2b-2e9f-401a-9aac-34d82b29e10e
Manjaro Linux (Kernel: 6.2.10-1-MANJARO x64 - fallback initramfs) gnulinux-6.2.10-1-MANJARO x64-fallback-d79d9b2b-2e9f-401a-9aac-34d82b29e10e
Manjaro Linux (Kernel: 6.1.23-1-MANJARO x64) d79d9b2b-2e9f-401a-9aac-34d82b29e10e
Manjaro Linux (Kernel: 6.1.23-1-MANJARO x64 - fallback initramfs) gnulinux-6.1.23-1-MANJARO x64-fallback-d79d9b2b-2e9f-401a-9aac-34d82b29e10e
Manjaro Linux (Kernel: 5.15.106-1-MANJARO x64) d79d9b2b-2e9f-401a-9aac-34d82b29e10e
Manjaro Linux (Kernel: 5.15.106-1-MANJARO x64 - fallback initramfs) gnulinux-5.15.106-1-MANJARO x64-fallback-d79d9b2b-2e9f-401a-9aac-34d82b29e10e
Windows Boot Manager (sur nvme0n1p1) osprober-efi-58E3-4E2B
KDE neon 5.27 (22.04) (sur nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux (sur nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.19.0-35-generic (sur nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.19.0-32-generic (sur nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.15.0-67-generic (sur nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.15.0-60-generic (sur nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.15.0-58-generic (sur nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.15.0-57-generic (sur nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
Ubuntu 22.04.2 LTS (22.04) (sur nvme0n1p8) 37727857-6e69-4a10-a635-a5be91cf1fe2
Ubuntu (sur nvme0n1p8) 37727857-6e69-4a10-a635-a5be91cf1fe2
Ubuntu, with Linux 5.15.0-69-generic (sur nvme0n1p8) 37727857-6e69-4a10-a635-a5be91cf1fe2
Ubuntu, with Linux 5.15.0-67-generic (sur nvme0n1p8) 37727857-6e69-4a10-a635-a5be91cf1fe2
Ubuntu, with Linux 5.15.0-60-generic (sur nvme0n1p8) 37727857-6e69-4a10-a635-a5be91cf1fe2
Ubuntu, with Linux 5.15.0-58-generic (sur nvme0n1p8) 37727857-6e69-4a10-a635-a5be91cf1fe2
### END /etc/grub.d/30_os-prober ###
UEFI Firmware Settings uefi-firmware
### END /etc/grub.d/30_uefi-firmware ###
======================== nvme0n1p6/etc/fstab (filtered) ========================
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=58E3-4E2B /boot/efi vfat umask=0077 0 2
UUID=d79d9b2b-2e9f-401a-9aac-34d82b29e10e / ext4 defaults,noatime 0 1
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
==================== nvme0n1p6/etc/default/grub (filtered) =====================
GRUB_DEFAULT=saved
GRUB_TIMEOUT=5
GRUB_TIMEOUT_STYLE=hidden
GRUB_DISTRIBUTOR="Manjaro"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash udev.log_priority=3"
GRUB_CMDLINE_LINUX=""
GRUB_SAVEDEFAULT=true
GRUB_PRELOAD_MODULES="part_gpt part_msdos"
GRUB_TERMINAL_INPUT=console
GRUB_GFXMODE=auto
GRUB_GFXPAYLOAD_LINUX=keep
GRUB_DISABLE_RECOVERY=true
GRUB_DISABLE_OS_PROBER=false
GRUB_COLOR_NORMAL="light-gray/black"
GRUB_COLOR_HIGHLIGHT="green/black"
GRUB_THEME="/usr/share/grub/themes/manjaro/theme.txt"
================= nvme0n1p6: Location of files loaded by Grub ==================
GiB - GB File Fragment(s)
589,477559090 = 632,946709504 boot/grub/grub.cfg 1
604,298153877 = 648,860201984 boot/vmlinuz-5.15-x86_64 1
604,311520576 = 648,874554368 boot/vmlinuz-6.1-x86_64 2
604,319333076 = 648,882942976 boot/vmlinuz-6.2-x86_64 2
602,841866493 = 647,296525312 boot/initramfs-5.15-x86_64-fallback.img 2
604,348908424 = 648,914699264 boot/initramfs-5.15-x86_64.img 2
602,900357246 = 647,359329280 boot/initramfs-6.1-x86_64-fallback.img 1
602,856911659 = 647,312679936 boot/initramfs-6.1-x86_64.img 1
622,464875221 = 668,366570496 boot/initramfs-6.2-x86_64-fallback.img 2
602,919518471 = 647,379903488 boot/initramfs-6.2-x86_64.img 1
=================== nvme0n1p6: ls -l /etc/grub.d/ (filtered) ===================
-rwxr-xr-x 1 root root 13736 Apr 5 16:07 10_linux
-rwxr-xr-x 1 root root 14287 Apr 5 16:07 20_linux_xen
-rwxr-xr-x 1 root root 12649 Apr 5 16:07 30_os-prober
-rwxr-xr-x 1 root root 1120 Apr 5 16:07 30_uefi-firmware
-rwxr-xr-x 1 root root 722 Mar 31 13:15 35_fwupd
-rwxr-xr-x 1 root root 214 Apr 5 16:07 40_custom
-rwxr-xr-x 1 root root 215 Apr 5 16:07 41_custom
-rwxr-xr-x 1 root root 26939 Dec 19 10:57 41_snapshots-btrfs
-rwxr-xr-x 1 root root 1219 Feb 9 22:50 60_memtest86+
-rwxr-xr-x 1 root root 1394 Feb 9 22:50 60_memtest86+-efi
=================== nvme0n1p6/etc/grub.d/41_snapshots-btrfs ====================
#! /usr/bin/env bash
#
# Written by: Antynea
# BTC donation address: 1Lbvz244WA8xbpHek9W2Y12cakM6rDe5Rt
# Github: https://github.com/Antynea/grub-btrfs
#
# Purpose:
# Improves Grub by adding "btrfs snapshots" to the Grub menu.
# You can boot your system on a "snapshot" from the Grub menu.
# Supports manual snapshots, snapper, timeshift ...
# Warning : booting on read-only snapshots can be tricky.
# (Read about it, https://github.com/Antynea/grub-btrfs#warning-booting-on-read-only-snapshots-can-be-tricky)
#
# What this script does:
# - Automatically List snapshots existing on root partition (btrfs).
# - Automatically Detect if "/boot" is in separate partition.
# - Automatically Detect kernel, initramfs and intel/amd microcode in "/boot" directory on snapshots.
# - Automatically Create corresponding "menuentry" in grub.cfg.
# - Automatically detect the type/tags and descriptions/comments of snapper/timeshift snapshots.
# - Automatically generate grub.cfg if you use the provided systemd service.
#
# Installation:
# - Refer to https://github.com/Antynea/grub-btrfs#installation-
#
# Customization:
# You have the possibility to modify many parameters in /etc/default/grub-btrfs/config.
#
# Automatically update Grub
# If you would like grub-btrfs menu to automatically update when a snapshot is created or deleted:
# - Refer to https://github.com/Antynea/grub-btrfs#automatically-update-grub.
#
# Special thanks for assistance and contributions:
# - My friends
# - All contributors on Github
#
set -e
sysconfdir="/etc"
grub_btrfs_config="${sysconfdir}/default/grub-btrfs/config"
[[ -f "$grub_btrfs_config" ]] && . "$grub_btrfs_config"
[[ -f "${sysconfdir}/default/grub" ]] && . "${sysconfdir}/default/grub"
## Error Handling
print_error()
{
local err_msg="$*"
local bug_report="If you think an error has occurred, please file a bug report at \"https://github.com/Antynea/grub-btrfs\""
printf "%s\n" "${err_msg}" "${bug_report}" >&2 ;
exit 0
}
# parse arguments
while getopts :V-: opt; do
case "$opt" in
-)
case "${OPTARG}" in
version)
printf "Version %s\n" "${GRUB_BTRFS_VERSION}" >&2 ;
exit 0
;;
esac;;
V)
printf "Version %s\n" "${GRUB_BTRFS_VERSION}" >&2 ;
exit 0
;;
*)
printf "Unknown flag, exiting...\n"
exit 0
;;
esac
done
## Exit the script, if:
[[ "${GRUB_BTRFS_DISABLE,,}" == "true" ]] && print_error "GRUB_BTRFS_DISABLE is set to true (default=false)"
if ! type btrfs >/dev/null 2>&1; then print_error "btrfs-progs isn't installed"; fi
[[ -f "${GRUB_BTRFS_MKCONFIG_LIB:-/usr/share/grub/grub-mkconfig_lib}" ]] && . "${GRUB_BTRFS_MKCONFIG_LIB:-/usr/share/grub/grub-mkconfig_lib}" || print_error "grub-mkconfig_lib couldn't be found"
[[ "$(${grub_probe} --target="fs" / 2>/dev/null)" != "btrfs" ]] && print_error "Root filesystem isn't btrfs"
printf "Detecting snapshots ...\n" >&2 ;
## Submenu name
distro=$(awk -F "=" '/^NAME=/ {gsub(/"/, "", $2); print $2}' /etc/os-release)
submenuname=${GRUB_BTRFS_SUBMENUNAME:-"${distro:-Linux} snapshots"}
## Limit snapshots to show in the Grub menu (default=50)
limit_snap_show="${GRUB_BTRFS_LIMIT:-50}"
## How to sort snapshots list
btrfs_subvolume_sort="--sort=${GRUB_BTRFS_SUBVOLUME_SORT:-"-rootid"}"
## Customize GRUB directory, where "grub.cfg" file is saved
grub_directory=${GRUB_BTRFS_GRUB_DIRNAME:-"/boot/grub"}
## Customize BOOT directory, where kernels/initrams/microcode is saved.
boot_directory=${GRUB_BTRFS_BOOT_DIRNAME:-"/boot"}
## Password protection management for submenu
# Protection support for submenu (--unrestricted)
case "${GRUB_BTRFS_DISABLE_PROTECTION_SUBMENU,,}" in
true) unrestricted_access_submenu="--unrestricted ";;
*) unrestricted_access_submenu=""
esac
# Authorized users (--users foo,bar)
if [ -n "${GRUB_BTRFS_PROTECTION_AUTHORIZED_USERS}" ] ; then
protection_authorized_users="--users ${GRUB_BTRFS_PROTECTION_AUTHORIZED_USERS} "
fi
## Probe informations of Root and Boot devices
# Probe info "Root partition"
root_device=$(${grub_probe} --target=device /) # Root device
root_uuid=$(${grub_probe} --device ${root_device} --target="fs_uuid" 2>/dev/null) # UUID of the root device
root_uuid_subvolume=$(btrfs subvolume show / 2>/dev/null) || print_error "UUID of the root subvolume is not available"; # If UUID of root subvolume is not available, then exit
root_uuid_subvolume=$(awk -F":" 'match($1, /(^[ \t]+UUID)/) {sub(/^[ \t]+/, "", $2); print $2}' <<< "$root_uuid_subvolume") # UUID of the root subvolume
# Probe info "Boot partition"
boot_device=$(${grub_probe} --target=device ${boot_directory}) # Boot device
boot_uuid=$(${grub_probe} --device ${boot_device} --target="fs_uuid" 2>/dev/null) # UUID of the boot device
boot_uuid_subvolume=$(btrfs subvolume show "$boot_directory" 2>/dev/null) || boot_uuid_subvolume=" UUID: $root_uuid_subvolume"; # If boot folder isn't a subvolume, then UUID=root_uuid_subvolume
boot_uuid_subvolume=$(awk -F":" 'match($1, /(^[ \t]+UUID)/) {sub(/^[ \t]+/, "", $2); print $2}' <<< "$boot_uuid_subvolume") # UUID of the boot subvolume
boot_hs=$(${grub_probe} --device ${boot_device} --target="hints_string" 2>/dev/null) # hints string
boot_fs=$(${grub_probe} --device ${boot_device} --target="fs" 2>/dev/null) # Type filesystem of boot device
## Parameters passed to the kernel
kernel_parameters="$GRUB_CMDLINE_LINUX $GRUB_CMDLINE_LINUX_DEFAULT"
## Mount point location
grub_btrfs_mount_point=$(mktemp -dt grub-btrfs.XXXXXXXXXX)
## Class for theme
CLASS="--class snapshots --class gnu-linux --class gnu --class os"
## save IFS
oldIFS=$IFS
## Detect uuid requirement (lvm,btrfs...)
check_uuid_required() {
if [ "x${root_uuid}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
|| ! test -e "/dev/disk/by-uuid/${root_uuid}" \
|| ( test -e "${root_device}" && uses_abstraction "${root_device}" lvm ); then
LINUX_ROOT_DEVICE=${root_device}
else
LINUX_ROOT_DEVICE=UUID=${root_uuid}
fi
}
## Detect rootflags
detect_rootflags()
{
local fstabflags=$(grep -oE '^\s*[^#][[:graph:]]+\s+/\s+btrfs\s+[[:graph:]]+' "${grub_btrfs_mount_point}/${snap_dir_name_trim}/etc/fstab" \
| sed -E 's/^.*[[:space:]]([[:graph:]]+)$/\1/;s/,?subvol(id)?=[^,$]+//g;s/^,//')
rootflags="rootflags=${fstabflags:+$fstabflags,}${GRUB_BTRFS_ROOTFLAGS:+$GRUB_BTRFS_ROOTFLAGS,}"
}
unmount_grub_btrfs_mount_point()
{
if [[ -d "$grub_btrfs_mount_point" ]]; then
local wait=true
local wait_max=0
printf "Unmount %s .." "$grub_btrfs_mount_point" >&2;
while $wait; do
if grep -qs "$grub_btrfs_mount_point" /proc/mounts; then
wait_max=$((1+wait_max))
if umount "$grub_btrfs_mount_point" >/dev/null 2>&1; then
wait=false # umount successful
printf " Success\n" >&2;
elif [[ $wait_max = 10 ]]; then
printf "\nWarning: Unable to unmount %s in %s\n" "$root_device" "$grub_btrfs_mount_point" >&2;
break;
else
printf "." >&2 ; # output to show that the script is alive
sleep 2 # wait 2 seconds before retry
fi
else
wait=false # not mounted
printf " Success\n" >&2;
fi
done
if [[ "$wait" != true ]]; then
if ! rm -d "$grub_btrfs_mount_point" >/dev/null 2>&1; then
printf "Unable to delete %s: Device or ressource is busy\n" "$grub_btrfs_mount_point" >&2;
fi
fi
fi
}
## Create entry
entry()
{
echo "$@" >> "$grub_directory/grub-btrfs.new"
}
## menu entries
make_menu_entries()
{
## \" required for snap,kernels,init,microcode with space in their name
entry "submenu '${title_menu}' {
submenu '${title_submenu}' { echo }"
for k in "${name_kernel[@]}"; do
[[ ! -f "${boot_dir}"/"${k}" ]] && continue;
kversion=${k#*"-"}
for i in "${name_initramfs[@]}"; do
if [[ "${name_initramfs}" != "x" ]] ; then
# prefix_i=${i%%"-"*}
suffix_i=${i#*"-"}
# alt_suffix_i=${i##*"-"}
if [ "${kversion}" = "${suffix_i}" ]; then i="${i}";
elif [ "${kversion}.img" = "${suffix_i}" ]; then i="${i}";
elif [ "${kversion}-fallback.img" = "${suffix_i}" ]; then i="${i}";
elif [ "${kversion}.gz" = "${suffix_i}" ]; then i="${i}";
else continue;
fi
for u in "${name_microcode[@]}"; do
if [[ "${name_microcode}" != "x" ]] ; then
entry "
menuentry ' "${k}" & "${i}" & "${u}"' ${CLASS} "\$menuentry_id_option" 'gnulinux-snapshots-$boot_uuid' {"
else
entry "
menuentry ' "${k}" & "${i}"' ${CLASS} "\$menuentry_id_option" 'gnulinux-snapshots-$boot_uuid' {"
fi
entry "\
if [ x\$feature_all_video_module = xy ]; then
insmod all_video
fi
set gfxpayload=keep
insmod ${boot_fs}
if [ x\$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root ${boot_hs} ${boot_uuid}
else
search --no-floppy --fs-uuid --set=root ${boot_uuid}
fi
echo 'Loading Snapshot: "${snap_date_trim}" "${snap_dir_name_trim}"'
echo 'Loading Kernel: "${k}" ...'
linux \"${boot_dir_root_grub}/"${k}"\" root="${LINUX_ROOT_DEVICE}" ${kernel_parameters} ${rootflags}subvol=\""${snap_dir_name_trim}"\""
if [[ "${name_microcode}" != "x" ]] ; then
entry "\
echo 'Loading Microcode & Initramfs: "${u}" "${i}" ...'
initrd \"${boot_dir_root_grub}/"${u}"\" \"${boot_dir_root_grub}/"${i}"\""
else
entry "\
echo 'Loading Initramfs: "${i}" ...'
initrd \"${boot_dir_root_grub}/"${i}"\""
fi
entry " }"
count_warning_menuentries=$((1+count_warning_menuentries))
done
else
for u in "${name_microcode[@]}"; do
if [[ "${name_microcode}" != "x" ]] ; then
entry "
menuentry ' "${k}" & "${u}"' ${CLASS} "\$menuentry_id_option" 'gnulinux-snapshots-$boot_uuid' {"
else
entry "
menuentry ' "${k}"' ${CLASS} "\$menuentry_id_option" 'gnulinux-snapshots-$boot_uuid' {"
fi
entry "\
if [ x\$feature_all_video_module = xy ]; then
insmod all_video
fi
set gfxpayload=keep
insmod ${boot_fs}
if [ x\$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root ${boot_hs} ${boot_uuid}
else
search --no-floppy --fs-uuid --set=root ${boot_uuid}
fi
echo 'Loading Snapshot: "${snap_date_trim}" "${snap_dir_name_trim}"'
echo 'Loading Kernel: "${k}" ...'
linux \"${boot_dir_root_grub}/"${k}"\" root="${LINUX_ROOT_DEVICE}" ${kernel_parameters} ${rootflags}subvol=\""${snap_dir_name_trim}"\""
if [[ "${name_microcode}" != "x" ]] ; then
entry "\
echo 'Loading Microcode: "${u}" ...'
initrd \"${boot_dir_root_grub}/"${u}"\""
fi
entry " }"
count_warning_menuentries=$((1+count_warning_menuentries))
done
fi
done
done
entry "}"
}
## Trim a string from leading and trailing whitespaces
trim() {
local var="$*"
var="${var#"${var%%[![:space:]]*}"}"
var="${var%"${var##*[![:space:]]}"}"
echo -n "$var"
}
## List of snapshots on filesystem
snapshot_list()
{
local snapper_info="info.xml"
local timeshift_info="info.json"
local date_snapshots=()
local path_snapshots=()
local type_snapshots=()
local description_snapshots=()
IFS=$'\n'
for snap in $(btrfs subvolume list -sa "${btrfs_subvolume_sort}" /); do # Parse btrfs snapshots
IFS=$oldIFS
snap=($snap)
local path_snapshot=${snap[@]:13:${#snap[@]}}
if [ "$path_snapshot" = "DELETED" ]; then continue; fi # Discard deleted snapshots
[[ ${path_snapshot%%"/"*} == "<FS_TREE>" ]] && path_snapshot=${path_snapshot#*"/"} # Remove the "<FS_TREE>" string at the beginning of the path
# ignore specific path during run "grub-mkconfig"
if [ -n "${GRUB_BTRFS_IGNORE_SPECIFIC_PATH}" ] ; then
for isp in "${GRUB_BTRFS_IGNORE_SPECIFIC_PATH[@]}" ; do
[[ "${path_snapshot}" == "${isp}" ]] && continue 2;
done
fi
if [ -n "${GRUB_BTRFS_IGNORE_PREFIX_PATH}" ] ; then
for isp in "${GRUB_BTRFS_IGNORE_PREFIX_PATH[@]}" ; do
[[ "${path_snapshot}" == "${isp}"/* ]] && continue 2;
done
fi
[[ ! -d "$grub_btrfs_mount_point/$path_snapshot/boot" ]] && continue; # Discard snapshots without /boot folder
# Parse Snapper & timeshift informations
local type_snapshot="N/A"
local description_snapshot="N/A"
if [[ -s "$grub_btrfs_mount_point/${path_snapshot%"/"*}/$snapper_info" ]] ; then
type_snapshot=$(awk -F"<|>" 'match($2, /^type/) {print $3}' "$grub_btrfs_mount_point/${path_snapshot%"/"*}/$snapper_info") # search matching string beginning "type"
description_snapshot=$(awk -F"<|>" 'match($2, /^description/) {print $3}' "$grub_btrfs_mount_point/${path_snapshot%"/"*}/$snapper_info") # search matching string beginning "description"
elif [[ -s "$grub_btrfs_mount_point/${path_snapshot%"/"*}/$timeshift_info" ]] ; then
type_snapshot=$(awk -F" : " 'match($1, /^[ \t]+"tags"/) {gsub(/"|,/,"");print $2}' "$grub_btrfs_mount_point/${path_snapshot%"/"*}/$timeshift_info") # search matching string beginning "tags"
description_snapshot=$(awk -F" : " 'match($1, /^[ \t]+"comments"/) {gsub(/"|,/,"");print $2}' "$grub_btrfs_mount_point/${path_snapshot%"/"*}/$timeshift_info") # search matching string beginning "comments"
fi
[[ -z "$type_snapshot" ]] && type_snapshot=("N/A")
[[ -z "$description_snapshot" ]] && description_snapshot=("N/A")
# ignore specific {type,tag,description} of snapshot during run "grub-mkconfig"
if [ -n "${GRUB_BTRFS_IGNORE_SNAPSHOT_TYPE}" ] ; then
for ist in "${GRUB_BTRFS_IGNORE_SNAPSHOT_TYPE[@]}" ; do
[[ "${type_snapshot}" == "${ist}" ]] && continue 2;
done
fi
if [ -n "${GRUB_BTRFS_IGNORE_SNAPSHOT_DESCRIPTION}" ] ; then
for isd in "${GRUB_BTRFS_IGNORE_SNAPSHOT_DESCRIPTION[@]}" ; do
[[ "${description_snapshot}" == "${isd}" ]] && continue 2;
done
fi
local date_snapshot="${snap[@]:10:2}"
date_snapshots+=("$date_snapshot")
path_snapshots+=("$path_snapshot")
type_snapshots+=("$type_snapshot")
description_snapshots+=("$description_snapshot")
done
# Find max length of a snapshot date, needed for pretty formatting
local max_date_length=0
for i in "${date_snapshots[@]}"; do
local length="${#i}"
[[ "$length" -gt "$max_date_length" ]] && max_date_length=$length
done
# Find max length of a snapshot name, needed for pretty formatting
local max_path_length=0
for i in "${path_snapshots[@]}"; do
local length="${#i}"
[[ "$length" -gt "$max_path_length" ]] && max_path_length=$length
done
# Find max length of a snapshot type, needed for pretty formatting
local max_type_length=0
for i in "${type_snapshots[@]}"; do
local length="${#i}"
[[ "$length" -gt "$max_type_length" ]] && max_type_length=$length
done
# Find max length of a snapshot description, needed for pretty formatting
local max_description_length=0
for i in "${description_snapshots[@]}"; do
local length="${#i}"
[[ "$length" -gt "$max_description_length" ]] && max_description_length=$length
done
for i in "${!path_snapshots[@]}"; do
printf -v entry "%-${max_date_length}s | %-${max_path_length}s | %-${max_type_length}s | %-${max_description_length}s |" "${date_snapshots[$i]}" "${path_snapshots[$i]}" "${type_snapshots[$i]}" "${description_snapshots[$i]}"
echo "$entry"
done
IFS=$oldIFS
}
## Parse snapshots in snapshot_list
parse_snapshot_list()
{
snap_date=" $(echo "$item" | cut -d'|' -f1)" # column_1, first space is necessary for pretty formatting
snap_date_trim="$(trim "$snap_date")"
snap_dir_name="$(echo "$item" | cut -d'|' -f2)" # column_2
snap_dir_name_trim="$(trim "$snap_dir_name")"
snap_snapshot="$snap_dir_name" # Used by "title_format" function
snap_type="$(echo "$item" | cut -d'|' -f3)" # column_3
snap_description="$(echo "$item" | cut -d'|' -f4)" # column_4
}
## Detect kernels in "boot_directory"
detect_kernel()
{
list_kernel=()
# Original kernel (auto-detect)
for okernel in "${boot_dir}"/vmlinuz-* \
"${boot_dir}"/vmlinux-* \
"${boot_dir}"/kernel-* ; do
[[ ! -f "${okernel}" ]] && continue;
list_kernel+=("$okernel")
done
# Custom name kernel in "GRUB_BTRFS_NKERNEL"
if [ -n "${GRUB_BTRFS_NKERNEL}" ] ; then
for ckernel in "${boot_dir}/${GRUB_BTRFS_NKERNEL[@]}" ; do
[[ ! -f "${ckernel}" ]] && continue;
list_kernel+=("$ckernel")
done
fi
}
## Detect initramfs in "boot_directory"
detect_initramfs()
{
list_initramfs=()
# Original initramfs (auto-detect)
for oinitramfs in "${boot_dir}"/initrd.img-* \
"${boot_dir}"/initramfs-* \
"${boot_dir}"/initrd-* ; do
[[ ! -f "${oinitramfs}" ]] && continue;
list_initramfs+=("$oinitramfs")
done
# Custom name initramfs in "GRUB_BTRFS_NINIT"
if [ -n "${GRUB_BTRFS_NINIT}" ] ; then
for cinitramfs in "${boot_dir}/${GRUB_BTRFS_NINIT[@]}" ; do
[[ ! -f "${cinitramfs}" ]] && continue;
list_initramfs+=("$cinitramfs")
done
fi
if [ -z "${list_initramfs}" ]; then list_initramfs=(x); fi
}
## Detect microcode in "boot_directory"
detect_microcode()
{
list_ucode=()
# Original intel/amd microcode (auto-detect)
# See "https://www.gnu.org/software/grub/manual/grub/html_node/Simple-configuration.html"
for oiucode in "${boot_dir}"/intel-uc.img \
"${boot_dir}"/intel-ucode.img \
"${boot_dir}"/amd-uc.img \
"${boot_dir}"/amd-ucode.img \
"${boot_dir}"/early_ucode.cpio \
"${boot_dir}"/microcode.cpio; do
[[ ! -f "${oiucode}" ]] && continue;
list_ucode+=("$oiucode")
done
# Custom name microcode in "GRUB_BTRFS_CUSTOM_MICROCODE"
if [ -n "${GRUB_BTRFS_CUSTOM_MICROCODE}" ] ; then
for cucode in "${boot_dir}/${GRUB_BTRFS_CUSTOM_MICROCODE[@]}" ; do
[[ ! -f "${cucode}" ]] && continue
list_ucode+=("$cucode")
done
fi
if [ -z "${list_ucode}" ]; then list_ucode=(x); fi
}
## Title format in Grub-menu
declare -A title_column=( [date]=Date [snapshot]=Snapshot [type]=Type [description]=Description ) # Column title that appears in the header
title_format()
{
title_menu="|" # "|" is for visuals only
title_submenu="|" # "|" is for visuals only
[[ -z "${GRUB_BTRFS_TITLE_FORMAT}" ]] && GRUB_BTRFS_TITLE_FORMAT=("date" "snapshot" "type" "description"); # Default parameters
for key in "${!GRUB_BTRFS_TITLE_FORMAT[@]}"; do
[[ ${GRUB_BTRFS_TITLE_FORMAT[$key],,} != "${title_column[${GRUB_BTRFS_TITLE_FORMAT[$key]}],,}" ]] && continue; # User used wrong parameter
declare -n var="snap_${GRUB_BTRFS_TITLE_FORMAT[$key],,}" # $var is a indirect variable
if [[ "${#var}" -lt "${#title_column[${GRUB_BTRFS_TITLE_FORMAT[$key],,}]}" ]]; then # Add extra spaces if length of $var is smaller than the length of column, needed for pretty formatting
printf -v var "%-$(((${#title_column[${GRUB_BTRFS_TITLE_FORMAT[$key],,}]}-${#var})+${#var}))s" "${var}";
fi
var="$(sed "s/'//g" <(echo "${var}"))"
title_menu+="${var}|"
title_submenu+=" $(trim "${var}") |"
done
}
# Adds a header to the grub-btrfs.cfg file
header_menu()
{
local header_entry=""
[[ -z "${GRUB_BTRFS_TITLE_FORMAT}" ]] && GRUB_BTRFS_TITLE_FORMAT=("date" "snapshot" "type" "description"); # Default parameters
for key in "${!GRUB_BTRFS_TITLE_FORMAT[@]}"; do
[[ ${GRUB_BTRFS_TITLE_FORMAT[$key],,} != "${title_column[${GRUB_BTRFS_TITLE_FORMAT[$key]}],,}" ]] && continue; # User used wrong parameter
declare -n var="snap_${GRUB_BTRFS_TITLE_FORMAT[$key],,}" # $var is a indirect variable
# Center alignment, needed for pretty formatting
local lenght_title_column_left=$((${#var}-${#title_column[${GRUB_BTRFS_TITLE_FORMAT[$key],,}]}))
((lenght_title_column_left%2)) && lenght_title_column_left=$((lenght_title_column_left+1)); # If the difference is an odd number, add an extra space
lenght_title_column_left=$((((lenght_title_column_left/2)+${#title_column[${GRUB_BTRFS_TITLE_FORMAT[$key],,}]})));
local lenght_title_column_right=$(((${#var}-lenght_title_column_left)+1)) #+1 is necessary for extra "|" character
header_entry+=$(printf "%${lenght_title_column_left}s%${lenght_title_column_right}s" "${title_column[${GRUB_BTRFS_TITLE_FORMAT[$key],,}]}" "|") # Final "|" is for visuals only
done
sed -i "1imenuentry '|${header_entry}' { echo }" "$grub_directory/grub-btrfs.new" # First "|" is for visuals only
}
## List of kernels, initramfs and microcode in snapshots
boot_bounded()
{
# Initialize menu entries
IFS=$'\n'
for item in $(snapshot_list); do
[[ ${limit_snap_show} -le 0 ]] && break; # fix: limit_snap_show=0
IFS=$oldIFS
parse_snapshot_list
boot_dir="$grub_btrfs_mount_point/$snap_dir_name_trim$boot_directory"
detect_kernel
if [ -z "${list_kernel}" ]; then continue; fi
name_kernel=("${list_kernel[@]##*"/"}")
detect_initramfs
name_initramfs=("${list_initramfs[@]##*"/"}")
detect_microcode
name_microcode=("${list_ucode[@]##*"/"}")
detect_rootflags
title_format
boot_dir_root_grub="$(make_system_path_relative_to_its_root "${boot_dir}")" # convert "boot_directory" to root of GRUB (e.g /boot become /)
make_menu_entries
# show snapshot found during run "grub-mkconfig"
if [[ "${GRUB_BTRFS_SHOW_SNAPSHOTS_FOUND:-"true"}" = "true" ]]; then
printf "Found snapshot: %s\n" "$item" >&2 ;
fi
# Limit snapshots found during run "grub-mkconfig"
count_limit_snap=$((1+count_limit_snap))
[[ $count_limit_snap -ge $limit_snap_show ]] && break;
done
IFS=$oldIFS
}
boot_separate()
{
boot_dir="${boot_directory}"
boot_dir_root_grub="$(make_system_path_relative_to_its_root "${boot_dir}")" # convert "boot_directory" to root of GRUB (e.g /boot become /)
detect_kernel
if [ -z "${list_kernel}" ]; then print_error "Kernels not found."; fi
name_kernel=("${list_kernel[@]##*"/"}")
detect_initramfs
name_initramfs=("${list_initramfs[@]##*"/"}")
detect_microcode
name_microcode=("${list_ucode[@]##*"/"}")
# Initialize menu entries
IFS=$'\n'
for item in $(snapshot_list); do
[[ ${limit_snap_show} -le 0 ]] && break; # fix: limit_snap_show=0
IFS=$oldIFS
parse_snapshot_list
detect_rootflags
title_format
make_menu_entries
# show snapshot found during run "grub-mkconfig"
if [[ "${GRUB_BTRFS_SHOW_SNAPSHOTS_FOUND:-"true"}" = "true" ]]; then
printf "Found snapshot: %s\n" "$item" >&2 ;
fi
# Limit snapshots found during run "grub-mkconfig"
count_limit_snap=$((1+count_limit_snap))
[[ $count_limit_snap -ge $limit_snap_show ]] && break;
done
IFS=$oldIFS
}
rm -f "$grub_directory/grub-btrfs.new"
> "$grub_directory/grub-btrfs.new" # Create a "grub-btrfs.new" file in "grub_directory"
# Create mount point then mounting
[[ ! -d $grub_btrfs_mount_point ]] && mkdir -p "$grub_btrfs_mount_point"
mount -o ro,subvolid=5 /dev/disk/by-uuid/"$root_uuid" "$grub_btrfs_mount_point/"
trap "unmount_grub_btrfs_mount_point" EXIT # unmounting mount point on EXIT signal
count_warning_menuentries=0 # Count menuentries
count_limit_snap=0 # Count snapshots
check_uuid_required
# Detects if /boot is a separate partition
[[ "${GRUB_BTRFS_OVERRIDE_BOOT_PARTITION_DETECTION,,}" == "true" ]] && printf "Override boot partition detection : enable \n" >&2 && boot_separate;
if [[ "$root_uuid" != "$boot_uuid" ]] || [[ "$root_uuid_subvolume" != "$boot_uuid_subvolume" ]]; then boot_separate ; else boot_bounded ; fi
# Show warn, menuentries exceeds 250 entries
[[ $count_warning_menuentries -ge 250 ]] && printf "Generated %s total GRUB entries. You might experience issues loading snapshots menu in GRUB.\n" "${count_warning_menuentries}" >&2 ;
# Show total found snapshots
if [[ "${GRUB_BTRFS_SHOW_TOTAL_SNAPSHOTS_FOUND:-"true"}" = "true" && -n "${count_limit_snap}" && "${count_limit_snap}" != "0" ]]; then
printf "Found %s snapshot(s)\n" "${count_limit_snap}" >&2 ;
fi
# if no snapshot found, exit
if [[ "${count_limit_snap}" = "0" || -z "${count_limit_snap}" ]]; then
print_error "No snapshots found."
fi
# Make a submenu in GRUB (grub.cfg) and move "grub-btrfs.new" to "grub-btrfs.cfg"
header_menu
if "${bindir}/${GRUB_BTRFS_SCRIPT_CHECK:-grub-script-check}" "$grub_directory/grub-btrfs.new"; then
cat "$grub_directory/grub-btrfs.new" > "$grub_directory/grub-btrfs.cfg"
rm -f "$grub_directory/grub-btrfs.new"
cat << EOF
submenu '${submenuname}' ${protection_authorized_users}${unrestricted_access_submenu}{
configfile "\${prefix}/grub-btrfs.cfg"
}
EOF
else
print_error "Syntax errors were detected in generated ${grub_directory}/grub-btrfs.new file. Old grub-btrfs.cfg (if present) was not replaced."
fi
# warn when this script is run but there is no entry in grub.cfg
grep "snapshots-btrfs" "${grub_directory}/grub.cfg" || printf "\nWARNING: '%s' needs to run at least once to generate the snapshots (sub)menu entry in grub the main menu. \
After that this script can run alone to generate the snapshot entries.\n\n" "${GRUB_BTRFS_MKCONFIG:-grub-mkconfig}" >&2 ;
=================== nvme0n1p8/boot/grub/grub.cfg (filtered) ====================
Ubuntu 37727857-6e69-4a10-a635-a5be91cf1fe2
Ubuntu, with Linux 5.15.0-69-generic 37727857-6e69-4a10-a635-a5be91cf1fe2
Ubuntu, with Linux 5.15.0-67-generic 37727857-6e69-4a10-a635-a5be91cf1fe2
Windows Boot Manager (on nvme0n1p1) osprober-efi-58E3-4E2B
KDE neon 5.27 (22.04) (on nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux (on nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.19.0-35-generic (on nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.19.0-32-generic (on nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.15.0-67-generic (on nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.15.0-60-generic (on nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.15.0-58-generic (on nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
GNU/Linux, with Linux 5.15.0-57-generic (on nvme0n1p5) 36eca5f9-c15c-4a03-8f2e-effa252f6371
### END /etc/grub.d/30_os-prober ###
UEFI Firmware Settings uefi-firmware
### END /etc/grub.d/30_uefi-firmware ###
======================== nvme0n1p8/etc/fstab (filtered) ========================
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/nvme0n1p8 during installation
UUID=37727857-6e69-4a10-a635-a5be91cf1fe2 / ext4 errors=remount-ro 0 1
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=58E3-4E2B /boot/efi vfat umask=0077 0 1
==================== nvme0n1p8/etc/default/grub (filtered) =====================
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
GRUB_DISABLE_OS_PROBER=false
================= nvme0n1p8: Location of files loaded by Grub ==================
GiB - GB File Fragment(s)
793,400074005 = 851,906842624 boot/grub/grub.cfg 1
820,165069580 = 880,645537792 boot/vmlinuz 2
829,641624451 = 890,820911104 boot/vmlinuz-5.15.0-67-generic 2
820,165069580 = 880,645537792 boot/vmlinuz-5.15.0-69-generic 2
829,641624451 = 890,820911104 boot/vmlinuz.old 2
827,537105560 = 888,561201152 boot/initrd.img 4
824,677730560 = 885,490970624 boot/initrd.img-5.15.0-67-generic 3
827,537105560 = 888,561201152 boot/initrd.img-5.15.0-69-generic 4
824,677730560 = 885,490970624 boot/initrd.img.old 3
=================== nvme0n1p8: ls -l /etc/grub.d/ (filtered) ===================
-rwxr-xr-x 1 root root 18683 Apr 15 2022 10_linux
-rwxr-xr-x 1 root root 43031 Apr 15 2022 10_linux_zfs
-rwxr-xr-x 1 root root 14180 Apr 15 2022 20_linux_xen
-rwxr-xr-x 1 root root 13369 Apr 15 2022 30_os-prober
-rwxr-xr-x 1 root root 1372 Apr 15 2022 30_uefi-firmware
-rwxr-xr-x 1 root root 700 Feb 19 2022 35_fwupd
-rwxr-xr-x 1 root root 214 Apr 15 2022 40_custom
-rwxr-xr-x 1 root root 215 Apr 15 2022 41_custom
Suggested repair: ______________________________________________________________
The default repair of the Boot-Repair utility would reinstall the grub-efi of
nvme0n1p8,
using the following options: nvme0n1p1/boot/efi
Additional repair would be performed: unhide-bootmenu-10s use-standard-efi-file restore-efi-backups
Final advice in case of suggested repair: ______________________________________
Please do not forget to make your UEFI firmware boot on the Ubuntu 22.04.2 LTS entry (nvme0n1p1/efi/****/grub****.efi (**** will be updated in the final message) file) !
If your computer reboots directly into Windows, try to change the boot order in your UEFI firmware.
If your UEFI firmware does not allow to change the boot order, change the default boot entry of the Windows bootloader.
For example you can boot into Windows, then type the following command in an admin command prompt:
bcdedit /set {bootmgr} path \EFI\****\grub****.efi (**** will be updated in the final message)