Btrfs子卷

Linux LVM逻辑卷管理 类似,Btrfs提供了卷管理能力,但是也有一些借鉴 ZFS 的管理改进:

  • 通过独立子卷可以从操作系统层面隔离用户访问

  • 在不同子卷采用针对不同业务的不同 Btrfs优化 ,例如 Btrfs压缩

本文实践中,我采用独立子卷来提供 Btrfs NFS

创建独立子卷

  • 创建子卷: 这里创建一个 cloud-atlas_build 子卷,用于输出我的 Sphinx文档 编译输出目录:

    # 先清理掉 build 目录下文件: make clean
    rm -rf /home/huatai/docs/github.com/cloud-atlas/build/*
    

/data 挂载卷下创建 cloud-atlas_build 子卷:

在Btrfs文件/data挂载卷下创建子卷 cloud-atlas_build
# 在 ``/data`` 已挂载的btrfs目录下创建子卷 cloud-atlas_build
btrfs subvolume create /data/cloud-atlas_build
  • 可以手工命令挂载子卷:

    # 挂载子卷 cloud-atlas_build
    mount -t btrfs -o subvol=cloud-atlas_build /dev/nvme0n1p7 /home/huatai/docs/github.com/cloud-atlas/build
    

备注

注意,首先需要将 Btrfs 根卷挂载到 /data 目录,这样才能在 /data 下面创建子卷 /data/cloud-atlas_build

  • 挂载后检查 df -h 可以看到:

    Filesystem      Size  Used Avail Use% Mounted on
    ...
    /dev/nvme0n1p7   47G  7.9G   39G  17% /data
    /dev/nvme0n1p7   47G  7.9G   39G  17% /data/docs/github.com/cloud-atlas/build
    

为了能够启动时自动挂载,需要在在 /etc/fstab 中创建子卷的对应配置,但是怎么指定设备文件呢?

请注意上文中 Btrfs 文件系统以及其下的子卷都是使用了相同的设备 /dev/nvme0n1p7 ,所以在 /etc/fstab 中,子卷的设备文件其实和父卷是一样的,差别仅在挂载选项上:

通过配置 /etc/fstab btrfs的子卷 cloud-atlas_build 实现btrfs子卷挂载
echo "UUID=efd22ea6-9365-4bc3-a233-e61d1d159fcd  /data/docs/github.com/cloud-atlas/build  btrfs  subvol=cloud-atlas_build  0  1" >> /etc/fstab

systemctl daemon-reload
mount /data/docs/github.com/cloud-atlas/build

备注

接下来就可以实践 Btrfs NFS 将上述 cloud-atlas_build 子卷通过NFS输出给 kind(本地docker模拟k8s集群) 集群使用构建一个简单的个人WEB网站

实践案例

debootstrap 提供一个独立 btrfs subvolume ubuntu-dev :

创建 btrfs subvolume ubuntu-dev
uuid=d80f2f08-3b50-4b19-a0eb-058fb47693b0
pool=/var/lib/docker
subvol=ubuntu-dev

btrfs subvolume create ${pool}/${subvol}
echo "/dev/disk/by-uuid/${uuid}    ${pool}/${subvol}    btrfs    defaults,compress=lzo,subvol=${subvol}    0 1" >> /etc/fstab
mount ${pool}/${subvol}

参考