安全地更新ArchLinux

使用任何系统,难免会碰到需要更新系统的情况。有时是为了修补漏洞,有时是为了提高易用性。ArchLinux为了这样的需求,提供了一个非常方便的方法,只要使用pacman -Syu就能对系统进行一次全面的更新。

但是,世事难料,这样的全面更新难免会有一些这样那样的问题。比如更新的软件包与工作环境不兼容,又比如包维护人员出了点小纰漏导致更新后有虫爬。因为操作系统也是软件,总会有出错的时候,所以这些问题我们都能容忍,但是在容忍的同时,我们也会希望有一个恢复原状的方法。这样,在问题解决以前,我们的工作不至于被耽搁。可惜的是,ArchLinux的包管理程序pacman并没有提供这样的功能。

不过,由于ABS的关系,pacman提供了从指定二进制包文件安装的方法,这就为我们回滚系统提供的便利。在少量包更新的情况下,只要之前pacman的cache文件没有被清空,原来版本的二进制包会存放在/var/cache/pacman/pkg/,所以只要记住原来的包版本,在升级失败时手动指定包文件就能对特定包进行降级操作。

但如果出现了大规模的系统更新呢?特别是在更新后出现了bug的情况,面对这众多的软件包,如何快速地回复到原来的状态从而不影响正常的工作?一直以来我都没有找到合适的方法,直到某天蛋疼地翻看pacman的man,突然发现,原来pacman提供了一个打印更新列表的办法pacman -Qu,在有了更新列表以后,下面的事情就好办了。

首先,在更新之前,运行

pacman -Sy

这步没啥说的,只是更新本地数据库。更新完后,我们使用pacman -Qu就能够获得一份本次更新涉及的软件包列表。不过,内容是“<包名> <版本号>”这样的格式的,我们需要将其转换成真正的二进制包文件名。

pacman -Qu | sed 's/(.*) (.*)/\1-\2.i686.pkg.tar.gz /g'| tr -d '\n' >/tmp/pkg_snapshot_`date +%Y%m%d`

保存好这个文件。接下来再执行常规的更新操作

pacman -Su

如果没有问题,那就万事大吉。但如果有问题,则可以使用如下的方法快速回滚。

cd /var/cache/pacman/pkg/ && cat <软件包更新列表文件> | xargs sudo pacman -U

OK,现在我们可以放心地更新ArchLinux了。

P.S. 使用类似的方法,还可以为当前ArchLinux建立快照,因为pacman还提供了使用pacman -Q获取当前主机安装的软件包列表的功能。在利用pacman的包缓存无痛安装 ArchLinux里我提到了使用本地的包缓存建立一个不完全镜像,方便网络环境安装。但如果使用本文的方法,只要利用这个列表,利用可移动介质,也可以在无网环境下对其他机器进行软件包同步了:)

发表评论

评论备注:

  1. 留言时的头像是Gravatar提供的服务。
  2. By submitting a comment here you grant this site a perpetual license to reproduce your words and name/web site in attribution. So, you don't fully own your words, so to speak.