BTRFS indeed is a better filesystem, featuring extent based file storage, copy-on-write (COW), easy snapshots and filesystem compression, deduplication and defragmentation. It supports in place upgrade from ext2/3/4 to btrfs with an optional rollback. It can even rebalance itself.
What it does not support is encryption, nor swap files.
mkfs.btrfs -f -L testbtrfs /dev/sdd1 /dev/sdd2 /dev/sdd3 mkfs.btrfs -L home /dev/sdd1 [root@oel7 ~]# mkfs.btrfs -L home /dev/sdd1 btrfs-progs v3.19.1 See http://btrfs.wiki.kernel.org for more information. Turning ON incompat feature 'extref': increased hardlink limit per file to 65536 fs created label home on /dev/sdd1 nodesize 16384 leafsize 16384 sectorsize 4096 size 30.00GiB
Btrfs supports in place migration from ext2/3/4 with an option to rollback. The original extfs image stays untouched after the migration, and it can be used to rollback the entire extfs-btrfs upgrade. This is offline upgrade.
The migration is offline, so the filesystem needs to be unmounted first and cleaned by forcing fsck on it.
umount /dev/sdb1 fsck -f /dev/sdb1
Only then the convertion may start and it takes quite a long time.
btrfs-convert /dev/sdb1 mount /dev/sdb1 /btrfs btrfs subvolume list /btrfs ID 256 gen 25 top level 5 path ext2_saved
Directly after the conversion the btrfs can be mounted rw, the extra space is consumed by btrfs metadata only. The actual file data stays on extfs and changes are performed by making a differential COW to ext2 image.
ext2_saved subvolume contains a file named “image” which indeed is
an image of extfs. It can be accessed (read-only) by mounting it through
a loop device. When it is not required, it can be deleted:
btrfs subvolume delete /btrfs/ext2_saved
When we are happy with the new btrfs it can be defragmented and balanced:
btrfs filesystem defrag -r /btrfs btrfs balance start /btrfs
Subvolumes and Snapshots
Btrfs subvolume has its hierarchy and relations between other subvolumes. A subvolume in btrfs can be accessed from the parent subvolume (as a subdirectory) or as separately mounted filesystem. A btrfs filesystem consists of one or more subvolumes, the default one’s id is 5 (alias 0).
A btrfs snapshot is also a kind of a subvolume, sharing its data with the parent subvolume and possibly other snapshots.The snaphost can be writable but due to its nature, the subsequent changes on it are visible in the snapshot itself and not in its source snapshot.
[root@oel7 ~]# btrfs subvolume create /home/sub1 Create subvolume '/home/sub1' [root@oel7 ~]# btrfs subvolume create /home/sub2 Create subvolume '/home/sub2' [root@oel7 ~]# btrfs subvolume list /home ID 258 gen 14 top level 5 path sub1 ID 259 gen 15 top level 5 path sub2
External Articles on Subvolumes
- Subvolumes and Snapshots in LWN
Snapper is a tool which helps with managing snapshosts. It can compare snapshosts, revert between snapshots and supports automatic snapshots timelines.
[root@oel7 ~]# ls /home jxa oracle sub1 sub2 [root@oel7 ~]# snapper -c home create-config /home [root@oel7 ~]# snapper -c home list Type | # | Pre # | Date | User | Cleanup | Description | Userdata -------+---+-------+------+------+---------+-------------+--------- single | 0 | | | root | | current | [root@oel7 ~]# snapper list Unknown config. [root@oel7 ~]# snapper -c root create-config /home Creating config failed (subvolume already covered). [root@oel7 ~]# snapper delete-config home Command 'delete-config' does not take arguments. [root@oel7 ~]# snapper -c home delete-config [root@oel7 ~]# snapper -c root create-config /home [root@oel7 ~]# snapper list Type | # | Pre # | Date | User | Cleanup | Description | Userdata -------+---+-------+------+------+---------+-------------+--------- single | 0 | | | root | | current | [root@oel7 ~]# snapper list-configs Config | Subvolume -------+---------- root | /home
snapper set-config ALLOW_USERS="oracle" snapper set-config TIMELINE_LIMIT_HOURLY="24" snapper set-config TIMELINE_LIMIT_DAILY="14" snapper set-config TIMELINE_LIMIT_MONTHLY="6" snapper set-config TIMELINE_LIMIT_YEARLY="0" snapper get-config Key | Value -----------------------+------- ALLOW_GROUPS | ALLOW_USERS | oracle BACKGROUND_COMPARISON | yes EMPTY_PRE_POST_CLEANUP | yes EMPTY_PRE_POST_MIN_AGE | 1800 FSTYPE | btrfs NUMBER_CLEANUP | yes NUMBER_LIMIT | 50 NUMBER_MIN_AGE | 1800 SUBVOLUME | /home TIMELINE_CLEANUP | yes TIMELINE_CREATE | yes TIMELINE_LIMIT_DAILY | 14 TIMELINE_LIMIT_HOURLY | 24 TIMELINE_LIMIT_MONTHLY | 6 TIMELINE_LIMIT_YEARLY | 0 TIMELINE_MIN_AGE | 1800 cd /home mv jxa/.cache jxa/.cache-old btrfs subvolume create /home/jxa/.cache chmod 700 jxa/.cache chown jxa:jxa jxa/.cache mv jxa/.cache-old/* jxa/.cache/ rmdir jxa/.cache-old # other subvolumes @home jxa/.virtualbox jxa/Downloads jxa/tmp jxa/VirtualBox VMs jxa/.cache
root fs config
mv log log-old btrfs subvolume create /var/log chmod 775 log chown root:syslog log mv log-old/* log rmdir log-old mv cache cache-old btrfs subvolume create /var/cache chmod 755 cache mv cache-old/* cache rmdir cache-old mv /tmp /tmp-old btrfs subvolume create /tmp chmod 1777 /tmp mv /tmp-old/* /tmp rmdir /tmp-old mv /var/tmp /var/tmp-old btrfs subvolume create /var/tmp chmod 1777 /var/tmp mv /var/tmp-old/* /var/tmp rmdir /var/tmp-old snapper -c root2 create-config / root@ubuntu15b:/var# snapper list-configs Config | Subvolume -------+---------- root | /home root2 | / snapper -c root2 set-config ALLOW_USERS="jxa" snapper -c root2 set-config TIMELINE_LIMIT_HOURLY="24" snapper -c root2 set-config TIMELINE_LIMIT_DAILY="7" snapper -c root2 set-config TIMELINE_LIMIT_MONTHLY="0" snapper -c root2 set-config TIMELINE_LIMIT_YEARLY="0" snapper -c root2 get-config
Suse recommends to create following subvolumes:
/tmp /opt /srv /var/crash /var/spool /var/log /var/run /var/tmp
I like snapper to ignore a list of directories when doing
reports (comparing changes). So I add a filter file
with following lines:
updatedb of indexing
The configuration to adjust is located in
PRUNENAMES=".git .bzr .hg .svn .cache .snapshots"
Use the latest kernel available. Even with LTS Ubuntu (14.04 at the moment) you may use 4.2 kernel.
BTRFS occupies more space when snapper is active. Depending on configuration and on the filesystem activity, it might actually occupy much more than a regular filesystem does. So the rule of thumb is to plan btrfs size at least twice what a regular filesystem would take. If possible, plan it more.
Simple df is not enough at BTRFS filesystem because it does not count in
snapshot data. More appropriate command is
btrfs filesystem show:
root@Ubuntu16a:~# btrfs filesystem show /home Label: 'home' uuid: b7dfa550-e798-463d-ad65-78d0002318a8 Total devices 1 FS bytes used 9.59GiB devid 1 size 30.00GiB used 12.31GiB path /dev/sdb1
The filesystem above shows 9.59GB of filsystem data but it takes 12.31GB at BTRFS (devid line).
Planning wide space margin might not be enough, particularly during often
system updates and upgrades the space pressure might go high and
other-than-fs-increase solution is often required. In such the situation you
may sacrifice snapshots history or remove some of them selectively. The command
you are searching for is
snapper delete (remove|rm) number | number1-number2,
snapper -c root2 delete 63-97
Above removes some incremental changes and usually releases sometimes significant amount of diskspace.
It happend deleting most of my snapshots was not enough and
btrfs fi show still reported the filsystem being full.
Marc Merlin wrote good article on the issue.
Below are his advices:
Unfortunately it’s not uncommon for a btrfs device to fill up due to the fact that it does not rebalance chunks (3.18+ has started freeing empty chunks, which is a step in the right direction).
btrfs balance start /home & while sleep 5; do btrfs fi show /home; btrfs balance status -v /home; done
- BTRFS wiki.kernel.org - primary source of information on BTRFS.
- How to manage BTRFS Storage Pools, Subvolumes and Snapshots - RedHat documentation on LVM CLI.
- Incremental Backup
- Subvolumes and Snapshots - an LWN article.
- Snappper - automatic snapshots.
- Tuning Snapper - ArchLinux Wiki.
- ArchLinux on BTRFS
- BTRFS in Oracle Enterprise Liinux
- BTRFS features, Oracle’s summary.
- Fixing BTRFS full problems
- Moving BTRFS subvolume to another disk