Difference between revisions of "Downgrading packages (简体中文)"

From ArchWiki
Jump to navigation Jump to search
(跟进原文)
Line 18: Line 18:
 
{{Related|Arch Linux Archive (简体中文)}}
 
{{Related|Arch Linux Archive (简体中文)}}
 
{{Related articles end}}
 
{{Related articles end}}
{{TranslationStatus (简体中文)|Downgrading_Packages|2012-09-19|221655}}
+
{{Expansion|soname bumps, cf. [[Frequently_asked_questions#What_if_I_run_a_full_system_upgrade_and_there_will_be_an_update_for_a_shared_library.2C_but_not_for_the_apps_that_depend_on_it.3F]]}}
本文将会向你展示如何把一个包降级到以前的版本。通常,并不推荐降级包,只有在现有包存在Bug的情况下才推荐降级。
+
{{TranslationStatus (简体中文)|Downgrading_Packages|2016-03-25|422336}}
 +
在降级之前,好好考虑下你为什么要降级.如果是因为现有包有Bug,请在[https://bugs.archlinux.org/ Bug追踪系统]搜索现有的Bug报告.如果没有,请花上几分钟帮忙把它报告给Arch的Bug追踪系统或软件包的项目地址,或者至少警告其他可能遇到类似问题的用户.
  
在降级之前,好好考虑下你为什么要降级。如果是因为现有包有Bug,请花上几分钟帮忙把它报告给Arch的Bug追踪系统或软件包的项目地址。我们和上游的开发者们都会很感激报告Bug的用户。因为Bug 报告中的任何额外信息都有可能节省大量的测试时间,帮助我们发行更加稳定的软件。
+
{{警告|
 +
* 降级某个软件包可能需要降级相应的依赖包.如果软件包数量巨大,参见[[Arch Linux Archive (简体中文)#如何恢复所有包到指定日期]].
 +
* 在修改配置文件和脚本时请小心.现在只要我们不绕过pacman的安全措施,它将为我们处理这些问题.}}
  
== 原因 ==
+
== 如何降级软件包 ==
  
降级一个软件包实质就是卸载当前版本的软件包再安装旧版本的软件包。这个”旧版本“可以是当前版本之前的任何一个版本。
+
=== 使用pacman的临时文件 ===
  
降级的原因包括:当前软件包有Bug,当前软件包未包含你需要的功能,实验性的目的。不管哪种情况,用户都认为:降级软件包是解决目前包出现问题的一个有效办法。
+
如果一个包刚刚被安装并且[[Pacman#Cleaning_the_package_cache|pacman cache]]没有被清除,你可以在{{ic|/var/cache/pacman/pkg/}}寻找并安装早的版本.
 +
这个方法会删除现有的版本并安装老的版本.依赖包会被处理但[[pacman]]并不会处理依赖库的版本冲突.如果一个其他包或依赖库因该包降级需要降级,你将不得不手动降级这些包.
  
降级一个包有时意味着其它包也要跟着它一起降级。对于那些装了一堆实验性或测试性软件包的用户,我们推荐直接重装整个系统而不是一个个降级软件包。
+
# cd /var/cache/pacman/pkg/
 +
# pacman -U <file_name_of_the_package>
  
== 细节 ==
+
当成功降级该包以后,请暂时性地将其加入{{ic|pacman.conf}}的[[Pacman#Skip package from being upgraded|IgnorePkg section]],等待问题被解决.
但是,用户必须注意以下几点:
 
* 注意每个包的依赖性。每个版本的包所需要的库往往是不同的,相关文件的功能跟以前的版本可能完全是不一样的。所以在降级的时候,你也要同时将那些库更改到相应的版本。
 
* 注意是否在降级过程中一些必须的文件会被删除。Arch Linux的滚动发行策略使得它不会在软件仓库中保存任何旧软件。下面会详述这个问题。
 
* 注意在降级过程中对配置文件或脚本做出的更改。在目前,我们会依赖pacman来帮我们处理这个问题。
 
  
== 如何降级软件包 ==
+
=== 降级内核 ===
* 问: 当我运行 {{ic|pacman -Syu}} 将软件包从版本甲升级到版本乙之后,发现这个软件包导致系统出现了一些问题,我该怎样将该软件包重新降级到版本甲呢?
 
* 答: 如果该包不是很重要的话,你可以降级的。先查看你系统的{{ic|/var/cache/pacman/pkg}}目录,看看旧版本的软件包是不是还保存在那儿 (如果你最近没有执行 {{ic|pacman -Scc}}以清空包缓存的话,应该在那儿)。 如果在,你可以执行{{ic|pacman -U pkgname-olderpkgver.pkg.tar.gz}}来安装旧版本。如果pacman提示文件冲突的话,你可以通过加上{{ic|-f}}参数以强制执行,即 {{ic|pacman -U --force pkgname-olderpkgver.pkg.tar.gz}}。
 
  
这个过程会移除现有的包,仔细的计算所有依赖的改变,然后安装你选择的旧版本的软件包以及合适的依赖。
+
如果您在升级内核后无法启动,您可以通过使用live CD来降级内核.方法类似Arch Linux的安装进程.启动后在{{ic|/mnt}}挂载你的根目录文件系统,如果有其他分区如{{ic|/boot}}或{{ic|/var}}等等,同样地,请挂载它们.(例子 {{ic|mount /dev/sdc3 /mnt/boot}}).然后[[chroot]].
  
{{注意|如果你改变了操作系统的一个基本的组件包,你也许需要降级许多包。这些软件包可能在过程中被删除,需要手动一点一点的安装回来;同时,后续升级时要小心,不要重新安装不想要的软件包版本。}}
+
# arch-chroot /mnt /bin/bash
  
在 [[AUR]] 中有一个包叫做{{AUR|downgrade}}。它是一个简单的 Bash 脚本,它会从你的缓存中寻找旧版本的包,如果没有的话它会搜索 [[#ARM|A.R.M.]]。你可以选择一个旧包来安装。它基本上自动化了上面所述的过程。查看 {{Ic|downgrade --help}} 获取使用方法的信息。
+
现在你可以在{{ic|/var/cache/pacman/pkg}} 寻找旧的安装包.必须降级的有{{Pkg|linux}}, {{Pkg|linux-headers}}和任何内核模块.举例来说:
  
另一个更强大的工具是{{AUR|downgrader}},它可以处理 pacman 的 log,能从 ARM、本地缓存降级,并且可以处理包列表 (如果在升级一些包后不稳定,而你不确定包的名字)
+
# pacman -U linux-3.5.6-1-x86_64.pkg.tar.xz linux-headers-3.5.6-1-x86_64.pkg.tar.xz virtualbox-host-modules-4.2.0-5-x86_64.pkg.tar.xz
  
== 如何找到旧版本 ==
+
退出并重启.
目前有三种方法
 
  
=== 过期源 ===
+
=== Arch Linux Archive ===
如果系统上找不到旧版本,请检查未即时同步的源,从里面下载软件包。软件源同步状态可以从[https://www.archlinux.org/mirrors/status/ 这里]获得。
 
  
=== ARM ===
+
[[Arch Linux Archive]]是[[official repositories]]的日更快照.
[http://ala.seblu.net/ Arch Rollback Machine] (ARM) 里包含2009年9月1日以来所有仓库的归档。目前(2009年11月21日),这个网站还不稳定,根据以前的报道,丢失了2008年10月1日到目前的一些数据。
 
  
如果你对ARM感兴趣的话,最好是到它的宣传论坛了解一下相关信息,这样可以了解它的最新进度。它的宣传论坛在这里:[https://bbs.archlinux.org/viewtopic.php?id=53665].
+
''ALA''能被用来降级包或者还原整个系统到过去版本.
 
 
据说,ARM想达到这样一个目的:使得使用wget+pacman可以方便的将你的系统回溯到某个时间点。但他们还没有给出这个自动化过程的具体解释。
 
  
 
=== 手动编译 ===
 
=== 手动编译 ===
Line 67: Line 61:
 
对于AUR包来说,只能在http://pkgbuild.com/git/aur-mirror.git/ 处找到旧包的PKGBUILD,或者你可以到[Unofficial User Repositories]]处找到旧的二进制包。
 
对于AUR包来说,只能在http://pkgbuild.com/git/aur-mirror.git/ 处找到旧包的PKGBUILD,或者你可以到[Unofficial User Repositories]]处找到旧的二进制包。
  
== 更改仓库 ==
+
==== vABS - Versioned Arch Build System ====
要使用ARM仓库的话,注释掉原来的仓库,添加适当的ARM仓库地址即可:
 
[core]
 
#<nowiki>Server=http://mirrors.gigenet.com/archlinux/core/os/i686</nowiki>
 
<nowiki>Server=http://arm.konnichi.com/2009/11/01/core/os/i686</nowiki>
 
  
在这个例子中,这个配置会把当前系统的包回溯到2009年11月1日的状态。请注意,所有的仓库都是官方仓库的快照。所以你只需要更改{{Ic|/etc/pacman.d/mirrorlist}}处的镜像,把ARM的镜像放在最前头。
+
[https://vabs.archlinux-br.org vABS] is an addition to ABS that has as main goal to keep different versions of the official PKGBUILDs. In ABS you have the latest versions of PKGBUILDs, while in vABS you also have old versions (up to 2 years). Select the desired version and download the build files tgz package or individual files and easily build your package with pkgbuild. More information about the service can be found [https://www.archlinux-br.org/vabs_en here].
然后运行:
 
pacman -Syy  # refresh the sync databases
 
pacman -Suu  # downgrade all packages with a lower version in the repos
 
  
仅仅这样并不能保证无缝的回溯,因为有时候相对于版本号会有包冲突等问题。
+
=== 自动的方法 ===
  
更多信息请参考[[pacman]]
+
[[AUR]] 中有一个包叫做{{AUR|downgrade}}。它是一个简单的 Bash 脚本,它会从你的缓存中寻找旧版本的包,如果没有的话它会搜索 [[#ARM|A.R.M.]]。你可以选择一个旧包来安装。它基本上自动化了上面所述的过程。查看 {{Ic|downgrade --help}} 获取使用方法的信息。
  
== FAQ ==
+
另一个更强大的工具是{{AUR|downgrader}},它可以处理 pacman 的 log,能从 ARM、本地缓存降级,并且可以处理包列表 (如果在升级一些包后不稳定,而你不确定包的名字)
=== 由于依赖问题我无法降级 ===
 
 
 
你可以使用{{ic|-d}}选项在升级或删除包的时候忽略依赖的限制,比如,{{ic|pacman -Ud pkgpkgname-olderpkgver.pkg.tar.gz}},但这样做有可能破坏你的系统。
 
 
 
=== 怎么才能阻止Pacman升级我已降级的包? ===
 
  
{{Ic|pacman.conf}}中设置{{Ic|<nowiki>IgnorePkg = package1 package2</nowiki>}}会使Pacman在更新时忽略你列出的包。
+
{{AUR|agetpkg-git}} quickly lists/gets/installs packages from the [[Arch Linux Archive]].
  
=== 我想把我的系统回溯到昨天的状态 ===
+
== 从[testing]中返回 ==
  
如果你使用[[LVM]],并且开启了periodic snapshots的话,这很容易实现。
+
参见 [[Official repositories#Disabling testing repositories]].

Revision as of 11:36, 25 March 2016

翻译状态: 本文是英文页面 Downgrading_Packages翻译,最后翻译时间:2016-03-25,点击这里可以查看翻译后英文页面的改动。

在降级之前,好好考虑下你为什么要降级.如果是因为现有包有Bug,请在Bug追踪系统搜索现有的Bug报告.如果没有,请花上几分钟帮忙把它报告给Arch的Bug追踪系统或软件包的项目地址,或者至少警告其他可能遇到类似问题的用户.

警告:

如何降级软件包

使用pacman的临时文件

如果一个包刚刚被安装并且pacman cache没有被清除,你可以在/var/cache/pacman/pkg/寻找并安装早的版本. 这个方法会删除现有的版本并安装老的版本.依赖包会被处理但pacman并不会处理依赖库的版本冲突.如果一个其他包或依赖库因该包降级需要降级,你将不得不手动降级这些包.

# cd /var/cache/pacman/pkg/
# pacman -U <file_name_of_the_package>

当成功降级该包以后,请暂时性地将其加入pacman.confIgnorePkg section,等待问题被解决.

降级内核

如果您在升级内核后无法启动,您可以通过使用live CD来降级内核.方法类似Arch Linux的安装进程.启动后在/mnt挂载你的根目录文件系统,如果有其他分区如/boot/var等等,同样地,请挂载它们.(例子 mount /dev/sdc3 /mnt/boot).然后chroot.

# arch-chroot /mnt /bin/bash

现在你可以在/var/cache/pacman/pkg 寻找旧的安装包.必须降级的有linux, linux-headers和任何内核模块.举例来说:

# pacman -U linux-3.5.6-1-x86_64.pkg.tar.xz linux-headers-3.5.6-1-x86_64.pkg.tar.xz virtualbox-host-modules-4.2.0-5-x86_64.pkg.tar.xz

退出并重启.

Arch Linux Archive

Arch Linux Archiveofficial repositories的日更快照.

ALA能被用来降级包或者还原整个系统到过去版本.

手动编译

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

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

vABS - Versioned Arch Build System

vABS is an addition to ABS that has as main goal to keep different versions of the official PKGBUILDs. In ABS you have the latest versions of PKGBUILDs, while in vABS you also have old versions (up to 2 years). Select the desired version and download the build files tgz package or individual files and easily build your package with pkgbuild. More information about the service can be found here.

自动的方法

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

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

agetpkg-gitAUR quickly lists/gets/installs packages from the Arch Linux Archive.

从[testing]中返回

参见 Official repositories#Disabling testing repositories.