# Downgrading Packages (简体中文)

相关文章

- Arch Build System (简体中文)
- pacman (简体中文)

翻译状态： 本文是英文页面 Downgrading_Packages 的翻译，最后翻译时间：2012-09-19，点击这里可以查看翻译后英文页面的改动。

本文将会向你展示如何把一个包降级到以前的版本。通常，并不推荐降级包，只有在现有包存在Bug的情况下才推荐降级。

在降级之前，好好考虑下你为什么要降级。如果是因为现有包有Bug，请花上几分钟帮忙把它报告给Arch的Bug追踪系统或软件包的项目地址。我们和上游的开发者们都会很感激报告Bug的用户。因为Bug 报告中的任何额外信息都有可能节省大量的测试时间，帮助我们发行更加稳定的软件。

## 原因

降级一个软件包实质就是卸载当前版本的软件包再安装旧版本的软件包。这个”旧版本“可以是当前版本之前的任何一个版本。

降级的原因包括：当前软件包有Bug，当前软件包未包含你需要的功能，实验性的目的。不管哪种情况，用户都认为：降级软件包是解决目前包出现问题的一个有效办法。

降级一个包有时意味着其它包也要跟着它一起降级。对于那些装了一堆实验性或测试性软件包的用户，我们推荐直接重装整个系统而不是一个个降级软件包。

## 细节

但是，用户必须注意以下几点：

- 注意每个包的依赖性。每个版本的包所需要的库往往是不同的，相关文件的功能跟以前的版本可能完全是不一样的。所以在降级的时候，你也要同时将那些库更改到相应的版本。
- 注意是否在降级过程中一些必须的文件会被删除。Arch Linux的滚动发行策略使得它不会在软件仓库中保存任何旧软件。下面会详述这个问题。
- 注意在降级过程中对配置文件或脚本做出的更改。在目前，我们会依赖pacman来帮我们处理这个问题。

Arch回溯机概念正在开发中，等待与pacman的融合。一旦开发融合完成，上面提到的细节问题将会自动完成，不需要你来操心。

## 如何降级软件包

- 问: 当我运行 `pacman -Syu` 将软件包从版本甲升级到版本乙之后，发现这个软件包导致系统出现了一些问题，我该怎样将该软件包重新降级到版本甲呢？
- 答: 如果该包不是很重要的话，你可以降级的。先查看你系统的`/var/cache/pacman/pkg`目录，看看旧版本的软件包是不是还保存在那儿 (如果你最近没有执行 `pacman -Scc`以清空包缓存的话，应该在那儿)。 如果在，你可以执行`pacman -U pkgname-olderpkgver.pkg.tar.gz`来安装旧版本。如果pacman提示文件冲突的话，你可以通过加上`-f`参数以强制执行，即 `pacman -U --force pkgname-olderpkgver.pkg.tar.gz`。

这个过程会移除现有的包，仔细的计算所有依赖的改变，然后安装你选择的旧版本的软件包以及合适的依赖。

注意: 如果你改变了操作系统的一个基本的组件包，你也许需要降级许多包。这些软件包可能在过程中被删除，需要手动一点一点的安装回来；同时，后续升级时要小心，不要重新安装不想要的软件包版本。

在 AUR 中有一个包叫做downgrade。它是一个简单的 Bash 脚本，它会从你的缓存中寻找旧版本的包，如果没有的话它会搜索 A.R.M.。你可以选择一个旧包来安装。它基本上自动化了上面所述的过程。查看 `downgrade --help` 获取使用方法的信息。

另一个更强大的工具是downgrader，它可以处理 pacman 的 log，能从 ARM、本地缓存降级，并且可以处理包列表 (如果在升级一些包后不稳定，而你不确定包的名字)

## 如何找到旧版本

目前有三种方法

### 过期源

如果系统上找不到旧版本，请检查未即时同步的源，从里面下载软件包。软件源同步状态可以从这里获得。

### ARM

Arch Rollback Machine (ARM) 里包含2009年9月1日以来所有仓库的归档。目前（2009年11月21日），这个网站还不稳定，根据以前的报道，丢失了2008年10月1日到目前的一些数据。

如果你对ARM感兴趣的话，最好是到它的宣传论坛了解一下相关信息，这样可以了解它的最新进度。它的宣传论坛在这里：[1].

据说，ARM想达到这样一个目的：使得使用wget+pacman可以方便的将你的系统回溯到某个时间点。但他们还没有给出这个自动化过程的具体解释。目前如果想手动搜索某个特定包的话，可以到这里：ARM Search。

### 手动编译

最糟糕的情况，如果这些地方都没有找到，那你就需要自己动手编译旧版本的软件包了。如果决定这样做，就可以从abs中先取出该软件包的PKGBUILD文件，然后修改相应的内容（通常是版本号）。或者访问 https://www.archlinux.org/packages/ 搜索你需要的降级的软件包，然后点 "查看修改" 链接，选择“查看日志“。找到你需要的版本然后点击路径。然后下载相应的文件再用makepkg编译即可。

对于AUR包来说，只能在http://pkgbuild.com/git/aur-mirror.git/ 处找到旧包的PKGBUILD，或者你可以到[Unofficial User Repositories]]处找到旧的二进制包。

## 更改仓库

要使用ARM仓库的话，注释掉原来的仓库，添加适当的ARM仓库地址即可：

    [core]
    #Server=http://mirrors.gigenet.com/archlinux/core/os/i686
    Server=http://arm.konnichi.com/2009/11/01/core/os/i686

在这个例子中，这个配置会把当前系统的包回溯到2009年11月1日的状态。请注意，所有的仓库都是官方仓库的快照。所以你只需要更改`/etc/pacman.d/mirrorlist`处的镜像，把ARM的镜像放在最前头。 然后运行：

    pacman -Syy  # refresh the sync databases
    pacman -Suu  # downgrade all packages with a lower version in the repos

仅仅这样并不能保证无缝的回溯，因为有时候相对于版本号会有包冲突等问题。

更多信息请参考pacman

## FAQ

#### Q: 由于依赖问题我无法降级

A: 你可以使用`-d`选项在升级或删除包的时候忽略依赖的限制，比如，`pacman -Ud pkgpkgname-olderpkgver.pkg.tar.gz`，但这样做有可能破坏你的系统。

#### Q: 怎么才能阻止Pacman升级我已降级的包？

A: 在`pacman.conf`中设置`IgnorePkg = package1 package2`会使Pacman在更新时忽略你列出的包。

#### Q: 我想把我的系统回溯到昨天的状态

A: 如果你使用LVM，并且开启了periodic snapshots的话，这很容易实现。
Category:

- Package management (简体中文)