Missing btrfs timeshift snapshots with grub update

Since long time already my GRUB update finds only one old snapshot and I didn’t figure out how to make it discover the other snapshots again. Thanks in advance for help on this issue!

Find below the output of some relevant commands I believe. Both timeshift and btrfs list all the snapshots, but update-grub just ignores them.

sudo update-grub or sudo grub-mkconfig -o /boot/grub/grub.cfg

Generating grub configuration file ...
Found theme: /usr/share/grub/themes/manjaro/theme.txt
Found linux image: /boot/vmlinuz-6.18-x86_64
Found initrd image: /boot/intel-ucode.img /boot/amd-ucode.img /boot/initramfs-6.18-x86_64.img
Found linux image: /boot/vmlinuz-6.12-x86_64
Found initrd image: /boot/intel-ucode.img /boot/amd-ucode.img /boot/initramfs-6.12-x86_64.img
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
Found Windows Boot Manager on /dev/nvme0n1p1@/EFI/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for UEFI Firmware Settings ...
Detecting snapshots ...
Found snapshot: 2025-12-15 14:10:38 | timeshift-btrfs/snapshots/2025-12-15_14-10-38/@ | ondemand | before X11 removal update                     |
Found 1 snapshot(s)
Unmount /tmp/grub-btrfs.Zh4d7PoctY .. Success
Found memtest86+ image: /boot/memtest86+/memtest.bin
Found memtest86+ EFI image: /boot/memtest86+/memtest.efi
done

sudo btrfs subvolume list /

ID 256 gen 132647 top level 5 path @
ID 257 gen 132937 top level 5 path @home
ID 258 gen 132817 top level 5 path @cache
ID 259 gen 132937 top level 5 path @log
ID 268 gen 1312 top level 5 path @swap
ID 282 gen 132937 top level 5 path timeshift-btrfs/snapshots/2025-12-15_14-10-38/@
ID 298 gen 132195 top level 5 path timeshift-btrfs/snapshots/2026-03-24_10-45-54/@
ID 303 gen 132195 top level 5 path timeshift-btrfs/snapshots/2026-03-24_11-37-19/@
ID 310 gen 132195 top level 5 path timeshift-btrfs/snapshots/2026-04-28_17-00-01/@
ID 315 gen 132195 top level 5 path timeshift-btrfs/snapshots/2026-05-05_17-00-00/@
ID 316 gen 132195 top level 5 path timeshift-btrfs/snapshots/2026-05-06_13-25-53/@
ID 317 gen 132195 top level 5 path timeshift-btrfs/snapshots/2026-05-11_10-55-01/@
ID 318 gen 132195 top level 5 path timeshift-btrfs/snapshots/2026-05-12_17-00-00/@
ID 319 gen 132648 top level 5 path timeshift-btrfs/snapshots/2026-05-18_10-18-32/@

sudo timeshift --list

Mounted '/dev/dm-0 (nvme0n1p5)' (subvolid=0) at '/run/timeshift/458634/backup'
btrfs: Quotas are not enabled
Device : /dev/dm-0 (nvme0n1p5)
UUID   : a82e0673-67d0-45cf-a20e-e3bafc2f87cf
Path   : /run/timeshift/458634/backup
Mode   : BTRFS
Status : OK
9 snapshots, 1.6 GB free

Num     Name                 Tags  Description                                    
------------------------------------------------------------------------------
0    >  2025-12-15_14-10-38  O     before X11 removal update                      
1    >  2026-03-24_10-45-54  O     test                                           
2    >  2026-03-24_11-37-19  O                                                    
3    >  2026-04-28_17-00-01  W                                                    
4    >  2026-05-05_17-00-00  W                                                    
5    >  2026-05-06_13-25-53  O     {timeshift-autosnap} {created before upgrade}  
6    >  2026-05-11_10-55-01  O     {timeshift-autosnap} {created before upgrade}  
7    >  2026-05-12_17-00-00  W                                                    
8    >  2026-05-18_10-18-32  O     {timeshift-autosnap} {created before upgrade}  

sudo /usr/bin/grub-btrfsd --verbose --timeshift-auto during manual creation of a snapshot

