恢复Pacman的本地数据库 (简体中文)
From ArchWiki
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