FreeBSD 的 Ports 系統

目錄php

什麼是 Ports 系統

簡單的講,一個 port 就是一個被移植到了 FreeBSD 上的軟件。全部這些軟件的集合,加上 FreeBSD 處理這些軟件的各類工具,就是 Ports 系統。

Ports 系統有什麼用

每個被移植到 FreeBSD 上的軟件(就是 Port),都能經過 Ports 系統中的工具方便有序的安裝,升級,卸載。並且符合 FreeBSD 系統對應用軟件施加的各類規範。免去了你處處尋找軟件,本身編譯,安裝,升級的麻煩。藉助這些 ports 維護者的努力,你也不用擔憂這些軟件與系統不兼容致使沒法安裝升級等等。

怎麼安裝 Ports 系統

有三種方法來安裝 Ports 系統:

1 安裝系統時選擇安裝 Ports 系統

這是最簡單的方法,可是也有缺點。由於 Ports 系統老是隨時更新的。所以你從安裝光盤上安裝的 Ports 系統確定不是最新的了。

2 使用 portsnap 安裝/同步 ports 系統

這是推薦的方法。使用portsnap不須要事先安裝 ports tree,而且可以在任什麼時候候恢復到已知的最新狀態(即便手工對ports tree進行了修改)。

使用 portsnap 分紅兩個步驟:下載壓縮的 portsnap 快照,和更新現有系統。下載或更新 portsnap 快照的方法是 portsnap fetch;首次安裝,或但願將 ports tree 恢復到快照的樣子,應使用 portsnap extract;以後更新系統中的 ports tree,則能夠經過 portsnap update 來完成。對於服務器而言,推薦在 crontab 中增長在天天3點執行 portsnap cron,以減小使用時所須要的下載時間。

首次下載 portsnap 快照時,須要下載一個大約50MB的快照基礎文件。在中國大陸,因爲網絡情況的緣由,這可能須要較長時間。能夠考慮用 portsnap fetch -s portsnap.cn.freebsd.org 作首次下載;以後的下載,仍是推薦使用正常的 portsnap fetch。

可使用下面步驟完成上述狀況

1.首先設置一個比較快的portsnap服務器,若是系統默認的地址你的訪問速度也很快,能夠不修改

#vi /etc/portsnap.conf

設置SERVERNAME=portsnap.cn.freebsd.org ,你能夠設置相對你速度快點的服務器的地址

2.執行下面命令

 #portsnap fetch extract    這裏直接下載ports而且解壓

這樣就完成了下載ports系統以及解壓到/usr下面了

3.設置最快的ports鏡像

用ports安裝軟件的時候,若是沒有設置相對於你來講最快的ports服務器地址,那就會默認的 <A class=urlextern title=ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/ href="ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/" rel=nofollow>ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/,這個地址對於不少地方來講是很慢的。

修改 /etc/make.conf 加入如下代碼

MASTER_SITE_OVERRIDE=\
ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}\
ftp://ftp.tw.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}

若是你有最快的地址,能夠加到上面去,下載就會塊了

3 使用 csup/cvsup 安裝/同步 Ports 系統

這種方法已經再也不推薦使用。

無論事先你有沒有安裝 Ports 系統,你均可以使用 csup/cvsup (推薦使用 csup,這是基本系統中本身帶的)來安裝/同步最新的 Ports 系統。把 /usr/share/examples/cvsup/ports-supfile 拷貝到一個地方(好比 /home/user/tmp/ports-supfile),而後做適當的修改(好比修改要鏈接的服務器)。最後使用以下命令來安裝/同步:

csup -L 2 /home/user/tmp/ports-supfile

Ports 樹的目錄結構

假設你的 ports 樹安裝在默認位置 /usr/ports。

文件:

usrportsCHANGES usrportsCOPYRIGHT usrportsGIDs usrportsINDEX-xxx usrportsKNOBS usrportsLEGAL usrportsMOVED usrportsMakefile usrportsREADMEusrportsUIDs usrportsUPDATING

目錄:

usrportsMk usrportsTemplates usrportsTools vardbports vardbpkg

除開以上文件和目錄,其餘全部的目錄都是 ports。一個 port 的目錄結構:

/usr/ports/分類/名稱

好比 firefox 被分類在 www。所以 firefox 在 ports 樹中的位置就是:

/usr/ports/www/firefox

使用 Ports 系統

1 查詢

好比,你想知道 ports 中是否有 pidgin 這個軟件,那麼能夠這樣:

 usrports search =pidgin

一樣也可使用

 usrports search =pidgin

