Gentoo Linux: /var/db/pkg 这个文件夹很重要![转]推荐阅读
來自 http://www.aiview.com/2008/03/gentoo_linux_deleted_var_db_pkg.html
前段時(shí)間折騰tmpfs 文件系統(tǒng),不小心弄丟了/var/db/pkg 下面所有的文件,在查資料的過程中,才了解這個(gè)文件夾的重要。
這個(gè)文件夾對于Gentoo 的作用,相當(dāng)于Windows 應(yīng)用程序的Uninstall 文件,所有通過Portage 安裝的程序包信息都保存在這,每個(gè)程序包包含哪些文件,以及文件的路徑信息是最重要的,缺少這些信息,將無法正常的卸載程序包,其他一些重要的信息丟失也 導(dǎo)致Portage 系統(tǒng)混亂。
這個(gè)文件夾丟失,雖然系統(tǒng)中的應(yīng)用程序可以照常運(yùn)行,但卻是最大的災(zāi)難,除非不再打算通過Portage 對包進(jìn)行任何維護(hù)工作,比如升級,安裝新的軟件等。解決方法只有一個(gè):重新merge 所有軟件包,重新生成這部分信息。一般來說,系統(tǒng)中軟件包的規(guī)模在幾百,甚至上千個(gè),里面還有一些重磅角色,全部重新編譯一遍,可能需要幾十個(gè)小時(shí) (OpenOffice 在我的T43 上花去10個(gè)小時(shí)進(jìn)行編譯)。
文件夾丟失后,我最初找到了這個(gè)討論(en),參考hielvc 寫的腳本, 希望通過讀取/var/log/emerge.log 恢復(fù)丟失的信息,但這個(gè)方法只能恢復(fù)出系統(tǒng)中所有已安裝軟件包名稱和版本信息,無法找回已安裝文件的列表,能不能通過某個(gè)Gentoo 工具得到每個(gè)軟件包默認(rèn)的文件列表呢,答案應(yīng)該是不可以,因?yàn)镚entoo 是一個(gè)定制性的系統(tǒng),大部分文件都是編譯后生成的,并沒有一個(gè)默認(rèn)的庫能夠告訴這些文件的具體信息。換句話說,我的/var/db/pkg 是唯一的,如果沒有備份,只能重新編譯一遍系統(tǒng)來生成它們,下面這個(gè)討論中,didymos很清楚的解釋了這個(gè)問題,也證實(shí)了我的想法:PANIC! I deleted /var/db/pkg
所幸,在把我的/var/db/pkg 放入內(nèi)存之前,我留下一個(gè)備份,但隨后,我merge了約50個(gè)軟件包,這些信息被寫入內(nèi)存中的/var/db/pkg ,隨后就在一次重啟后徹底丟失了。
在具有備份的情況下,我使用以下步驟重建了/var/db/pkg,時(shí)間成本主要花費(fèi)在重新merge 約50個(gè)軟件包。
步驟恢復(fù)備份的/var/db/pkg 文件夾
恢復(fù)之后,/var/db/pkg 代表了merge 50個(gè)包之前我的系統(tǒng)的狀況,但我的系統(tǒng)實(shí)際多出了一些包,或者一些已存在包的升級。 ?
找出/var/db/pkg 與實(shí)際系統(tǒng)的不一致
前面提到的hielvc 寫的腳本可以派上用場,但hielvc 忽略了一些情況(emerge -> unmerge -> emerge again),結(jié)果可能并不準(zhǔn)確,我重寫了一個(gè)腳本rebuildpkgdb,用法:
# ./rebuildpkgdb -pThis is a dry-run, Nothing really changed.Done! Please check package.lst
這將得到系統(tǒng)中實(shí)際安裝的所有包列表(包含版本),再使用下面命令獲取/var/db/pkg 記錄的列表。
# ?find /var/db/pkg/ -type d |cut -d/ -f 5- |awk -F/ 'NF > 1' |sort > package.db
然后比較兩個(gè)文件,找到以下包:
存在于package.lst,但不存在于package.db
存在于package.db,但不存在于package.lst
都存在,但版本不同(取 package.lst)
對于第一種情況,是因?yàn)槲以?var/db/pkg 丟失之后,unmerge 了一些包,雖然emerge.log 顯示unmerge 成功,但因?yàn)閬G失/var/db/pkg,實(shí)際文件并沒有從文件系統(tǒng)真正刪除。
而后兩種情況是我備份/var/db/pkg 之后,丟失的信息。
因此對于上面三種情況,都執(zhí)行一次merge 即可。
remerge
將上個(gè)步驟取得的包列表格式化成類似下面的命令,重新merge一遍,這個(gè)過程將重建正確的/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]檢查系統(tǒng)
列出那些在/usr/lib/portage/world,但不在/var/db/pkg 中的軟件包:
# emaint --check world
如果上面命令找到了任何包,那么應(yīng)該先merge 它們,如果事實(shí)不需要它們,再進(jìn)行unmerge ,這樣可以保證world, /var/db/pkg/, 以及文件系統(tǒng)三者的一致性。
revdep-rebuild
最后執(zhí)行revdep-rebuild 查找系統(tǒng)中的任何共享庫以及依賴關(guān)系的缺失,如果需要,會自動merge 需要的軟件包。這個(gè)命令可能需要運(yùn)行多次,直到?jīng)]有任何問題發(fā)現(xiàn)為止。
# revdep-rebuild如果沒有/var/db/pkg 備份
這是個(gè)很不幸的狀況,如果真正希望world, /var/db/pkg/, 以及文件系統(tǒng)這三者具有一致性,那么似乎沒有別的選擇,找個(gè)空閑時(shí)間依次執(zhí)行下面的命令,來重建/var/db/pkg ?
# emaint --check world# emerge -e system# emerge -e world# revdep-rebuild
這個(gè)過程可能很漫長,視機(jī)器的速度,如果有其他Gentoo 系統(tǒng)可以利用,那么可以嘗試分布式編譯來節(jié)省時(shí)間。
延展閱讀
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?
轉(zhuǎn)載于:https://blog.51cto.com/axlrose/1287450
總結(jié)
以上是生活随笔為你收集整理的Gentoo Linux: /var/db/pkg 这个文件夹很重要![转]推荐阅读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件架构设计的三个维度,软件架构师需要知
- 下一篇: 一款世界上最快的固态硬盘