Boot from snapshots missing from GRUB menu

The GRUB menu I get when booting is missing the option to boot from snapshots. I have used the feature many times in the past but not in the most recent months.

I have followed the advice in threads 141714 and 169726 (I can’t post links because I am a new user) as best I can, but without success.

There is a “.snapshots” entry in /etc/fstab,
/.snapshots is mounted, and running sudo grub2-mkconfig -o /boot/grub2/grub.cfg makes no difference. I also “checked” journalctl -b -p 0…4 though I am unsure what to do with that information.
The output of grep -Ev '^$|^#' /etc/default/grub is

GRUB_DISTRIBUTOR=
GRUB_DEFAULT=saved
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=8
GRUB_CMDLINE_LINUX_DEFAULT="splash=silent preempt=full mitigations=auto quiet security=apparmor nosimplefb=1"
GRUB_CMDLINE_LINUX=""
GRUB_TERMINAL="gfxterm"
GRUB_GFXMODE="auto"
GRUB_BACKGROUND=
GRUB_THEME=/boot/grub2/themes/openSUSE/theme.txt
SUSE_BTRFS_SNAPSHOT_BOOTING="true"
GRUB_USE_LINUXEFI="true"
GRUB_DISABLE_OS_PROBER="false"
GRUB_ENABLE_CRYPTODISK="n"
GRUB_CMDLINE_XEN_DEFAULT="vga=gfx-1024x768x16"

so it does include SUSE_BTRFS_SNAPSHOT_BOOTING="true".

The output of grep -Ev '$^|^#' /etc/sysconfig/bootloader is

LOADER_TYPE="grub2-efi"
SECURE_BOOT="yes"
TRUSTED_BOOT="no"
UPDATE_NVRAM="yes"

I can still make snapshots just fine. Here is the output of snapper list if it helps https://0x0.st/XrhQ.txt.

Does anyone have any ideas for how to restore the “boot from snapshots” feature?

Did it ever work on this system?

AlinderS
I have used the feature many times in the past but not in the most recent months.

Yes. And I have made no changes that should affect this since the last time I used it.

Start with showin grub.cfg. upload to https://paste.opensuse.org/

Here is my grub.cfg.
I see a section for /etc/grub.d/80_suse_btrfs_snapshot. I don’t know if it is a problem that it is empty. I have pasted the content of that file here.

This could be the problem, in my grub.cfg it’s not empty:

### BEGIN /etc/grub.d/80_suse_btrfs_snapshot ###
btrfs-mount-subvol ($root) /.snapshots @/.snapshots
if [ -f "/.snapshots/grub-snapshot.cfg" ]; then
  source "/.snapshots/grub-snapshot.cfg"
fi
### END /etc/grub.d/80_suse_btrfs_snapshot ###

You might want to reinstall the grub2-snapper-plugin package and reboot to see if that fixes the problem.

It is. Show

ls -l /.snapshots

I reinstalled grub2-snapper-plugin with zypper install --force grub2-snapper-plugin. This also reinstalles grub2. The only difference I can see after a reboot is that lines 209-210 in the grub.cfg file have been removed. But they do not seem important.

209  ### BEGIN /etc/grub.d/20_memtest86+ ###
210  ### END /etc/grub.d/20_memtest86+ ###

I looked though some older snapshots and found that in an older version of grub.cfg, I do have the same contents in the 80_suse_btrfs_snapshot section as pavinjoseph. The youngest snapshot where it is present is from 24 November.

