gentoo下如何恢復包的信息

前段時間折騰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 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 系統可以利用,那麼可以嘗試分佈式編譯來節省時間。



http://www.aiview.com/2008/03/gentoo_linux_deleted_var_db_pkg.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章