btrfs 笔记
学习btrfs文件系统笔记.
btrfs 管理模式和标准的文件系统不同。 btrfs 的顶级卷可以理解为 存储池, 跨越多个设备添加所有的空间到顶级卷。
在顶级卷中可以直接创建目录结构进行使用, 但是并不推荐。推荐的方式是在顶级卷下面创建子卷, 然后挂载子卷使用, 这样可以最大程度的发挥 btrfs 文件系统的高级特性。
子卷可以和标准目录使用 ls 命令输出没有任何差异, 为了在更好的区分 子卷 还是 普通目录, 在创建子卷的时候使用 @VOLUME_NAME 的格式进行创建。 ^3e41e6
例如:
1 | /mnt/btrfs/ <-- 这一层还是 xfs 文件系统的范围,下面的三个目录都是手动创建的挂载点 |
在 top volume 里面创建 subvolume 挂载到其他位置使用。
实际使用中不管理子卷的时候 top volume 可以不挂载。
配置完成之后, 看到的应该是这样的。
1 | /mnt/btrfs/ <-- 这一层还是 xfs 文件系统的范围 |
查看当前os支持的特性
1 | ➤ mkfs.btrfs -O list-all |
创建 Btrfs 卷
单一设备文件系统:
1 | mkfs.btrfs -n 64k -m single -d single -L liarlee_test /dev/nvme1n1 |
多设备文件系统:
1 | mkfs.btrfs -d single -m raid1 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1 |
更改 Btrfs 的 Raid 存储方式
可以将文件系统的冗余方式进行转换, 例如 raid0, raid1, single.
最好在初始的时候就设定好, 后面的转换会导致一段时间的IO不可用。
1
btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt
^9c4bbd
创建轻量副本文件
默认情况下 cp 命令的行为是不启用 CoW 特性的, 需要这个参数.
1 | cp --reflink source dest |
创建 Subvolume 和 删除 Subvolume
创建 Subvolume
1 | btrfs su create @test |
删除 Subvolume
1 | btrfs su del @test/ |
挂载 Btrfs 顶级卷
1 | mkdir /mnt/btrfs/root/ |
挂载 Btrfs 子卷
命令行挂载
1 | mkdir /mnt/btrfs/test/ |
写入 fstab
1 | UUID=519abb44-a6a3-4ed1-b99d-506e9443e73f /mnt/btrfs/root btrfs defaults,compress=zstd,autodefrag,ssd,space_cache=v2,vol=@ |
Btrfs 文件系统碎片整理
1 | btrfs filesystem defragment -r /mnt/btrfs/root |
Btrfs 文件系统在线检查
1 | btrfs scrub start /mnt/btrfs/root |
Btrfs 对特定的文件进行压缩
一般来说, 压缩选项是挂载的时候指定的 compress=zstd 执行自动压缩, compress-force=zstd 执行强制压缩. 这会对挂载之后写入的新文件生效, 旧文件是需要手动处理的.
1 | btrfs property set <PATH> compression <VALUE> |
Btrfs 测试
Read Throughput
1 | [global] |
Read 测试结果
1 | [root@ip-172-31-10-64 fio]# fio ./job1 |
Write Throughtput
1 | [global] |
Write 测试结果
1 | [root@ip-172-31-10-64 fio]# fio ./job1 |
记录测试结果:
- 如果是 -d raid0 -m raid1 可以直接将三个EBS IO1 3000IOPS的卷吃满, 直接到 9000
- 如果是 -d raid1 -m raid1 只能达到3000IOPS, 但是容量会有冗余。
对比 Xfs 测试
Write Throughput
1 | [root@ip-172-31-10-64 fio]# fio ./job1 |
Read Throughput
1 | [root@ip-172-31-10-64 fio]# fio ./job1 |
列出所有的subvolume
1 | btrfs su li -t . |
创建新的磁盘挂载点
1 | mkdir -pv /mnt/btrfs_snapshot_loc/ |
创建子卷只读快照:
1 | btrfs su sn -r @harbor_data ".snapshots/harbor_data-2024-05-08-12:46-ro" |
在快照的基础上创建增量快照, 并发送到另外一个 btrfs 文件系统的设备, 例如 USB。
1 | btrfs send -p ".snapshots/harbor_data-2024-05-08-12:46-ro/" ".snapshots/harbor_data-2024-05-08-13:03-ro/" | btrfs receive /mnt/btrfs_snapshot_loc/ |
^08cd21
查看目录内容, 分析目录内容和大小.
磁盘占用空间实际是 15GB, 总文件大小是 47GB.
1 | ╰─>$ ll |
为 Btrfs 文件系统添加新的磁盘
添加新的磁盘并列出, 这个时候不会自动平衡文件系统容量, 新添加的磁盘使用容量是空的.
1 | ╰─>$ btrfs device add -f /dev/nvme3n1 /mnt/btrfs/root |
进行文件系统再平衡
1 | ╰─>$ btrfs balance start --full-balance /mnt/btrfs/root |
查看平衡之后的文件系统空间使用情况.
1 | ╰─>$ btrfs fi us . |
为 Btrfs 文件系统移除磁盘
使用 btrfs dev delete 指令移除磁盘, 之后会自动重新平衡数据。
1 | btrfs dev delete /dev/nvme4n1 . |
btrfs dev remove 设备并不会再平衡数据, 所以如果冗余不够的话,可能会丢数据,在设备坏了的时候使用。
1 | btrfs dev remove /dev/nvme3n1 . |