total 8
drwxr-xr-x 1 root root 66 Aug 14 2023 372
drwxr-xr-x 1 root root 98 Aug 14 2023 375
drwxr-xr-x 1 root root 38 Oct 2 20:13 459
drwxr-xr-x 1 root root 38 Oct 5 08:35 461
drwxr-xr-x 1 root root 38 Oct 5 08:35 463
drwxr-xr-x 1 root root 38 Oct 7 09:32 465
drwxr-xr-x 1 root root 38 Oct 10 18:32 467
drwxr-xr-x 1 root root 66 Oct 14 09:48 492
drwxr-xr-x 1 root root 104 Oct 14 11:58 502
drwxr-xr-x 1 root root 66 Nov 24 22:56 626
drwxr-xr-x 1 root root 32 Feb 11 10:57 673
drwxr-xr-x 1 root root 66 Mar 13 08:00 680
drwxr-xr-x 1 root root 104 Mar 13 08:00 681
drwxr-xr-x 1 root root 66 Mar 19 21:49 682
drwxr-xr-x 1 root root 104 Mar 19 21:49 683
drwxr-xr-x 1 root root 66 Mar 20 10:49 684
drwxr-xr-x 1 root root 104 Mar 20 10:49 685
drwxr-xr-x 1 root root 66 Mar 22 21:45 686
drwxr-xr-x 1 root root 104 Mar 22 21:45 687
drwxr-xr-x 1 root root 66 Mar 23 14:53 688
drwxr-xr-x 1 root root 104 Mar 23 10:29 689
drwxr-xr-x 1 root root 104 Mar 23 14:50 726
drwxr-xr-x 1 root root 66 Mar 23 15:42 730
drwxr-xr-x 1 root root 104 Mar 23 15:42 731
drwxr-xr-x 1 root root 66 Mar 23 15:44 732
drwxr-xr-x 1 root root 142 Mar 23 15:57 733
drwxr-xr-x 1 root root 66 Mar 23 15:55 734
drwxr-xr-x 1 root root 104 Mar 23 15:59 735
drwxr-xr-x 1 root root 66 Mar 23 18:48 736
drwxr-xr-x 1 root root 104 Mar 23 18:48 737
drwxr-xr-x 1 root root 66 Mar 23 19:06 738
-rw-r----- 1 root root 2984 Mar 23 19:07 grub-snapshot.cfg

And the contents of grub-snapshot.cfg is here.

Sidenote; I am used to needing to use grub-mkconfig to regenerate the config.cfg file, but that does not seem to be the case here as running it returns grub-mkconfig: command not found. Is that correct, that I don’t need to worry about grub-mkconfig?

Try “grub2-mkconfig”.

Show

lsblk -f -o +partuuid

And do it as preformatted text. You do know how to use it. You previous output of ls -l is unreadable.

$ lsblk -f -o +partuuid
NAME FSTYPE FSVER LABEL    UUID                                 FSAVAIL FSUSE% MOUNTPOINTS PARTUUID
sda                                                                                        
├─sda1
│    ntfs                  94B443E6B443C986                                                e3bf097a-b416-4192-b957-68543ed407d2
├─sda2
│    vfat   FAT32          8277-EA36                                                       5e85e831-e57f-4a96-be97-366b3ce2b017
├─sda3
│                                                                                          51497b7c-ac92-467d-b4b3-42ab6fbc5285
└─sda4
     ntfs                  1EEA7DC4EA7D992B                                                8fa1c4bc-a6e5-46ce-8c72-3150f341ba58
sdb                                                                                        
└─sdb1
     ntfs         Elements 612D2AA97444B49B                                                469d60df-01
sdc                                                                                        
├─sdc1
│                                                                                          738837e5-58d8-4c66-a956-602f6f67f92c
└─sdc2
     ntfs         Vault    B89A8E389A8DF364                                                4d5d7047-db8e-4779-88a4-49abc3ffefbe
nvme0n1
                                                                                           
├─nvme0n1p1
│    vfat   FAT32          936D-F997                             505.1M     1% /boot/efi   980554b7-02e3-4b59-ad78-bcb1177b2742
├─nvme0n1p2
│    btrfs                 624bb25f-78d8-4053-aa5c-54144f08e546    1.5T    18% /var        5001d56b-5e85-4df6-9ef1-b3764741ea2c
│                                                                              /tmp        
│                                                                              /usr/local  
│                                                                              /srv        
│                                                                              /root       
│                                                                              /home       
│                                                                              /boot/grub2/x86_64-efi 
│                                                                              /opt        
│                                                                              /boot/grub2/i386-pc 
│                                                                              /.snapshots 
│                                                                              /           
└─nvme0n1p3
     swap   1              e954f13d-9a25-4ffe-9ad7-9cecdc71d351                [SWAP]      0584e6a3-a8fb-40b5-b5db-e10d2b26fd5a

