Understand snapshots

Hi,

I’m having troubles with my snapshots - and either I don’t understand how snapshots work or my system doesn’t work as intended.
My assumption was that once I create a snapshot, I can browse the files within that snapshot - however this is not what I encounter with my TrueNAS Scale 25.04.0.
I found a relevant topic where a similar question is discussed, but it is “closed” with the resolution that this was an error in an earlier version and is fixed by Fangtooth - but this is not my experience.

I created an automatic snapshot task, which ran at midnight successfully. But when I browse to the .zfs/snapshots/auto-2025-xxxxxx/ folder, I see no files inside, even though the snapshot indicates that there are space used for the jellyfin/config folder:


That config folder is missing.
Either my system doesn’t work as it should, or I don’t understand how snapshots should behave (or maybe I have an access problem)?

My NAS is set up with 2 mirrored 4 TB HDDs, and one SSD that holds the applications and configs. Ultimately my goal is to create regular snapshots of the SSD, and copy them to the HDD via replication. But I’m not sure if this will work and I can restore my SSD from this “backup”, if the snapshots are sort of empty.

Is that “jellyfin” folder really a dataset? If yes, did you check the “recursive” box in your snapshot task? Also if that is the case, you need to navigate to /mnt/SSD-Spud/jellyfin/.zfs/snapshot/…

HTH,
Patrick

1 Like

Do you store your files directly in the top-level dataset? If so, you should know that this is not recommended. Not sure if this is related, though.

EDIT: Seems like it is not the case. You should follow @pmh instructions. If your dataset is SSD-Spud/jellyfin/config, the path would be /mnt/SSD-Spud/jellyfin/config/.zfs/snapshot/auto-2025-05-19_00-00.

Yes and yes.
It seems like I was lacking some understanding for sure becuase if I navigate deeper, to /mnt/SSD-Spud/jellyfin/config/.zfs/snapshot/auto-2025-05-19_00-00 as suggested, in fact I can find the “missing” files within the config folder.

I thought the snapshot would be created on the highest level i.e. /SSD-Spud and everything recursively would be stored in that one snapshot.

What is confusing in addition is that if I navigate on level up, to /mnt/SSD-Spud/jellyfin/.zfs/snapshot/auto-2025-05-19_00-00, there’s a config folder there as well, but without content again…

On addditional question: are the hidden dot folders also part of the snapshots, e.g., .ix-apps? Becuase that’s again something I don’t see anywhere in the snapshot - at least not manually, but it’s there in the snapshot list.

Snapshots are per dataset. If the .ix-stuff is included depends on that.

Try zfs list -t snapshot to find out.

/mnt/SSD-Spud/jellyfin and /mnt/SSD-Spud/jellyfin/config are 2 separate datasets. What dataset is actually used by JF? If they are both used, I suspect there would be various collisions.

My guess is that the permissions in the .zfs snapshot directory are different.

Do you see files if you run your ls command with sudo?

If you have a dataset hierarchy of e.g. pool/foo/bar with a collection of files in bar, and take a recursive snapshot of foo then:

  • /mnt/pool/foo/bar/.zfs/snapshot/<date>/ will contain the files in bar at that time
  • while /mnt/pool/foo/.zfs/snapshot/<date>/ will contain the files in foo at that time - which is an empty directory named bar which serves as the mountpoint for the child dataset

HTH,
Patrick

2 Likes

Now I think I understand snapshots - thank you everyone for commenting.

BTW this is the output of the command zfs list -t snapshot from yesterday, which explains a lot too:

NAME USED AVAIL REFER MOUNTPOINT
SSD-Spud@auto-2025-05-19_00-00 0B - 112K -
SSD-Spud/.ix-virt@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/.ix-virt/buckets@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/.ix-virt/containers@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/.ix-virt/custom@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/.ix-virt/deleted@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/.ix-virt/deleted/buckets@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/.ix-virt/deleted/containers@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/.ix-virt/deleted/custom@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/.ix-virt/deleted/images@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/.ix-virt/deleted/virtual-machines@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/.ix-virt/images@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/.ix-virt/virtual-machines@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/.system@auto-2025-05-19_00-00 0B - 104K -
SSD-Spud/.system/configs-ae32c386e13840b2bf9c0083275e7941@auto-2025-05-19_00-00 64K - 768K -
SSD-Spud/.system/cores@auto-2025-05-19_00-00 0B - 120K -
SSD-Spud/.system/netdata-ae32c386e13840b2bf9c0083275e7941@auto-2025-05-19_00-00 80K - 111M -
SSD-Spud/.system/nfs@auto-2025-05-19_00-00 0B - 112K -
SSD-Spud/.system/samba4@auto-2025-05-19_00-00 96K - 224K -
SSD-Spud/duplicati@auto-2025-05-19_00-00 0B - 1.36M -
SSD-Spud/filebrowser@auto-2025-05-19_00-00 0B - 116K -
SSD-Spud/ix-apps@auto-2025-05-19_00-00 0B - 128K -
SSD-Spud/ix-apps/app_configs@auto-2025-05-19_00-00 0B - 1.77M -
SSD-Spud/ix-apps/app_mounts@auto-2025-05-19_00-00 0B - 96K -
SSD-Spud/ix-apps/docker@auto-2025-05-19_00-00 180K - 1.08G -
SSD-Spud/ix-apps/truenas_catalog@auto-2025-05-19_00-00 0B - 173M -
SSD-Spud/jellyfin@auto-2025-05-19_00-00 0B - 104K -
SSD-Spud/jellyfin/cache@auto-2025-05-19_00-00 0B - 269M -
SSD-Spud/jellyfin/config@auto-2025-05-19_00-00 3.82M - 165M -
SSD-Spud/jellyfin/transcodes@auto-2025-05-19_00-00 0B - 104K -
SSD-Spud/tailscale@auto-2025-05-19_00-00 56K - 120K -
boot-pool/ROOT/25.04.0@pristine 0B - 174M -
boot-pool/ROOT/25.04.0/conf@pristine 0B - 6.97M -
boot-pool/ROOT/25.04.0/etc@pristine 1.04M - 5.98M -
boot-pool/ROOT/25.04.0/opt@pristine 0B - 96K -
boot-pool/ROOT/25.04.0/usr@pristine 0B - 2.51G -
boot-pool/ROOT/25.04.0/var@pristine 824K - 3.98M -
boot-pool/ROOT/25.04.0/var/lib@pristine 208K - 26.5M -