FreeBSD中的包管理器pkg_add,pkg和ports之間有什麼差別?

最近剛開始學習unix,於是打算在虛擬機中安裝一個freeBSD輔助學習。剛開始安裝系統的過程還好,按著指示一步一步操作就差不多了。但是到了安裝軟體的時候就犯愁了。在百度的時候發現freeBSD有好幾個包管理器。pkg,pkg_add和ports。現在主要的問題如下:

1,三個包管理器主要的區別是什麼?

2,可不可以直接理解為pkg就是pkg_add的升級版?

3,是不是pkg/pkg_add就是安裝二進位包,而ports就是安裝源代碼包?或者和arch一樣,一個是官方包,一個是安裝民間維護的包?

4,國內有沒有快一點的軟體源?百度上老是么有這方面的文檔啊……


要理解這個問題,必須從ports用戶的角度去看問題。

首先,ports是一堆Makefile。對每個軟體,它主要記載以下信息:

  • 源碼包在哪裡下載,如何解壓縮
  • 哈希值是什麼
  • 編譯依賴,運行依賴有哪些
  • 要打哪些補丁
  • 如何編譯,有哪些可選項

  • 將會安裝哪些文件,裝到什麼地方去
  • 調用什麼工具註冊安裝信息

有了這些信息和規則,我們直接敲"make"命令,就能自動下載編譯安裝某個軟體及其依賴。因此ports不過是對各種開源軟體的源碼包進行了二次封裝,稱不上包管理器。

真正管「裝完之後的事情」的,是pkg。它有一個sqlite3資料庫,ports在安裝軟體時會把相關信息告訴pkg,讓pkg記錄在案。如果以後要卸載某個軟體,只有pkg知道該刪除什麼東西。而更新略微複雜,因為ports不知道你機器上已經裝了什麼,而pkg不知道最新的ports是什麼,所以需要另外一個工具(portmaster)從雙方獲取信息,計算你機器上哪些軟體需要更新,更新的先後順序是什麼。因此對ports用戶來說,至少需要ports、pkg、portmaster三樣東西,才能實現安裝、卸載、更新。

由於pkg記錄了所有安裝信息,我們完全可以用pkg將某個已安裝的軟體打包,分發給別的機器解壓安裝,這就是所謂的package。它可以滿足兩類用戶:

  1. 不想編譯安裝的用戶(使用官方的pkg源)
  2. 既想用ports實現更多定製,又需要批量安裝的用戶(自己搭建pkg源)

總結:

  • ports記錄了所有最新的已經移植到FreeBSD的軟體之間的依賴關係、編譯安裝方法
  • pkg記錄了已經安裝到系統中的所有軟體之間的依賴關係、安裝文件路徑
  • 對ports用戶來說,至少需要ports/pkg/portmaster三樣東西,才能實現安裝卸載更新
  • 對package用戶來說,只需要pkg就能實現安裝卸載更新
  • 對package開發者來說,沒有ports那套Makefile,他們就做不出二進位安裝包

  • ports和pkg各司其職,相互依存

至於pkg_*那套工具,已經淘汰了,不用管它。

凡是看到"pkg_add"字樣的文章全部丟進垃圾箱。

最後夾帶一點私貨:

  • 推薦使用我寫ports-mgmt/pkg-rmleaf卸載軟體
  • 推薦閱讀我寫的這篇指南:FreeBSD 簡明用戶指南


1,三個包管理器主要的區別是什麼?

pkg_add 是原來老的二進位包管理器(的部件之一),現在已經被淘汰,缺點主要就是不那麼智能。pkg 是新的包管理器,據說比較智能化。ports 是整個包管理系統的名稱。其實目前 ports 的運作,不管你是直接用二進位包,還是從源碼編譯,都要用到 pkg。

2,可不可以直接理解為pkg就是pkg_add的升級版?

可以

3,是不是pkg/pkg_add就是安裝二進位包,而ports就是安裝源代碼包?或者和arch一樣,一個是官方包,一個是安裝民間維護的包

pkg 主要用於二進位包的安裝,從 ports 編譯安裝以前是不需要老的 pkg 參與的,但現在需要新的 pkg 用來註冊和管理包的依賴關係。FreeBSD 的 ports 沒有民間維護的包這種說法。ports 的實際運作方式是,貢獻者提交一個或幾個 port,有 ports 管理者審批。審批通過就能進入 ports 系統。以後 port 的打補丁或升級都是這個套路。

4,國內有沒有快一點的軟體源?

