为什么是 Btrfs 子卷?
Btrfs vs ext4:现代文件系统的优势
Btrfs(B-Tree File System)相比传统 ext4 具备以下核心特性:
- 写时复制 (CoW):修改文件时保留原数据,避免意外覆盖
- 子卷 (Subvolume):可独立挂载的逻辑分区(类似"文件夹中的文件系统")
- 透明压缩:节省存储空间(支持 zstd/lzo 算法)
- 实时快照:秒级创建系统还原点(需配合子卷使用)
为什么必须使用子卷?
直接使用 Btrfs 根卷会导致:
- 快照工具(如Timeshift)无法区分系统文件和用户数据
- 系统更新/回滚时可能破坏重要配置
- 无法实现精细化空间配额管理
总而言之,你用滚动发行版比如 Arch、Debian sid 等就建议你用 btrfs 文件系统,创造布局合理的子卷才能充分提高 Btrfs 各方面的使用效率
安装步骤:手动创建子卷流程
前置准备
- 下载最新 Debian ISO
- 制作启动U盘(推荐使用 Ventoy)
关键操作节点
如果你使用图形界面安装的过程中是看不到子卷的操作的,解决方法也很简单,直接 Ctrl + Alt + F1~7 换一个 tty 就行
具体步骤如下:
- 启动 Live 后选择高级中的专家模式(建议、方便操作)
- 启动安装程序并完成基本设置如语言、时区、键盘
- 进入分区向导步骤时选择 btrfs 文件系统,并且分好 efi、根目录、交互空间等分区
- 在进行到安装基本系统时停止操作
你的鼠标应该停在 install base system 选项上:

TTY 切换 与 手动分区(核心步骤)
按下 Ctrl + Alt + F2 进入 tty2 命令行界面(tty2 不行,你就 F3、F4 一个个试,直到进入一个可执行命令的 tty)
默认应该是按回车就自动登录
接着查看当前挂载的分区
df -h
默认会有一个 /target 和 /target/boot/efi 已挂载,这两个目录是 Debian 安装时的默认目录,后面会用到。
如果装过 Arch 都知道一般会手动把系统安装在 /mnt 里面,只不过 Debian 规定在 /target 里面
然后取消这两个目录的挂载
# 顺序不能反,不然会繁忙
umount /target/boot/efi/
umount /target/
最后可以再次查看挂载状态
完整截图如下:

然后将你的 btrfs 分区挂载到随便的一个目录,比如说 /mnt
mount /dev/nvme0n1p3 /mnt
进入 /mnt
后查看这个目录下的文件会发现有一个 @rootfs
这是你在分区操作中选择 btrfs 文件系统时自动创建的单子卷布局,而我这里选择的是扁平化布局即 @
@home
@xxx
等
以下是两种布局的差异
特性 | 单子卷布局(@rootfs) | 扁平化布局(@/@home/@snapshots) |
---|---|---|
结构特点 | 仅包含单个根子卷@rootfs,所有系统文件、用户数据均存储在该子卷内 | 将根目录、用户目录、快照存储等拆分为独立子卷,形成平行结构 |
快照管理 | 需对整个根卷快照,无法单独回滚/home等目录 | 可针对@(系统)或@home(用户数据)单独创建/恢复快照,实现精准回滚 |
空间配额 | 无法对子目录设置独立配额 | 可对每个子卷分配独立存储空间(btrfs qgroup) |
系统更新影响 | 用户数据与系统文件混合存储,系统升级失败可能导致数据丢失 | 用户数据(@home)与系统(@)隔离,降低操作风险 |
那既然都是卷,为什么不直接在 @rootfs
上创建子卷呢?
可以直接在 @rootfs
上创建子卷,但是会形成层级化布局,也称嵌套子卷
层级化布局的目录结构如下
@rootfs
├── home(子卷)
├── snapshots(子卷)
└── 其他系统文件
层级化布局的局限性:
- 快照依赖关系:快照 @rootfs 时会包含其下所有嵌套子卷,无法单独管理
- 挂载复杂度:需通过 subvolid 或 subvol=@rootfs/home 路径挂载,易出错
- 工具兼容性:部分工具(如Timeshift)可能无法正确识别嵌套子卷结构
所以我这里优先选择扁平化布局,目录结构如下所示
.
├── @
├── @home
├── @snapshots
└── @其他系统文件
首先将 @rootfs 重命名为 @
mv @rootfs @
然后按自己的需求创建平行子卷
btrfs subvolume create /mnt/@home # 我这里就只创建一个用户数据的卷
btrfs subvolume create /mnt/@xxxxx
创建完成后通过 list 参数查看子卷
btrfs subvolume list -p /mnt
完整截图如下:

子卷创建完成之后就可以重新将分区挂载到 /target 等目录
# 先创建子卷对应文件夹
mkdir /target/home
mkdir /target/xxxxx
# 挂载子卷(可选择 zstd 压缩等特性)
mount -t btrfs -o subvol=/@,compress=zstd /dev/nvme0n1p3 /target
mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p3 /target/home
# 挂载 efi 分区
mount /dev/nvme0n1p1 /target/boot/efi
# 查看挂载状态
df -h
完整截图如下:

为了安装后的系统能正确启动和识别 btrfs 子卷,必须要修改 fstab 文件
注意点就是把 @rootfs 改成 @,新加你创建的子卷行,当然你也可以加 zstd 等特性

最后推出当前 tty
exit
接着按 Ctrl + Alt + F1 进入 tty1 图形界面(tty1 不行,你就 F3、F4 一个个试)
返回图形界面继续安装完成安装
系统安装后的优化配置
配置 Timeshift 自动快照
安装必要组件:
sudo apt install timeshift
sudo apt install cronie
sudo systemctl enable --now cronie.service
- 快照类型选择 BTRFS,点击下一步:

- 快照位置选择 BTRFS 分区,点击下一步:

Timeshift 只支持扁平化布局,如果你是单子卷或嵌套子卷则不能使用
- 选择快照计划
Debian sid 建议每天、每周、每月

- 选择是否包含用户数据

然后现在手动创建一个快照,会发现瞬间完成,这就是写时复制(Copy-on-Write,CoW) 机制
可以通过以下命令查看快照存放的位置
sudo timeshift --list

Timeshift 默认备份的快照位置是在同一个 btrfs 分区,默认是在 @snapshots 子卷中(如果你之前创建过)
因为我没有创建 @snapshots 子卷,所以备份的位置在 /run/timeshift/329018/backup
通过查看这个目录发现占用 29G,没错 29G 就是这么快

虽然这样可以快速恢复快照,但是还是有一个潜在的问题,快照的位置和你的 btrfs 分区的位置是同一个,如果你的根分区出现损坏,快照也就没了,timeshift 也就不能恢复了。
为了解决这个问题,你可以考虑将快照备份到另一块磁盘上。