<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Snapshot · XB Field Notes</title><link>https://www.xbcatm.com/tags/snapshot/</link><description>Illustrated field notes on HTTP, DNS, TLS, Caddy, SSH, releases, and recovery.</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://www.xbcatm.com/tags/snapshot/index.xml" rel="self" type="application/rss+xml"/><item><title>LVM snapshots capture a block device in time</title><link>https://www.xbcatm.com/posts/lvm-logical-volume-snapshot/</link><pubDate>Mon, 10 Apr 2028 00:00:00 +0000</pubDate><guid>https://www.xbcatm.com/posts/lvm-logical-volume-snapshot/</guid><description>A logical volume snapshot preserves the original blocks, letting you back up or roll back a partition without taking it offline.</description><content:encoded>&lt;p&gt;An LVM snapshot is neither a copy nor a reflink: it is a fixed-size copy-on-write exception store attached to an origin logical volume. &lt;code&gt;lvcreate -s -L 5G -n snap vg/data&lt;/code&gt; allocates 5 GiB from the volume group, and the device-mapper &lt;code&gt;snapshot&lt;/code&gt; target records the original contents of each origin chunk the first time it is written. Creation is instant whatever the origin&amp;rsquo;s size, because nothing is copied.&lt;/p&gt;
&lt;p&gt;That size is the whole safety margin, and it is the parameter people get wrong. A store sized for a quiet week is exhausted in an hour by a database checkpoint or an &lt;code&gt;rsync&lt;/code&gt;, and when it fills the snapshot does not degrade — it becomes invalid and returns I/O errors. The recovery point disappears exactly when you needed it, which is why the store&amp;rsquo;s free space belongs on a dashboard, not in a runbook.&lt;/p&gt;
&lt;h2 id="an-exception-store-not-a-copy"&gt;An exception store, not a copy&lt;/h2&gt;
&lt;p&gt;A classic LVM snapshot uses two device-mapper targets: the origin is re-mapped as &lt;code&gt;snapshot-origin&lt;/code&gt;, and a new &lt;code&gt;snapshot&lt;/code&gt; device combines it with a COW device. Reads of unchanged chunks go straight to the origin; the first write to a chunk copies the old chunk into the COW device, then writes the new data. So consumption tracks the number of distinct chunks that changed, not the number of writes: the simulation writes a million times to sixteen hot chunks and consumes fifteen exceptions, about 60 KiB.&lt;/p&gt;
&lt;p&gt;Watch it with &lt;code&gt;lvs -a -o lv_name,lv_attr,origin,data_percent,lv_size&lt;/code&gt;. A classic snapshot&amp;rsquo;s &lt;code&gt;lv_attr&lt;/code&gt; reads &lt;code&gt;swi-a-s---&lt;/code&gt; — &lt;code&gt;s&lt;/code&gt; for snapshot, &lt;code&gt;w&lt;/code&gt; writable, and a state character that becomes &lt;code&gt;I&lt;/code&gt; when the store is exhausted. &lt;code&gt;data_percent&lt;/code&gt; is the store&amp;rsquo;s fill, and that is the number to alert on, at 70 or 80 percent; 100 percent is not a warning, it is an obituary. &lt;code&gt;lvextend&lt;/code&gt; grows the COW device while the snapshot is still valid; &lt;code&gt;lvchange --monitor y&lt;/code&gt; lets dmeventd do it automatically.&lt;/p&gt;
&lt;h2 id="exhaustion-is-invalidation"&gt;Exhaustion is invalidation&lt;/h2&gt;
&lt;p&gt;The kernel documentation is blunt: the COW device will often be smaller than the origin, and if it fills up the snapshot becomes useless and is disabled, returning errors. LVM&amp;rsquo;s guidance is to plan for expected writes — often 20 percent of the origin — and extend before it fills. A small slice of the store holds the COW block map, so usable data capacity is a little under the &lt;code&gt;-L&lt;/code&gt; value.&lt;/p&gt;
&lt;p&gt;The blast radius is narrow but the timing is cruel: the origin keeps running normally, so nothing looks wrong until the backup that reads the snapshot fails or the rollback is unavailable. There is no partial mode: at 100 percent, the snapshot never existed.&lt;/p&gt;
&lt;h2 id="merging-and-why-thin-changes-the-failure"&gt;Merging, and why thin changes the failure&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;lvconvert --merge vg/snap&lt;/code&gt; rolls the snapshot&amp;rsquo;s changed chunks back into the origin, and it runs in the background while the origin stays usable — writes to chunks not yet merged are deferred. The constraint is on the origin: it must be inactive when the merge is set up, so unmount it, or schedule the merge and activate the origin afterwards. Merging consumes the snapshot, so copy out anything you need first.&lt;/p&gt;
&lt;p&gt;Thin snapshots change the failure mode rather than removing it. A thin snapshot is created when the origin is a thin LV and no size is given; it shares blocks in the thin pool instead of owning a store, so its own divergence cannot invalidate it. The pool is the shared resource now: when it runs out, the damage is not one dead snapshot but every thin volume in the pool, which LVM warns may be damaged and hard to repair. &lt;code&gt;thin_pool_autoextend_threshold&lt;/code&gt; and dmeventd exist precisely because pool exhaustion is a pool-wide outage.&lt;/p&gt;
&lt;h2 id="when-it-breaks"&gt;When it breaks&lt;/h2&gt;
&lt;p&gt;The classic failure is a backup that silently stops being a backup. The job mounts the snapshot, copies for longer than the store can cover, and the store reaches 100 percent; the snapshot goes invalid and the copy fails — or worse, monitoring watches only the exit code while the job reads a stale mount. Check &lt;code&gt;data_percent&lt;/code&gt; on every snapshot LV, alert at 70 percent, and size for the busiest hour in the retention window.&lt;/p&gt;
&lt;p&gt;The second failure is the merge that cannot happen when you need it. &lt;code&gt;lvconvert --merge&lt;/code&gt; requires the origin closed, and teams discover that during the incident. Rehearse the merge on a disposable volume, keep a real backup independent of the snapshot, and remember that a snapshot whose store is full cannot be merged.&lt;/p&gt;
&lt;h2 id="check-it-quickly"&gt;Check it quickly&lt;/h2&gt;
&lt;p&gt;Look at the store&amp;rsquo;s fill before trusting the snapshot:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;lvs -a -o lv_name,vg_name,lv_attr,origin,data_percent,lv_size
lvs -a -o lv_name,data_percent,metadata_percent vg/thinpool
dmsetup status vg-snap
lvextend -L +2G vg/snap
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;data_percent&lt;/code&gt; is the COW store&amp;rsquo;s fill and should sit well under 100; a state character of &lt;code&gt;I&lt;/code&gt; in &lt;code&gt;lv_attr&lt;/code&gt; means the snapshot is already invalid. For a thin snapshot, &lt;code&gt;data_percent&lt;/code&gt; and &lt;code&gt;metadata_percent&lt;/code&gt; on the pool are the numbers that matter; &lt;code&gt;dmsetup status&lt;/code&gt; shows allocated sectors against the total so you can watch a merge drain.&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://man7.org/linux/man-pages/man8/lvcreate.8.html"&gt;lvcreate(8)&lt;/a&gt;, documents &lt;code&gt;-s&lt;/code&gt;/&lt;code&gt;--snapshot&lt;/code&gt;, COW versus thin snapshots and the sizing guidance, checked 2026-09-16.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://man7.org/linux/man-pages/man8/lvs.8.html"&gt;lvs(8)&lt;/a&gt;, defines the &lt;code&gt;lv_attr&lt;/code&gt; state characters including invalid snapshot, checked 2026-09-16.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.kernel.org/admin-guide/device-mapper/snapshot.html"&gt;Device-mapper snapshot support&lt;/a&gt;, the exception store, invalidation and &lt;code&gt;lvconvert --merge&lt;/code&gt; behaviour, checked 2026-09-16.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://man7.org/linux/man-pages/man7/lvmthin.7.html"&gt;lvmthin(7)&lt;/a&gt;, thin snapshots, pool exhaustion and automatic extension, checked 2026-09-16.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>ZFS snapshots give the filesystem a rewind button</title><link>https://www.xbcatm.com/posts/zfs-snapshots-multiversion-safety/</link><pubDate>Tue, 21 Mar 2028 00:00:00 +0000</pubDate><guid>https://www.xbcatm.com/posts/zfs-snapshots-multiversion-safety/</guid><description>A ZFS snapshot records a coherent view of a dataset at an instant, costless until data changes and reversible with a rollback.</description><content:encoded>&lt;p&gt;A ZFS snapshot is a name attached to a dataset&amp;rsquo;s block tree at one transaction group. Nothing is copied, nothing is quiesced, and the cost is a few metadata blocks: &lt;code&gt;zfs snapshot tank/data@before-upgrade&lt;/code&gt; returns before the shell prompt redraws. Because ZFS never overwrites a live block in place, the old tree stays valid on disk until the last reference to it goes away, and the snapshot is that reference.&lt;/p&gt;
&lt;p&gt;That is what makes a nightly wall of history practical, and it is also where this article&amp;rsquo;s title gets dangerous. Snapshots give you many versions of the data; they do not give you safety from losing the pool. Every snapshot of &lt;code&gt;tank/data&lt;/code&gt; lives in &lt;code&gt;tank&lt;/code&gt;, so the failure that takes the pool takes the dataset and its history in the same instant. Multiversion and multiversion-safety are different properties, and only replication supplies the second.&lt;/p&gt;
&lt;h2 id="a-name-for-one-consistent-tree"&gt;A name for one consistent tree&lt;/h2&gt;
&lt;p&gt;Snapshots are created at a transaction group boundary, so the tree they capture is internally consistent — a database&amp;rsquo;s files and its metadata freeze at the same instant, not microseconds apart. &lt;code&gt;-r&lt;/code&gt; snapshots a dataset and all its descendants, which is what you want for anything holding child datasets; without it, a recursive layout gets snapshots taken at different times at different levels, and incremental replication between them becomes awkward.&lt;/p&gt;
&lt;p&gt;Names are the retention policy&amp;rsquo;s only handle: &lt;code&gt;tank/data@daily-2026-09-16&lt;/code&gt; is prunable by pattern, while an autogenerated name needs bookkeeping. &lt;code&gt;zfs list -t snapshot -o name,used,refer,creation -s creation&lt;/code&gt; shows the set with the space each one pins.&lt;/p&gt;
&lt;h2 id="where-the-space-is-in-zfs-list--o-space"&gt;Where the space is, in zfs list -o space&lt;/h2&gt;
&lt;p&gt;ZFS reports space in a column set that answers the only question that matters: whose data is it? &lt;code&gt;zfs list -o space tank/data&lt;/code&gt; gives USED, USEDSNAP, USEDDS, USEDREFRESERV, USEDCHILD, REFER and AVAIL. REFER is what the dataset alone needs, USEDSNAP is what its snapshots pin, and USED is the sum. A rising USEDSNAP with a flat REFER means the snapshots, not the data, are eating the pool.&lt;/p&gt;
&lt;p&gt;The fixture builds a wall of thirty daily snapshots over a 64 MiB dataset with 2 MiB of churn per day. Creation costs 0 KiB every single time — the cost lands on the write that follows, 2048 KiB for 2 MiB rewritten — and the whole wall costs 60 MiB against 1920 MiB for thirty full copies. That ratio is the entire argument for snapshots, and why nobody notices the pool filling until it is nearly full.&lt;/p&gt;
&lt;h2 id="holds-diff-and-comparing-versions"&gt;Holds, diff, and comparing versions&lt;/h2&gt;
&lt;p&gt;A hold is a named reference that makes destruction fail with EBUSY: &lt;code&gt;zfs hold keep tank/data@daily-2026-09-16&lt;/code&gt; protects a snapshot, &lt;code&gt;zfs holds&lt;/code&gt; lists the holders, and &lt;code&gt;zfs release keep&lt;/code&gt; clears it. Backup software holds the snapshot it is sending so retention cannot delete it; the cost is that pruning then fails until the hold is released, and a stuck hold can pin a snapshot for months.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;zfs diff tank/data@daily-2026-09-15 tank/data@daily-2026-09-16&lt;/code&gt; reports per-path changes — &lt;code&gt;+&lt;/code&gt; created, &lt;code&gt;-&lt;/code&gt; removed, &lt;code&gt;M&lt;/code&gt; modified, &lt;code&gt;R&lt;/code&gt; renamed — and both snapshots must still exist, which is why diffing against yesterday is easy and against last month may not be. Read a snapshot&amp;rsquo;s contents through the hidden &lt;code&gt;.zfs/snapshot/&amp;lt;name&amp;gt;&lt;/code&gt; directory; there is no separate mount for a snapshot, and &lt;code&gt;snapdir=visible&lt;/code&gt; makes it listable.&lt;/p&gt;
&lt;h2 id="when-it-breaks"&gt;When it breaks&lt;/h2&gt;
&lt;p&gt;The failure that matters is the one the title invites: a pool loss. A failed controller, a backplane fault, or pool-wide corruption removes the dataset and every snapshot of it atomically; there is no partial survival. The only defence is a copy outside that pool: &lt;code&gt;zfs send -i tank/data@yesterday tank/data@today | zfs receive backup/data&lt;/code&gt; writes an independent, checksummed stream into a second pool, and only that stream survives the first pool&amp;rsquo;s death. A snapshot wall with no replica is a single point of failure with a nicer interface.&lt;/p&gt;
&lt;p&gt;The second failure is silent space creep plus retention that cannot run. USEDSNAP grows while REFER stays flat, the pool passes 80 percent, and ZFS starts refusing writes with no space left even though the datasets look reasonable — slop and reservations are not visible from inside the filesystem. If a snapshot is also held for a clone, destroying it fails, and rolling back past a clone&amp;rsquo;s origin forces a recursive destroy. Long-lived holds turn retention into a dependency graph, so keep hold lifetimes short and audited.&lt;/p&gt;
&lt;h2 id="check-it-quickly"&gt;Check it quickly&lt;/h2&gt;
&lt;p&gt;See what the snapshots cost and whether they can be removed:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;zfs list -t snapshot -o name,used,refer,creation -s creation tank/data
zfs list -o space tank/data
zfs holds tank/data@daily-2026-09-16
zfs diff tank/data@daily-2026-09-15 tank/data@daily-2026-09-16
zfs send -i tank/data@daily-2026-09-15 tank/data@daily-2026-09-16 | zfs receive backup/data
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;used&lt;/code&gt; per snapshot is the space that snapshot alone pins, and a fresh snapshot&amp;rsquo;s value is near zero; the &lt;code&gt;space&lt;/code&gt; columns then show USEDSNAP against REFER, and a rising USEDSNAP with a flat REFER is the signal to prune. If &lt;code&gt;zfs destroy&lt;/code&gt; fails with a busy snapshot, &lt;code&gt;zfs holds&lt;/code&gt; names the tag to release. The last line is the only one that protects against losing the pool; run it on a schedule.&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://openzfs.github.io/openzfs-docs/man/master/8/zfs-snapshot.8.html"&gt;zfs-snapshot(8)&lt;/a&gt;, snapshot creation semantics and recursive snapshots, checked 2026-09-16.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openzfs.github.io/openzfs-docs/man/master/8/zfs-list.8.html"&gt;zfs-list(8)&lt;/a&gt;, the &lt;code&gt;space&lt;/code&gt; column set including USEDSNAP, USEDDS and REFER, checked 2026-09-16.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openzfs.github.io/openzfs-docs/man/master/8/zfs-hold.8.html"&gt;zfs-hold(8)&lt;/a&gt;, holds, &lt;code&gt;zfs holds&lt;/code&gt;, and the EBUSY returned by destroy, checked 2026-09-16.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openzfs.github.io/openzfs-docs/man/master/8/zfs-send.8.html"&gt;zfs-send(8)&lt;/a&gt;, incremental replication streams that leave the pool, checked 2026-09-16.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Btrfs snapshots are copy-on-write, not copies</title><link>https://www.xbcatm.com/posts/btrfs-snapshots-are-copy-on-write/</link><pubDate>Sun, 14 Nov 2027 00:00:00 +0000</pubDate><guid>https://www.xbcatm.com/posts/btrfs-snapshots-are-copy-on-write/</guid><description>A btrfs snapshot shares unchanged blocks with its source until a write arrives, so taking one costs little and only changed data grows.</description><content:encoded>&lt;p&gt;A btrfs snapshot is not a copy of anything. &lt;code&gt;btrfs subvolume snapshot&lt;/code&gt; creates a new subvolume whose root points at the same extent tree as the source, so every extent the two share is referenced twice and stored once. Creation is a metadata operation measured in milliseconds whether the subvolume holds a gigabyte or ten terabytes.&lt;/p&gt;
&lt;p&gt;That makes snapshots the cheapest rollback primitive on the box, and it is also why they are the most commonly over-trusted. Space grows with divergence, not with the size of the data; the cost arrives later, on somebody else&amp;rsquo;s write, on the same device that holds the original. A snapshot you never prune is a slow-motion disk-full incident, and a snapshot on the same disk is not a backup no matter how many of them you keep.&lt;/p&gt;
&lt;h2 id="shared-extents-not-copied-blocks"&gt;Shared extents, not copied blocks&lt;/h2&gt;
&lt;p&gt;Snapshots are subvolumes, and a subvolume is a subtree with its own root, so the snapshot machinery is the reference-counting machinery that makes reflinks work. Take a read-only snapshot with &lt;code&gt;btrfs subvolume snapshot -r /data /snap/data-2026-09-16&lt;/code&gt;; the &lt;code&gt;-r&lt;/code&gt; matters, because a writable snapshot starts diverging the moment anything writes to it, and a backup target should not be writable in the first place.&lt;/p&gt;
&lt;p&gt;The first write after a snapshot is what costs. When either side overwrites a shared extent, the filesystem allocates a new extent for the writer and leaves the old one to the other side, so the price of a snapshot is paid by the next write, in units of the extents that write touches — not by the snapshot command. APFS clonefiles share extents under the same rule, and the fixture measures the shape: a 64 MiB clone costs 0 KiB, a plain 64 MiB copy costs 65536 KiB, and overwriting the first 8 MiB of the clone costs 8192 KiB. Rewriting that same 8 MiB a second time costs 0 KiB, because those extents already diverged.&lt;/p&gt;
&lt;h2 id="where-the-space-actually-goes"&gt;Where the space actually goes&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;btrfs filesystem du&lt;/code&gt; is the honest accounting: it prints Total, Exclusive and Set shared for each argument, where Set shared is the space it shares with the others named on the command line. Right after a snapshot, Exclusive should be near zero and Set shared close to the origin&amp;rsquo;s Total. &lt;code&gt;compsize&lt;/code&gt; gives the same split per file, and &lt;code&gt;btrfs qgroup show -reF&lt;/code&gt; tracks exclusive and referenced bytes per qgroup when quotas are enabled.&lt;/p&gt;
&lt;p&gt;Deleting the origin does not free the shared extents — they become the snapshot&amp;rsquo;s exclusive data, and the space changes owner. This is the most common support question about btrfs: a file is deleted and &lt;code&gt;df&lt;/code&gt; does not move. Only when the last reference goes away does the space return, which is why retention policy and snapshot cadence must be designed together.&lt;/p&gt;
&lt;h2 id="a-restore-point-is-not-a-replica"&gt;A restore point is not a replica&lt;/h2&gt;
&lt;p&gt;Snapshots live in the same filesystem on the same device as their source, so a controller failure, a dead disk, or a &lt;code&gt;btrfs check&lt;/code&gt; gone wrong takes the data and every snapshot of it in one motion. They defend against exactly one class of accident — the write that should not have happened — and they are excellent at it: rollback is local, instant, and needs no network.&lt;/p&gt;
&lt;p&gt;Real protection means an independent copy: &lt;code&gt;btrfs send&lt;/code&gt; walks a snapshot and emits a stream that &lt;code&gt;btrfs receive&lt;/code&gt; applies to another filesystem, with &lt;code&gt;-p&lt;/code&gt; sending only the delta from a parent snapshot. Send that stream to a different machine or a different pool. The distinction: &lt;code&gt;send&lt;/code&gt; is the replication mechanism, and the snapshot is just the object it replicates.&lt;/p&gt;
&lt;h2 id="when-it-breaks"&gt;When it breaks&lt;/h2&gt;
&lt;p&gt;The classic failure is the delete that frees nothing: someone removes a 40 GB directory, &lt;code&gt;df&lt;/code&gt; is unmoved, and they delete more to compensate. Run &lt;code&gt;btrfs filesystem du -s&lt;/code&gt; across the subvolume and its snapshots and look for one whose Exclusive value accounts for the gap. If the snapshots are read-only, the fix is deleting snapshots, not more files.&lt;/p&gt;
&lt;p&gt;The second failure is a full filesystem, which on btrfs is worse than on ext4. Metadata needs space of its own, and a copy-on-write filesystem with no free space cannot allocate the extent a write requires, so one at 100 percent can fail writes that would succeed elsewhere and can go read-only. Keep headroom — 5 percent is not paranoia — bound snapshot retention, and remember that a snapshot of a nearly full filesystem also commits you to space for its divergence.&lt;/p&gt;
&lt;h2 id="check-it-quickly"&gt;Check it quickly&lt;/h2&gt;
&lt;p&gt;Confirm the snapshot shares rather than copies, and find what is holding the space:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;btrfs subvolume snapshot -r /data /snap/data-$(date +%F)
btrfs filesystem du -s /data /snap/data-2026-09-16
compsize /snap/data-2026-09-16
btrfs filesystem usage /data
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;du&lt;/code&gt; prints a Total, Exclusive and Set shared triple per path: a fresh snapshot&amp;rsquo;s Exclusive should be a few MiB of metadata at most while Set shared tracks the origin&amp;rsquo;s Total. If Exclusive already equals Total, the snapshot is a full copy. &lt;code&gt;btrfs filesystem usage&lt;/code&gt; then shows how much divergence the device can still absorb.&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://btrfs.readthedocs.io/en/latest/btrfs-subvolume.html"&gt;btrfs subvolume documentation&lt;/a&gt;, subvolume and snapshot semantics including read-only snapshots, checked 2026-09-16.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://btrfs.readthedocs.io/en/latest/btrfs-filesystem.html"&gt;btrfs filesystem documentation&lt;/a&gt;, defines the &lt;code&gt;du&lt;/code&gt; Exclusive and Set shared columns used above, checked 2026-09-16.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://btrfs.readthedocs.io/en/latest/btrfs-qgroup.html"&gt;btrfs qgroup documentation&lt;/a&gt;, exclusive and referenced byte accounting per qgroup, checked 2026-09-16.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://btrfs.readthedocs.io/en/latest/btrfs-send.html"&gt;btrfs send documentation&lt;/a&gt;, the replication stream that moves a snapshot off the machine, checked 2026-09-16.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>