在 Arch Linux 中降级软件包

Arch Linux 作为一个滚动式发行版,最大的特点就是只定期发布安装介质,而不以新版本号的形式发布新系统。但这样的平滑更新机制有时候会导致故障。比如在最近一次执行 pacman -Syu 后,笔者的 wifi-menu 就罢工了,一直显示Aborted;查了一下/var/log/pacman.log,看起来是wpa_supplicant的问题:

[2015-04-25 14:24] [ALPM] upgraded wpa_supplicant (2.3-1 -> 2.4-1)

看到这种问题,首先想到的就是降级软件包。ArchLinux每次升级都会把包下载到本地,并且不会覆盖以前的安装包——也就是说,如果没有删过历史软件包,那安装的某个包的所有版本,都会留在本地:

[/var/cache/pacman/pkg] femrat$ ls wpa*
wpa_supplicant-2.4-1-x86_64.pkg.tar.xz

如果你在此找到了历史软件包,就可以直接跳到本文的最后一步了;但是很可惜,我不知道什么时候手欠把老包删了…… 而且问题在于,ArchLinux作为滚动发行版,一大特色就是仓库不提供历史软件包下载,ArchLinux源里只有最新版本的包。不过对于历史,ArchLinux也不算丢弃,他们提供了PKGBUILD下载。 ArchLinux的PKGBUILD是打包控制文件,它决定了源码从哪下载,如何打包。一般PKGBUILD里会给出上游源码(或者二进制)下载的URL,打包的时候从指定的地址下载源码包然后本地编译打包。 所以,现在我们希望的,就是软件包使用的上游源码还在。不过在这之前,首先得找到PKGBUILD。 访问http://archlinux.org,右侧Package Search中填入wpa_supplicant,选择目标架构(Arch)对应的包——这里我选的是x86_64,会进入到https://www.archlinux.org/packages/core/x86_64/wpa_supplicant/这个页面。 在页面右侧Package Actions中,点Source Files,我们来到了对应包的项目页面: https://projects.archlinux.org/svntogit/packages.git/tree/trunk?h=packages/wpa_supplicant。

题外话:这是一个Git源。如果你有足够的好奇心,可以点summary,把页面往下拉,找到git地址把库clone下来…以及,每个包都对应这个库中的一个分支(Branch),所以你clone的时候实际上是把所有包的所有历史都拽回来了。

ArchLinux这个库中,对于每个分支,有trunk和repos两个文件夹。刚才进入的是trunk,这个不是发布到源中的包用的打包脚本。所以找到“summary refs log…”下面的path: root/trunk,点root然后进入root/repos,即这个页面:https://projects.archlinux.org/svntogit/packages.git/tree/repos?h=packages/wpa_supplicant。 core-x86_64文件夹就是我们需要的东西了。点它旁边的log,查看所有和这个文件夹有关的git历史。

Age Commit message (Expand) ...
15 hours db-move: moved wpa_supplicant from [testing] to [core] (i686, x86_64) ...
2014-10-19 db-move: moved wpa_supplicant from [testing] to [core] (i686, x86_64) ...

ArchLinux包维护的流程是:testing测好了之后,发布到core/extra/community。15 hours 那个包就是我们现在装的,有问题。 所以我们降到2014-10-19的包。点那个commit的commit message,进入 https://projects.archlinux.org/svntogit/packages.git/commit/repos/core-x86_64?h=packages/wpa_supplicant&id=4ed8733c9b86bcecf6131386a54f1cdec56e9222。 找到

download packages-4ed8733c9b86bcecf6131386a54f1cdec56e9222.tar.gz

点链接下载,解压,进入packages-4ed8733c9b86bcecf6131386a54f1cdec56e9222/repos/core-x86_64目录,以非root身份运行:

makepkg

提示缺依赖的话,用makepkg -s命令。 如果一切顺利,makepkg会从PKGBUILD中下载指定的源码包,然后自动打包生成wpa_supplicant-2.3-1-x86_64.pkg.tar.xz,留在这个目录下。 安装这个包:切换到root,执行

pacman -U wpa_supplicant-2.3-1-x86_64.pkg.tar.xz

Enjoy。

注:本文为@femrat撰写的文章《HOW-TO: 在ArchLinux中降级软件包》,经作者授权进行了一定编辑。

Now have One Response to “在 Arch Linux 中降级软件包”

  1. jiangtao9999 2015-04-28 19:06 says: 回复

    gentoo 才是最终出路!
    经常能看见新版有问题,降级到旧版本的情况……

发表评论