I spotted something else that I feel might be relevant. At the top of the 80_suse_btrfs_snapshot file it says

if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] &&
   [ "x${GRUB_FS}" = "xbtrfs" ] && 
   [ -d "${SNAPSHOTS}" ]; then

and SUSE_BTRFS_SNAPSHOT_BOOTING being missing from the defaults file was discussed as a cause for this problem in another thread. I do not have a GRUB_FS field in my /etc/default/grub file. If I understand how this works, that means the snapshots section will not be added to the GRUB menu. Should GRUB_FS be in the defaults file, or is it looked for somewhere else?

Yes, you are right. The correct command is grub2-mkconfig -o /boot/grub2/grub.cfg.
However, running it does not change my config.cfg file, because it is already up to date.

No, it is detected by grub-mkconfig. Show

findmnt
cat /etc/fstab
btrfs subvolume list /
$ findmnt
TARGET                 SOURCE                  FSTYPE   OPTIONS
/                      /dev/nvme0n1p2[/@/.snapshots/673/snapshot]
                                               btrfs    rw,relatime,ssd,discard=async,space_cache,subvolid=1698,subvol=/@/.snapshots
├─/srv                 /dev/nvme0n1p2[/@/srv]  btrfs    rw,relatime,ssd,discard=async,space_cache,subvolid=260,subvol=/@/srv
├─/.snapshots          /dev/nvme0n1p2[/@/.snapshots]
│                                              btrfs    rw,relatime,ssd,discard=async,space_cache,subvolid=266,subvol=/@/.snapshots
├─/boot/grub2/i386-pc  /dev/nvme0n1p2[/@/boot/grub2/i386-pc]
│                                              btrfs    rw,relatime,ssd,discard=async,space_cache,subvolid=265,subvol=/@/boot/grub2/
├─/home                /dev/nvme0n1p2[/@/home] btrfs    rw,relatime,ssd,discard=async,space_cache,subvolid=263,subvol=/@/home
├─/boot/grub2/x86_64-efi
│                      /dev/nvme0n1p2[/@/boot/grub2/x86_64-efi]
│                                              btrfs    rw,relatime,ssd,discard=async,space_cache,subvolid=264,subvol=/@/boot/grub2/
├─/opt                 /dev/nvme0n1p2[/@/opt]  btrfs    rw,relatime,ssd,discard=async,space_cache,subvolid=262,subvol=/@/opt
├─/var                 /dev/nvme0n1p2[/@/var]  btrfs    rw,relatime,ssd,discard=async,space_cache,subvolid=257,subvol=/@/var
├─/root                /dev/nvme0n1p2[/@/root] btrfs    rw,relatime,ssd,discard=async,space_cache,subvolid=261,subvol=/@/root
│ ├─/root/.cache/doc   portal                  fuse.por rw,nosuid,nodev,relatime,user_id=0,group_id=0
│ └─/root/.gvfs        gvfsd-fuse              fuse.gvf rw,nosuid,nodev,relatime,user_id=0,group_id=0
├─/dev                 devtmpfs                devtmpfs rw,nosuid,size=4096k,nr_inodes=2029413,mode=755,inode64
│ ├─/dev/mqueue        mqueue                  mqueue   rw,nosuid,nodev,noexec,relatime
│ ├─/dev/hugepages     hugetlbfs               hugetlbf rw,nosuid,nodev,relatime,pagesize=2M
│ ├─/dev/shm           tmpfs                   tmpfs    rw,nosuid,nodev,inode64
│ └─/dev/pts           devpts                  devpts   rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000
├─/sys                 sysfs                   sysfs    rw,nosuid,nodev,noexec,relatime
│ ├─/sys/kernel/debug  debugfs                 debugfs  rw,nosuid,nodev,noexec,relatime
│ ├─/sys/kernel/tracing
│ │                    tracefs                 tracefs  rw,nosuid,nodev,noexec,relatime
│ ├─/sys/fs/fuse/connections
│ │                    fusectl                 fusectl  rw,nosuid,nodev,noexec,relatime
│ ├─/sys/kernel/config configfs                configfs rw,nosuid,nodev,noexec,relatime
│ ├─/sys/kernel/security
│ │                    securityfs              security rw,nosuid,nodev,noexec,relatime
│ ├─/sys/fs/cgroup     cgroup2                 cgroup2  rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot
│ ├─/sys/fs/pstore     pstore                  pstore   rw,nosuid,nodev,noexec,relatime
│ ├─/sys/firmware/efi/efivars
│ │                    efivarfs                efivarfs rw,nosuid,nodev,noexec,relatime
│ └─/sys/fs/bpf        bpf                     bpf      rw,nosuid,nodev,noexec,relatime,mode=700
├─/usr/local           /dev/nvme0n1p2[/@/usr/local]
│                                              btrfs    rw,relatime,ssd,discard=async,space_cache,subvolid=258,subvol=/@/usr/local
├─/tmp                 /dev/nvme0n1p2[/@/tmp]  btrfs    rw,relatime,ssd,discard=async,space_cache,subvolid=259,subvol=/@/tmp
├─/proc                proc                    proc     rw,nosuid,nodev,noexec,relatime
│ └─/proc/sys/fs/binfmt_misc
│                      systemd-1               autofs   rw,relatime,fd=33,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=203
├─/run                 tmpfs                   tmpfs    rw,nosuid,nodev,size=3258488k,nr_inodes=819200,mode=755,inode64
│ └─/run/user/1000     tmpfs                   tmpfs    rw,nosuid,nodev,relatime,size=1629244k,nr_inodes=407311,mode=700,uid=1000,gi
│   ├─/run/user/1000/doc
│   │                  portal                  fuse.por rw,nosuid,nodev,relatime,user_id=1000,group_id=100
│   └─/run/user/1000/gvfs
│                      gvfsd-fuse              fuse.gvf rw,nosuid,nodev,relatime,user_id=1000,group_id=100
└─/boot/efi            /dev/nvme0n1p1          vfat     rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname
$ cat /etc/fstab 
UUID=624bb25f-78d8-4053-aa5c-54144f08e546  /                       btrfs  defaults                      0  0
UUID=624bb25f-78d8-4053-aa5c-54144f08e546  /var                    btrfs  subvol=/@/var                 0  0
UUID=624bb25f-78d8-4053-aa5c-54144f08e546  /usr/local              btrfs  subvol=/@/usr/local           0  0
UUID=624bb25f-78d8-4053-aa5c-54144f08e546  /tmp                    btrfs  subvol=/@/tmp                 0  0
UUID=624bb25f-78d8-4053-aa5c-54144f08e546  /srv                    btrfs  subvol=/@/srv                 0  0
UUID=624bb25f-78d8-4053-aa5c-54144f08e546  /root                   btrfs  subvol=/@/root                0  0
UUID=624bb25f-78d8-4053-aa5c-54144f08e546  /opt                    btrfs  subvol=/@/opt                 0  0
UUID=624bb25f-78d8-4053-aa5c-54144f08e546  /home                   btrfs  subvol=/@/home                0  0
UUID=624bb25f-78d8-4053-aa5c-54144f08e546  /boot/grub2/x86_64-efi  btrfs  subvol=/@/boot/grub2/x86_64-efi  0  0
UUID=624bb25f-78d8-4053-aa5c-54144f08e546  /boot/grub2/i386-pc     btrfs  subvol=/@/boot/grub2/i386-pc  0  0
UUID=624bb25f-78d8-4053-aa5c-54144f08e546  /.snapshots             btrfs  subvol=/@/.snapshots          0  0
UUID=e954f13d-9a25-4ffe-9ad7-9cecdc71d351  swap                    swap   defaults                      0  0
UUID=936D-F997                             /boot/efi               vfat   utf8                          0  2
$ sudo btrfs subvolume list /
ID 256 gen 32 top level 5 path @
ID 257 gen 295532 top level 256 path @/var
ID 258 gen 295294 top level 256 path @/usr/local
ID 259 gen 295493 top level 256 path @/tmp
ID 260 gen 295266 top level 256 path @/srv
ID 261 gen 295489 top level 256 path @/root
ID 262 gen 294720 top level 256 path @/opt
ID 263 gen 295533 top level 256 path @/home
ID 264 gen 295368 top level 256 path @/boot/grub2/x86_64-efi
ID 265 gen 295266 top level 256 path @/boot/grub2/i386-pc
ID 266 gen 295495 top level 256 path @/.snapshots
ID 815 gen 138196 top level 266 path @/.snapshots/372/snapshot
ID 818 gen 138196 top level 266 path @/.snapshots/375/snapshot
ID 1104 gen 178878 top level 266 path @/.snapshots/492/snapshot
ID 1115 gen 178878 top level 266 path @/.snapshots/502/snapshot
ID 1434 gen 178878 top level 266 path @/.snapshots/626/snapshot
ID 1698 gen 295519 top level 266 path @/.snapshots/673/snapshot
ID 1764 gen 282394 top level 266 path @/.snapshots/680/snapshot
ID 1765 gen 282398 top level 266 path @/.snapshots/681/snapshot
ID 1767 gen 289869 top level 266 path @/.snapshots/682/snapshot
ID 1769 gen 290149 top level 266 path @/.snapshots/683/snapshot
ID 1770 gen 290155 top level 266 path @/.snapshots/684/snapshot
ID 1771 gen 290159 top level 266 path @/.snapshots/685/snapshot
ID 1772 gen 293877 top level 266 path @/.snapshots/686/snapshot
ID 1773 gen 294379 top level 266 path @/.snapshots/687/snapshot
ID 1774 gen 294387 top level 266 path @/.snapshots/688/snapshot
ID 1775 gen 294391 top level 266 path @/.snapshots/689/snapshot
ID 1812 gen 294895 top level 266 path @/.snapshots/726/snapshot
ID 1816 gen 295001 top level 266 path @/.snapshots/730/snapshot
ID 1817 gen 295003 top level 266 path @/.snapshots/731/snapshot
ID 1818 gen 295006 top level 266 path @/.snapshots/732/snapshot
ID 1819 gen 295027 top level 266 path @/.snapshots/733/snapshot
ID 1820 gen 295028 top level 266 path @/.snapshots/734/snapshot
ID 1821 gen 295036 top level 266 path @/.snapshots/735/snapshot
ID 1822 gen 295357 top level 266 path @/.snapshots/736/snapshot
ID 1823 gen 295362 top level 266 path @/.snapshots/737/snapshot
ID 1824 gen 295402 top level 266 path @/.snapshots/738/snapshot
ID 1825 gen 295474 top level 266 path @/.snapshots/739/snapshot
ID 1826 gen 295486 top level 266 path @/.snapshots/740/snapshot
ID 1827 gen 295487 top level 266 path @/.snapshots/741/snapshot
ID 1828 gen 295488 top level 266 path @/.snapshots/742/snapshot
ID 1829 gen 295493 top level 266 path @/.snapshots/743/snapshot

Well, run

sh -c '. /etc/default/grub; GRUB_FS=`stat -f -c %T /`; export SUSE_BTRFS_SNAPSHOT_BOOTING GRUB_FS; sh -x /etc/grub.d/80_suse_btrfs_snapshot'

and post output

+ set -e
+ SNAPSHOTS=/.snapshots
+ '[' xtrue = xtrue ']'
+ '[' 'xUNKNOWN (0x0)' = xbtrfs ']'

Do you run it as root?

I did not, but doing so produces identical results.

Copy and paste the full command and its output.

Here you go

~ $ sudo sh -c '. /etc/default/grub; GRUB_FS=`stat -f -c %T /`; export SUSE_BTRFS_SNAPSHOT_BOOTING GRUB_FS; sh -x /etc/grub.d/80_suse_btrfs_snapshot'
[sudo] password for simon: 
+ set -e
+ SNAPSHOTS=/.snapshots
+ '[' xtrue = xtrue ']'
+ '[' 'xUNKNOWN (0x0)' = xbtrfs ']'
~ $