Gentoo Linux: /var/db/pkg 这个文件夹很重要![转]推荐阅读
來自 http://www.aiview.com/2008/03/gentoo_linux_deleted_var_db_pkg.html
前段時間折騰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 -pThis 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
然后比較兩個文件,找到以下包:
存在于package.lst,但不存在于package.db
存在于package.db,但不存在于package.lst
都存在,但版本不同(取 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 kBWould 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 系統可以利用,那么可以嘗試分布式編譯來節省時間。
延展閱讀
Gentoo Linux文檔 -- Portage入門
Gentoo Forums :: 閱讀主題 - PANIC! I deleted /var/db/pkg
Gentoo Forums :: 閱讀主題 - deleted /var/db/pkg [solved]
HOWTO Use Portage Correctly - Gentoo Linux Wiki
GF16: Corrupt or empty world file, what do I do?
轉載于:https://blog.51cto.com/axlrose/1287450
總結
以上是生活随笔為你收集整理的Gentoo Linux: /var/db/pkg 这个文件夹很重要![转]推荐阅读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件架构设计的三个维度,软件架构师需要知
- 下一篇: 一款世界上最快的固态硬盘