在上一篇文章中,我们详细介绍了Btrfs文件系统的基本使用方法和核心原理。本文将重点讲解如何利用Btrfs的特性来实现系统备份功能。
实现原理其实很简单:Linux内核支持直接从Btrfs的子卷(subvolume)启动系统。基于这个特性,我们可以通过计划任务定期为系统根目录创建快照,再配合btrfs-linux自动生成对应的GRUB启动项,从而实现完整的系统备份和恢复功能。
为了简化操作流程,我推荐使用TimeShift或Snapper这类工具。它们提供了图形化界面,让系统备份和恢复变得更加直观和便捷。
准备工作
timeshift需要根子卷(@)以及home子卷(@home)这两个特殊的子卷。但是Ubuntu在默认安装时候并不会创建这两个子卷。所以我们要手工创建一下。
在安装Ubuntu时,强烈建议将/boot目录单独分区。这是因为GRUB在读取grub.cfg配置文件时不支持Btrfs子卷机制。如果不单独分区,当系统挂载到@子卷后,新生成的grub.cfg会位于@子卷的/boot目录下,而不是原始根目录的/boot下,导致GRUB引导配置失效。如果你在安装时未进行单独分区,请不用担心,后续章节会详细介绍解决方案。
在这里默认你已经将ubuntu安装到btrfs中。
步骤:
- 创建@子卷。
sudo btrfs subvolume snapshot / /@
- 创建@home子卷
sudo btrfs subvolume create /@home
- 复制home文件夹的内容到@home子卷
sudo cp -a /home/* /@home
- 修改grub,在linux启动参数中新增btrfs子卷
修改/etc/default/grub,在GRUB_CMDLINE_LINUX_DEFAULT
这行追加rootflags=subvol=@
- 执行
sudo update-grub
更新grub引导 - 重启
- 修改/etc/fstab,直接原有的
/
挂载上修改,删除subvolid=x字段,如果存在subvol,否则追加subvol=/
改成/@
。如下所示
/dev/disk/by-uuid/uuid / btrfs defaults,subvol=/@ 0 1
- 复制上面一行的内容,将/改成/home ,subvol=/@改成/@home,目的为了挂载@home子卷
/dev/disk/by-uuid/uuid /home btrfs defaults,subvol=/@home 0 1
- 重启
Timeshift
首先安装Timeshift
sudo apt install timeshift
按照下一步下一步,开启timeshift备份即可。
grub备份
下面我们讲解一下,如何将btrfs的备份通过grub-btrfs生成grub参数。
参考安装grub-btrfs
https://github.com/Antynea/grub-btrfs
使用make && make install
即可安装。
在安装过程中需要你手动安装inotify。
sudo apt-get install inotify-tools
启动grub-btrfs服务。
sudo systemctl start grub-btrfsd
检查grub-btrfs的服务状态 sudo systemctl status grub-btrfsd
检查一下如果出现这种,就代表设置成功
grub-btrfsd.service - Regenerate grub-btrfs.cfgLoaded: loaded (/etc/systemd/system/grub-btrfsd.service; disabled; preset:>Active: active (running) since Sat 2025-01-18 15:36:57 CST; 1min 56s agoMain PID: 4862 (bash)Tasks: 3 (limit: 18694)Memory: 1.3M (peak: 4.1M)CPU: 48msCGroup: /system.slice/grub-btrfsd.service├─4862 bash /usr/bin/grub-btrfsd --syslog -t├─4867 bash /usr/bin/grub-btrfsd --syslog -t└─4873 inotifywait -q -q -e create -e delete /run/timeshift
最终在系统启动中的效果如下: