btrfs is used by SUSE12 for the /root partition – where it is doing daily snapshots of the installed OS.

It has more functionality built-in than just storing files.

This article wants to take btrfs for a test-drive.

Video Tutorials:

btrfs and raid

snapshots in 2012 with SuSE


Btrfs is a modern copy on write (CoW) filesystem for Linux aimed at implementing advanced features while also focusing on fault tolerance, repair and easy administration.

Jointly developed at multiple companies, Btrfs is licensed under the GPL and open for contribution from anyone.

The following companies use Btrfs in production:

  • Facebook (testing in production as of 2014/04)
  • Jolla (smartphone)
  • Lavu (iPad point of sale solution. Used for compressed log storage on webservers.)
  • Rockstor (BTRFS powered FOSS NAS solution)
  • Tripadvisor (mid term log storage)
  • NAS devices from Thecus support Btrfs support since FW 2.05.04 (release notes)
  • Synology (NAS vendor) features Btrfs starting in DiskStation Manager (DSM) v6.0
  • HostDime (as of 2017/01, used for backup drives and underlying FS for OpenStack cloud)
  • Mendix (since end 2014) for backup servers using snapshots and rsync (remotes are mostly ext4) and for incremental replication (fast and often) for disaster recovery purposes using snapshots and send/receive (btrbk)

(src: production users)

create and mount a btrfs partition

fdisk /dev/sdb; # create a new partition 10G

mkfs.btrfs -L LABEL /dev/sdb7; # format it
mkfs.btrfs -L LABEL -f /dev/sdb7; # if it is allready btrfs formatted
btrfs-progs v4.7.3
See for more information.

Performing full device TRIM (10.00GiB) ...
Label:              (null)
Node size:          16384
Sector size:        4096
Filesystem size:    10.00GiB
Block group profiles:
  Data:             single            8.00MiB
  Metadata:         DUP               1.00GiB
  System:           DUP               8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  1
   ID        SIZE  PATH
    1    10.00GiB  /dev/sdb7

lsblk -fs|grep btrfs
sdb7  btrfs        52b80a42-4737-4cc9-b939-afe0a8c6c0ea

mkdir /mnt/btrfs; # create mountpoint

mount /dev/sdb7 /mnt/btrfs; # mount the partition

show basic info about this filesystem

btrfs filesystem show; # show all available btrfs partitions
Label: none  uuid: 52b80a42-4737-4cc9-b939-afe0a8c6c0ea
        Total devices 1 FS bytes used 384.00KiB
        devid    1 size 10.00GiB used 2.02GiB path /dev/sdb7

btrfs filesystem df /mnt/btrfs/
Data, single: total=7.98GiB, used=7.98GiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=1.00GiB, used=8.70MiB
GlobalReserve, single: total=512.00MiB, used=0.00B


btrfs filesystem resize -1g /mnt/btrfs
Resize '/mnt/btrfs' of '-1g'

df -Th|grep btrfs
/dev/sdb7      btrfs     9.0G   17M  7.0G   1% /mnt/btrfs

btrfs filesystem resize +1g /mnt/btrfs
Resize '/mnt/btrfs' of '+1g'

df -Th|grep btrfs
/dev/sdb7      btrfs      10G   17M  8.0G   1% /mnt/btrfs

create and restore snapshots

snapper is not SUSE only 😉

unfortunately – snapshots under btrfs – are a bit complicated IMHO.


  • Does snapper really revert everything?

    Snapper will revert all files (text and binary) including permissions, ownership and extended attributes and also remove and recreate files and directories. File timestamps are not reverted. Some files are excluded, e.g. /etc/mtab.

    It’s recommended to always use the status command to see in advance what files snapper will process. (Snapper FAQ)


Snapper is a command-line program for filesystem snapshot management. It can create, delete and compare snapshots and undo changes done between snapshots.

Snapper never modifies the content of snapshots.

Thus snapper creates read-only snapshots if supported by the kernel.

Supported filesystems are btrfs and ext4 as well as snapshots of LVM logical volumes with thin-provisioning.

Q: Does snapper support ext4?

A: Yes, but only experimentally and you need a special kernel and e2fsprogs. For more information see the next4 project. (src)


Some filesystems might not be supported depending on your installation.

apt-cache search btrfs|grep snap
snapper - Linux filesystem snapshot management tool

snapper -c LABEL create-config /mnt/btrfs/; # enable recurring snapshots for this partition
... stuck.


what are subvolumes?

Separate internal filesystem roots.

A Btrfs subvolume is an independently mountable POSIX filetree and not a block device (and cannot be treated as one). Most other POSIX filesystems have a single mountable root, Btrfs has an independent mountable root for the volume (top level subvolume) and for each subvolume; a Btrfs volume can contain more than a single filetree, it can contain a forest of filetrees. A Btrfs subvolume can be thought of as a POSIX file namespace.

A subvolume in Btrfs is not similar to a LVM logical volume or a ZFS subvolume. With LVM, a logical volume is a block device in its own right (which could for example contain any other filesystem or container like dm-crypt, MD RAID, etc.), this is not the case with Btrfs.

A Btrfs subvolume root directory differs from a directory in that each subvolume defines a distinct inode number space (distinct inodes in different subvolumes can have the same inumber) and each inode under a subvolume has a distinct device number (as reported by stat(2)). Each subvolume root can be accessed as implicitly mounted via the volume (top level subvolume) root, if that is mounted, or it can be mounted in its own right.

So, given a filesystem structure like this:

toplevel            (volume root directory)
+-- dir_1           (normal directory)
|   +-- file_2      (normal file)
|   \-- file_3      (normal file)
\-- subvol_a        (subvolume root directory)
    +-- subvol_b    (subvolume root directory, nested below subvol_a)
    |   \-- file_4  (normal file)
    \-- file_5      (normal file)


let’s create some:

btrfs subvolume create /mnt/btrfs/sub1
Create subvolume '/mnt/btrfs/sub1'

btrfs subvolume create /mnt/btrfs/sub2
Create subvolume '/mnt/btrfs/sub2'

btrfs subvolume create /mnt/btrfs/sub2/sub2.1
Create subvolume '/mnt/btrfs/sub2/sub2.1'

btrfs subvolume list /mnt/btrfs; # show all subvolumes
ID 257 gen 11 top level 5 path sub1
ID 258 gen 13 top level 5 path sub2
ID 259 gen 13 top level 258 path sub2/sub2.1


umount /dev/sdb7
root@debian9:~# btrfs check --repair /dev/sdb7
enabling repair mode
Checking filesystem on /dev/sdb7
UUID: 52b80a42-4737-4cc9-b939-afe0a8c6c0ea
checking extents
Fixed 0 roots.
checking free space cache
cache and super generation don't match, space cache will be invalidated
checking fs roots
checking csums
checking root refs
found 393216 bytes used err is 0
total csum bytes: 0
total tree bytes: 131072
total fs tree bytes: 32768
total extent tree bytes: 16384
btree space waste bytes: 124760
file data blocks allocated: 262144
referenced 262144