前段时间折腾tmpfs 文件系统,不小心弄丢了/var/db/pkg 下面所有的文件,在查资料的过程中,才了解这个文件夹的重要。

这个文件夹对于Gentoo 的作用,相当于Windows 应用程序的Uninstall 文件,所有通过Portage 安装的程序包信息都保存在这,每个程序包包含哪些文件,以及文件的路径信息是最重要的,缺少这些信息,将无法正常的卸载程序包,其他一些重要的信息丢失也导致Portage 系统混乱。

这个文件夹丢失,虽然系统中的应用程序可以照常运行,但却是最大的灾难,除非不再打算通过Portage 对包进行任何维护工作,比如升级,安装新的软件等。解决方法只有一个:重新merge 所有软件包,重新生成这部分信息。一般来说,系统中软件包的规模在几百,甚至上千个,里面还有一些重磅角色,全部重新编译一遍,可能需要几十个小时(OpenOffice 在我的T43 上花去10个小时进行编译)。

文件夹丢失后,我最初找到了这个讨论(en),参考hielvc 写的脚本,希望通过读取/var/log/emerge.log 恢复丢失的信息,但这个方法只能恢复出系统中所有已安装软件包名称和版本信息,无法找回已安装文件的列表,能不能通过某个Gentoo 工具得到每个软件包默认的文件列表呢,答案应该是不可以,因为Gentoo 是一个定制性的系统,大部分文件都是编译后生成的,并没有一个默认的库能够告诉这些文件的具体信息。换句话说,我的/var/db/pkg 是唯一的,如果没有备份,只能重新编译一遍系统来生成它们,下面这个讨论中,didymos很清楚的解释了这个问题,也证实了我的想法:PANIC! I deleted /var/db/pkg

所幸,在把我的/var/db/pkg 放入内存之前,我留下一个备份,但随后,我merge了约50个软件包,这些信息被写入内存中的/var/db/pkg ,随后就在一次重启后彻底丢失了。

在具有备份的情况下,我使用以下步骤重建了/var/db/pkg,时间成本主要花费在重新merge 约50个软件包。

步骤

恢复备份的/var/db/pkg 文件夹

恢复之后,/var/db/pkg 代表了merge 50个包之前我的系统的状况,但我的系统实际多出了一些包,或者一些已存在包的升级。

找出/var/db/pkg 与实际系统的不一致

前面提到的hielvc 写的脚本可以派上用场,但hielvc 忽略了一些情况(emerge -> unmerge -> emerge again),结果可能并不准确,我重写了一个脚本rebuildpkgdb,用法:

# ./rebuildpkgdb -p
This is a dry-run, Nothing really changed.
Done! Please check package.lst

这将得到系统中实际安装的所有包列表(包含版本),再使用下面命令获取/var/db/pkg 记录的列表。

#  find /var/db/pkg/ -type d |cut -d/ -f 5- |awk -F/ 'NF > 1' |sort > package.db

然后比较两个文件,找到以下包:

  1. 存在于package.lst,但不存在于package.db
  2. 存在于package.db,但不存在于package.lst
  3. 都存在,但版本不同(取 package.lst)

对于第一种情况,是因为我在/var/db/pkg 丢失之后,unmerge 了一些包,虽然emerge.log 显示unmerge 成功,但因为丢失/var/db/pkg,实际文件并没有从文件系统真正删除。

而后两种情况是我备份/var/db/pkg 之后,丢失的信息。

因此对于上面三种情况,都执行一次merge 即可。

remerge

将上个步骤取得的包列表格式化成类似下面的命令,重新merge一遍,这个过程将重建正确的/var/db/pkg。

# sudo emerge -av =app-admin/eselect-ctags-1.3 =app-admin/eselect-wxwidgets-0.8 =app-admin/sudo-1.6.9_p14 =app-editors/emacs-22.1-r3 ...
These are the packages that would be merged, in order:
Calculating dependencies... done!
[ebuild  N    ] sys-fs/mtools-3.9.10  USE="X" 0 kB 
[ebuild     U ] kde-base/kpdf-3.5.9 [3.5.8] USE="xinerama -arts -debug -kdeenablefinal" 0 kB 
[ebuild     U ] kde-misc/krusader-1.80.0-r1 [1.80.0] USE="xinerama -arts -debug -javascript -kde" 0 kB 
[ebuild  N    ] sys-boot/syslinux-3.52  0 kB  
...
Total: 49 packages (42 upgrades, 6 new, 1 in new slot), Size of downloads: 3 kB
Would you like to merge these packages? [Yes/No] 
检查系统

列出那些在/usr/lib/portage/world,但不在/var/db/pkg 中的软件包:

# emaint --check world 

如果上面命令找到了任何包,那么应该先merge 它们,如果事实不需要它们,再进行unmerge ,这样可以保证world, /var/db/pkg/, 以及文件系统三者的一致性。

revdep-rebuild

最后执行revdep-rebuild 查找系统中的任何共享库以及依赖关系的缺失,如果需要,会自动merge 需要的软件包。这个命令可能需要运行多次,直到没有任何问题发现为止。

# revdep-rebuild 

如果没有/var/db/pkg 备份

这是个很不幸的状况,如果真正希望world, /var/db/pkg/, 以及文件系统这三者具有一致性,那么似乎没有别的选择,找个空闲时间依次执行下面的命令,来重建/var/db/pkg

# emaint --check world
# emerge -e system
# emerge -e world
# revdep-rebuild 

这个过程可能很漫长,视机器的速度,如果有其他Gentoo 系统可以利用,那么可以尝试分布式编译来节省时间。 

延展阅读

Post a comment

mail.png


相似文章|Related Entries

最近更新|Recent Entries

不定期更新|Handy Entries

相似标签|Related Tags

gentoo
3d (1)
chinese (2)
conf (1)
db2 (2)
driver (2)
emerge (0)
environment (1)
fingerprint reader (1)
Fn (1)
fonts (1)
hdaps (1)
java (1)
jdk (1)
kernel configuration (1)
linux (20)
locale (1)
picasa (1)
portage (0)
ramdisk (2)
rebuildpkgdb (1)
soundcard (0)
subversion (2)
svn (1)
t43 (12)
thinkpad (12)
tmpfs (1)
wine (1)
wireless (1)
x300 (1)
中文 (1)
指纹 (1)
软件 (1)
linux
3d (1)
chinese (2)
conf (1)
db2 (2)
driver (2)
emerge (0)
environment (1)
fingerprint reader (1)
Fn (1)
font (1)
fonts (1)
gentoo (18)
Gentoo (1)
hdaps (1)
java (1)
jdk (1)
kernel configuration (1)
locale (1)
picasa (1)
portage (0)
ramdisk (2)
rebuildpkgdb (1)
soundcard (0)
subversion (2)
svn (1)
t43 (12)
thinkpad (12)
tmpfs (1)
wine (1)
winxp (4)
wireless (1)
x300 (1)
中文 (1)
指纹 (1)
软件 (1)
rebuildpkgdb
gentoo (18)
linux (20)

分类栏目|Categories

按月归档|By Month

2008
04
03
02
01
2007
12
10
07
06
05
04
03
02
01
2006
12
11
10
09
08
07
06
05
04
03
02
01
2005
11
10
09
08
07
04
03
2004
12
11
10
09
08
07
06
05
04
03
02
01
2003
12
10
09
08
06
2002
09
08
04
03
02
2001
12
09
07
06
05

站内链接|Site Links

Powered by
Movable Type 3.34