前言
Arch Linux 有各种好处,但也有一些烦恼。
一个比较普遍的一个问题是:更新完系统后,无法正常启动、或者无法正常进入桌面,俗称“滚挂了”。
对于这个问题我们可以利用Timeshift这个工具来有效处理。
Timeshift 是一个被设计用来保护系统文件的备份工具,类似于Windows的“系统还原”,MacOS的“Time Machine”功能。
我们可以通过利用Timeshift对系统整体进行“快照”,简单的说来就是对系统进行备份。
当我们遇到“滚挂了”的情况时,可以利用该工具回到最近一个正常的系统快照,轻松拯救挂掉的系统。
本文介绍基于BTRFS文件系统的Timeshift用法,对于其他文件系统例如:Ext4本人未在使用,不做介绍。
BTRFS
Btrfs是一种新型的Linux文件系统,诞生至今不到20年。
不过它有很多优秀的特性和主流Linux发行版对其拥抱的态度,这两个理由足以让我在工作机上选用它。
它有这些优点:
- Btrfs采用B-tree索引文件的元信息,这跟数据库的索引原理类似,在查找文件方面足够快速。
- 对SSD进行了具有针对性的读写优化,可以一定程度上的提高I/O性能。
- 利用透明压缩的特性,可以减少对SSD的写入,显著提高SSD的使用寿命。
- 内置快照功能。 快照的原理不同于文件副本,它类似于操作日志,需要占用空间远远少于创建文件副本。
- 支持动态添加设备,新增硬盘后可以很方便的加入Btrfs文件系统,类似LVM。
Timeshift
简单介绍一下Timeshift的安装和基本用法。
首先需要安装:
sudo pacman -S timeshift # 安装Timeshift
sudo systemctl enable --now cronie.service # 启用Crond服务,启用该服务后Timeshift才能定期自动创建快照
安装完毕后,打开菜单找到Timeshift并启动,如下图:
第一次启动会进入设置向导,此处选择BTRFS快照类型,如下图:
进入下一步,选择快照的存储位置,如下图:
BTRFS不支持将快照存储在系统目录之外的其他地方,因此我们选择系统所在的磁盘即可。
进入下一步,设置一下快照的创建频率,如下图:
我选择每周、每日、每小时的快照都创建。因为快照不是特别占用空间,因此我适当提高快照频率。
最后一步,需要选择一下是否需要对用户目录创建快照,如下图:
我个人是极不推荐对Home目录进行快照的,原因很简单:Home目录里面除了用户自定义的配置外,还有我的很多代码。
如果这些文件在恢复系统快照的时候也一并被恢复成了旧版本,那我岂不是一朝回到解放前?
另外还有一些文档、视频、图片这些都是不适合恢复成旧版本的。
谁也不想恢复一次系统之后,所有的工作都没了吧?
因此这里推荐不勾选。
设置完毕后会进入主界面,如下图:
根据我们在向导中选择的“计划”,Timeshift会定时自动创建快照。除此之外,我们也可以手动创建快照。
我一般会在 执行 sudo pacman -Syyu
之前手动创建一个快照,又或者准备安装一个庞大的软件,预感到会有很多依赖会塞到我的系统时,也会手动创建一个快照。
如果安装失败,立马就可以恢复到之前的干净状态,再重新来过。
使用Timeshift恢复系统
了解了Timeshift的基本功能后,我们来尝试使用Timeshift恢复损坏的系统。
一般来说,系统坏掉了之后面临三种情况:
- 部分功能损坏,但是不影响进入系统。
- 系统能正常启动,但是无进入桌面。
- 系统无法正常启动。
就这三种情况,我们分别介绍一下如何使用Timeshift进行恢复。
能正常进入桌面系统
运行timeshift,选中某个快照后,点“恢复”按钮,按提示操作,之后重启即可。
系统能启动,但是无法进入桌面
-
键盘按
Ctrl
+Alt
+F2 ~ F6
切换到终端,输入用户名密码登录进入命令行模式。 -
sudo timeshift --list
列出所有可用快照。 -
sudo timeshift --restore --snapshot '20XX-XX-XX_XX-XX-XX' --skip-grub
恢复到选定的快照,并跳过grup的安装,如果情况特殊请酌情调整参数。
系统彻底烂掉了,无法进入系统
- Arch 安装盘启动系统。
- 挂载系统分区(以下命令请根据系统的实际分区情况进行调整)。
mount -t btrfs -o subvol=/@,compress=zstd /dev/sdxn /mnt
mount -t btrfs -o subvol=/@home,compress=zstd /dev/sdxn /mnt/home
mount /dev/sdxn /mnt/boot/efi
arch-chroot /mnt
- 恢复系统,根据提示选择期望的快照(跟第二种情况的操作步骤一样了)。
sudo timeshift --list
sudo timeshift --restore --snapshot '20XX-XX-XX_XX-XX-XX' --skip-grub
- 重启系统,完成恢复。