Chapter 20 Ports and Packages 常見問題

Yi-Feng Tzeng
20.1. 如何只抓取 tarball?
20.2. 如何僅做到解開 tarball的步驟?
20.3. 如何僅做到解開 tarball 並補上官方提供的 patch ?
20.4. 如何安裝一個新的 port?
20.5. 如何安裝一個新的 port,並打包(package)起來?
20.6. 如何打包一個 port,並將其所有相依的 ports 也打包起來?
20.7. 如何對一個已經安裝的 port 打包?
20.8. 如何清理 ports 編輯期間所產生的暫存資料?
20.9. 如何清理 ports 編輯期間所產生的暫存資料,以及 tarball 檔?
20.10. 如何在安裝 ports 前查詢所依賴的相關套件?
20.11. 如何移除已安裝的 ports?
20.12. 如何一併移除所相依的 ports?
20.13. 如何重新安裝已安裝過的 ports?
20.14. 如何以關鍵字搜尋所要找的 ports?
20.15. 如何升級已安裝的 ports?
20.16. 如何查詢目前系統安裝了哪些套件?
20.17. 如何查詢目前系統有沒有安裝這個關鍵字的套件?
20.18. 如何查詢某個檔案是屬於哪些套件?
20.19. 如何查詢某個套件安裝了哪些檔案?
20.20. 如何安裝舊版的 ports?

20.1. 如何只抓取 tarball?

如果只希望抓取 tarball 下來的話,僅需打下面指令即可:

# make fetch
如果是要抓取單一的 port,以 editors/joe 為例的話,則:

# cd /usr/ports/editors/joe
# make fetch

那麼,預設會將 editors/joe 的 tarball 下載至 /usr/ports/distfiles 目錄下。

如果是希望抓取安裝此 ports 所有相關相依 ports 的 tarball,以 systuils/portupgrade 為例的話,則:

# cd /usr/ports/systuils/portupgrade
# make fetch-recursive

預設會將此 port 與所有需要的其他 port 的 tarball,都下載至 /usr/ports/distfiles 目錄下。

如果是希望抓取 ftp 分類下所有 ports 的 tarball ,則:

# cd /usr/ports/ftp
# make fetch-recursive

則會所將 ftp 分類下所有 ports 的 tarball 都下載至 /usr/ports/distfiles 目錄下。

20.2. 如何僅做到解開 tarball的步驟?

有時候習慣自己 patch 原始碼的時候,會很常用到這個功能。以 editors/joe 為例的話,則:

# cd /usr/ports/editors/joe
# make extract

那麼就會將 tarball解開至 /usr/ports/editors/joe/work 目錄下。

20.3. 如何僅做到解開 tarball 並補上官方提供的 patch ?

此法與上面方式有一些類似,不同於是先補上官方提供的 patch ,再行 patch 自己的修正。有時候習慣自己 patch 原始碼的時候,會很常用到這個功能。 以 editors/joe 為例的話,則:

# cd /usr/ports/editors/joe
# make patch

那麼就會將 tarball解開至 /usr/ports/editors/joe/work 目錄下 ,並補上官方提供的 patch。

20.4. 如何安裝一個新的 port?

如果系統上未安裝此軟體,則可以選擇安裝一個新的 port。 以 editors/joe 為例的話,則:

# cd /usr/ports/editors/joe
# make install

如此會在系統上安裝一個新的 joe 軟體。 如果需要在安裝完成後,也一併清除編輯時期所留下來的暫存目錄,則可配合 make clean 方法一起使用,如:

# cd /usr/ports/editors/joe
# make clean

20.5. 如何安裝一個新的 port,並打包(package)起來?

將安裝完成的軟體打包起來,有許多便利性:包括在叢集系統中,可供其它機器使用, 或將未來此軟體出問題可重新利用此 package 重新快速安裝。 以 editors/joe 為例的話,則:

# cd /usr/ports/editors/joe
# make package

如此會在系統上安裝一個新的 joe 軟體,並將此軟體打包(package)起來。 package 預設會在 /usr/ports/editors/joe 目錄下,如果希望集中管理的話,建議做如下的步驟:

