使用任何系统,难免会碰到需要更新系统的情况。有时是为了修补漏洞,有时是为了提高易用性。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里我提到了使用本地的包缓存建立一个不完全镜像,方便网络环境安装。但如果使用本文的方法,只要利用这个列表,利用可移动介质,也可以在无网环境下对其他机器进行软件包同步了:)


跟据你思想我做了一下改变,因为不是所有的包都是i686的也不一定都是.gz结尾的
pacman -Qu | sed 's/\(.*\) \(.*\)/\1-\2/g'|grep _ `ls /var/cache/pacman/pkg/`|cut -d ' ' -f 2| tr '\n' ' '>/tmp/pkg_snapshot_`date +%Y%m%d`,对shell不是很熟,请指教。
展开回复(1)
不是gz那就用通配符比如*z来替换吧。