It detects that a change in snapshots happened, but again it updates grub only with the old snapshot.

Arguments:
Snapshot directories: 
Timestift autodetection: true
Timeshift old: false
Logfile: 0
Recursive: false
grub-btrfsd starting up...
Subdaemon function started, PID: 465891
465891: Entering infinite while for timeshift
465891: Snapshot dir watchtimeout: 15
Watching /run/timeshift for timeshift to start
Setting up watches.
Watches established.
/run/timeshift/ CREATE,ISDIR 466047
465891: detected Timeshift startup, PID is: 466047
465891: new snapshots directory is /run/timeshift/466047/backup/timeshift-btrfs/snapshots
### BEGIN /etc/grub.d/41_snapshots-btrfs ###
### END /etc/grub.d/41_snapshots-btrfs ###
Detecting snapshots ...
Found snapshot: 2025-12-15 14:10:38 | timeshift-btrfs/snapshots/2025-12-15_14-10-38/@ | ondemand | before X11 removal update                     |
if [ ! -e "${prefix}/grub-btrfs.cfg" ]; then
echo ""
else
submenu 'Manjaro Linux snapshots' {
    configfile "${prefix}/grub-btrfs.cfg"
}
fi
Found 1 snapshot(s)
Unmount /tmp/grub-btrfs.TYvNllDO5g .. Success
Grub submenu recreated
465891: Watching /run/timeshift/466047/backup/timeshift-btrfs/snapshots for new snapshots...
Setting up watches.
Watches established.
/run/timeshift/466047/backup/timeshift-btrfs/snapshots/ CREATE,ISDIR 2026-05-18_13-00-54
465891: Detected snapshot creation/ deletion, recreating Grub menu
### BEGIN /etc/grub.d/41_snapshots-btrfs ###
### END /etc/grub.d/41_snapshots-btrfs ###
Detecting snapshots ...
Found snapshot: 2025-12-15 14:10:38 | timeshift-btrfs/snapshots/2025-12-15_14-10-38/@ | ondemand | before X11 removal update                     |
if [ ! -e "${prefix}/grub-btrfs.cfg" ]; then
echo ""
else
submenu 'Manjaro Linux snapshots' {
    configfile "${prefix}/grub-btrfs.cfg"
}
fi
Found 1 snapshot(s)
Unmount /tmp/grub-btrfs.1D700n6hPT .. Success
Grub submenu recreated
465891: Watching /run/timeshift/466047/backup/timeshift-btrfs/snapshots for new snapshots...
Setting up watches.
Watches established.

Versions

Kernel 6.18.26-1
grub-btrfs 4.14-1 (Version 4.13-yabsnap_info_support-2024-03-06T13:43:57+00:00)
timeshift 25.12.4-1

I’m not much of an expert, but one question is: what is the output of

systemctl status grub-btrfsd

It’s disabled.

systemctl status grub-btrfsd

○ grub-btrfsd.service - Regenerate grub-btrfs.cfg
     Loaded: loaded (/etc/systemd/system/grub-btrfsd.service; disabled; preset: disabled)
     Active: inactive (dead)

systemctl start grub-btrfsd

systemctl status grub-btrfsd

× grub-btrfsd.service - Regenerate grub-btrfs.cfg
     Loaded: loaded (/etc/systemd/system/grub-btrfsd.service; disabled; preset: disabled)
     Active: failed (Result: exit-code) since Mon 2026-05-18 16:08:19 CEST; 2s ago
   Duration: 37ms
 Invocation: 868e85132b4e444eae91fbe486871a5d
    Process: 472865 ExecStart=/usr/bin/grub-btrfsd --syslog /.snapshots (code=exited, status=1/FAILURE)
   Main PID: 472865 (code=exited, status=1/FAILURE)
   Mem peak: 2M
        CPU: 22ms

May 18 16:08:19 tqnz grub-btrfsd[472874]: [!] Please specify a valid snapshot directory
May 18 16:08:19 tqnz systemd[1]: grub-btrfsd.service: Main process exited, code=exited, status=1/FAILURE
May 18 16:08:19 tqnz systemd[1]: grub-btrfsd.service: Failed with result 'exit-code'.

