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

From ArchWiki
Jump to navigation Jump to search
(http://schlunix.org/ shutdown.)
Line 12: Line 12:
 
[[uk:Downgrading Packages]]
 
[[uk:Downgrading Packages]]
 
{{translateme (简体中文)}}
 
{{translateme (简体中文)}}
 +
 +
 +
本文将会向你展示如何把一个包降级到以前的版本。通常,并不推荐降级包,只有在现有包存在Bug的情况下才推荐降级。
 +
 +
在降级之前,好好考虑下你为什么要降级。如果是因为现有包有Bug,请花上几分钟帮忙把它报告给Arch的Bug追踪系统或软件包的项目地址。由于Arch是一个滚动发行版,你很有可能经常遇到Bug。
 +
 +
我们和上游的开发者们都会很感激你所做的努力(报告Bug)。你们提供的这点(看似微不足道的)额外的信息会帮助我们节省大量的测试时间,因而帮助我们发行更加稳定的软件。
 +
 +
== 原因 ==
 +
 +
降级一个软件包实质就是卸载当前版本的软件包再安装旧版本的软件包。这个”旧版本“既可以是当前版本之前的任何一个版本。
 +
 +
降级的原因包括:当前软件包有Bug,当前软件包未包含你需要的功能,实验性的目的。不管哪种情况,用户都认为:降级软件包是解决目前包出现问题的一个有效办法。
 +
 +
降级一个包有时意味着其它包也要跟着它一起降级。对于那些装了一堆实验性或测试性软件包的用户,我们推荐直接重装整个系统而不是一个个降级软件包。
 +
 +
== 细节 ==
 +
但是,用户必须注意以下几点:
 +
* 注意每个包的依赖性。每个版本的包所需要的库往往是不同的,相关文件的功能跟以前的版本可能完全是不一样的。所以在降级的时候,你也要同时将那些库更改到相应的版本。
 +
* 注意是否在降级过程中一些必须的文件会被删除。Arch Linux的滚动发行策略使得它不会在软件仓库中保存任何旧软件。下面会详述这个问题。
 +
* 注意在降级过程中对配置文件或脚本做出的更改。在目前,我们会依赖pacman来帮我们处理这个问题。
 +
 +
Arch回溯机概念正在开发中,等待与pacman的融合。一旦开发融合完成,上面提到的细节问题将会自动完成,不需要你来操心。
  
 
== 如何降级软件包 ==
 
== 如何降级软件包 ==
Line 19: Line 42:
 
这个过程会移除现有的包,仔细的计算所有依赖的改变,然后安装你选择的旧版本的软件包以及合适的依赖。
 
这个过程会移除现有的包,仔细的计算所有依赖的改变,然后安装你选择的旧版本的软件包以及合适的依赖。
  
{{注意|如果你改变了操作系统的一个基本的组件,你也许需要取出很多包,然后用它们的旧版本替代。Or they may just be gone and you will have to put them back in a manual, piece-meal fashion, while being careful that a particular upgrade does not want to re-install the undesirable package version you did not want in the first place.}}
+
{{注意|如果你改变了操作系统的一个基本的组件包,你也许需要降级许多包。Or they may just be gone and you will have to put them back in a manual, piece-meal fashion, while being careful that a particular upgrade does not want to re-install the undesirable package version you did not want in the first place.}}
  
在 [[AUR]] 中有一个包叫做 [https://aur.archlinux.org/packages.php?ID=31937 downgrade]。它是一个简单的 Bash 脚本,它会寻找你的缓存中的旧版本的包,也会搜索 [[#ARM|A.R.M.]] 查看是否你的缓存里面没有包。你也可以选择一个包来安装。它基本上自动化了上面所述的过程。查看 {{Ic|downgrade --help}} 获取使用方法的信息。
+
在 [[AUR]] 中有一个包叫做{{AUR|downgrade}}。它是一个简单的 Bash 脚本,它会从你的缓存中寻找旧版本的包,如果没有的话它会搜索 [[#ARM|A.R.M.]]。你可以选择一个旧包来安装。它基本上自动化了上面所述的过程。查看 {{Ic|downgrade --help}} 获取使用方法的信息。
  
另一个更强大的工具是 [https://aur.archlinux.org/packages.php?ID=50246 downgrader],它可以处理 pacman 的 log,能从 ARM、本地缓存降级,并且可以列出包 (如果在升级一些包后不稳定,而你不确定包的名字)
+
另一个更强大的工具是{{AUR|downgrader}},它可以处理 pacman 的 log,能从 ARM、本地缓存降级,并且可以处理包列表 (如果在升级一些包后不稳定,而你不确定包的名字)
  
 
== 如何找到旧版本 ==
 
== 如何找到旧版本 ==
如果你本地系统里没有旧版的软件包,检查一下我们的更新源里有没有还没来得及更新的,如果有的话可以从那儿下载旧版软件包。你可以点击这里看看[http://users.archlinux.de/~gerbra/mirrorcheck.html 各镜像源的状态].
+
目前有三种方法
  
 
=== 过期源 ===
 
=== 过期源 ===
Line 32: Line 55:
  
 
=== ARM ===
 
=== ARM ===
 +
[http://arm.konnichi.com/ Arch Rollback Machine] (ARM) 里包含2009年9月1日以来所有仓库的归档。目前(2009年11月21日),这个网站还不稳定,根据以前的报道,丢失了2008年10月1日到目前的一些数据。
 +
 +
如果你对ARM感兴趣的话,最好是到它的宣传论坛了解一下相关信息,这样可以了解它的最新进度。它的宣传论坛在这里:[http://bbs.archlinux.org/viewtopic.php?id=53665].
 +
 +
据说,ARM想达到这样一个目的:使得使用wget+pacman可以方便的将你的系统回溯到某个时间点。但他们还没有给出这个自动化过程的具体解释。目前如果想手动搜索某个特定包的话,可以到这里:[http://arm.konnichi.com/search/ ARM Search]。
 +
 
=== 手动编译 ===
 
=== 手动编译 ===
最糟糕的情况,如果这些地方都没有找到,那你就需要自己动手编译旧版本的软件包了。如果决定这样做,就可以从abs中先取出该软件包的PKGBUILD文件,然后修改相应的内容(通常是版本号)。或者访问 http://www.archlinux.org/packages/ 搜索你需要的降级的软件包,然后点 "View SVN entries" 链接,查看当前包的PKGBUILD和前一版本有何不同(ie: for the revision you are interested in). 如果你使用的是 "side by side" diff视图,你可以直接把旧版本的PKGBUILD的内容直接拷贝到本地,然后用他来编译。
+
最糟糕的情况,如果这些地方都没有找到,那你就需要自己动手编译旧版本的软件包了。如果决定这样做,就可以从abs中先取出该软件包的PKGBUILD文件,然后修改相应的内容(通常是版本号)。或者访问 http://www.archlinux.org/packages/ 搜索你需要的降级的软件包,然后点 "View SVN entries" 链接,选择“View Log“。找到你需要的版本然后点击路径。然后下载相应的文件再用makepkg编译即可。
 +
 
 +
对于AUR包来说,只能在http://pkgbuild.com/git/aur-mirror.git/ 处找到旧包的PKGBUILD,或者你可以到[Unofficial User Repositories]]处找到旧的二进制包。
 +
 
 +
== 更改仓库 ==
 +
要使用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的镜像放在最前头。
 +
然后运行:
 +
pacman -Syy  # refresh the sync databases
 +
pacman -Suu  # downgrade all packages with a lower version in the repos
 +
 
 +
This alone does not guarantee a seamless rollback as there are sometimes package conflicts with regards to version numbers, etc. If you know the repository it may be easier to visit the global mirror, e.g http://arm.konnichi.com/core/os/i686, note the omission of the date.
 +
仅仅这样并不能保证无缝的回溯,因为有时候相对于版本号会有包冲突等问题。
 +
 
 +
更多信息请参考[[pacman]]
 +
 
 +
== FAQ ==
 +
{{FAQ
 +
|question=I can not downgrade a package, because of dependencies.
 +
|answer=You can ignore dependencies when upgrading or removing with 'd'. e.g. '''pacman -Ud pkgpkgname-olderpkgver.pkg.tar.gz''' but this might break your system further.}}
 +
 
 +
{{FAQ
 +
|question=How do I stop Pacman from upgrading downgraded packages?
 +
|answer={{Ic|<nowiki>IgnorePkg = package1 package2</nowiki>}} in your {{Ic|pacman.conf}} will instructs Pacman to ignore any upgrades for selected packages when performing a --sysupgrade.}}
 +
 
 +
{{FAQ
 +
|question=I want to go back to how my system was yesterday.
 +
|answer=It is easy if you have enabled periodic snapshots provided by [[LVM]].}}
  
 
== 禁止Pacman升级不想升级的包 ==
 
== 禁止Pacman升级不想升级的包 ==

Revision as of 14:41, 17 September 2012

Tango-preferences-desktop-locale.png本页面需要更新翻译,内容可能已经与英文脱节。要贡献翻译,请访问简体中文翻译组Tango-preferences-desktop-locale.png

附注: please use the first argument of the template to provide more detailed indications.


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

在降级之前,好好考虑下你为什么要降级。如果是因为现有包有Bug,请花上几分钟帮忙把它报告给Arch的Bug追踪系统或软件包的项目地址。由于Arch是一个滚动发行版,你很有可能经常遇到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 -Uf pkgname-olderpkgver.pkg.tar.gz

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

注意: 如果你改变了操作系统的一个基本的组件包,你也许需要降级许多包。Or they may just be gone and you will have to put them back in a manual, piece-meal fashion, while being careful that a particular upgrade does not want to re-install the undesirable package version you did not want in the first place.

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

另一个更强大的工具是downgraderAUR,它可以处理 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文件,然后修改相应的内容(通常是版本号)。或者访问 http://www.archlinux.org/packages/ 搜索你需要的降级的软件包,然后点 "View SVN entries" 链接,选择“View Log“。找到你需要的版本然后点击路径。然后下载相应的文件再用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

This alone does not guarantee a seamless rollback as there are sometimes package conflicts with regards to version numbers, etc. If you know the repository it may be easier to visit the global mirror, e.g http://arm.konnichi.com/core/os/i686, note the omission of the date. 仅仅这样并不能保证无缝的回溯,因为有时候相对于版本号会有包冲突等问题。

更多信息请参考pacman

FAQ

Template:FAQ

Template:FAQ

Template:FAQ

禁止Pacman升级不想升级的包

  • 问: 我怎么才能禁止Pacman升级那些我需要保持低版本的包呢?
  • 答: 修改/etc/pacman.conf中的'IgnorePkg' 变量值。

/etc/pacman.conf中,有一行是'IgnorePkg = 第一个包 第二个包 ……',他的作用就是在执行全系统升级的时候,跳过某些包。

恢复到指定日期的状态

  • 问: 我想恢复到我昨天的状态。
  • 答: 你可以通过启用快照很容易的达到该目的。

你可以通过创建一个逻辑分卷管理器(LVM)来创建和维护你的快照。不要和CVS版本控制系统中的快照搞混了。LVM快照是一种内核级别的文件系统快照,和全系统备份所不同的是,通过试用COW (copy-on-write)模式,即便是文件被修改了,快照也只需要占用比实际大家稍大一点的空间用来保存修改前的文件。换句话说,由于pacman -Sy只会修改远远小于2GB的数据,所以快照只需2GB的空闲空间就可以保存35GB的系统快照。 如果你系统的状态在升级后不正常了,你就可以迅速的通过回滚到前一个系统快照镜像。

参考资料

  • 参考Arch Build System 以了解更多相关信息
  • 参考LVM2 以了解如何启用LVM快照并恢复指定状态。