# mkdir -p /usr/ports/packages/All

以後打包的 packages 都會存放在此目錄下,並且系統會自動做分類,以方便管理。 如果需要在安裝完成後,一併清除編輯時期所留下來的暫存目錄,則可加上 make clean 一起使用,比如:

# cd /usr/ports/editors/joe
# make package clean

20.6. 如何打包一個 port,並將其所有相依的 ports 也打包起來?

因為上面剛說的 make package 方式只有打包單一套件, 中間依賴的 ports 並沒有一起打包,這會出現一個常遇到的問題: 就是如果一個 port 需要依賴其它的 ports,那麼必須將其它 ports 也一起打包,否則安裝 packages 會有相依的問題。 以 sysutils/portupgrade 為例:

# cd /usr/ports/sysutils/portupgrade
# make DEPENDS_TARGET=package package

如此一來,就會對所有 portupgrade 所相依賴的 ports 都一併打包,也包括自己本身。

20.7. 如何對一個已經安裝的 port 打包?

如果安裝好一個套軟,事前並未打包,事後想打包的話, 以 editors/joe 為例:

# cd /var/db/pkg
# pkg_create -b joe-{版本號}

如此一來,就會將已安裝的 port 打包起來,放在 /var/db/pkg 目錄下。

20.8. 如何清理 ports 編輯期間所產生的暫存資料?

在安裝 port 的時候,通常會有編譯期間所需要的工作目錄(work),因此通常安裝好一個套件後,會清除此暫存目錄,以節省硬碟空間。 以 editors/joe 為例:

# cd /usr/ports/editors/joe
# make clean

而如果是希望清除所有 ports 的暫存目錄,則:

# cd /usr/ports
# make clean

而如果是希望清除所有 ftp 分類的暫存目錄,則:

# cd /usr/ports/ftp
# make clean

20.9. 如何清理 ports 編輯期間所產生的暫存資料,以及 tarball 檔?

上面所講的 make clean 僅只是清除編輯期間所需要的工作目錄(work),並沒有將編譯 ports 時一併下載的 tarball 刪除(相對應之 tarball 預設會存放在 /usr/ports/distfiles) 如果打算把 tarball 也一併清除的話,以 editors/joe 為例:

# cd /usr/ports/editors/joe
# make distclean

make distclean 的步驟包含了 make clean 的功能,也就是說除了會刪除 tarball 外,還會一併清除編譯時的暫存 work 目錄。

如果是希望清除所有 ports 的暫存 work 目錄及 tarball,則:

# cd /usr/ports
# make distclean

而如果是希望清除所有 ftp 分類的暫存目錄以及 tarball,則:

# cd /usr/ports/ftp
# make distclean

20.10. 如何在安裝 ports 前查詢所依賴的相關套件?

在安裝 ports 前,可以查詢所需依賴/相關的套件。 以 mail/p5-Mail-SpamAssassin 為例:

# cd /usr/ports/mail/p5-Mail-SpamAssassin
# make all-depends-list

make all-depends-list 顯示此套件所有相依的套件。

# cd /usr/ports/mail/p5-Mail-SpamAssassin
# make pretty-print-build-depends-list

make all-depends-list 顯示此套件在編譯期間所需要的套件。

# cd /usr/ports/mail/p5-Mail-SpamAssassin
# make pretty-print-run-depends-list

make all-depends-list 顯示此套件要執行時所需要的套件。

20.11. 如何移除已安裝的 ports?

editors/joe 為例:

# cd /usr/ports/editors/joe
# make deinstall

或是使用 pkg_delete

# pkg_delete joe-{version}

有時候套件之間的相依性會導致無法直接移除,如果要強制移除的話,則:

# pkg_delete -f joe-{version}

但請注意:很有可能會導致其它相依到這軟體的套件執行起來出現問題。

20.12. 如何一併移除所相依的 ports?

sysutils/portupgrade 為例:

# cd /usr/ports/sysutils/portupgrade
# make deinstall-depends