Fails because /.snapshots does not exist and missing --timeshift-auto argument. But anyhow, this is just calling the same program as above (Missing btrfs timeshift snapshots with grub update).

Here some more detailed information (if it helps?):

sudo btrfs subvolume list -apcguqRts /

ID gen cgen parent top level otime parent_uuid received_uuid uuid path
282 133029 30564 5 5 2025-12-15 14:10:38 aa4550a0-16c6-d248-b8c1-c3357aa6390b - ff695a8e-e10f-5142-ad5b-f0d84eabc62c
298 132195 111229 5 5 2026-03-24 10:45:54 aa4550a0-16c6-d248-b8c1-c3357aa6390b - dffdab9e-bfd3-774c-ad48-c7921f4b679f
303 132195 111351 5 5 2026-03-24 11:37:19 aa4550a0-16c6-d248-b8c1-c3357aa6390b - 8c9e42ef-a631-b546-9662-40b7520bb6cd
310 132195 124756 5 5 2026-04-28 17:00:01 aa4550a0-16c6-d248-b8c1-c3357aa6390b - 6b82b490-1b88-3c47-acf5-5468ea5a9ac7
315 132195 127358 5 5 2026-05-05 17:00:00 aa4550a0-16c6-d248-b8c1-c3357aa6390b - c1003539-116a-6242-94bd-a1af2454fb30
316 132195 127739 5 5 2026-05-06 13:25:53 aa4550a0-16c6-d248-b8c1-c3357aa6390b - 87956ad4-9ad0-bb47-9e6c-078801607848
317 132195 128943 5 5 2026-05-11 10:55:01 aa4550a0-16c6-d248-b8c1-c3357aa6390b - 528f2354-083b-464b-bcb5-1eb67d9d491a
318 132195 130058 5 5 2026-05-12 17:00:00 aa4550a0-16c6-d248-b8c1-c3357aa6390b - f61862a6-8ad7-bb4f-810a-7e47c0e9d96a
319 132648 132647 5 5 2026-05-18 10:18:32 aa4550a0-16c6-d248-b8c1-c3357aa6390b - 865da248-bc17-c241-b63c-ce17d0f9f8d5
320 132955 132954 5 5 2026-05-18 13:00:54 aa4550a0-16c6-d248-b8c1-c3357aa6390b - b00bd5b9-cbe2-864c-b96c-0fddede4ae4c

This never works on a standard Manjaro install, and the service is not used.

At least it doesn’t come configured anyway, it is my understanding that Manjaro’s own custom scripts do away with the need for the service.

You can look at the pacman hook yourself:

/usr/share/libalpm/hooks/00-timeshift-autosnap.hook


Trigger]
Operation = Upgrade
Type = Package
Target = *

[Action]
Description = Creating Timeshift snapshot before upgrade...
Depends = timeshift
When = PreTransaction
Exec = /usr/bin/timeshift-autosnap
AbortOnFail

At the end of: /usr/bin/timeshift-autosnap, it writes out the snapshots in the end calling: /etc/grub.d/41_snapshots-btrfs.

(Never using the grub-btrfsd service.)

The only thing I ve configured around this, is the number of snapshots to boot. You shouldn’t have to touch anything else around grub-btrfs.

These scripts heavily rely on regex parsing, so changing things in this exact area can easily break things.

That said, is only one (old) snapshot getting added to grub, when you upgrade normally as well?

If so…

Are the snapshots writable? They don’t get added otherwrise.

e.g.

# You can mount yourself rather than piggybacking off the GUI
sudo mount -o subvol=/ /dev/nvme0n1p5 /mnt
sudo btrfs prop get /mnt/timeshift-btrfs/snapshots/2026-05-18_09-45-49/@
sudo btrfs prop get /mnt/timeshift-btrfs/snapshots/2026-05-18_09-45-49/@home

Should return:

ro=false
ro=false

Meaning read only is off, and you can write to (and boot) it.

2 Likes

Yes. Both times, the issue likely lies somewhere in the script /etc/grub.d/41_snapshots-btrfs.

Because of encryption I was running

