恢复Pacman的本地数据库 (简体中文)

From ArchWiki

Jump to: navigation, search


i18n
English
简体中文
Español

Contents

如何恢复Pacman的本地数据库

介绍

pacman出了问题。'Pacman -Q'没有结果,'pacman -Syu'告诉你系统已经是最新的了,但你知道并不是这样的。 当你试图用'pacman -S package'安装一个包,你会得到一个依赖性列表的提示,即使你知道其实它们已经安装了的。

这个问题是因为pacman存放在'/var/lib/pacman/local'的已安装软件数据库被破坏或者删除了。这是个很严重的问题,不过幸好你可以通过下列步骤来恢复'/var/lib/pacman/local'。

声明

在你开始前,我得说明一下,虽然这些步骤对我有效,但并不一定对你有效。事实上,你的系统可能永远都无法变得和以前一样。

请自行承担风险!

命令

以下这行表示在终端以非root的用户'me'身份键入命令。

[me@linuxbox]$ ls

以下这行表示在终端以root的用户身份键入命令。

[root@linuxbox]# ls

下面的大部分步骤都假设你可以获得系统的root权限。

步骤

  • 首先,你得确定你有pacman的日志文件。
[me@linuxbox]$ ls /var/log/pacman.log
/var/log/pacman.log

如果你的pacman日志文件不存在,那就没必要继续了。你唯一的选择就是从零开始重装系统。

好的,你的'/var/log/pacman.log'还在,接下来你要干什么?

  • 创建'pkglist.sh'文件。
[root@linuxbox]# touch pkglist.sh
  • 复制黏贴下面的内容到你的'pkglist.sh'文件中。
#!/bin/bash
#
SEDEXP='s/^\[[^ ]* *[0-9][0-9]:[0-9][0-9]\] \([^ ]*\) *\([^ ]*\) .*/\1 \2/'
GRPEXP='(upgraded)|(installed)'
AWKEXP='{print $2}'
#
sed -e "$SEDEXP" /var/log/pacman.log | grep -E "$GRPEXP" | awk "$AWKEXP" | sort -u
# End

感谢'rdt' http://bbs.archlinux.org/viewtopic.php?id=38531

保存退出。

  • 设置'pkglist.sh'为可执行。
[root@linuxbox]# chmod 744 pkglist.sh
  • 运行'pklglist.sh'用管道输出到'pkglist'。
[root@linuxbox]# ./pkglist.sh > pkglist
  • 现在'pkglist'包含了你所有安装和升级过的软件的列表。编辑'pkglist'删除掉所有你不想重新安装的东西。之所以这样做是因为也许某些包你是需要通过例如'abs'什么的来定制安装的。
[root@linuxbox]# vi pkglist
  • 一旦你对'pkglist'里的内容觉得满意了,你可以就用它来重装软件,恢复'/var/lib/pacman/local'。

没有必要检查依赖性,而且因为文件已存在,所以你必须用'强制'安装。

[root@linuxbox]# pacman -Sdf `cat pkglist`

Pacman会提示一长串需要安装的软件列表,回答'是'然后等pacman运行完毕。

  • 最后,你需要查找所有被变更了的配置文件。通过下面命令先更新'locate'数据库。
[root@linuxbox]# updatedb
  • 然后就可以查找所有变更过的配置文件。
[root@linuxbox]# locate pacorig

这会给你列出所有被替换的配置文件。你的原始文件会加上'.pacorig'后缀。对每个受影响的软件,删除掉新配置文件,把'.pacorig'文件更名恢复回原始文件。某些目录权限也可能被改变了,如果还有程序不能运行的话可能要检查一下。

祝贺你,你已经成功恢复你的pacman本地数据库了。


Ian K Armstrong

The Island of Bornholm, Denmark.

ika@{REMOVE_THIS}openmail.cc

Personal tools