用上面兩種方法查詢時,顯示的信息比較詳細,包括維護者、依賴包、主頁等內容。若是隻想顯示所在的路徑和軟件名稱,則能夠用

 usrports quicksearch =php

這樣可使顯示的結果更清晰。

/usr/ports/README 中還有更多的例子能夠參考。

2 安裝

很是簡單。好比你要安裝 firefox,那麼做爲超級用戶 root:

#cd /usr/ports/www/firefox#make install clean

3 卸載

要卸載 firefox 的話:

#cd /usr/ports/www/firefox#make deinstall clean

要卸載全部安裝的ports:

#cd /var/db/pkg#pkg_delete *#reboot

4 升級

要升級 firefox:

#cd /usr/ports/www/firefox#make deinstall reinstall clean

5 定製 port

有時候,你會發現安裝某個 port 的時候會有奇怪的事情發生。好比 editors/vim,安裝的時候居然會自動安裝 glib1 和 gtk1,而明明本身的系統上已經有了 glib2 和 gtk2。

這是由於有些 port 有不少不是默認的編譯選項。這個時候你須要設定一些環境變量讓 port 知道該怎麼作。對於 editors/vim,你須要設定 WITH_GTK2 來讓 vim 依賴 gtk2 而不是 gtk1。

你能夠在 csh 下:

setenv WITH_GTK2

或者在 bash 下:

 =

也能夠把這個選項寫到 /etc/make.conf 裏面:

=

或者你也能夠指定在更新/安裝某個 port 的時候使用特定的環境變量。添加以下代碼(注:csh 的語法,不是 sh/bash)到 /etc/make.conf 裏面:

.if 
  =.endif

這樣下次升級 editors/vim 的時候就會自動依賴到 gtk2 而不是 gtk1 了。

相似的例子還包括 WITH_GECKO 環境變量。請閱讀 ports/Mk/bsd.gecko.mk 來得到詳細資料。

定製 Ports 系統

1 設定 Ports 樹的位置

當你把 Ports 樹放在非默認位置(/usr/ports)的時候,就須要修改一些環境變量讓 Ports 中的工具知道你的修改。這個變量就是 PORTSDIR。好比,你把 Ports 樹放在了 /opt/ports,那麼 在 sh/bash 中,執行以下命令:

 =optports

在 csh 中,你須要執行以下命令:

setenv PORTSDIR /opt/ports

妥貼的辦法是把這個環境變量放到超級用戶 root 的 dot.cshrc 文件(/root/.cshrc)裏面。又或者你想讓普通用戶也能用到這個環境變量,能夠考慮放到 /etc/profile 或者 /etc/csh.cshrc 裏面。

注意!若是你使用 portsnap 命令來同步 Ports 樹,而你的 Ports 樹不在默認位置,請在 /etc/portsnap.conf 中也設定你的 Ports 樹的位置。

注意!若是你使用 csup/cvsup 同步 Ports 樹,而你的 Ports 樹不在默認位置,請在你的 ports-supfile 中也設定你的 Ports 樹的位置。

2 設定 dist 文件的位置

所謂 dist 文件,就是 port 的源碼。通常狀況下,這些源碼都是用 tar 打包而後用 bzip2 壓縮的。默認的位置是在 $PORTSDIR/distfiles。可是,你也能夠把這些 dist 文件放到另外的地方。須要設定的環境變量就是 DISTDIR。你能夠根據上面的例子來設定這個環境變量。

3 設定工做目錄

若是沒有設定工做目錄,ports 系統默認在 port 的目錄進行編譯。好比你的 firefox 在 /usr/ports/www/firefox,那麼默認將在 /usr/ports/www/firefox/work 下編譯 firefox。這樣有一個缺點,若是你的 /usr 目錄不是很大的話,在編譯某些大軟件的時候,好比 gnome,kde 桌面系統時,你的 /usr 空間可能會不足。

解決的辦法之一就是設定環境變量 WRKDIRPREFIX,好比

export WRKDIRPREFIX=/opt/obj/portbld

這個時候 ports 系統就會到 /opt/obj/portbld/usr/ports/www/firefox/work 下編譯 firefox。

Ports 管理工具

1 系統自帶的工具

同步 ports

portsnap 是同步 ports 用的,前文已經做了介紹。
詳細用法參照<A class=urlextern title=http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/ports-using.html href="http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/ports-using.html" rel=nofollow>這裏(搜索「Portsnap 方式」)
爲了方便,我在 csh 的配置文件裏寫入了以下 alias :

alias update-ports 'portsnap fetch update'

你們不妨參考一下。

維護 ports

  1. pkg_add

  2. pkg_create

  3. pkg_delete

  4. pkg_info

  5. pkg_updating

  6. pkg_version

