Btrfs快速起步

Btrfs的一些提示

根据官方 Btrfs Getting started 提示如下:

  • Btrfs是一个快速迭代的文件系统,和内核版本紧密结合(位于内核主线),每次内核版本升级都有很多错误修复和增强功能(也意味着Btrfs稳定性是一个巨大的考验)

  • 建议使用支持Btrfs的Linux发行版(例如 SUSE Linux 企业版从SLES11 SP2就开始支持 )或者运行最新的内核 - 发行版支持的优势是会将最新内核补丁移植到早期版本,所以可以兼顾兼容性和稳定性

  • 不建议运行内核比kernel.org提供的最新版本落后两个或更多版本

  • 建议使用最新的用户空间工具,可以用于调试和恢复文件系统

备注

Btrfs长期被视为试验阶段,不过核心功能被认为是足够稳定满足日常需要。所以务必关注官方的发布说明和搜集各方实验数据进行对比和验证。

创建文件系统

parted分区: 50G data, 48G docker, 216G libvirt
# 50G data,48G docker,216G libvirt(3个vm 共48G + 3个Ceph存储 168G)
parted -a optimal /dev/nvme0n1 mkpart primary 181GB 231GB
parted -a optimal /dev/nvme0n1 mkpart primary 231GB 279GB
parted -a optimal /dev/nvme0n1 mkpart primary 279GB 495GB
parted /dev/nvme0n1 name 7 btrfs-data
parted /dev/nvme0n1 name 8 btrfs-docker
parted /dev/nvme0n1 name 9 lvm-libvirt

备注

本文在 btrfs-data 分区上操作,实践如何对数据分区进行常规的 Btrfs 操纵:

parted分区输出
Model: APPLE SSD AP0512R (nvme)
Disk /dev/nvme0n1: 500GB
Sector size (logical/physical): 4096B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size    File system  Name                  Flags
 1      24.6kB  524MB  524MB                iBootSystemContainer
 2      524MB   149GB  148GB
 3      149GB   151GB  2500MB
 4      151GB   152GB  500MB   fat32                              boot, esp
 5      152GB   181GB  29.0GB  ext4
 7      181GB   231GB  50.2GB               btrfs-data
 8      231GB   279GB  48.0GB               btrfs-docker
 9      279GB   495GB  216GB                lvm-libvirt
 6      495GB   500GB  5369MB               RecoveryOSContainer
  • 对磁盘(例如 /dev/sdb )或者磁盘分区(例如,我这里的实际案例 /dev/nvme0n1p7 ):

在NVMe磁盘第7分区创建btrfs文件系统格式化
sudo mkfs.btrfs -f -L data /dev/nvme0n1p7

备注

Btrfs 也支持类似 ZFS 的内置RAID功能,目前支持 RAID 0, RAID 1, RAID 10, RAID 5 and RAID 6 多磁盘Btrfs

  • 磁盘挂载(磁盘UUID使用 blkid 工具查看):

挂载Btrfs文件系统到/data目录(root卷)
echo "UUID=efd22ea6-9365-4bc3-a233-e61d1d159fcd  /data  btrfs  defaults,compress=lzo  0  1" >> /etc/fstab
kdir /data
mount /data
  • 完成后文件系统目录挂载如下( /data 目录挂载后我迁移了 docs 目录到btrfs的 /data 目录下 ):

    Filesystem      Size  Used Avail Use% Mounted on
    ...
    /dev/nvme0n1p7   47G  7.9G   39G  17% /data
    ...
    

命令

btrfs 命令是管理 Btrfs 文件系统的控制程序,大多数操作,如创建快照,创建子卷以及扫描设备都可以使用该命令。

  • 扫描设备: 可以检查所有btrfs文件系统的设备,或者指定分区:

    btrfs device scan
    btrfs device scan /dev/nvme0n1p7
    

子卷

  • 创建子卷: 这里创建一个 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网站

快照

快照是为了避免数据被误删除的本地备份: 举例,上述 /data 数据卷,需要定时每天做一次快照:

btrfs subvolume snapshot /data /data/data_snapshot_`date +%Y_%m_%d_%H:%M:%S`

提示信息:

Create a snapshot of '/data' in '/data/data_snapshot_2022_11_30_00:17:57'
  • 如果需要恢复数据:

    mkdir -p /snapshot/data_snapshot_2022_11_30_00:17:57
    mount -t btrfs -o subvol=data_snapshot_2022_11_30_00:17:57 /dev/nvme0n1p7 /snapshot/data_snapshot_2022_11_30_00:17:57
    

此时就可以到快照目录下去找数据进行恢复(如果你不幸误删除了某些重要数据)

备注

你可以写一个简单的每日快照脚本,只要在快照前记录下时间戳,并且快照名是按照时间戳来命名的,就很容易恢复到某个快照备份数据。

参考