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

From ArchWiki
Jump to navigation Jump to search
(细节)
(fixed section fragments (interactive))
(Tag: wiki-scripts)
 
(8 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[Category:简体中文]]
 
 
[[Category:Package management (简体中文)]]
 
[[Category:Package management (简体中文)]]
 
[[cs:Downgrading packages]]
 
[[cs:Downgrading packages]]
Line 9: Line 8:
 
[[it:Downgrading packages]]
 
[[it:Downgrading packages]]
 
[[ja:パッケージのダウングレード]]
 
[[ja:パッケージのダウングレード]]
 +
[[pt:Downgrading packages]]
 
[[ru:Downgrading packages]]
 
[[ru:Downgrading packages]]
 
[[sk:Downgrading packages]]
 
[[sk:Downgrading packages]]
[[tr:Paket sürümünü düşürmek]]
 
[[uk:Downgrading packages]]
 
 
{{Related articles start (简体中文)}}
 
{{Related articles start (简体中文)}}
 
{{Related|Arch Build System (简体中文)}}
 
{{Related|Arch Build System (简体中文)}}
Line 18: Line 16:
 
{{Related|Arch Linux Archive (简体中文)}}
 
{{Related|Arch Linux Archive (简体中文)}}
 
{{Related articles end}}
 
{{Related articles end}}
{{TranslationStatus (简体中文)|Downgrading_Packages|2012-09-19|221655}}
+
{{TranslationStatus (简体中文)|Downgrading_Packages|2017-10-12|492967}}
本文将会向你展示如何把一个包降级到以前的版本。通常,并不推荐降级包,只有在现有包存在Bug的情况下才推荐降级。
+
在决定降级之前,请小心考虑。如果是因为现有包有Bug,请在[https://bugs.archlinux.org/ Bug追踪系统]搜索现有的Bug报告。如果没有,请花上几分钟帮忙把它报告给Arch的Bug追踪系统或软件包的项目地址,或者在论坛中警告其他可能遇到类似问题的用户。
  
在降级之前,好好考虑下你为什么要降级。如果是因为现有包有Bug,请花上几分钟帮忙把它报告给Arch的Bug追踪系统或软件包的项目地址。我们和上游的开发者们都会很感激报告Bug的用户。因为Bug 报告中的任何额外信息都有可能节省大量的测试时间,帮助我们发行更加稳定的软件。
+
{{警告|
 +
* 降级某个软件包可能需要降级相应的依赖包.如果依赖包数量巨大,参见[[Arch Linux Archive (简体中文)#如何恢复所有包到指定日期]].
 +
* 在修改配置文件和脚本时请小心.只要我们不绕过pacman的安全措施,它将为我们处理这些问题.
 +
* 如果软件包降级会引进 soname 变更,所有依赖包可能都需要降级或[[Frequently_asked_questions#What if I run a full system upgrade and there will be an update for a shared library, but not for the apps that depend on it?|重新编译]].
 +
}}
  
== 原因 ==
+
== 如何降级软件包 ==
 
 
降级一个软件包实质就是卸载当前版本的软件包再安装旧版本的软件包。这个”旧版本“可以是当前版本之前的任何一个版本。
 
  
降级的原因包括:当前软件包有Bug,当前软件包未包含你需要的功能,实验性的目的。不管哪种情况,用户都认为:降级软件包是解决目前包出现问题的一个有效办法。
+
=== 使用pacman的临时文件 ===
  
降级一个包有时意味着其它包也要跟着它一起降级。对于那些装了一堆实验性或测试性软件包的用户,我们推荐直接重装整个系统而不是一个个降级软件包。
+
如果一个新包刚刚被安装并且没有删除[[Pacman#Cleaning_the_package_cache|pacman cache]],你可以在{{ic|/var/cache/pacman/pkg/}}中找到较早版本.
 +
安装替换现有的版本.[[pacman]]会处理依赖包但不会处理依赖库的版本冲突。如果一个其依赖库因该包降级需要降级,你需要手动降级这些包。
  
== 细节 ==
+
# pacman -U /var/cache/pacman/pkg/''package''-''old_version''.pkg.tar.xz
但是,用户必须注意以下几点:
 
* 注意每个包的依赖性。每个版本的包所需要的库往往是不同的,相关文件的功能跟以前的版本可能完全是不一样的。所以在降级的时候,你也要同时将那些库更改到相应的版本。
 
* 注意是否在降级过程中一些必须的文件会被删除。Arch Linux的滚动发行策略使得它不会在软件仓库中保存任何旧软件。下面会详述这个问题。
 
* 注意在降级过程中对配置文件或脚本做出的更改。在目前,我们会依赖pacman来帮我们处理这个问题。
 
  
== 如何降级软件包 ==
+
当成功降级该包以后,请暂时将其加入{{ic|pacman.conf}}的[[Pacman#Skip package from being upgraded|IgnorePkg section]],直到您的问题被解决。
* 问: 当我运行 {{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]]进入系统。
  
在 [[AUR]] 中有一个包叫做{{AUR|downgrade}}。它是一个简单的 Bash 脚本,它会从你的缓存中寻找旧版本的包,如果没有的话它会搜索 [[#ARM|A.R.M.]]。你可以选择一个旧包来安装。它基本上自动化了上面所述的过程。查看 {{Ic|downgrade --help}} 获取使用方法的信息。
+
# arch-chroot /mnt /bin/bash
  
另一个更强大的工具是{{AUR|downgrader}},它可以处理 pacman 的 log,能从 ARM、本地缓存降级,并且可以处理包列表 (如果在升级一些包后不稳定,而你不确定包的名字)
+
现在你可以在{{ic|/var/cache/pacman/pkg}} 寻找旧的安装包。必须降级的有{{Pkg|linux}}, {{Pkg|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
目前有三种方法
 
  
=== 过期源 ===
+
退出并重启。
如果系统上找不到旧版本,请检查未即时同步的源,从里面下载软件包。软件源同步状态可以从[https://www.archlinux.org/mirrors/status/ 这里]获得。
 
  
=== ARM ===
+
=== Arch Linux Archive ===
[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].
+
[[Arch Linux Archive]]是[[official repositories]]的日更快照。
  
据说,ARM想达到这样一个目的:使得使用wget+pacman可以方便的将你的系统回溯到某个时间点。但他们还没有给出这个自动化过程的具体解释。
+
''ALA''能被用来降级包或者还原整个系统到过去版本。
  
 
=== 手动编译 ===
 
=== 手动编译 ===
最糟糕的情况,如果这些地方都没有找到,那你就需要自己动手编译旧版本的软件包了。如果决定这样做,就可以从abs中先取出该软件包的PKGBUILD文件,然后修改相应的内容(通常是版本号)。或者访问 https://www.archlinux.org/packages/ 搜索你需要的降级的软件包,然后点 "查看修改" 链接,选择“查看日志“。找到你需要的版本然后点击路径。然后下载相应的文件再用makepkg编译即可。
 
  
对于AUR包来说,只能在http://pkgbuild.com/git/aur-mirror.git/ 处找到旧包的PKGBUILD,或者你可以到[Unofficial User Repositories]]处找到旧的二进制包。
+
如果找不到编译好的软件包,就需要自己找到 [[PKGBUILD]] 并通过 [[makepkg]] 编译。
 +
 
 +
[[official repositories|官方软件仓库]]中的 PKGBUILD 可以通过 [[ABS]] 获取并修改软件版本。或者访问 [https://www.archlinux.org/packages 软件包]页面搜索你需要的降级的软件包,然后点 "查看修改" 链接,选择“查看日志“。找到需要的版本并通过 ''Tree'' 视图下载 {{ic|.tar.gz}} 快照。
  
== 更改仓库 ==
+
参阅 [[Arch Build System#Checkout an older version of a package]].
要使用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的镜像放在最前头。
+
老的 AUR 软件包可以从 AUR 软件包 git 仓库提出旧版本。如果是 2015 AUR3 之前的 PKGBUILD,请参阅 [[Arch User Repository#Git repositories for AUR3 packages]].
然后运行:
 
pacman -Syy  # refresh the sync databases
 
pacman -Suu  # downgrade all packages with a lower version in the repos
 
  
仅仅这样并不能保证无缝的回溯,因为有时候相对于版本号会有包冲突等问题。
+
==== vABS - Versioned Arch Build System ====
  
更多信息请参考[[pacman]]
+
[https://vabs.archlinux-br.org vABS] 是一个ABS的拓展物,主要用来保存不同版本的官方PKGBUILD。你能够在其中找到两年内的旧版本。选择你期望的版本并编译安装,详细参见[https://www.archlinux-br.org/vabs_en 这里].
  
== FAQ ==
+
=== 自动化 ===
=== 由于依赖问题我无法降级 ===
 
  
你可以使用{{ic|-d}}选项在升级或删除包的时候忽略依赖的限制,比如,{{ic|pacman -Ud pkgpkgname-olderpkgver.pkg.tar.gz}},但这样做有可能破坏你的系统。
+
{{AUR|downgrader}} 是一个基于libalpm的小工具, 支持 pacman log,使用 [[Arch Linux Archive]],本地缓存和[http://repo-arm.archlinuxcn.org ARM]进行降级.
  
=== 怎么才能阻止Pacman升级我已降级的包? ===
+
{{AUR|downgrade}} 基于Bash使用本地缓存和[[Arch Rollback Machine]]。详见{{ic|man downgrade}}。
  
{{Ic|pacman.conf}}中设置{{Ic|<nowiki>IgnorePkg = package1 package2</nowiki>}}会使Pacman在更新时忽略你列出的包。
+
{{AUR|agetpkg-git}}功能与上述类似。
  
=== 我想把我的系统回溯到昨天的状态 ===
+
== 从[testing]中返回 ==
  
如果你使用[[LVM]],并且开启了periodic snapshots的话,这很容易实现。
+
参见 [[Official repositories#Disabling testing repositories]]

Latest revision as of 16:27, 26 December 2017

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

在决定降级之前,请小心考虑。如果是因为现有包有Bug,请在Bug追踪系统搜索现有的Bug报告。如果没有,请花上几分钟帮忙把它报告给Arch的Bug追踪系统或软件包的项目地址,或者在论坛中警告其他可能遇到类似问题的用户。

警告:

如何降级软件包

使用pacman的临时文件

如果一个新包刚刚被安装并且没有删除pacman cache,你可以在/var/cache/pacman/pkg/中找到较早版本. 安装替换现有的版本.pacman会处理依赖包但不会处理依赖库的版本冲突。如果一个其依赖库因该包降级需要降级,你需要手动降级这些包。

# pacman -U /var/cache/pacman/pkg/package-old_version.pkg.tar.xz

当成功降级该包以后,请暂时将其加入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 寻找旧的安装包。必须降级的有linuxlinux-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能被用来降级包或者还原整个系统到过去版本。

手动编译

如果找不到编译好的软件包,就需要自己找到 PKGBUILD 并通过 makepkg 编译。

官方软件仓库中的 PKGBUILD 可以通过 ABS 获取并修改软件版本。或者访问 软件包页面搜索你需要的降级的软件包,然后点 "查看修改" 链接,选择“查看日志“。找到需要的版本并通过 Tree 视图下载 .tar.gz 快照。

参阅 Arch Build System#Checkout an older version of a package.

老的 AUR 软件包可以从 AUR 软件包 git 仓库提出旧版本。如果是 2015 AUR3 之前的 PKGBUILD,请参阅 Arch User Repository#Git repositories for AUR3 packages.

vABS - Versioned Arch Build System

vABS 是一个ABS的拓展物,主要用来保存不同版本的官方PKGBUILD。你能够在其中找到两年内的旧版本。选择你期望的版本并编译安装,详细参见这里.

自动化

downgraderAUR 是一个基于libalpm的小工具, 支持 pacman log,使用 Arch Linux Archive,本地缓存和ARM进行降级.

downgradeAUR 基于Bash使用本地缓存和Arch Rollback Machine。详见man downgrade

agetpkg-gitAUR功能与上述类似。

从[testing]中返回

参见 Official repositories#Disabling testing repositories