强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Btrfs 文件系统运维完全教程 / 第 2 章:基础操作

第 2 章:基础操作

2.1 工具链安装

Btrfs 的管理工具是 btrfs-progs,大部分发行版默认安装。

各发行版安装方法

发行版安装命令
Debian / Ubuntuapt install btrfs-progs
Fedoradnf install btrfs-progs
openSUSE默认已安装(zypper install btrfsprogs)
Arch Linuxpacman -S btrfs-progs
CentOS / RHELyum install btrfs-progs
Alpineapk 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:3zstd 压缩级别 3✅ 推荐(默认级别)
compress=lzoLZO 压缩(更快但压缩率低)低延迟场景
compress-force=zstd强制压缩所有数据数据已压缩较少时
ssdSSD 优化模式SSD 设备
ssd_spreadSSD 模式且数据尽量连续SSD + 顺序写较多
noatime不更新访问时间✅ 推荐
nodiratime不更新目录访问时间✅ 推荐
discard=async异步 TRIMSSD ✅ 推荐
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文件系统 UUIDblkidbtrfs filesystem show
dev_uuid设备 UUID(每个设备唯一)btrfs inspect-internal dump-super
chunk_uuid块 UUIDbtrfs 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 /mntusage /mnt
设备统计btrfs device stats /mnt
设置标签btrfs filesystem label /mnt "new-label"
只读检查btrfs check /dev/sdX(需卸载)
恢复数据btrfs restore /dev/sdX /recovery/

扩展阅读