
效果预览
之前的方案
通过之前写的文章:如何在安装 Debian 时配置 Btrfs 子卷 | 详细分步指南如何在安装 Debian 时配置 Btrfs 子卷 | 详细分步指南
对安装好的 Debian sid 做了如下分区方案
├─nvme0n1p1 259:1 487M part /boot/efi
├─nvme0n1p2 259:1 16G part SWAP
└─nvme0n1p3 259:2 226.4G part /
/home
其中 nvme0n1p3 里有两个子卷,分别是 @ 和 @home 采用扁平式布局,而且介绍了 Timeshift 快照工具
但是使用后发现 Timeshift 不支持自定义快照存放的位置,而且 Swap 用分区的形式不方便管理,于是便有了这篇文章,记录我更改的过程
优化后的方案
保留 @ 和 @home 子卷,新增 @var @tmp @snapshots 子卷,使用 Zram 作为 SWAP。并且重新对分区进行编号,不能格式化磁盘
├─nvme0n1p1 259:1 0 487M 0 part /boot/efi
└─nvme0n1p2 259:2 0 232.4G 0 part /
/home
/var
/tmp
/.snapshots
之所以要将 /var 以子卷的形式存放,是为了后续使用 snapper 的方便
准备工具
只需要一个 Fedora KDE 版本的 liveCD 即可
其实哪个版本并不重要只要有 btrfs 工具就行,关键是 KDE 里面的分区工具很好用,避免可以敲错命令
方法步骤
1. 重启进入 LiveCD
之所以进 LiveCD 是为了方便对 /
进行操作,而且在 LiveCD 里面方便对子卷重新布局
2. 重新设计分区
在 KDE 的分区管理工具中,找到你的 SWAP 分区(nvme0n1p2)删掉就行,删掉之后会变成 Free Space

这是我随便截的一张图,必须按照你自己的分区表来删除
现在的分区表变成了一个 nvme0n1p1、一个 FreeSPace 和一个 nvme0n1p3,并且保证这三个是紧挨着的
然后选择之前的 nvme0n1p3 重新调整分区大小

你可以拖动 1 和 2 的位置让 nvme0n1p3 占满所有空余空间,也可以直接填写 0MB 到前方空置和后方空置
这是我随便截的一张图,必须按照你自己的分区表来删除
这里的调整分区大小需要将分区 nvme0n1p3 里面所有的文件往前移动,所以需要一点时间
调整完成之后保存并写入,现在你的磁盘就只剩下了 nvme0n1p1 和 nvme0n1p3 这两个分区
然后通过 sfdisk 对分区重新排序,在 LiveCD 的终端执行如下命令(需要用 root 账户)
sfdisk -r /dev/nvme0n1
这里是选择的你的磁盘而不是分区,按照自己电脑进行调整
现在,你的分区已经变成了 nvme0n1p1 和 nvme0n1p2 ,分区重新设置的部分到此结束了
3. 重新设计 Btrfs 子卷布局
继续在刚才 LiveCD 的终端里面操作
将 Btrfs 分区挂载到任意目录下,比如说 /mnt
mount /dev/nvme0n1p2 /mnt
然后可以查看下 /mnt 下的现有子卷
btrfs subvolume list /mnt
如果你是按照我之前的文件进行设计的话,你应该会有一个 @ 和 @home
然后新增你需要的子卷
cd /mnt # 进入 /mnt 后再操作
btrfs su cr @var
btrfs su cr @tmp
btrfs su cr @snapshot
su 是 subvolume 的缩写、cr 是 create 的缩写
接下来要看好 @/ 和 @ 的位置关系,不要敲错了命令
将 @ 子卷中的 /var 和 /tmp 中的文件移动到 @var 和 @tmp 中
mv @/var @var
mv @/tmp @tmp
因为 @snapshot 子卷我们会挂载到 /.snapshot 上,所以需要创建这个目录
mkdir @/.snapshot
现在的子卷布局已经重新设计并且迁移了数据,不出意外的话,查看 /mnt 下的子卷应该出现如下内容
btrfs subvolume list /mnt
top level 5 path @
top level 5 path @home
top level 5 path @var
top level 5 path @tmp
top level 5 path @snapshots
子卷的重新布局到此结束
4. 修改 fstab
这里对 btrfs 子卷添加一些特性参数挂载
UUID=$(blkid -s UUID -o value /dev/nvme0n1p2) # 获取 Btrfs 分区的 UUID
tee /mnt/@/etc/fstab <<EOF
UUID=${UUID} / btrfs noatime,space_cache=v2,compress=zstd:1,ssd,discard=async,subvol=@snapshots 0 0
UUID=${UUID} /home btrfs noatime,space_cache=v2,compress=zstd:1,ssd,discard=async,subvol=@snapshots 0 0
UUID=${UUID} /var btrfs noatime,space_cache=v2,compress=zstd:1,ssd,discard=async,subvol=@snapshots 0 0
UUID=${UUID} /tmp btrfs noatime,space_cache=v2,compress=zstd:1,ssd,discard=async,subvol=@snapshots 0 0
UUID=${UUID} /.snapshots btrfs noatime,space_cache=v2,compress=zstd:1,ssd,discard=async,subvol=@snapshots 0 0
EOF
最后查看你的 /mnt/@/etc/fstab 应该如下图所示

5. 重启进入正常的系统
修改完毕后卸载 /mnt 并且重新到 Debian 系统
umount /mnt
reboot
重启之后你可以验证当前的分区表和子卷
6. 设置 Zram
安装 Zram 组件
sudo apt update && sudo apt upgrade
sudo apt install zram-tools
修改 Zram 配置文件
sudo vim /etc/default/zramswap

主要就是改一下大小,我这里修改成内容的 60% 其他不变
然后重新加载服务
sudo service zramswap reload
可以通过 zramctl 验证你的修改

接下来...
接下来就可以使用 snapper 这个更强大的快照工具了
具体可以去看 Arch Wiki https://wiki.archlinux.org/title/Snapper