Btrfs 文件系统运维完全教程 / 第 2 章:基础操作
第 2 章:基础操作
2.1 工具链安装
Btrfs 的管理工具是 btrfs-progs,大部分发行版默认安装。
各发行版安装方法
| 发行版 | 安装命令 |
|---|---|
| Debian / Ubuntu | apt install btrfs-progs |
| Fedora | dnf install btrfs-progs |
| openSUSE | 默认已安装(zypper install btrfsprogs) |
| Arch Linux | pacman -S btrfs-progs |
| CentOS / RHEL | yum install btrfs-progs |
| Alpine | apk add btrfs-progs |
# 安装(以 Debian/Ubuntu 为例)
sudo apt update && sudo apt install btrfs-progs
# 确认安装
btrfs version
# btrfs-progs v6.6.3
📝 注意: 内核模块(
btrfs.ko)是内核自带的,无需额外安装。但btrfs-progs用户态工具版本越新越好,建议与内核版本保持同步。
验证内核支持
# 检查内核是否加载了 Btrfs 模块
cat /proc/filesystems | grep btrfs
# nodev btrfs
# 检查模块信息
modinfo btrfs | head -5
# filename: /lib/modules/6.1.0/kernel/fs/btrfs/btrfs.ko
# license: GPL
# description: B-Tree Filesystem (Btrfs)
# author: Oracle
# 如果没有加载,手动加载
sudo modprobe btrfs
2.2 创建 Btrfs 文件系统(mkfs.btrfs)
2.2.1 基础创建
# 在单个分区上创建 Btrfs
sudo mkfs.btrfs /dev/sdb1
# 指定标签
sudo mkfs.btrfs -L "mydata" /dev/sdb1
# 指定 UUID(通常不需要,系统自动生成)
sudo mkfs.btrfs -U 12345678-1234-1234-1234-123456789012 /dev/sdb1
mkfs 输出示例:
btrfs-progs v6.6.3
See https://btrfs.readthedocs.io for more information.
NOTE: severalass validated with v6.6.3, it's recommended to use this version or newer.
Label: mydata
UUID: a1b2c3d4-e5f6-7890-abcd-ef1234567890
Node size: 16384
Sector size: 4096
Filesystem size: 100.00GiB
Block group profiles:
Data: single 8.00MiB
Metadata: DUP 1.02GiB
System: DUP 12.00MiB
SSD detected: no
Zoned device: no
Incompat features: extref, skinny-metadata
Runtime features:
Checksum: crc32c
Number of devices: 1
Devices:
ID SIZE PATH
1 100.00GiB /dev/sdb1
2.2.2 创建多设备文件系统
# 将多个设备组成一个 Btrfs 文件系统(single 模式)
sudo mkfs.btrfs -L "pool" /dev/sdb1 /dev/sdc1
# RAID 1 模式(数据和元数据都镜像)
sudo mkfs.btrfs -d raid1 -m raid1 -L "mirror" /dev/sdb1 /dev/sdc1
# RAID 10 模式(至少 4 个设备)
sudo mkfs.btrfs -d raid10 -m raid10 -L "fast-mirror" /dev/sd{b,c,d,e}1
# RAID 5 模式(不推荐用于生产)
sudo mkfs.btrfs -d raid5 -m raid5 -L "raid5-pool" /dev/sd{b,c,d}1
2.2.3 mkfs 常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-L | 设置标签 | -L "mydata" |
-U | 指定 UUID | -U random(随机生成) |
-d | 数据 RAID profile | -d raid1 |
-m | 元数据 RAID profile | -m raid1 |
-n | 节点大小 | -n 16k(默认 16K) |
-s | 扇区大小 | -s 4k(默认 4K) |
-f | 强制覆盖(慎用) | -f |
--csum | 校验和算法 | --csum xxhash |
--mixed | 混合数据/元数据块组 | 适合小分区 < 1GB |
--nodiscard | 创建后不立即丢弃 | SSD 性能优化 |
2.2.4 选择校验和算法
# 查看支持的校验和算法
mkfs.btrfs --help 2>&1 | grep csum
# 使用 xxhash(比 CRC32C 更快,需要内核 5.5+)
sudo mkfs.btrfs --csum xxhash -L "fast-check" /dev/sdb1
# 使用 sha256(更安全,但较慢)
sudo mkfs.btrfs --csum sha256 -L "secure-check" /dev/sdb1
# 使用 blake2b(需要内核 5.17+,速度接近 xxhash)
sudo mkfs.btrfs --csum blake2b -L "balanced" /dev/sdb1
校验和算法对比:
| 算法 | 速度 | 安全性 | 内核要求 | 推荐场景 |
|---|---|---|---|---|
| crc32c | 快 | 低(仅检测意外损坏) | 所有版本 | 默认,通用 |
| xxhash | 很快 | 中 | 5.5+ | 性能敏感场景 |
| sha256 | 慢 | 高(密码学安全) | 5.5+ | 安全敏感场景 |
| blake2b | 快 | 高(密码学安全) | 5.17+ | 最佳平衡 |
💡 提示: 校验和算法在创建文件系统时确定,后续不可更改。如果需要更改,必须重新创建文件系统。
2.2.5 混合模式(–mixed)
对于非常小的分区(< 1GB),推荐使用混合模式:
# 小分区推荐使用混合模式
sudo mkfs.btrfs --mixed -L "boot-btrfs" /dev/sdb1
混合模式将数据和元数据混合在同一个块组中,避免小分区空间浪费。但大型文件系统不应使用混合模式,因为它会影响 balance 和空间管理的灵活性。
2.3 挂载 Btrfs 文件系统(mount)
2.3.1 基础挂载
# 基础挂载
sudo mount /dev/sdb1 /mnt/data
# 通过 UUID 挂载(推荐)
sudo mount UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /mnt/data
# 通过标签挂载
sudo mount -L "mydata" /mnt/data
# 卸载
sudo umount /mnt/data
2.3.2 常用挂载选项
| 选项 | 说明 | 推荐 |
|---|---|---|
compress=zstd | 启用 zstd 压缩 | ✅ 推荐 |
compress=zstd:3 | zstd 压缩级别 3 | ✅ 推荐(默认级别) |
compress=lzo | LZO 压缩(更快但压缩率低) | 低延迟场景 |
compress-force=zstd | 强制压缩所有数据 | 数据已压缩较少时 |
ssd | SSD 优化模式 | SSD 设备 |
ssd_spread | SSD 模式且数据尽量连续 | SSD + 顺序写较多 |
noatime | 不更新访问时间 | ✅ 推荐 |
nodiratime | 不更新目录访问时间 | ✅ 推荐 |
discard=async | 异步 TRIM | SSD ✅ 推荐 |
space_cache=v2 | 使用 v2 空间缓存 | ✅ 推荐(内核 5.10+) |
subvol=/@ | 挂载指定子卷 | 子卷布局时 |
subvolid=256 | 通过子卷 ID 挂载 | 子卷布局时 |
autodefrag | 自动碎片整理 | 桌面/小文件场景 |
degraded | 降级模式(容错时) | RAID 修复时 |
max_inline=0 | 禁用内联数据 | 大文件场景 |
commit=60 | 提交间隔(秒),默认 30 | 根据需求调整 |
thread_pool=N | 线程池大小 | 多设备时增大 |
2.3.3 典型挂载配置
桌面系统(推荐配置):
mount -o compress=zstd:1,noatime,ssd,discard=async,space_cache=v2 /dev/sda2 /mnt
服务器(推荐配置):
mount -o compress=zstd:3,noatime,space_cache=v2,commit=60 /dev/sdb1 /data
RAID 1 配置:
mount -o compress=zstd:3,noatime,space_cache=v2 /dev/sdb1 /data
# RAID 信息存储在文件系统内部,不需要额外指定
2.3.4 配置 /etc/fstab
# 获取 UUID
sudo blkid /dev/sdb1
# /dev/sdb1: LABEL="mydata" UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="btrfs"
# /etc/fstab 配置(单设备)
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /data btrfs defaults,compress=zstd:3,noatime,ssd,discard=async 0 0
# /etc/fstab 配置(带子卷)
UUID=xxxx / btrfs subvol=/@,defaults,compress=zstd:1,ssd,discard=async 0 0
UUID=xxxx /home btrfs subvol=/@home,defaults,compress=zstd:3,ssd,discard=async 0 0
UUID=xxxx /var btrfs subvol=/@var,defaults,ssd,discard=async 0 0
UUID=xxxx /.snapshots btrfs subvol=/@snapshots,defaults,ssd,discard=async 0 0
# 测试 fstab 是否正确
sudo mount -a
# 检查挂载状态
mount | grep btrfs
findmnt -t btrfs
⚠️ 警告: fstab 中使用 UUID 而非设备名(如
/dev/sdb1),因为设备名在重启后可能变化。
2.4 查看文件系统信息
2.4.1 文件系统概览
# 查看文件系统摘要
sudo btrfs filesystem show /data
# Label: 'mydata' uuid: a1b2c3d4-e5f6-7890-abcd-ef1234567890
# Total devices 1 FS bytes used 10.00GiB
# devid 1 size 100.00GiB used 12.04GiB path /dev/sdb1
2.4.2 空间使用情况
# 查看详细空间使用
sudo btrfs filesystem df /data
# 输出示例:
# Data, single: total=8.01GiB, used=6.50GiB
# System, DUP: total=8.00MiB, used=16.00KiB
# Metadata, DUP: total=1.01GiB, used=350.50MiB
# GlobalReserve, single: total=512.00MiB, used=0.00B
# unknown, single: total=0.00B, used=0.00B
# 查看设备级空间使用
sudo btrfs filesystem show --raw /data
sudo btrfs filesystem usage /data
btrfs filesystem usage 输出详解:
Overall:
Device size: 100.00GiB
Device allocated: 12.04GiB
Device unallocated: 87.96GiB
Device missing: 0.00B
Used: 10.50GiB
Free (estimated): 87.50GiB (min: 87.50GiB)
Free (statfs, currentl): 87.50GiB
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 512.00MiB (used: 0.00B)
Multiple profiles: no
| 字段 | 说明 |
|---|---|
| Device size | 设备总大小 |
| Device allocated | 已分配给块组的空间 |
| Device unallocated | 未分配的空间(可用于新块组) |
| Used | 实际使用的空间 |
| Free (estimated) | 估计可用空间 |
| Data ratio | 数据冗余比(RAID 1 为 2.0) |
| Metadata ratio | 元数据冗余比(DUP 为 2.0) |
2.4.3 设备信息
# 查看设备统计
sudo btrfs device stats /data
# 输出(正常情况下全为 0):
# [/dev/sdb1].write_io_errs 0
# [/dev/sdb1].read_io_errs 0
# [/dev/sdb1].flush_io_errs 0
# [/dev/sdb1].corruption_errs 0
# [/dev/sdb1].generation_errs 0
# 非零的值表示有问题!
2.4.4 详细的 superblock 信息
# 查看主 superblock 信息
sudo btrfs inspect-internal dump-super /dev/sdb1
# 查看所有 superblock 副本
sudo btrfs inspect-internal dump-super -f /dev/sdb1
# 查看 chunk 信息
sudo btrfs inspect-internal dump-tree -t chunk /dev/sdb1
# 查看文件系统 tree root
sudo btrfs inspect-internal dump-tree -t root /dev/sdb1
2.5 UUID 和标签管理
2.5.1 UUID
Btrfs 文件系统有三种 UUID:
| UUID 类型 | 说明 | 查看方式 |
|---|---|---|
| fs_uuid | 文件系统 UUID | blkid、btrfs filesystem show |
| dev_uuid | 设备 UUID(每个设备唯一) | btrfs inspect-internal dump-super |
| chunk_uuid | 块 UUID | btrfs inspect-internal dump-super |
# 查看文件系统 UUID
sudo blkid /dev/sdb1
# 查看所有 Btrfs 文件系统
sudo btrfs filesystem show
# 通过 UUID 查找设备
sudo btrfs filesystem show a1b2c3d4-e5f6-7890-abcd-ef1234567890
2.5.2 标签(Label)
标签是文件系统的可读名称,方便识别:
# 创建时设置标签
sudo mkfs.btrfs -L "production-data" /dev/sdb1
# 修改标签(文件系统需要已挂载)
sudo btrfs filesystem label /mnt/data
# production-data
sudo btrfs filesystem label /mnt/data "new-label"
# 通过标签查找
findfs LABEL=production-data
sudo btrfs filesystem show -L "production-data"
2.6 Btrfs 检查与修复
2.6.1 只读检查(btrfs check)
# ⚠️ 警告:check 之前必须卸载文件系统!
sudo umount /mnt/data
# 只读检查(安全)
sudo btrfs check /dev/sdb1
# Opening filesystem to check...
# Checking filesystem on /dev/sdb1
# UUID: a1b2c3d4-e5f6-7890-abcd-ef1234567890
# [1/7] checking root items
# [2/7] checking extents
# [3/7] checking free space cache
# [4/7] checking fs roots
# [5/7] checking only csums items (without verifying data)
# [6/7] checking root refs
# [7/7] checking quota groups
# found 10737418240 bytes used, no error found
# total csum bytes: 9876543
# total tree bytes: 123456789
# total fs tree bytes: 987654321
# total extent tree bytes: 12345678
# btree space waste bytes: 1234567
# file data blocks allocated: 10737418240
# referenced: 10737418240
2.6.2 查看内部树结构
# 查看文件系统树(详细)
sudo btrfs check --tree-stats /dev/sdb1
# 查看 extent 树
sudo btrfs check --check-data-csum /dev/sdb1
# 这会验证所有数据块的校验和,比较慢但更彻底
2.6.3 修复模式
⚠️ 警告:
btrfs check --repair是危险操作!除非你清楚自己在做什么,否则不要使用。建议先在测试环境验证。
# ⚠️ 危险修复模式
sudo btrfs check --repair /dev/sdb1
# 更安全的 init-extent-tree 修复
sudo btrfs check --init-extent-tree /dev/sdb1
# 清除空间缓存(如果缓存损坏)
sudo btrfs check --clear-space-cache v1 /dev/sdb1
sudo btrfs check --clear-space-cache v2 /dev/sdb1
2.6.4 日志恢复(btrfs restore)
# 尝试从损坏的文件系统中恢复数据
# -s 恢复 snapshots
# -m 恢复 metadata
# -S 恢复 symlinks
# -i 忽略错误
sudo btrfs restore /dev/sdb1 /recovery/
# 恢复指定子卷
sudo btrfs restore -r 256 /dev/sdb1 /recovery/
# 指定 root tree 的 bytenr(高级用法)
sudo btrfs restore -r 256 -t <bytenr> /dev/sdb1 /recovery/
2.7 实战:创建并使用 Btrfs
以下是完整的操作流程:
# 1. 准备磁盘
lsblk
sudo fdisk /dev/sdb
# 创建新分区 sdb1
# 2. 创建 Btrfs 文件系统
sudo mkfs.btrfs -L "project-data" --csum xxhash /dev/sdb1
# 3. 创建挂载点
sudo mkdir -p /data
# 4. 挂载
sudo mount -o compress=zstd:3,noatime,space_cache=v2 /dev/sdb1 /data
# 5. 验证挂载
df -h /data
mount | grep /data
# 6. 测试读写
sudo touch /data/testfile
echo "Hello Btrfs" | sudo tee /data/testfile
cat /data/testfile
# 7. 查看文件系统信息
sudo btrfs filesystem show /data
sudo btrfs filesystem df /data
sudo btrfs device stats /data
# 8. 配置开机自动挂载
echo "UUID=$(sudo blkid -s UUID -o value /dev/sdb1) /data btrfs defaults,compress=zstd:3,noatime,space_cache=v2 0 0" | sudo tee -a /etc/fstab
# 9. 测试 fstab
sudo umount /data
sudo mount -a
df -h /data
# 10. 清理测试文件
sudo rm /data/testfile
2.8 本章小结
| 操作 | 命令 |
|---|---|
| 创建文件系统 | mkfs.btrfs -L label /dev/sdX |
| 挂载 | mount -o compress=zstd /dev/sdX /mnt |
| 查看信息 | btrfs filesystem show /mnt |
| 空间使用 | btrfs filesystem df /mnt 和 usage /mnt |
| 设备统计 | btrfs device stats /mnt |
| 设置标签 | btrfs filesystem label /mnt "new-label" |
| 只读检查 | btrfs check /dev/sdX(需卸载) |
| 恢复数据 | btrfs restore /dev/sdX /recovery/ |