sudo mount -o subvol=/ /dev/dm-0 /tmp/timeX
for f in /tmp/timeX/timeshift-btrfs/snapshots/*/@*; do echo $f; sudo btrfs prop get $f; done

and all of the snapshots returned ro=false:

/tmp/timeX/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@
ro=false
/tmp/timeX/timeshift-btrfs/snapshots/2026-03-24_10-45-54/@
ro=false
/tmp/timeX/timeshift-btrfs/snapshots/2026-03-24_11-37-19/@
ro=false
/tmp/timeX/timeshift-btrfs/snapshots/2026-04-28_17-00-01/@
ro=false
/tmp/timeX/timeshift-btrfs/snapshots/2026-05-05_17-00-00/@
ro=false
/tmp/timeX/timeshift-btrfs/snapshots/2026-05-06_13-25-53/@
ro=false
/tmp/timeX/timeshift-btrfs/snapshots/2026-05-11_10-55-01/@
ro=false
/tmp/timeX/timeshift-btrfs/snapshots/2026-05-12_17-00-00/@
ro=false
/tmp/timeX/timeshift-btrfs/snapshots/2026-05-18_10-18-32/@
ro=false
/tmp/timeX/timeshift-btrfs/snapshots/2026-05-18_13-00-54/@
ro=false

(Home is not snap-shotted, but that is how I want it.)

I don’t know if it brings any information, but: At some point I was booting into one of the snapshots and then created snapshots from this time-point. Later, even going further back in time, and again snapshotting. Now, 2025-12-15_14-10-38 is the last remaining snapshot. Because the switch to Wayland was without hick-ups maybe I just remove this snapshot and see what happens?

The bug from restoring in Timeshift when booting snapshots has been long fixed.

Wait.

When you are booting into this snapshots, what exactly are you doing?

What state is it in now?

What is the output of:

findmnt /

And we may need the contents of /boot/grub/grub.cfg as well.

I used the GRUB menu and there I selected the snapshot I wanted to boot into. After that I continued booting normally without any extra selection in the GRUB boot menu (and snapshotting in between some times). I don’t remember any extra steps (but also this happened a while ago already).

findmnt / | cat

gives me

TARGET SOURCE                                                                                                  FSTYPE OPTIONS
/      /dev/mapper/luks-c38fb5c8-eabf-447e-a8f9-337b052ec8ce[/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@] btrfs  rw,relatime,compress=zstd:1,ssd,space_cache=v2,subvolid=282,subvol=/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@
/boot/grub/grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
insmod part_gpt
insmod part_msdos
if [ -s $prefix/grubenv ]; then
  load_env
fi

if [ "${env_block}" ] ; then
  set env_block="(${root})${env_block}"
  export env_block
  load_env -f "${env_block}"
fi

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="${saved_entry}"
fi

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
}

function load_video {
  if [ x$grub_platform = xefi ]; then
    insmod efi_gop
    insmod efi_uga
  elif [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

set menu_color_normal=light-gray/black
set menu_color_highlight=green/black

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_gpt
insmod cryptodisk
insmod luks
insmod gcry_rijndael
insmod gcry_rijndael
insmod gcry_sha256
insmod btrfs
cryptomount -u c38fb5c8eabf447ea8f9337b052ec8ce
set root='cryptouuid/c38fb5c8eabf447ea8f9337b052ec8ce'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint='cryptouuid/c38fb5c8eabf447ea8f9337b052ec8ce'  a82e0673-67d0-45cf-a20e-e3bafc2f87cf
else
  search --no-floppy --fs-uuid --set=root a82e0673-67d0-45cf-a20e-e3bafc2f87cf
fi
    font="/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=en_GB
  insmod gettext
fi
terminal_input console
terminal_output gfxterm
insmod part_gpt
insmod cryptodisk
insmod luks
insmod gcry_rijndael
insmod gcry_rijndael
insmod gcry_sha256
insmod btrfs
cryptomount -u c38fb5c8eabf447ea8f9337b052ec8ce
set root='cryptouuid/c38fb5c8eabf447ea8f9337b052ec8ce'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint='cryptouuid/c38fb5c8eabf447ea8f9337b052ec8ce'  a82e0673-67d0-45cf-a20e-e3bafc2f87cf
else
  search --no-floppy --fs-uuid --set=root a82e0673-67d0-45cf-a20e-e3bafc2f87cf
fi
insmod gfxmenu
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/dejavu_sans_12.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/dejavu_sans_14.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/dejavu_sans_16.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/dejavu_sans_24.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/dejavu_sans_48.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/dejavu_sans_bold_16.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/dejavu_sans_mono_12.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/terminus-12.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/terminus-14.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/terminus-16.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/terminus-18.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/terminus-b12.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/terminus-b14.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/terminus-b16.pf2
loadfont ($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/terminus-b18.pf2
insmod png
set theme=($root)/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/usr/share/grub/themes/manjaro/theme.txt
export theme
if [ x$feature_timeout_style = xy ] ; then
  set timeout_style=hidden
  set timeout=5
# Fallback hidden-timeout code in case the timeout_style feature is
# unavailable.
elif sleep --interruptible 5 ; then
  set timeout=0
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/10_linux ###
menuentry 'Manjaro Linux' --class manjaro --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a82e0673-67d0-45cf-a20e-e3bafc2f87cf' {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_gpt
	insmod cryptodisk
	insmod luks
	insmod gcry_rijndael
	insmod gcry_rijndael
	insmod gcry_sha256
	insmod btrfs
	cryptomount -u c38fb5c8eabf447ea8f9337b052ec8ce
	set root='cryptouuid/c38fb5c8eabf447ea8f9337b052ec8ce'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint='cryptouuid/c38fb5c8eabf447ea8f9337b052ec8ce'  a82e0673-67d0-45cf-a20e-e3bafc2f87cf
	else
	  search --no-floppy --fs-uuid --set=root a82e0673-67d0-45cf-a20e-e3bafc2f87cf
	fi
	linux	/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/vmlinuz-6.18-x86_64 root=UUID=a82e0673-67d0-45cf-a20e-e3bafc2f87cf rw rootflags=subvol=timeshift-btrfs/snapshots/2025-12-15_14-10-38/@  quiet cryptdevice=UUID=c38fb5c8-eabf-447e-a8f9-337b052ec8ce:luks-c38fb5c8-eabf-447e-a8f9-337b052ec8ce root=/dev/mapper/luks-c38fb5c8-eabf-447e-a8f9-337b052ec8ce splash apparmor=1 security=apparmor udev.log_priority=3 resume=UUID=a82e0673-67d0-45cf-a20e-e3bafc2f87cf resume_offset=13258811
	initrd	/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/intel-ucode.img /timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/amd-ucode.img /timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/initramfs-6.18-x86_64.img
}
submenu 'Advanced options for Manjaro Linux' $menuentry_id_option 'gnulinux-advanced-a82e0673-67d0-45cf-a20e-e3bafc2f87cf' {
	menuentry 'Manjaro Linux (Kernel: 6.18.32-1-MANJARO x64)' --class manjaro --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.18.32-1-MANJARO x64-advanced-a82e0673-67d0-45cf-a20e-e3bafc2f87cf' {
		load_video
		set gfxpayload=keep
		insmod gzio
		insmod part_gpt
		insmod cryptodisk
		insmod luks
		insmod gcry_rijndael
		insmod gcry_rijndael
		insmod gcry_sha256
		insmod btrfs
		cryptomount -u c38fb5c8eabf447ea8f9337b052ec8ce
		set root='cryptouuid/c38fb5c8eabf447ea8f9337b052ec8ce'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint='cryptouuid/c38fb5c8eabf447ea8f9337b052ec8ce'  a82e0673-67d0-45cf-a20e-e3bafc2f87cf
		else
		  search --no-floppy --fs-uuid --set=root a82e0673-67d0-45cf-a20e-e3bafc2f87cf
		fi
		linux	/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/vmlinuz-6.18-x86_64 root=UUID=a82e0673-67d0-45cf-a20e-e3bafc2f87cf rw rootflags=subvol=timeshift-btrfs/snapshots/2025-12-15_14-10-38/@  quiet cryptdevice=UUID=c38fb5c8-eabf-447e-a8f9-337b052ec8ce:luks-c38fb5c8-eabf-447e-a8f9-337b052ec8ce root=/dev/mapper/luks-c38fb5c8-eabf-447e-a8f9-337b052ec8ce splash apparmor=1 security=apparmor udev.log_priority=3 resume=UUID=a82e0673-67d0-45cf-a20e-e3bafc2f87cf resume_offset=13258811
		initrd	/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/intel-ucode.img /timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/amd-ucode.img /timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/initramfs-6.18-x86_64.img
	}
	menuentry 'Manjaro Linux (Kernel: 6.12.90-1-MANJARO x64)' --class manjaro --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.12.90-1-MANJARO x64-advanced-a82e0673-67d0-45cf-a20e-e3bafc2f87cf' {
		load_video
		set gfxpayload=keep
		insmod gzio
		insmod part_gpt
		insmod cryptodisk
		insmod luks
		insmod gcry_rijndael
		insmod gcry_rijndael
		insmod gcry_sha256
		insmod btrfs
		cryptomount -u c38fb5c8eabf447ea8f9337b052ec8ce
		set root='cryptouuid/c38fb5c8eabf447ea8f9337b052ec8ce'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint='cryptouuid/c38fb5c8eabf447ea8f9337b052ec8ce'  a82e0673-67d0-45cf-a20e-e3bafc2f87cf
		else
		  search --no-floppy --fs-uuid --set=root a82e0673-67d0-45cf-a20e-e3bafc2f87cf
		fi
		linux	/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/vmlinuz-6.12-x86_64 root=UUID=a82e0673-67d0-45cf-a20e-e3bafc2f87cf rw rootflags=subvol=timeshift-btrfs/snapshots/2025-12-15_14-10-38/@  quiet cryptdevice=UUID=c38fb5c8-eabf-447e-a8f9-337b052ec8ce:luks-c38fb5c8-eabf-447e-a8f9-337b052ec8ce root=/dev/mapper/luks-c38fb5c8-eabf-447e-a8f9-337b052ec8ce splash apparmor=1 security=apparmor udev.log_priority=3 resume=UUID=a82e0673-67d0-45cf-a20e-e3bafc2f87cf resume_offset=13258811
		initrd	/timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/intel-ucode.img /timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/amd-ucode.img /timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/initramfs-6.12-x86_64.img
	}
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/15_ostree ###
### END /etc/grub.d/15_ostree ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/25_bli ###
if [ "$grub_platform" = "efi" ]; then
  insmod bli
fi
### END /etc/grub.d/25_bli ###

### BEGIN /etc/grub.d/30_os-prober ###
# This menu entry is supported only on EFI platforms.
if [ "$grub_platform" = "efi" ]; then
menuentry 'Windows Boot Manager (on /dev/nvme0n1p1)' --class windows --class os $menuentry_id_option 'osprober-efi-0455-F9F7' {
	insmod part_gpt
	insmod fat
	search --no-floppy --fs-uuid --set=root 0455-F9F7
	chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
fi
set timeout_style=menu
if [ "${timeout}" = 0 ]; then
  set timeout=10
fi
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/30_uefi-firmware ###
if [ "$grub_platform" = "efi" ]; then
	menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' {
		fwsetup
		}
fi
### END /etc/grub.d/30_uefi-firmware ###

### BEGIN /etc/grub.d/35_fwupd ###
### END /etc/grub.d/35_fwupd ###

### BEGIN /etc/grub.d/40_custom ###
# 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.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
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
### END /etc/grub.d/41_custom ###

### BEGIN /etc/grub.d/41_snapshots-btrfs ###
if [ ! -e "${prefix}/grub-btrfs.cfg" ]; then
echo ""
else
submenu 'Manjaro Linux snapshots' {
    configfile "${prefix}/grub-btrfs.cfg"
}
fi
### END /etc/grub.d/41_snapshots-btrfs ###

### BEGIN /etc/grub.d/60_memtest86+ ###
if [ "${grub_platform}" == "pc" ]; then
    menuentry "Memory Tester (memtest86+)" --class memtest86 --class gnu --class tool {
        search --fs-uuid --no-floppy --set=root --hint='cryptouuid/c38fb5c8eabf447ea8f9337b052ec8ce'  a82e0673-67d0-45cf-a20e-e3bafc2f87cf
        linux16 /timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/memtest86+/memtest.bin 
    }
fi
### END /etc/grub.d/60_memtest86+ ###

### BEGIN /etc/grub.d/60_memtest86+-efi ###
if [ "${grub_platform}" == "efi" ]; then
    menuentry "Memory Tester (memtest86+)" --class memtest86 --class gnu --class tool {
        if loadfont unicode ; then
            set gfxmode=1024x768,800x600,auto
            set gfxpayload=800x600,1024x768
            terminal_output gfxterm
        fi
        search --fs-uuid --no-floppy --set=root --hint='cryptouuid/c38fb5c8eabf447ea8f9337b052ec8ce'  a82e0673-67d0-45cf-a20e-e3bafc2f87cf
        linux /timeshift-btrfs/snapshots/2025-12-15_14-10-38/@/boot/memtest86+/memtest.efi 
    }
fi
### END /etc/grub.d/60_memtest86+-efi ###
/etc/timeshift/timeshift.json
{
  "backup_device_uuid" : "a82e0673-67d0-45cf-a20e-e3bafc2f87cf",
  "parent_device_uuid" : "c38fb5c8-eabf-447e-a8f9-337b052ec8ce",
  "do_first_run" : "false",
  "btrfs_mode" : "true",
  "include_btrfs_home_for_backup" : "false",
  "include_btrfs_home_for_restore" : "false",
  "stop_cron_emails" : "true",
  "schedule_monthly" : "false",
  "schedule_weekly" : "true",
  "schedule_daily" : "false",
  "schedule_hourly" : "false",
  "schedule_boot" : "false",
  "count_monthly" : "2",
  "count_weekly" : "3",
  "count_daily" : "5",
  "count_hourly" : "6",
  "count_boot" : "5",
  "snapshot_size" : "0",
  "snapshot_count" : "0",
  "date_format" : "%Y-%m-%d %H:%M:%S",
  "exclude" : [],
  "exclude-apps" : []
}%

I was afraid you were going to say that.

If you need to boot a snapshot, you should boot it, do what you need to do, and then get out.

If you ever need to use a whole snapshot, you should be restoring it instead.

When you boot into a snapshot, your root subvolume is not @ anymore, it looks a lot like yours is currently:

You can work and run this way. The snapshots themselves are fine, and you can run all the normal operations on them. (But it’s a little bit of a mess.)

But right now, according to your root FS and grub, you are permanently booting into: .../2025-12-15_14-10-38/@.

Just to clarify. Now other restore options are gone, and you are currently booting normally (not into a snapshot), to get where you are at now?

I’m not sure how or why this happened, but this is a lot like that snapshot restore bug that was seemingly fixed 2 years ago.

But at least your snapshots are intact. So this should all be easily recoverable. Just not through Timeshift.

We also need to know where we’re going? (What snapshot are we trying to use, not the latest but 2026-05-12_17-00-00?)

I think that I am booting normally (with the first entry of the GRUB menu from Manjaro). I checked the boot options from within the GRUB menu (with E), and also they are indeed by default now pointing to the snapshot. If I can edit something there to get again “normal” booting, please let me know.

I set up this system last autumn. Thus, cannot be the same issue.

Sounds promising :wink: Thanks a lot for your help!

I mean, I don’t want to go anywhere back (definitely not to half a year ago). If I can boot into the last snapshot (currently 2026-05-19_18-00-00 or a just newly created snapshot), and then from there recover the normal booting process? Shall I just try something like the following?

sudo timeshift --restore --snapshot '2026-05-19_18-00-00'

Or is here something else to do?, as you said:

Just not through Timeshift.

I’m probably 9+ hrs behind you, and stuck with replying on my phone for most of today. Also, I do not use LUKS, but this should not matter.

This won’t work, it’s the same as doing it from the GUI. You need your working root subvolume to be called @. Timeshift is picky about this.

All we need to do is rename your root subvolume, essentially. But one mistype and this could easily do the opposite of restore everything.

Also, where is '2026-05-19_18-00-00 from? We have to work with the snapshots you have. (I’ll use the latest from your btrfs sub list.)

One thing not posted is your: lsblk -f

I think your root btrfs FS is on /dev/nvme0n1p5? (Make :100: sure, and adjust commands accordingly if not. Or ask if unsure, with your lsblk.)

1. Boot live image

:optical_disk:

2. Mount top level (no chroot yet)

sudo mount -o subvol=/ /dev/nvme0n1p5 /mnt

3. Move (broken) old root

You will have to remember to come back and btrfs sub delete this after things are working. (Maybe there is data in here you may need as well.)

So let’s just rename it.

sudo mv /mnt/@ /mnt/@root-backup

4. Create snapshot for your new root

We will create a copy of the snapshot you want to do use, so nothing is lost in this process.

Using the latest snapshot you posted in the subvolume list.

sudo btrfs sub snapshot /mnt/timeshift-btrfs/snapshots/2026-05-18_10-18-32/@ /mnt/@

5. Chroot / Update grub

Mount your new root.

sudo umount /mnt
sudo mount -o subvol=@ /dev/nvme0n1p5 /mnt

Chroot in.

sudo manjaro-chroot /mnt /bin/bash

Update grub.

mount /boot/efi
update-grub

Reboot.

umount /boot/efi
exit
reboot

I should put a disclaimer that I’ve done this entire post from my phone, and everything from memory.

I’ve done this type of thing and more, hundreds of times. But there’s bound to be a typo, even with me quadruple checking it quadruple times.

So please take care when executing these commands. We may want a btrfs guru to give this a once-over, and at least someone that has access to a terminal!

2 Likes

Thanks a lot already! I will take my time (it is not urgent, as the system is running fine) and will follow your guide to do it from a live system.

I mean, I can just create at anytime a new snapshot from where I am now.

`lsblk -f
NAME                                          FSTYPE      FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme0n1                                                                                                                   
├─nvme0n1p1                                   vfat        FAT32       0455-F9F7                              64.2M    33% /boot/efi
├─nvme0n1p2                                                                                                               
├─nvme0n1p3                                   ntfs                    226257DF6257B66F                                    
├─nvme0n1p4                                   ntfs                    A0F63AD7F63AAE02                                    
└─nvme0n1p5                                   crypto_LUKS 1           c38fb5c8-eabf-447e-a8f9-337b052ec8ce                
  └─luks-c38fb5c8-eabf-447e-a8f9-337b052ec8ce btrfs                   a82e0673-67d0-45cf-a20e-e3bafc2f87cf   13.6G    90% /var/log
                                                                                                                          /var/cache
                                                                                                                          /swap
                                                                                                                          /home
                                                                                                                          /

I guess that I need to adjust the commands to firstly open the encryption with cryptsetup and mount the unencrypted btrfs partition and then use this one. But this sounds doable.

I’ll let you know when (probably only in a couple of weeks) I tried your instructions and about their result! Thanks again!

You can only restore from snapshots that actually exist; you can’t restore to an arbitrary point in time between them. However, you can create snapshots as often as needed.

There is a even a setting to take them every hour, with cleanup options. Nothing wrong with using them either, the overhead is surprisingly minimal.

The default of Manjaro’s Timeshift is only on pacman upgrades. Not package removals, or new packages, which are kind of important too. (A simple modification in the pacman hook file pasted above to change that.)

Or just by usual manual snapshots, by hitting that big Create in Timeshift, any time you need.

You have to pick one from your: btrfs sub list /. These most likely got created every system update for you, and your latest was: 2026-05-18_10-18-32

If you choose to restore, which I think is the smart move, that snapshot is getting older. As all these changes you are currently making, will be lost.

I kind of forgot you were on LUKS. :facepalm:

I know I’ve helped many LUKS users with very similar things, and the steps really don’t change much. I’ve still never used it, but know basic things about it.

Someone can correct me if I’m wrong, but I think the only difference is after you boot the live image, you just simply:

sudo cryptsetup open /dev/nvme0n1p5 luksroot

Then in the following commands, where I have:

  • /dev/nvme0n1p5

You simply put in:

  • /dev/mapper/luksroot

Simple. Right? :grinning_face: