BTRFS-SEND(8)

🌸 btrfs-send(8) 🌸

okay bestie. you know that manual page btrfs-send? the 8th section one? yeah. we're doing this. sit down, hydrate, and let me tell you about generating streams of changes between subvolume snapshots πŸ’–


✨ NAME ✨

btrfs-send β€” generate a stream of changes between two subvolume snapshots


πŸ¦‹ SYNOPSIS πŸ¦‹

btrfs send [-ve] [-p <parent>] [-c <clone-src>] [-f <outfile>] <subvol>
[<subvol>...]

πŸ’… DESCRIPTION πŸ’…

So basically this command generates a stream of instructions that describe the changes between two subvolume snapshots. and that stream? it can be consumed by the btrfs receive command to replicate the sent snapshot on a different filesystem. iconic behavior honestly. also she operates in two modes: full and incremental. two moods, both valid 🫢

🚨 LOWKEY IMPORTANT: all snapshots involved in one send command must be read-only, and this status cannot be changed as long as there's a running send operation that uses the snapshot. and no, a read-only mount of the subvolume is not sufficient β€” there's literally no way to guarantee that there won't be any other writable mount of the same subvolume that would potentially write while send would be running. the way that is a real hazard 😭

In full mode, the entire snapshot data and metadata will end up in the stream. all of it. no crumbs left behind ✨

In incremental mode (options -p and -c), previously sent snapshots that are available on both the sending and receiving side can be used to reduce the amount of information that has to be sent to reconstruct the sent snapshot on a different filesystem. efficiency queen πŸ‘‘

The -p <parent> option can be omitted when -c <clone-src> options are given β€” in which case btrfs send will determine a suitable parent from among the clone sources. she'll figure it out herself, she's smart like that. 🧠

πŸ’€ You must not specify clone sources unless you guarantee that these snapshots are exactly in the same state on both sides β€” both for the sender and the receiver. For implications of changed read-write status of a received snapshot please see section SUBVOLUME FLAGS in btrfs-subvolume(8) <>. fr fr, do not play with this.

✨ Options ✨

  • -e β€” if sending multiple subvolumes at once, use the new format and omit the end cmd marker in the stream separating the subvolumes
  • -p <parent> β€” send an incremental stream from parent to subvol
  • -c <clone-src> β€” use this snapshot as a clone source for an incremental send (multiple allowed, she's flexible like that πŸ’…)
  • -f <outfile> β€” output is normally written to standard output so it can be, for example, piped to btrfs receive. Use this option to write it to a file instead. (when you want it to live somewhere permanent, not just vibe in stdout πŸŽ€)
  • --no-data β€” send in NO_FILE_DATA mode

The output stream does not contain any file data and thus cannot be used to transfer changes. This mode is faster and is useful to show the differences in metadata. slay for diffing, but do not try to actually move your stuff with it πŸ™ˆ

  • --proto <N> β€” use send protocol version N

The default is 1, which was the original protocol version. Version 2 encodes file data slightly more efficiently; it is also required for sending compressed data directly (see --compressed-data). Version 2 requires at least btrfs-progs 6.0 on both the sender and receiver and at least Linux 6.0 on the sender. Passing 0 means to use the highest version supported by the running kernel. so 0 = "give me your best, kernel" 😌

  • --compressed-data β€” send data that is compressed on the filesystem directly without decompressing it

If the receiver supports the BTRFS_IOC_ENCODED_WRITE ioctl (added in Linux 6.0), it can also write it directly without decompressing it. Otherwise, the receiver will fall back to decompressing it and writing it normally. either way it works, no cap 🫢

This requires protocol version 2 or higher. If --proto was not used, then --compressed-data implies --proto 2. she sets it for you. main character energy.

  • -q|--quiet β€” (deprecated) alias for global -q option
  • -v|--verbose β€” (deprecated) alias for global -v option

🌈 Global options 🌈

  • -q|--quiet β€” suppress all messages except errors (silence is golden, errors are the exception πŸ’€)
  • -v|--verbose β€” increase output verbosity, print generated commands in a readable form (for the girlies who want to see the receipts πŸ”)

⭐ EXIT STATUS ⭐

btrfs send returns a zero exit status if it succeeds. Non zero is returned in case of failure. that's it, that's the vibe check. βœ…βŒ


πŸŽ€ AVAILABILITY πŸŽ€

btrfs is part of btrfs-progs. Please refer to the documentation at <https://btrfs.readthedocs.io>. go read it, bestie, I believe in you 🌸


πŸ¦‹ SEE ALSO πŸ¦‹


and that's the whole page, you ate that πŸ’– this was btrfs-progs 7.3, dated Oct 24, 2026, bestie β€” no cap, go send some snapshots responsibly. periodt. πŸ‘‘βœ¨πŸ¦‹

πŸ“¦ where this page comes from