惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
IT之家
IT之家
博客园 - Franky
Stack Overflow Blog
Stack Overflow Blog
宝玉的分享
宝玉的分享
Recent Announcements
Recent Announcements
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
V
Visual Studio Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
H
Help Net Security
V
V2EX
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
博客园 - 叶小钗
J
Java Code Geeks
博客园 - 【当耐特】
月光博客
月光博客
爱范儿
爱范儿
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件

qlAD 的技术笔记

2026 年 6 月 7 日 -- 我有社交恐惧症,恐惧外面到处雷电风雨声(大学生活记录) 手把手带你实现哈希表(C/C++ 数据结构) 手把手带你实现图结构(C/C++ 数据结构) 手把手带你实现二叉树(C/C++ 数据结构) 手把手带你实现栈和队列(C/C++ 数据结构) 手把手带你实现单/双链表(C/C++ 数据结构) 手把手带你实现动态数组(C/C++ 数据结构) 2026 年 1 月 2 日 -- 我不怕冷,因为我内心炽热 【2025 年度总结】(大学生活记录) 2025 年 12 月 2 日 -- 省电模式:大一 100 天耗电日志(大学生活记录) 蓝桥杯备赛第一期 —— 枚举与模拟 2025 年 11 月 3 日 -- 用爱发电、大爱无私(大学生活记录) 使用循环嵌套输出规则图形找规律讲解(嵌套循环-图形输出) 2025 年 10 月 1 日 -- 二字开头第一年的生日记录及感悟随笔(大学生活记录) Python 初级 04 -- 目前为止 Python 中你们做题可能会遇到的问题以及七七八八 2025 年 9 月 24 日 -- 开学后的第一课及军训汇演(大学生活记录) Python 初级 03 -- 程序设计的三种结构之选择结构和循环结构 Python 初级 02 -- 基础的数据类型和输入输出 2025 年 9 月 17 日 -- 大连 2025 国际大体联足球世界杯(大学生活记录) Python 初级 01 -- 初识编程、理解计算机语言及程序运行方式 适合大一新生学习编程的前一课 -- 编程先导(编程的本质) 2025 年 9 月 12 日 -- 三天军训感受以及一些七七八八(大学生活记录) 2025 年 9 月 9 日 -- 体检、军训前的准备(大学生活记录) 适合大一新生的计算机基础知识 -- 个人认为足够版 2025 年 9 月 7 日 -- 既来之、则安之(大学生活记录) C++ 程序的内存布局 —— 代码区、全局/静态区、栈区和堆区 联想小新 pro 16 2025 开箱记录:跳过联网、office 激活、更换 win 11 专业版 R 语言中的数学函数 计算机软件著作权申请过程记录 从聚类到回归:用 Python 解析鸢尾花数据集的完整数据科学流程 条件概率、全概率与贝叶斯公式 —— 一篇文章带你死磕概率公式
重新设置磁盘分区以及 Btrfs 子卷(subvolume)布局的无损方案
qlAD · 2025-05-01 · via qlAD 的技术笔记

cover

效果预览

之前的方案

通过之前写的文章:如何在安装 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

删除 Swap 分区

这是我随便截的一张图,必须按照你自己的分区表来删除

现在的分区表变成了一个 nvme0n1p1、一个 FreeSPace 和一个 nvme0n1p3,并且保证这三个是紧挨着的

然后选择之前的 nvme0n1p3 重新调整分区大小

重新调整分区大小

你可以拖动 1 和 2 的位置让 nvme0n1p3 占满所有空余空间,也可以直接填写 0MB 到前方空置和后方空置

这是我随便截的一张图,必须按照你自己的分区表来删除

这里的调整分区大小需要将分区 nvme0n1p3 里面所有的文件往前移动,所以需要一点时间

调整完成之后保存并写入,现在你的磁盘就只剩下了 nvme0n1p1 和 nvme0n1p3 这两个分区

然后通过 sfdisk 对分区重新排序,在 LiveCD 的终端执行如下命令(需要用 root 账户)

这里是选择的你的磁盘而不是分区,按照自己电脑进行调整

现在,你的分区已经变成了 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 上,所以需要创建这个目录

现在的子卷布局已经重新设计并且迁移了数据,不出意外的话,查看 /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 应该如下图所示

/etc/fstab

5. 重启进入正常的系统

修改完毕后卸载 /mnt 并且重新到 Debian 系统

重启之后你可以验证当前的分区表和子卷

6. 设置 Zram

安装 Zram 组件

sudo apt update && sudo apt upgrade
sudo apt install zram-tools

修改 Zram 配置文件

sudo vim /etc/default/zramswap

Zram 配置文件

主要就是改一下大小,我这里修改成内容的 60% 其他不变

然后重新加载服务

sudo service zramswap reload

可以通过 zramctl 验证你的修改

Zram 交换

接下来...

接下来就可以使用 snapper 这个更强大的快照工具了

具体可以去看 Arch Wiki https://wiki.archlinux.org/title/Snapper