以前 FreeBSD China 倒是有,但很久沒用過了。現在建議用日本的源,雖然不如國內的快,但速度也不錯了。


FreeBSD 有三種安裝應用的方式,分別是 Tarball, Packages Ports。Tarball 就是源代碼壓縮打包文件,Packages 和 Ports 是兩種不同的源代碼打包文件。

對於 Packages ,FreeBSD 9.0 版本前用的是 pkg 這個包管理工具,對應的是 pkg_* 一組命令,比如 pkg_add, pkg_delete, pkg_version 等等,在 FreeBSD 9.x 的時代,FreeBSD 開發小組借鑒了 Debian 和 RHEL 的經驗,開發出了(當時)新一代包管理工具 pkgng(next generation pkg,下一代 pkg),相應的,pkg_* 這組命令變為 pkg 這個總命令,比如 pkg install, pkg delete, pkg version等等。在 FreeBSD 8.4 版本之前,可以通過命令 pkg2ng 將 pkg_* 轉換成 pkg ,但是 pkg_add 轉換成的 pkg add 將不再支持(FreeBSD官方聲明)。

對於 Ports ,所有 Ports 的集合(collection)叫 Ports Collection,由於它的目錄展開形似一棵樹,所以又叫作 Ports Tree 。Ports Collection 的管理方式有點特別,在 FreeBSD 中以快照的形式存儲,每一小時 FreeBSD 的 Ports 上游就要更新一次,所以用快照管理工具 Portsnap(Ports Snapshot)來管理。用 Ports 安裝應用前,需要更新一次 Ports Collection 。首次更新用命令 portsnap fetch extract,以後幾次更新用命令 portsnap fetch update(以後幾次更新也可以使用 portsnapn fetch extract,但第一次更新必須要使用 portsnap fetch extract )。雖然每一個 Port 本身是源代碼打包文件,但是裡面沒有源代碼有 Makefile 編譯文件。用戶用 Ports 安裝應用,採用命令 make install(需要 root 許可權)即可,也可以配合 make clean 來清理安裝完成後殘留的緩存文件,這兩個命令可以合併為 make install clean 。需要注意的是,當用戶在每一個port目錄中下達安裝命令( make install )後,系統會自動下達 9 個命令(分別是 make config, make fetch, make checksum, make extract, make patch, make depends, make configure, make build ),再執行make install,所以一般不需要手動一個個下達這些命令。

更多細節,你可以看我製作的上課講義 https://pan.baidu.com/s/1eRERTke ,你也可以私信我,我很高興與你探討。


我猜你想說 pkg_add,pkgng (pkg) 和 ports 吧

pkg_* 是老的binary package manager,現在換成 pkgng 了。

ports 與 pkg* 不同的是,ports 是直接從源碼編譯的,所以你可以自定義編譯選項,當然 build error 的可能性也大大增加了。

所以,

  1. pkg*是二進位管理,ports是源碼管理
  2. 見1
  3. USTC 算是比較好的了,不光教育網友好,電信聯通都很快 http://mirrors.ustc.edu.cn/freebsd/

我不記得 pkgng 是從哪個版本開始作為默認二進位管理器的了,但是好像 9.3 還是老的 pkg,升級到 10 以後我 pkg2ng 了一下。

--

最後,雖然題主態度很好,我還是想放上一句,RTFM

https://www.freebsd.org/doc/handbook/pkgng-intro.html

https://wiki.freebsd.org/pkgng


快一點軟體源,我常用這個:

http://mirrors.ustc.edu.cn

FreeBSD/Debian/Ubuntu都有,相信中科大。


port是源碼,類似於linux下你下了source code 自己編譯。pkg_add和pkg是包管理器,直接安裝二進位包,類似於yum和apt,後者應該是freebsd10引入逐步替代前者的。網上資料從freebsd8到10各種都有,建議只看最新的文檔,還是很良心很詳細的。


pkg_add類似pkg,都是二進位包的包管理器,現在已經不用這個了,都用pkg。

ports是源碼編譯的,進去目錄make install即可下載、編譯和安裝。


推薦閱讀:

有哪些 Linux 逆向相關的學習資料推薦?
Pwn2Own 有Unix/Linux系統的機器被攻破么?
Linux 為何不把圖形用戶界面寫入內核?
你認為 Linux 最差的用戶體驗是什麼?
可以將一個網頁應用「打包」成一個桌面應用嗎?

TAG:Linux | FreeBSD | Unix | Unix入門 |