<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Btrfs on tsvinc</title>
		<link>https://tsvinc.dev/tags/btrfs/</link>
		<description>Recent content in Btrfs on tsvinc</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Sun, 25 Oct 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://tsvinc.dev/tags/btrfs/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>12.4 GB of duplicates, 3.4 GB on disk</title>
				<link>https://tsvinc.dev/posts/btrfs-duplicates-that-werent/</link>
				<pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/btrfs-duplicates-that-werent/</guid>
				<description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; compsize -x model.bin model-copy.bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;model.bin: SEARCH_V2: Operation not permitted&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is compsize, the tool that reports what a file actually costs on btrfs, refusing to talk to a normal user. It reads each file&#39;s extent records through a btrfs ioctl, and the kernel lets only &lt;code&gt;CAP_SYS_ADMIN&lt;/code&gt; call it. I did the measuring on the workstation I was clearing out without sudo.&lt;/p&gt;&#xA;&lt;p&gt;What it did have was rootful Docker, through the docker group. So I ran the host&#39;s own compsize through a read-only chroot:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Measure real btrfs disk use without sudo</title>
				<link>https://tsvinc.dev/guides/btrfs-compsize-without-root/</link>
				<pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/guides/btrfs-compsize-without-root/</guid>
				<description>&lt;p&gt;Run the host&#39;s own &lt;code&gt;compsize&lt;/code&gt; as root in a throwaway Docker container to get the real on-disk size of a path on btrfs, with compression and reflinked copies counted correctly, when you are in the &lt;code&gt;docker&lt;/code&gt; group but have no sudo.&lt;/p&gt;&#xA;&#xA;&lt;dl class=&#34;guide-scope&#34;&gt;&lt;div class=&#34;guide-scope-row&#34;&gt;&lt;dt&gt;Tested on&lt;/dt&gt;&lt;dd&gt;Fedora 44 workstation, kernel 7.2.10-200.fc44, btrfs &lt;code&gt;/home&lt;/code&gt; mounted with &lt;code&gt;compress=zstd:1&lt;/code&gt;, compsize 1.5^git20250123.d79eacf-15.fc44, coreutils 9.10, Docker CE 29.9.1 (rootful), &lt;code&gt;alpine&lt;/code&gt; image 3.24.2 (2026-10-25, on test files). Used on real data on the same workstation on 2026-10-23 or 2026-10-24 (tool versions not recorded).&lt;/dd&gt;&lt;/div&gt;&lt;div class=&#34;guide-scope-row is-gap&#34;&gt;&lt;dt&gt;Not verified&lt;/dt&gt;&lt;dd&gt;a Docker daemon with SELinux support enabled (&lt;code&gt;selinux&lt;/code&gt; in &lt;code&gt;docker info&lt;/code&gt; security options); rootless Docker or Podman themselves (only the user-namespace mechanism they rely on, Failure modes row 2); the &lt;code&gt;All empty or still-delalloced files.&lt;/code&gt; message compsize prints for data not yet written out.&lt;/dd&gt;&lt;/div&gt;&lt;div class=&#34;guide-scope-row&#34;&gt;&lt;dt&gt;Needs&lt;/dt&gt;&lt;dd&gt;a btrfs filesystem; &lt;code&gt;compsize&lt;/code&gt; installed on the host as &lt;code&gt;/usr/bin/compsize&lt;/code&gt;; access to a rootful Docker daemon, usually through the &lt;code&gt;docker&lt;/code&gt; group; the &lt;code&gt;alpine&lt;/code&gt; image, or network access to pull it. No sudo.&lt;/dd&gt;&lt;/div&gt;&lt;div class=&#34;guide-scope-row&#34;&gt;&lt;dt&gt;Time&lt;/dt&gt;&lt;dd&gt;5 min.&lt;/dd&gt;&lt;/div&gt;&lt;div class=&#34;guide-scope-row&#34;&gt;&lt;dt&gt;Risk&lt;/dt&gt;&lt;dd&gt;nothing on disk changes (except a root-owned &lt;code&gt;ro-test&lt;/code&gt; file if the read-only check in Before you start fails), but this is not a low-privilege method. The &lt;code&gt;docker&lt;/code&gt; group grants root-level privileges (Docker&#39;s own docs). The container runs as root with CAP_SYS_ADMIN, and &lt;code&gt;-v /:/host:ro&lt;/code&gt; guards against your own mistakes, not against hostile code in the image. Run it only with an image you trust. The image provides only &lt;code&gt;chroot&lt;/code&gt;; the compsize binary and its libraries come from the host. Nothing to undo afterwards.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&#xA;&lt;h2 id=&#34;before-you-start&#34;&gt;Before you start&lt;a class=&#34;heading-anchor&#34; href=&#34;#before-you-start&#34; aria-label=&#34;Link to section: Before you start&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;Optional: a test directory with known content, to check the numbers before you trust them. Every transcript in this manual ran in one scratch directory on the same btrfs &lt;code&gt;/home&lt;/code&gt;; the measurements use these three 64 MiB files:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; head -c 64M /dev/urandom &amp;gt; random.bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; cp random.bin random-copy.bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; yes &lt;span class=&#34;s1&#34;&gt;&amp;#39;compsize demo: the quick brown fox jumps over the lazy dog&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -c 64M &amp;gt; text.txt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;compsize fails as your user, on any file on the btrfs filesystem (here &lt;code&gt;text.txt&lt;/code&gt; from the test directory). This is the error the manual works around:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; compsize text.txt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;text.txt: SEARCH_V2: Operation not permitted&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;The path is on btrfs, and compression is on:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; findmnt -no FSTYPE,OPTIONS -T .&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;btrfs rw,relatime,seclabel,compress=zstd:1,ssd,discard=async,space_cache=v2,subvolid=257,subvol=/home&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Expected: &lt;code&gt;btrfs&lt;/code&gt; and a &lt;code&gt;compress=&lt;/code&gt; option. Use &lt;code&gt;-T &amp;lt;path&amp;gt;&lt;/code&gt; for a path that is not the current directory.&lt;/li&gt;&#xA;&lt;li&gt;compsize is installed on the host, at the path the container will call:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; rpm -q compsize&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;compsize-1.5^git20250123.d79eacf-15.fc44.x86_64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;command&lt;/span&gt; -v compsize&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;/usr/bin/compsize&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Without it the &lt;code&gt;chroot&lt;/code&gt; has nothing to run, and installing it needs root.&lt;/li&gt;&#xA;&lt;li&gt;The Docker daemon is rootful:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; docker info --format &lt;span class=&#34;s1&#34;&gt;&amp;#39;{{.SecurityOptions}}&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;[name=seccomp,profile=builtin name=cgroupns]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Expected: no &lt;code&gt;rootless&lt;/code&gt; entry. A rootless daemon runs containers in a user namespace, where compsize fails the same way as for your user (Failure modes, row 2; rootless Docker itself not tested).&lt;/li&gt;&#xA;&lt;li&gt;The read-only mount reaches the filesystem that holds your path. &lt;code&gt;/home&lt;/code&gt; can be a separate mount under &lt;code&gt;/&lt;/code&gt;; on this box it is (&lt;code&gt;subvol=/home&lt;/code&gt; above). Docker makes the submounts of a read-only bind read-only too only as a best effort, on kernel 5.12 or newer:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; docker run --rm -v /:/host:ro -w &lt;span class=&#34;s2&#34;&gt;&amp;#34;/host&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PWD&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; alpine touch ro-test&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;touch: ro-test: Read-only file system&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Expected: &lt;code&gt;Read-only file system&lt;/code&gt;. If &lt;code&gt;touch&lt;/code&gt; succeeds instead, the guard does not cover your path, and a root-owned &lt;code&gt;ro-test&lt;/code&gt; file is left behind. Remove it through a container, for example &lt;code&gt;docker run --rm -v &amp;quot;$PWD&amp;quot;:/w alpine rm /w/ro-test&lt;/code&gt; &lt;code&gt;[UNVERIFIED: not exercised, the touch failed here]&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;alpine&lt;/code&gt; image is present, or &lt;code&gt;docker run&lt;/code&gt; pulls it on first use:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; docker run --rm alpine cat /etc/alpine-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;3.24.2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Expected: an Alpine version. The measurement uses only its &lt;code&gt;chroot&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Placeholders: &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; is the file or directory to measure, as an &lt;strong&gt;absolute&lt;/strong&gt; path (&lt;code&gt;&amp;quot;$PWD/&amp;lt;name&amp;gt;&amp;quot;&lt;/code&gt; or &lt;code&gt;~/…&lt;/code&gt;; a relative path prints &lt;code&gt;No files.&lt;/code&gt;, Failure modes row 3). &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; is a file or directory in the current directory. &lt;code&gt;&amp;lt;dir&amp;gt;&lt;/code&gt; is your test directory.&lt;/li&gt;&#xA;&lt;li&gt;Backups: none needed. Nothing is written.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;steps&#34;&gt;Steps&lt;a class=&#34;heading-anchor&#34; href=&#34;#steps&#34; aria-label=&#34;Link to section: Steps&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Flush pending writes.&lt;/strong&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sync&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Expected: no output. compsize counts only data that already has extents on disk; its man page says recently written files can show as taking no space until they are synced or written out, typically within about 30 seconds.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Run the host&#39;s compsize through the container.&lt;/strong&gt; This is the command as used on real data:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run --rm --cap-add SYS_ADMIN -v /:/host:ro alpine chroot /host /usr/bin/compsize -x &amp;lt;path&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;On the test directory:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; docker run --rm --cap-add SYS_ADMIN -v /:/host:ro alpine chroot /host /usr/bin/compsize -x &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PWD&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Processed 3 files, 513 regular extents (514 refs), 0 inline, 325 fragments.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Type       Perc     Disk Usage   Uncompressed Referenced  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;TOTAL       51%       66M         128M         192M       &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;none       100%       64M          64M         128M       &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;zstd         3%      2.0M          64M          64M       &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Expected: a &lt;code&gt;Processed N files&lt;/code&gt; line, a &lt;code&gt;TOTAL&lt;/code&gt; row, and one row per compression type. &lt;code&gt;--cap-add SYS_ADMIN&lt;/code&gt; grants the capability that btrfs checks for the search ioctl compsize uses. &lt;code&gt;-v /:/host:ro&lt;/code&gt; shows the host&#39;s root read-only. &lt;code&gt;chroot /host&lt;/code&gt; makes &lt;code&gt;/usr/bin/compsize&lt;/code&gt; the host&#39;s binary. &lt;code&gt;-x&lt;/code&gt; stops at filesystem boundaries, and to compsize a nested btrfs subvolume is one (Failure modes, row 5).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Read the &lt;code&gt;TOTAL&lt;/code&gt; row against &lt;code&gt;du&lt;/code&gt;.&lt;/strong&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; du -h random.bin random-copy.bin text.txt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;64M&#x9;random.bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;64M&#x9;random-copy.bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;64M&#x9;text.txt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; du -sh .&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;192M&#x9;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Expected: &lt;code&gt;du&lt;/code&gt; matches &lt;strong&gt;Referenced&lt;/strong&gt; (192M), not &lt;strong&gt;Disk Usage&lt;/strong&gt; (66M). From the compsize man page and README: Disk Usage is what the files cost on disk, and every referenced extent is counted once; Uncompressed is the same extents before compression; Referenced is the apparent size of every file, so each reflinked copy counts again. A &lt;code&gt;none&lt;/code&gt; row is data btrfs stored uncompressed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Price duplicates as a set: all copies, then one.&lt;/strong&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; docker run --rm --cap-add SYS_ADMIN -v /:/host:ro alpine chroot /host /usr/bin/compsize -x &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PWD&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/random.bin&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PWD&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/random-copy.bin&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Processed 2 files, 1 regular extents (2 refs), 0 inline, 2 fragments.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Type       Perc     Disk Usage   Uncompressed Referenced  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;TOTAL      100%       64M          64M         128M       &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;none       100%       64M          64M         128M       &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; docker run --rm --cap-add SYS_ADMIN -v /:/host:ro alpine chroot /host /usr/bin/compsize -x &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PWD&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/random.bin&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Processed 1 file, 1 regular extents (1 refs), 0 inline, 1 fragments.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Type       Perc     Disk Usage   Uncompressed Referenced  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;TOTAL      100%       64M          64M          64M       &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;none       100%       64M          64M          64M       &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Expected: Disk Usage of all copies minus Disk Usage of one copy is what the extra copies really cost. Here it is 64M − 64M = 0, because &lt;code&gt;cp&lt;/code&gt; made a reflink: coreutils 9.0 and later default to &lt;code&gt;--reflink=auto&lt;/code&gt;, and this box has 9.10. A duplicate finder that adds up file sizes would report 64M wasted.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;verify&#34;&gt;Verify&lt;a class=&#34;heading-anchor&#34; href=&#34;#verify&#34; aria-label=&#34;Link to section: Verify&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;A file with known content gives the expected cost. 64 MiB of repeated text takes 2.0M on disk:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; docker run --rm --cap-add SYS_ADMIN -v /:/host:ro alpine chroot /host /usr/bin/compsize -x &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PWD&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/text.txt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Processed 1 file, 512 regular extents (512 refs), 0 inline, 323 fragments.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Type       Perc     Disk Usage   Uncompressed Referenced  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;TOTAL        3%      2.0M          64M          64M       &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;zstd         3%      2.0M          64M          64M       &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;64 MiB of random data takes 64M, type &lt;code&gt;none&lt;/code&gt; (step 4, second command).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;undo--rollback&#34;&gt;Undo / rollback&lt;a class=&#34;heading-anchor&#34; href=&#34;#undo--rollback&#34; aria-label=&#34;Link to section: Undo / rollback&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;Nothing on the filesystem changes: compsize only reads, and the host root is mounted read-only (checked in Before you start).&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;--rm&lt;/code&gt; removes the container when it exits. Checked with a named run:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; docker run --rm --name compsize-manual-rmcheck-20261025 --cap-add SYS_ADMIN -v /:/host:ro alpine chroot /host /usr/bin/compsize -x &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PWD&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/text.txt&amp;#34;&lt;/span&gt; &amp;gt; /dev/null&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; docker ps -a --filter &lt;span class=&#34;nv&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;compsize-manual-rmcheck-20261025 --format &lt;span class=&#34;s1&#34;&gt;&amp;#39;{{.Names}}&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; wc -l&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;If &lt;code&gt;docker run&lt;/code&gt; pulled &lt;code&gt;alpine&lt;/code&gt; only for this, &lt;code&gt;docker image rm alpine&lt;/code&gt; removes it &lt;code&gt;[UNVERIFIED: not exercised, the image was already present]&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Remove the test directory with &lt;code&gt;rm -r &amp;lt;dir&amp;gt;&lt;/code&gt; if you made one &lt;code&gt;[UNVERIFIED: not exercised, the test files are kept as evidence]&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;failure-modes&#34;&gt;Failure modes&lt;a class=&#34;heading-anchor&#34; href=&#34;#failure-modes&#34; aria-label=&#34;Link to section: Failure modes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&lt;div class=&#34;table-wrap&#34; aria-label=&#34;Table: Symptom (exact message), Cause, Fix&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Symptom (exact message)&lt;/th&gt;&#xA;      &lt;th&gt;Cause&lt;/th&gt;&#xA;      &lt;th&gt;Fix&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;text.txt: SEARCH_V2: Operation not permitted&lt;/code&gt; (compsize run as your user; the file name comes first)&lt;/td&gt;&#xA;      &lt;td&gt;The btrfs &lt;code&gt;TREE_SEARCH_V2&lt;/code&gt; ioctl returns EPERM without CAP_SYS_ADMIN (kernel 7.2.10 &lt;code&gt;fs/btrfs/ioctl.c&lt;/code&gt;).&lt;/td&gt;&#xA;      &lt;td&gt;Step 2.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;The same message from root in a user namespace: &lt;code&gt;unshare -Ur&lt;/code&gt; shows &lt;code&gt;CapEff: 000001ffffffffff&lt;/code&gt; and compsize still fails&lt;/td&gt;&#xA;      &lt;td&gt;The kernel checks the capability in the initial user namespace. Rootless Docker runs the daemon and its containers inside a user namespace (Docker docs); tested here with &lt;code&gt;unshare -Ur&lt;/code&gt; only.&lt;/td&gt;&#xA;      &lt;td&gt;A rootful daemon, or an admin who runs compsize.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;No files.&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;A relative &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt;. After &lt;code&gt;chroot /host&lt;/code&gt; the working directory is &lt;code&gt;/&lt;/code&gt; (checked with &lt;code&gt;pwd&lt;/code&gt;), and compsize skips paths that do not exist without an error.&lt;/td&gt;&#xA;      &lt;td&gt;Pass an absolute path: &lt;code&gt;&amp;quot;$PWD/&amp;lt;name&amp;gt;&amp;quot;&lt;/code&gt; or &lt;code&gt;~/…&lt;/code&gt;. A relative path given together with absolute ones is skipped the same way, so the total is partial with no error.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;du: cannot read directory &#39;./locked&#39;: Permission denied&lt;/code&gt; and a total that is too small&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;du&lt;/code&gt; runs as your user and skips directories it cannot read, such as a container&#39;s database directory with mode 700.&lt;/td&gt;&#xA;      &lt;td&gt;Use the container total: root in the container reads them. On the test directory, a 16 MiB file in a &lt;code&gt;chmod 000&lt;/code&gt; directory was missing from &lt;code&gt;du -sh .&lt;/code&gt; (192M) and counted by compsize (Disk Usage 66M → 82M).&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;No message, but files in a nested subvolume are missing: &lt;code&gt;Processed 4 files&lt;/code&gt; instead of 5&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;-x&lt;/code&gt; skips anything whose device number differs from its parent&#39;s, and every btrfs subvolume has its own.&lt;/td&gt;&#xA;      &lt;td&gt;Drop &lt;code&gt;-x&lt;/code&gt; when the path holds subvolumes you want counted. On the test directory a 16 MiB file in a subvolume made 82M (with &lt;code&gt;-x&lt;/code&gt;) into 98M (without). Without &lt;code&gt;-x&lt;/code&gt; compsize also enters other mounts below the path, and per its source it stops at a non-btrfs one with &lt;code&gt;Not btrfs (or SEARCH_V2 unsupported).&lt;/code&gt; (not exercised).&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;field-notes&#34;&gt;Field notes&lt;a class=&#34;heading-anchor&#34; href=&#34;#field-notes&#34; aria-label=&#34;Link to section: Field notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;2026-10-25, workstation: Fedora 44, kernel 7.2.10-200.fc44, btrfs compress=zstd:1 (&lt;code&gt;/home&lt;/code&gt;); compsize 1.5^git20250123.d79eacf-15.fc44; Docker CE 29.9.1 (rootful), alpine 3.24.2; coreutils 9.10, overlayfs storage, SELinux enforcing:&lt;/strong&gt; Every block in this manual was run on test files in a scratch directory on the same &lt;code&gt;/home&lt;/code&gt;, not on real data. As the normal user, compsize failed with the file name in front of the error: &lt;code&gt;text.txt: SEARCH_V2: Operation not permitted&lt;/code&gt;. The container run worked first time. &lt;code&gt;du&lt;/code&gt; said 192M for the directory, compsize said 66M on disk. The 64 MiB &lt;code&gt;cp&lt;/code&gt; copy cost nothing (one extent, two references). A compsize run started within a second of writing 64 MiB of text was expected to show the unflushed-data message, but all 512 extents were already counted, so the &lt;code&gt;sync&lt;/code&gt; in step 1 is a precaution from the man page, not an observed fix. A &lt;code&gt;touch&lt;/code&gt; through the read-only mount failed, so the read-only flag reached the &lt;code&gt;/home&lt;/code&gt; submount on this kernel. Root in a user namespace (&lt;code&gt;unshare -Ur&lt;/code&gt;, all capabilities) still got EPERM. A relative path printed &lt;code&gt;No files.&lt;/code&gt; A directory with mode 000 hid 16 MiB from &lt;code&gt;du&lt;/code&gt; but not from the container, and &lt;code&gt;-x&lt;/code&gt; silently left out a nested test subvolume. The daemon has no SELinux support enabled, so this run says nothing about one that has.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;2026-10-23 or 2026-10-24 (the day was not recorded), same workstation and &lt;code&gt;/home&lt;/code&gt; filesystem, tool versions not recorded:&lt;/strong&gt; On the real disk, compsize ran without sudo, through the rootful Docker daemon (&lt;code&gt;docker&lt;/code&gt; group), and each destructive step of the housekeeping waited for my approval. &lt;code&gt;du&lt;/code&gt; reported uncompressed sizes. compsize run as my normal user failed on SEARCH_V2 with &lt;code&gt;Operation not permitted&lt;/code&gt;, and the container command in step 2 worked. Result: 144 GB of data in 94 GB of disk. 78 GB of it was stored uncompressed: zips, ROMs, maps and model weights, data that btrfs&#39;s compression heuristic skips. A Postgres data directory owned by a container&#39;s uid (mode 700) made &lt;code&gt;du&lt;/code&gt; print &lt;code&gt;Permission denied&lt;/code&gt; and undercount by 15.8 GB. A duplicate finder listed 268 sets of identical files of at least 5 MB, 12.4 GB of apparent waste. compsize per set (all copies, then one) put the real figure at 3.4 GB, because &lt;code&gt;cp&lt;/code&gt; had already made reflinks: a 2.9 GB speech model and its copy took 2.8 GB together. Recompressing with &lt;code&gt;btrfs filesystem defragment -czstd -L 9&lt;/code&gt; worked without root but gained about 5%, so it was dropped. A live SQLite database had the &lt;code&gt;m&lt;/code&gt; (no-compress) attribute on purpose.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;notes&#34;&gt;Notes&lt;a class=&#34;heading-anchor&#34; href=&#34;#notes&#34; aria-label=&#34;Link to section: Notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;Without Docker: &lt;code&gt;btrfs filesystem du -s &amp;lt;path&amp;gt;&lt;/code&gt; runs as a normal user and separates &lt;code&gt;Exclusive&lt;/code&gt; from &lt;code&gt;Set shared&lt;/code&gt;, so it does see reflinked copies. It reports uncompressed sizes, though: on the test directory it gave &lt;code&gt;text.txt&lt;/code&gt; 64.00MiB, against compsize&#39;s 2.0M.&lt;/li&gt;&#xA;&lt;li&gt;Why &lt;code&gt;chroot&lt;/code&gt; into the host instead of a compsize image: no package install inside a root container, and the binary is the host&#39;s own. Docker keeps the &lt;code&gt;SYS_CHROOT&lt;/code&gt; capability by default.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;~/…&lt;/code&gt; paths work for &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; because the host shell expands them before &lt;code&gt;docker&lt;/code&gt; runs (checked); relative paths do not (Failure modes, row 3).&lt;/li&gt;&#xA;&lt;li&gt;Higher zstd level: about 5% on the original box, which was put down to btrfs compressing each 128 KiB chunk on its own (the chunk size is in the btrfs docs). &lt;code&gt;btrfs-filesystem(8)&lt;/code&gt; warns that defragmenting breaks up reflinks on kernels 3.14-rc2 and later, so do not defragment files whose copies share extents.&lt;/li&gt;&#xA;&lt;li&gt;The story behind the numbers in the field notes, and why &lt;code&gt;du&lt;/code&gt; misled: &lt;a href=&#34;https://tsvinc.dev/posts/btrfs-duplicates-that-werent/&#34;&gt;the btrfs duplicates that weren&#39;t&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;heading-anchor&#34; href=&#34;#sources&#34; aria-label=&#34;Link to section: Sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/kilobyte/compsize/blob/master/compsize.c&#34;&gt;compsize source, &lt;code&gt;compsize.c&lt;/code&gt;&lt;/a&gt;: the &lt;code&gt;%s: SEARCH_V2: %m&lt;/code&gt; error, &lt;code&gt;-x&lt;/code&gt; as a device-number comparison, missing paths skipped silently, &lt;code&gt;No files.&lt;/code&gt;. Fedora&#39;s package is built from commit &lt;code&gt;d79eacf&lt;/code&gt;, byte-identical to master when fetched.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/kilobyte/compsize/master/compsize.8&#34;&gt;compsize man page, &lt;code&gt;compsize.8&lt;/code&gt;&lt;/a&gt;: meaning of Disk Usage, Uncompressed and Referenced; &lt;code&gt;-x&lt;/code&gt;; the caveat about unsynced files; &amp;quot;The ioctls used by this program require root.&amp;quot;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/kilobyte/compsize/master/README.md&#34;&gt;compsize README&lt;/a&gt;: &amp;quot;every referenced extent is counted whole, exactly once&amp;quot;; the ioctl requires root.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux/+/refs/tags/v7.2.10/fs/btrfs/ioctl.c&#34;&gt;Linux 7.2.10 &lt;code&gt;fs/btrfs/ioctl.c&lt;/code&gt;&lt;/a&gt;: &lt;code&gt;btrfs_ioctl_tree_search_v2()&lt;/code&gt; returns &lt;code&gt;-EPERM&lt;/code&gt; unless &lt;code&gt;capable(CAP_SYS_ADMIN)&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/coreutils/coreutils/master/NEWS&#34;&gt;GNU coreutils NEWS&lt;/a&gt;, release 9.0: &amp;quot;cp now uses --reflink=auto mode by default.&amp;quot;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.docker.com/engine/install/linux-postinstall/&#34;&gt;Docker: Linux post-installation steps&lt;/a&gt;: &amp;quot;The docker group grants root-level privileges to the user.&amp;quot;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.docker.com/engine/security/&#34;&gt;Docker: security&lt;/a&gt;: the daemon needs root unless in rootless mode; only trusted users should control it.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.docker.com/engine/storage/bind-mounts/&#34;&gt;Docker: bind mounts&lt;/a&gt;: read-only binds make submounts read-only as a best effort, on kernel 5.12 or newer.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.docker.com/engine/containers/run/&#34;&gt;Docker: running containers&lt;/a&gt;: default capabilities (&lt;code&gt;DAC_OVERRIDE&lt;/code&gt; and &lt;code&gt;SYS_CHROOT&lt;/code&gt; kept, &lt;code&gt;SYS_ADMIN&lt;/code&gt; only through &lt;code&gt;--cap-add&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.docker.com/engine/security/rootless/&#34;&gt;Docker: rootless mode&lt;/a&gt;: a rootless daemon lists &lt;code&gt;rootless&lt;/code&gt; under Security Options in &lt;code&gt;docker info&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://btrfs.readthedocs.io/en/latest/Compression.html&#34;&gt;btrfs documentation: compression&lt;/a&gt;: data is split into 128 KiB chunks before compression; if the first portion compressed does not shrink, compression is disabled for the whole file.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;btrfs-filesystem(8)&lt;/code&gt; from btrfs-progs 7.1 (&lt;code&gt;man btrfs-filesystem&lt;/code&gt;): the defragment warning about breaking up reflinks.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
	</channel>
</rss>
