简体中文

为什么是 Btrfs 子卷?

Btrfs vs ext4:现代文件系统的优势

Btrfs(B-Tree File System)相比传统 ext4 具备以下核心特性:

  • ‌写时复制 (CoW)‌:修改文件时保留原数据,避免意外覆盖
  • 子卷 (Subvolume)‌:可独立挂载的逻辑分区(类似"文件夹中的文件系统")
  • ‌透明压缩‌:节省存储空间(支持 zstd/lzo 算法)
  • ‌实时快照‌:秒级创建系统还原点(需配合子卷使用)

为什么必须使用子卷?

直接使用 Btrfs 根卷会导致:

  • 快照工具(如Timeshift)无法区分系统文件和用户数据
  • 系统更新/回滚时可能破坏重要配置
  • 无法实现精细化空间配额管理

总而言之,你用滚动发行版比如 Arch、Debian sid 等就建议你用 btrfs 文件系统,创造布局合理的子卷才能充分提高 Btrfs 各方面的使用效率

安装步骤:手动创建子卷流程

前置准备

  1. 下载最新 Debian ISO
  2. 制作启动U盘(推荐使用 Ventoy)

关键操作节点

如果你使用图形界面安装的过程中是看不到子卷的操作的,解决方法也很简单,直接 Ctrl + Alt + F1~7 换一个 tty 就行

具体步骤如下:

  1. 启动 Live 后选择高级中的专家模式(建议、方便操作)
  2. 启动安装程序并完成基本设置如语言、时区、键盘
  3. 进入‌分区向导‌步骤时选择 btrfs 文件系统,并且分好 efi、根目录、交互空间等分区
  4. 在进行到安装基本系统时停止操作

你的鼠标应该停在 install base system 选项上:

Debian 分区步骤

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/

最后可以再次查看挂载状态

完整截图如下:

取消挂载 Debian 已有目录

然后将你的 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 等特性

修改 fstab 文件

最后推出当前 tty

exit

接着按 Ctrl + Alt + F1 进入 tty1 图形界面(tty1 不行,你就 F3、F4 一个个试)

返回图形界面继续安装完成安装

系统安装后的优化配置

配置 Timeshift 自动快照

安装必要组件:

sudo apt install timeshift
sudo apt install cronie
sudo systemctl enable --now cronie.service
  1. 快照类型选择 BTRFS,点击下一步:
配置快照类型
  1. 快照位置选择 BTRFS 分区,点击下一步:
配置快照位置

Timeshift 只支持扁平化布局,如果你是单子卷或嵌套子卷则不能使用

  1. 选择快照计划

Debian sid 建议每天、每周、每月

选择快照计划
  1. 选择是否包含用户数据
选择快照计划

然后现在手动创建一个快照,会发现瞬间完成,这就是写时复制(Copy-on-Write,CoW) 机制

可以通过以下命令查看快照存放的位置

sudo timeshift --list
快照的位置

Timeshift 默认备份的快照位置是在同一个 btrfs 分区,默认是在 @snapshots 子卷中(如果你之前创建过)

因为我没有创建 @snapshots 子卷,所以备份的位置在 /run/timeshift/329018/backup

通过查看这个目录发现占用 29G,没错 29G 就是这么快

快照的大小

虽然这样可以快速恢复快照,但是还是有一个潜在的问题,快照的位置和你的 btrfs 分区的位置是同一个,如果你的根分区出现损坏,快照也就没了,timeshift 也就不能恢复了。

为了解决这个问题,你可以考虑将快照备份到另一块磁盘上。

0
0
0
0