portupgrade 可能出現的問題和解決方法
第一個問題是:當執行 portupgrade 時出現 /var/db/pkg/pkgdb.db: unexpected file type or format — Invalid argument 的訊息時,該怎麼辦?
這個問題常常出現,通常是發生在你很久沒執行 portupgrade,而 port tree 當中可能有其中一項軟件需要某個版本的相依組件,但是這個組件 portupgrade 卻把它擺在升級清單的後頭,還沒輪到它。這時候如果該軟件的 make file 沒寫好時,portupgrade 可能會被中斷,此時 /var/db/pkg/pkgdb.db 會不正常關閉,因此檔案會毀損。
因此,如果你此時下達 portupgrade 指令時,就會出現:/var/db/pkg/pkgdb.db: unexpected file type or format — Invalid argument 的訊息,而且好像 portupgrade 從此就無法正常工作。情況並沒有如此糟糕,這時你只需先把 /var/db/pkg/pkgdb.db 砍掉,然後重新建立一個讓 portupgrade 使用即可:
home/your-id> rm /var/db/pkg/pkgdb.db
home/your-id> pkgdb -fu
千萬要記得,這件工作和執行 portupgrade 一樣,需要有 root 的權限才能執行。這時候你可以開始重新執行一次 portupgrade -a (使用-a 參數,就是把所有的軟件全部升級一次),雖然一開始會出現一些錯誤訊息,但是它立刻會將你的 /var/db/pkg/pkgdb.db 修正成新而正確的版本,然後就一切 ok。
第二個問題是:有時你執行 portupgrade -a 時,會遇到程序自動 skip 掉一些軟件這時候該怎麼辦?這時候你不用太過擔心,當你看到升級結果有些程序的升級被 skip 掉,那麼只要記得重新再執行 portupgrade -a 一次,如果還是有軟件被跳過,再執行一次,如此一直到所有軟件全部被升級完成為止。會碰到這種狀況和前面的情況其實是類似的,也是因為相依組件尚未執行升級而跳過,只是 make file 有寫好,暫時跳過。
再補充一件事。portupgrade 有一個 -l 的參數,請你一定要善用它。使用的方法是在 -l 參數後加上一個檔名,比如說你下達這個指令時:
home/your-id> portupgrade -a -l ~/aaa
這時候,portupgrade 會將你的所有已安裝的套件有新版本的全部升級,然後把結果列一個清單存在你的家目錄中的 aaa 這個檔案中。這個檔案裡會有你所有已安裝套件的清單,清單會列出目前升級後的版本,此外還會在清單中每項套件前列有 +/-/! 這三種符號之一。「+」號代表該套件在這次升級中被升級了;「-」號代表此次保持原版本,並沒有新版本可供升級;「!」則是代表該套件在這次執行 portupgrade 時跳過了,這時你最好如我上一段所說的,再次執行 portupgrade -a 一次。
最後,也是最重要的。雖然 Unix 高手們喜歡用 cron 和 at 來把工作自動化,但是執行 portupgrade 最好還是手動。原因就是因為 portupgrade 常因 make file 沒寫好而出現一些例外狀況,如果你放心地交給 cron 去完成,很有可能很長一段時間你的套件都不會更新,直到你驚覺為止。
查看當前包的壯態。
安裝 ports-mgmt/portaudit,它能夠自動地檢查已經安裝的應用程序的漏洞; 此外,在您安裝程序之前它也會首先檢查是否存在已知的漏洞。 另外, 您也可以使用 portaudit -F -a 這個命令在安裝了某個軟件包之後作出檢查。
要刪除先前安裝的軟件package,只要使用pkg_delete(1) 工具。
# pkg_delete xchat-1.7.1
需要注意的是, pkg_delete(1) 需要提供完整的包名; 如果您只是指定了類似 xchat 而不是 xchat-1.7.1 這樣的名字, 則它將拒絕執行操作。不過, 您可以使用 pkg_version(1) 來了解安裝的 package 的版本。 除此之外, 也可以使用通配符:
# pkg_delete xchat\*
這時, 所有名字以 xchat 開頭的 package 都會被刪掉。
軟件包的管理
pkg_info(1) 是用於列出已安裝的所有軟件包列表和描述的程序。
# pkg_info
cvsup-16.1 A general network file distribution system optimized for CV
docbook-1.2 Meta-port for the different versions of the DocBook DTD
...
pkg_version(1)是一個用來統計所有安裝的軟件包版本的工具。它可以用來比較本地 package 的版本與 ports 目錄中的當前版本是否一致。
# pkg_version
cvsup =
docbook =
...
在第二列的符號指出了安裝版本的相關時間和本地ports目錄樹中可用的版本。
符號 含義
= 在本地ports樹中與已安裝的軟件包版本相匹配。
< 已安裝的版本要比在ports樹中的版本舊。
> 已安裝的版本要比在ports樹中的版本新 (本地的port樹可能沒有更新)。
? 已安裝的軟件包無法在ports索引中找到。 (可能發生這種事情,舉個例子, 您早先安裝的一個 port 從 port 樹中移出或改名了)
* 軟件包有很多版本。
所有已安裝的 package 信息都保存在 /var/db/pkg 目錄下。安裝文件的列表和每個 package 的內容和描述都能在這個目錄的相關文件中找到。