執行此步驟前,請注意是否會移除其他套件也有共同相依的部分。建議先參考 上面所講的 make-depends-list 的方法來檢查。

# pkg_delete joe-{version}

或者建議用:pkg_delete,這樣若仍有相依該套件的話,會先警告而不會移除。 除非有另外加了 -f 參數來強制移除...。

# pkg_delete -r joe-{version}

20.13. 如何重新安裝已安裝過的 ports?

重新安裝的前提是:之前有安裝過或目前已安裝。以 editors/joe 為例:

# cd /usr/ports/editors/joe
# make deinstall clean install

或是

# cd /usr/ports/editors/joe
# make reinstall

或是

# portupgrade -f joe

20.14. 如何以關鍵字搜尋所要找的 ports?

如果要從全部的 ports collection 中找尋與關鍵字 "ldap" 有關的 ports,則:

# cd /usr/ports
# make search key=ldap

如果只要從與 ftp 相關的 ports 下找尋與關鍵字 "ldap" 有關的 ports,則:

# cd /usr/ports/ftp
# make search key=ldap

另外,還有另一個用法,方法只是將 key 換成 name。如果已經知道要搜尋 ports 的名稱,或只想找名稱相關的關鍵字 "ldap", 則:

# cd /usr/ports
# make search name=ldap

20.15. 如何升級已安裝的 ports?

如果已經安裝套件,事後欲升級的話,必須先移除舊版的 port。以 editors/joe 為例:

# portupgrade joe

或是

# cd /usr/ports/editors/joe
# make clean reinstall

或是

# portupgrade -f joe

20.16. 如何查詢目前系統安裝了哪些套件?

查詢目前系統已安裝的全部套件:

# pkg_info

20.17. 如何查詢目前系統有沒有安裝這個關鍵字的套件?

假設要找的關鍵字是 joe 的話:

# pkg_info | grep joe

20.18. 如何查詢某個檔案是屬於哪些套件?

如果想查詢 /usr/local/bin/joe 是屬於哪個套件的話,則:

# pkg_info -W /usr/local/bin/joe

如果沒有回傳任何資訊的話,代表著這個檔案是由 FreeBSD 內建的。

20.19. 如何查詢某個套件安裝了哪些檔案?

如果想查詢目前系統所安裝的 joe 包含了哪些檔案,則:

# pkg_info -L /var/db/pkg/joe-{version}

20.20. 如何安裝舊版的 ports?

有時候會因為相依性,或是新版有問題,而會想裝舊版本的套件。 這裡介紹的方法是利用 CVS 的好處,回歸到以前舊版本存在的日子,以安裝舊版本的套件。

首先,若我們要回復到某一個套件的版本時,需要去查詢 FreeBSD ports CVS repository。 最常見的就是 Freshports 網站、 FreeBSD 的 Mailing FreeBSD cvs 或是 FreeBSD ports cvsweb

查到該套件版本所依存的日子後,就修改 CVS tag。一般預設 ports 的 CVS tag 會寫在 /usr/share/examples/cvsup/ports-supfile ,如要回溯到 2002/10/05 號的話,則:

# vi /usr/share/examples/cvsup/ports-supfile
default date=2002.10.05.00.00.00  #將 date 改成當日

然後按照一般 CVSup 或 csup 的時候一樣,執行 CVSup 或 csup (make update),此時的 ports collections 就會回到當時的情形,那麼該套件的舊版也會出現在 ports collections 中,只要安裝即可。

如果僅是想回溯某部份的 ports,則必須加上額外的資訊,如僅希望把 lang/perl5.8 回溯, 而我們得知此屬於 lang 中的一支,則:

# vi /usr/share/examples/cvsup/ports-supfile
#ports-all #將 ports-all 標示起來
ports-lang #加入這行


最後,執行 CVSup 或 csup ,並安裝即可。目前若希望單獨回溯單一的 port,則比較麻煩。

This, and other documents, can be downloaded from ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

For questions about FreeBSD, read the documentation before contacting <questions@FreeBSD.org>.
For questions about this documentation, e-mail <doc@FreeBSD.org>.