分类: BSD
2009-04-12 18:23:03
FreeBSD 4.X、5.X、6.X 常見問答集 | ||
---|---|---|
20.1. 如何只抓取 tarball?
如果只希望抓取 tarball 下來的話,僅需打下面指令即可:
# make fetch如果是要抓取單一的 port,以 為例的話,則:
# cd /usr/ports/editors/joe
# make fetch
那麼,預設會將 的 tarball 下載至 /usr/ports/distfiles 目錄下。
如果是希望抓取安裝此 ports 所有相關相依 ports 的 tarball,以 為例的話,則:
# 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 原始碼的時候,會很常用到這個功能。以 為例的話,則:
# cd /usr/ports/editors/joe
# make extract
那麼就會將 tarball解開至 /usr/ports/editors/joe/work 目錄下。
20.3. 如何僅做到解開 tarball 並補上官方提供的 patch ?
此法與上面方式有一些類似,不同於是先補上官方提供的 patch ,再行 patch 自己的修正。有時候習慣自己 patch 原始碼的時候,會很常用到這個功能。 以 為例的話,則:
# cd /usr/ports/editors/joe
# make patch
那麼就會將 tarball解開至 /usr/ports/editors/joe/work 目錄下 ,並補上官方提供的 patch。
20.4. 如何安裝一個新的 port?
如果系統上未安裝此軟體,則可以選擇安裝一個新的 port。 以 為例的話,則:
# cd /usr/ports/editors/joe
# make install
如此會在系統上安裝一個新的 joe 軟體。 如果需要在安裝完成後,也一併清除編輯時期所留下來的暫存目錄,則可配合 make clean 方法一起使用,如:
# cd /usr/ports/editors/joe
# make clean
20.5. 如何安裝一個新的 port,並打包(package)起來?
將安裝完成的軟體打包起來,有許多便利性:包括在叢集系統中,可供其它機器使用, 或將未來此軟體出問題可重新利用此 package 重新快速安裝。 以 為例的話,則:
# 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 也打包起來?
因為上面剛說的 方式只有打包單一套件, 中間依賴的 ports 並沒有一起打包,這會出現一個常遇到的問題: 就是如果一個 port 需要依賴其它的 ports,那麼必須將其它 ports 也一起打包,否則安裝 packages 會有相依的問題。 以 為例:
# cd /usr/ports/sysutils/portupgrade
# make DEPENDS_TARGET=package package
如此一來,就會對所有 portupgrade 所相依賴的 ports 都一併打包,也包括自己本身。
20.7. 如何對一個已經安裝的 port 打包?
如果安裝好一個套軟,事前並未打包,事後想打包的話, 以 為例:
# cd /var/db/pkg
# pkg_create -b joe-{版本號}
如此一來,就會將已安裝的 port 打包起來,放在 /var/db/pkg 目錄下。
20.8. 如何清理 ports 編輯期間所產生的暫存資料?
在安裝 port 的時候,通常會有編譯期間所需要的工作目錄(work),因此通常安裝好一個套件後,會清除此暫存目錄,以節省硬碟空間。 以 為例:
# cd /usr/ports/editors/joe
# make clean
而如果是希望清除所有 ports 的暫存目錄,則:
# cd /usr/ports
# make clean
而如果是希望清除所有 ftp 分類的暫存目錄,則:
# cd /usr/ports/ftp
# make clean
20.9. 如何清理 ports 編輯期間所產生的暫存資料,以及 tarball 檔?
上面所講的 僅只是清除編輯期間所需要的工作目錄(work),並沒有將編譯 ports 時一併下載的 tarball 刪除(相對應之 tarball 預設會存放在 /usr/ports/distfiles) 如果打算把 tarball 也一併清除的話,以 為例:
# 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 前,可以查詢所需依賴/相關的套件。 以 為例:
# 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?
以 為例:
# cd /usr/ports/editors/joe
# make deinstall
或是使用 pkg_delete:
# pkg_delete joe-{version}
有時候套件之間的相依性會導致無法直接移除,如果要強制移除的話,則:
# pkg_delete -f joe-{version}
但請注意:很有可能會導致其它相依到這軟體的套件執行起來出現問題。
20.12. 如何一併移除所相依的 ports?
以 為例:
# cd /usr/ports/sysutils/portupgrade
# make deinstall-depends
執行此步驟前,請注意是否會移除其他套件也有共同相依的部分。建議先參考 上面所講的 的方法來檢查。
# pkg_delete joe-{version}
或者建議用:pkg_delete,這樣若仍有相依該套件的話,會先警告而不會移除。 除非有另外加了 -f 參數來強制移除...。
# pkg_delete -r joe-{version}
20.13. 如何重新安裝已安裝過的 ports?
重新安裝的前提是:之前有安裝過或目前已安裝。以 為例:
# 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。以 為例:
# 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. 如何查詢某個套件安裝了哪些檔案?
如果想查詢目前系統所安裝的 包含了哪些檔案,則:
# pkg_info -L /var/db/pkg/joe-{version}
20.20. 如何安裝舊版的 ports?
有時候會因為相依性,或是新版有問題,而會想裝舊版本的套件。 這裡介紹的方法是利用 CVS 的好處,回歸到以前舊版本存在的日子,以安裝舊版本的套件。
首先,若我們要回復到某一個套件的版本時,需要去查詢 FreeBSD ports CVS repository。 最常見的就是 網站、 FreeBSD 的 或是 FreeBSD 。
查到該套件版本所依存的日子後,就修改 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 中的一支,則:
# vi /usr/share/examples/cvsup/ports-supfile
#ports-all #將 ports-all 標示起來
ports-lang #加入這行
最後,執行 CVSup 或 csup ,並安裝即可。目前若希望單獨回溯單一的 port,則比較麻煩。
感謝 | Bibliography |
This, and other documents, can be downloaded from .
For questions about FreeBSD, read the documentation before contacting <>.
For questions about this documentation, e-mail <>.