注:
1.具體的用法請參考<A class=urlextern title=http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/ports.html href="http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/ports.html" rel=nofollow>手冊中的4.四、4.5節。
2.嚴格來講,pkg_add,pkg_updating並非用於 ports 的工具,它們只能用於 package 。這裏只是爲了讓你們全面瞭解,哪些是官方的東西。

2 推薦的第三方工具

主要工具

  • portupgrade

portupgrade是一個強大全面的工具,可是依賴於ruby。
我的沒有用過,因此很少做評論,你們能夠試一下。

  • portmaster

portmaster是一套僅使用系統軟件,而不依賴其餘ports的工具。
由於它沒有依賴,很「純」,功能也夠用,因此我的比較推崇這個。
我在csh的配置文件裏寫了關於portmaster的以下alias:

alias update-apps 'portmaster -a --force-config'
alias show-dep 'portmaster --show-work ./ | sort'

前者用來更新全部ports,並強制make config。
後者用來顯示該軟件的依賴,按已裝和未裝排序,須要事先進入那個軟件的目錄才能執行。
由於 portmaster 不會讀取 /etc/make.conf 裏的 BATCH=yes 設置,若是你討厭煩人的 make config,能夠:

portmaster -aG  #更新全部ports,並防止 make config

portmaster的配置文件位於/usr/local/etc/portmaster.rc,須要手工建立。
能夠參考同目錄下的portmaster.rc.sample。
我使用的設置是:

ALWAYS_SCRUB_DISTFILES=dopt     #更新完一個ports後自動刪除舊版本的源碼壓縮包
PM_LOG=/var/log/portmaster.log  #日誌

輔助工具

  • pkg_rmleaves


這個工具能夠用來刪除用不着的軟件,其做用至關於Gentoo的emerge –depclean,或者Debian的orphaner(deborphan這個包)
它首先列出全部不被其餘軟件所依賴的「葉子節點」,或者說「孤立的軟件包」(這意味着刪除它們不會影響依賴關係)。
而後你能夠手動指定哪些軟件是你不須要的,
選中執行[OK]後,它會進一步篩選「葉子節點」。
如此遞歸以後,它能夠保證該軟件及其(不被其餘軟件依賴的)依賴被完全清除。

  • pkg_cleanup


這個工具的做用和pkg_rmleaves徹底同樣,其工做原理也一致,不用擔憂二者衝突或者哪一個剔除起來更完全。
惟一的區別在於,這個軟件能充分利用你的顯示屏=),另外能在上方顯示出每一個軟件的描述,
好比上圖中,光標停在了amarok這一行,它的上面就顯示出amarok的介紹:「Media Player for KDE4」。

  • pkg_cutleaves

這個工具也是用來清理孤立軟件包的,它沒有圖形界面,
可是它支持配置文件,能夠預先設定你須要保留的軟件包,之後就直接cut,沒必要每次都作選擇。

  • pkg-rmleaf

這個是基於 pkgng 的卸載工具,
若是你已經切換到下一代 pkg 系統,那麼 pkg_cleanup 將沒法工做,
此時能夠考慮 pkg-rmleaf,和 pkg_cleanup 有着相似界面,並且速度更快。

  • pkg_search

可能有的同窗要問,怎樣才能快速找到某個ports的位置呢,locate?find?
這個時候,我要向你推薦pkg_search。
pkg_search <name>可讓你快速找到該軟件包的版本和描述,而加上參數-r,就能夠知道它的位置。

  • pkgsearch

這個工具的做用和上述相同,可是它須要創建一個數據庫,並且每次更新ports以後也要更新數據庫。
看起來它的工做方式接近於Gentoo的eix。

  • portconf

它是用來設置全局的編譯標記的,相似於Gentoo中設置的USE標記。(詳細內容待撰,哪位對它比較熟悉的幫個忙吧)

Ports 開發工具

portlint

當你寫了一個新的 port 以後,可使用 portlint 來檢查本身的 port 是否符合 FreeBSD ports 的規範。

相關連接

<A class=urlextern title=http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/faq/applications.html href="http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/faq/applications.html" rel=nofollow>中文 FAQ

<A class=urlextern title=http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/ports.html href="http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/ports.html" rel=nofollow>中文手冊

<A class=urlextern title=http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/porters-handbook/ href="http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/porters-handbook/" rel=nofollow>中文 Porter 手冊

<A class=urlextern title=http://www.freshports.org href="http://www.freshports.org/" rel=nofollow>FreshPorts 查看全部 ports 更新的站點

相關文章
相關標籤/搜索