2 min read

Mounting a BTRFS Subvolume

Mounting a BTRFS Subvolume
Porque Podemos

Let's say there's a BTRFS filesystem happily running things in one location and it becomes desirable to use the same BTRFS filesystem in a different location. Traditionally would require the administrator to create a new partition or logical volume, format it, and mount it in the new location or use a bind mount. However, with BTRFS it's possible to mount a subvolume, with filesystem options, providing the ability to use a subvolume like a partition.

The Setup

  • An existing BTRFS filesystem mounted at /srv
  • A subvolume for "machines" will be created at /srv/machines
  • The resulting subvolume will be mounted at /var/lib/machines.
The Filesystem Overview
# btrfs filesystem show
Label: none  uuid: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
        Total devices 2 FS bytes used 21.81GiB
        devid    1 size 232.88GiB used 13.01GiB path /dev/sdb
        devid    2 size 232.89GiB used 13.01GiB path /dev/sdc
Make The Subvolume
# btrfs subvolume create /srv/machines
Validate The Subvolume
# btrfs subvolume show /srv/machines/
/srv/machines
        Name:                   machines
        UUID:                   YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY
        Parent UUID:            -
        Received UUID:          -
        Creation time:          2017-12-01 22:30:23 -0600
        Subvolume ID:           264
        Generation:             10531
        Gen at creation:        15
        Parent ID:              5
        Top level ID:           5
        Flags:                  -
        Snapshot(s):
Mount The Subvolume
# mount -t btrfs -o subvol=machines,defaults,nodatacow /dev/disk/by-uuid/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /var/lib/machines
Confirm The Subvolume is Mounted & Functional
# grep machines /proc/mounts  
/dev/sdb /var/lib/machines btrfs rw,relatime,space_cache,subvolid=264,subvol=/machines 0 0

Profit!


Bonus | Make The Subvolume Mount Persistent

A service file will be created /etc/systemd/service/var-lib-machines.mount and will allow the mounted subvolume to survive reboots.

Create a Systemd Mount Service File
[Unit]
Description=Virtual Machine and Container Storage

[Mount]
What=/dev/disk/by-uuid/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Where=/var/lib/machines
Type=btrfs
Options=subvol=machines,defaults,nodatacow
Reload The Systemd Daemon
# systemctl daemon-reload 
Enable The Mount
# systemctl enable var-lib-machines.mount
Restart The Mount
# systemctl start var-lib-machines.mount
Verify The Mount is Operational
# systemctl status var-lib-machines.mount 
● var-lib-machines.mount - Virtual Machine and Container Storage
   Loaded: loaded (/lib/systemd/system/var-lib-machines.mount; static; vendor preset: enabled)
   Active: active (mounted) since Sat 2017-11-25 04:48:33 UTC; 1 weeks 4 days ago
    Where: /var/lib/machines
     What: /dev/disk/by-uuid/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
    Tasks: 0 (limit: 8192)
   Memory: 0B
      CPU: 0

TTFN

With these simple steps, a BTRFS subvolume has been mounted in from /srv/machines to /var/lib/machines and potentially been setup as a persistent mount using a mount unit file.

Mastodon