歡迎光臨
每天分享高質量文章

包管理器的進化 | Linux 中國

包管理器在 Linux 軟體管理中扮演了重要角色。這裡對一些主要的包管理器進行了對比。
— Steve Ovens


致謝
編譯自 | 
https://opensource.com/article/18/7/evolution-package-managers
 
 作者 | Steve Ovens
 譯者 | DavidChenLiang ??共計翻譯:2 篇 貢獻時間:24 天

包管理器在 Linux 軟體管理中扮演了重要角色。這裡對一些主要的包管理器進行了對比。

今天,每個可計算裝置都會使用某種軟體來完成預定的任務。在軟體開發的上古時期,為了找出軟體中的“蟲”和其它缺陷,軟體會被嚴格的測試。在近十年間,軟體被透過網際網路來頻繁分發,以試圖透過持續不斷的安裝新版本的軟體來解決軟體的缺陷問題。在很多情況下,每個獨立的應用軟體都有其自帶的更新器。而其它一些軟體則讓使用者自己去搞明白如何獲取和升級軟體。

Linux 較早採用了維護一個中心化的軟體倉庫來釋出軟體更新這種做法,使用者可以在這個軟體倉庫裡查詢並安裝軟體。在這篇文章裡, 筆者將回顧在 Linux 上的如何進行軟體安裝的歷史,以及現代作業系統如何保持更新以應對軟體安全漏洞(CVE)[1]不斷的曝光。

那麼在包管理器出現之前在 Linux 上是如何安裝軟體的呢?

曾幾何時,軟體都是透過 FTP 或郵件串列(LCTT 譯註:即透過郵件串列釋出原始碼的補丁包)來分發的(最終這些釋出方式在網際網路的迅猛發展下都演化成為一個個現今常見的軟體釋出網站)。(一般在一個 tar 檔案中)只有一個非常小的檔案包含了建立二進位制的說明。你需要做的是先解壓這個包,然後仔細閱讀當中的 README 檔案, 如果你的系統上恰好有 GCC(LCTT 譯註:GNU C Compiler)或者其它廠商的 C 編譯器的話,你得首先執行 ./configure 指令碼,併在指令碼後新增相應的引數,如庫函式的路徑、建立可執行檔案的路徑等等。除此之外,這個配置過程也會檢查你作業系統上的軟體依賴是否滿足安裝要求。如果缺失了任何主要的依賴,該配置指令碼會退出不再繼續安裝,直到你滿足了該依賴。如果該配置指令碼正常執行完畢,將會建立一個 Makefile 檔案。

當有了一個 Makefile 檔案時, 你就可以接下去執行 make 命令(該命令由你所使用的編譯器提供)。make 命令也有很多引數,被稱為 make 標識flag,這些標識能為你的系統最佳化最終生成出來的二進位制可執行檔案。在計算機世界的早期,這些最佳化是非常重要的,因為彼時的計算機硬體正在為了跟上軟體迅速的發展而疲於奔命。今日今時,編譯標識變得更加通用而不是為了最佳化哪些具體的硬體型號,這得益於現代硬體和現代軟體相比已經變得成本低廉,唾手可得。

最後,在 make 完成之後, 你需要執行 make install (或 sudo make install)(LCTT 譯註:依賴於你的使用者許可權) 來“真正”將這個軟體安裝到你的系統上。可以想象,為你係統上的每一個軟體都執行上述的流程將是多麼無聊費時,更不用說如果更新一個已經安裝的軟體將會多複雜,多麼需要精力投入。(LCTT 譯註:上述流程也稱 CMMI 安裝, 即Configure、Make、Make Install)

那麼軟體包是什麼?

軟體包package(LCTT 譯註:下文簡稱“包”)這個概念是用來解決在軟體安裝、升級過程中的複雜性的。包將軟體安裝升級中需要的多個資料檔案合併成一個單獨的檔案,這將便於傳輸和(透過壓縮檔案來)減小儲存空間(LCTT 譯註:減少儲存空間這一點在現在已經不再重要),包中的二進位制可執行檔案已根據開發者所選擇的編譯標識預編譯。包本身包括了所有需要的元資料,如軟體的名字、軟體的說明、版本號,以及要執行這個軟體所需要的依賴包等等。

不同流派的 Linux 發行版都創造了它們自己的包格式,其中最常用的包格式有:

◈ .deb:這種包格式由 Debian、Ubuntu、Linux Mint 以及其它的變種使用。這是最早被髮明的包型別。
◈ .rpm:這種包格式最初被稱作紅帽包管理器Red Hat Package Manager(LCTT 譯註: 取自英文的首字母)。使用這種包的 Linux 發行版有 Red Hat、Fedora、SUSE 以及其它一些較小的發行版。
◈ .tar.xz:這種包格式只是一個軟體壓縮包而已,這是 Arch Linux 所使用的格式。(LCTT 譯註:這種格式無需特別的包管理器,解壓即可)

儘管上述的包格式自身並不能直接管理軟體的依賴問題,但是它們的出現將 Linux 軟體包管理向前推進了一大步。

軟體倉庫到底是什麼?

多年以前(當智慧電話還沒有像現在這樣流行時),非 Linux 世界的使用者是很難理解軟體倉庫的概念的。甚至今時今日,大多數完全工作在 Windows 下的使用者還是習慣於開啟瀏覽器,搜尋要安裝的軟體(或升級包),下載然後安裝。但是,智慧電話傳播了軟體“商店”(LCTT 譯註: 對應 Linux 裡的軟體倉庫)這樣一個概念。智慧電話使用者獲取軟體的方式和包管理器的工作方式已經非常相近了。些許不同的是,儘管大多數軟體商店還在費力美化它的圖形介面來吸取使用者,大多數 Linux 使用者還是願意使用命令列來安裝軟體。總而言之,軟體倉庫是一個中心化的可安裝軟體串列,上面列舉了在當前系統中預先配置好的軟體倉庫裡所有可以安裝的軟體。下麵我們舉一些例子來說在各個不同的 Linux 發行版下如何在對應的軟體倉庫裡搜尋某個特定的軟體(輸出有截斷)。

在 Arch Linux 下使用 aurman

  1. user@arch ~ $  aurman -Ss kate

  2. extra/kate 18.04.2-2 (kde-applications kdebase)

  3.     Advanced Text Editor

  4. aur/kate-root 18.04.0-1 (11, 1.139399)

  5.     Advanced Text Editor, patched to be able to run as root

  6. aur/kate-git r15288.15d26a7-1 (1, 1e-06)

  7.     An advanced editor component which is used in numerous KDE applications requiring a text editing component

在 CentOS 7 下使用 yum

  1. [user@centos ~]$ yum search kate

  2. kate-devel.x86_64 : Development files for kate

  3. kate-libs.x86_64 : Runtime files for kate

  4. kate-part.x86_64 : Kate kpart plugin

在 Ubuntu 下使用 apt

  1. user@ubuntu ~ $ apt search kate

  2. Sorting... Done

  3. Full Text Search... Done

  4. kate/xenial 4:15.12.3-0ubuntu2 amd64

  5.   powerful text editor

  6. kate-data/xenial,xenial 4:4.14.3-0ubuntu4 all

  7.   shared data files for Kate text editor

  8. kate-dbg/xenial 4:15.12.3-0ubuntu2 amd64

  9.   debugging symbols for Kate

  10. kate5-data/xenial,xenial 4:15.12.3-0ubuntu2 all

  11.   shared data files for Kate text editor

最好用的包管理器有哪些?

如上示例的輸出,包管理器用來和相應的軟體倉庫互動,獲取軟體的相應資訊。下麵對它們做一個簡短介紹。

基於 PRM 包格式的包管理器

更新基於 RPM 的系統,特別是那些基於 Red Hat 技術的系統,有著非常有趣而又詳實的歷史。實際上,現在的 YUM[2] 版本(用於 企業級發行版)和 DNF[3](用於社群版)就融合了好幾個開源專案來提供它們現在的功能。

Red Hat 最初使用的包管理器,被稱為 RPM[4]紅帽包管理器Red Hat Package Manager),時至今日還在使用著。不過,它的主要作用是安裝本地的 RPM 包,而不是去在軟體倉庫搜尋軟體。後來開發了一個叫 up2date 的包管理器,它被用來通知使用者包的最新更新,還能讓使用者在遠端倉庫裡搜尋軟體並便捷的安裝軟體的依賴。儘管這個包管理器盡職盡責,但一些社群成員還是感覺 up2date 有著明顯的不足。

現在的 YUM 來自於好幾個不同社群的努力。1999-2001 年一群在 Terra Soft Solution 的夥計們開發了黃狗更新器Yellowdog Updater(YUP),將其作為 Yellow Dog Linux[5] 圖形安裝器的後端。杜克大學Duke University喜歡這個主意就決定去增強它的功能,它們開發了黃狗更新器--修改版Yellowdog Updater, Modified[6](YUM),這最終被用來幫助管理杜克大學的 Red Hat 系統。Yum 壯大的很快,到 2005 年,它已經被超過一半的 Linux 市場所採用。今日,幾乎所有的使用 RPM 的的 Linux 都會使用 YUM 來進行包管理(當然也有一些例外)。

使用 YUM

為了能讓 YUM 正常工作,比如從一個軟體倉庫裡下載和安裝包,倉庫說明檔案必須放在 /etc/yum.repos.d/ 目錄下且必須以 .repo 作為副檔名。如下是一個示例檔案的內容:

  1. [local_base]

  2. name=Base CentOS  (local)

  3. baseurl=http://7-repo.apps.home.local/yum-repo/7/

  4. enabled=1

  5. gpgcheck=0

這是筆者本地倉庫之一,這也是為什麼 gpgcheck 值為 0 的原因。如果這個值為 1 的話,每個包都需要被金鑰簽名,相應的金鑰(的公鑰)也要匯入到安裝軟體的系統上。因為這個軟體倉庫是筆者本人維護的且筆者信任這個倉庫裡的包,所以就不去對它們一一簽名了。

當一個倉庫檔案準備好時,你就能開始從遠端軟體倉庫開始安裝檔案了。最基本的命令是 yum update,這將會更新所有已安裝的包。你也不需要用特殊的命令來更新倉庫本身,所有這一切都已自動完成了。執行命令示例如下:

  1. [user@centos ~]$ sudo yum update

  2. Loaded plugins: fastestmirror, product-id, search-disabled-repos, subscription-manager

  3. local_base                             | 3.6 kB  00:00:00    

  4. local_epel                             | 2.9 kB  00:00:00    

  5. local_rpm_forge                        | 1.9 kB  00:00:00    

  6. local_updates                          | 3.4 kB  00:00:00    

  7. spideroak-one-stable                   | 2.9 kB  00:00:00    

  8. zfs                                    | 2.9 kB  00:00:00    

  9. (1/6): local_base/group_gz             | 166 kB  00:00:00    

  10. (2/6): local_updates/primary_db        | 2.7 MB  00:00:00    

  11. (3/6): local_base/primary_db           | 5.9 MB  00:00:00    

  12. (4/6): spideroak-one-stable/primary_db |  12 kB  00:00:00    

  13. (5/6): local_epel/primary_db           | 6.3 MB  00:00:00    

  14. (6/6): zfs/x86_64/primary_db           |  78 kB  00:00:00    

  15. local_rpm_forge/primary_db             | 125 kB  00:00:00    

  16. Determining fastest mirrors

  17. Resolving Dependencies

  18. --> Running transaction check

如果你確定想讓 YUM 在執行任何命令時不要停下來等待使用者輸入,你可以命令裡放 -y 標誌,如 yum update -y

安裝一個新包很簡單。首先,用 yum search 搜尋包的名字。

  1. [user@centos ~]$ yum search kate

  2. artwiz-aleczapka-kates-fonts.noarch : Kates font in Artwiz family

  3. ghc-highlighting-kate-devel.x86_64 : Haskell highlighting-kate library development files

  4. kate-devel.i686 : Development files for kate

  5. kate-devel.x86_64 : Development files for kate

  6. kate-libs.i686 : Runtime files for kate

  7. kate-libs.x86_64 : Runtime files for kate

  8. kate-part.i686 : Kate kpart plugin

當你找到你要安裝的包後,你可以用 sudo yum install kate-devel -y 來安裝。如果你安裝了你不需要的軟體,可以用 sudo yum remove kdate-devel -y 來從系統上刪除它,預設情況下,YUM 會刪除軟體包以及它的依賴。

有些時候你甚至都不清楚要安裝的包的名稱,你只知道某個實用程式的名字。(LCTT 譯註:可以理解實用程式是安裝包的子集)。例如,你想找實用程式 updatedb(它是用來建立/更新由 locate 命令所使用的資料庫的),直接試圖安裝 updatedb 會傳回下麵的結果:

  1. [user@centos ~]$ sudo yum install updatedb

  2. Loaded plugins: fastestmirror, langpacks

  3. Loading mirror speeds from cached hostfile

  4. No package updatedb available.

  5. Error: Nothing to do

你可以搜尋實用程式來自哪個包:

  1. [user@centos ~]$ yum whatprovides *updatedb

  2. Loaded plugins: fastestmirror, langpacks

  3. Loading mirror speeds from cached hostfile

  4. bacula-director-5.2.13-23.1.el7.x86_64 : Bacula Director files

  5. Repo        : local_base

  6. Matched from:

  7. Filename    : /usr/share/doc/bacula-director-5.2.13/updatedb

  8. mlocate-0.26-8.el7.x86_64 : An utility for finding files by name

  9. Repo        : local_base

  10. Matched from:

  11. Filename    : /usr/bin/updatedb

筆者在前面使用星號的原因是 yum whatprovides 使用路徑去匹配檔案。筆者不確定檔案在哪裡,所以使用星號去指代任意路徑。

當然 YUM 還有很多其它的可選項。這裡筆者希望你能夠自己檢視 YUM 的手冊來找到其它額外的可選項。

時髦的 YumDandified Yum[7](DNF)是 YUM 的下一代接班人。從 Fedora 18 開始被作為包管理器引入系統,不過它並沒有被企業版所採用,所以它只在 Fedora(以及變種)上佔據了主導地位。DNF 的用法和 YUM 幾乎一模一樣,它主要是用來解決效能問題、晦澀無說明的API、緩慢/不可靠的依賴解析,以及偶爾的高記憶體佔用。DNF 是作為 YUM 的直接替代品來開發的,因此這裡筆者就不重覆它的用法了,你只用簡單的將 yum 替換為 dnf 就行了。

使用 Zypper

Zypper[8] 是用來管理 RPM 包的另外一個包管理器。這個包管理器主要用於 SUSE[9](和 openSUSE[10]),在MeeGo[11]Sailfish OS[12]Tizen[13] 上也有使用。它最初開發於 2006 年,已經經過了多次迭代。除了作為系統管理工具 YaST[14] 的後端和有些使用者認為它比 YUM 要快之外也沒有什麼好多說的。

Zypper 使用與 YUM 非常相像。它被用來搜尋、更新、安裝和刪除包,簡單的使用命令如下:

  1. zypper search kate

  2. zypper update

  3. zypper install kate

  4. zypper remove kate

主要的不同來自於使用 Zypper 的系統在新增軟體倉庫的做法上,Zypper 使用包管理器本身來新增軟體倉庫。最通用的方法是透過一個 URL,但是 Zypper 也支援從倉庫檔案裡匯入。

  1. suse:~ # zypper addrepo http://download.videolan.org/pub/vlc/SuSE/15.0 vlc

  2. Adding repository 'vlc' [done]

  3. Repository 'vlc' successfully added

  4. Enabled     : Yes

  5. Autorefresh : No

  6. GPG Check   : Yes

  7. URI         : http://download.videolan.org/pub/vlc/SuSE/15.0

  8. Priority    : 99

你也能用相似的手段來刪除軟體倉庫:

  1. suse:~ # zypper removerepo vlc

  2. Removing repository 'vlc' ...................................[done]

  3. Repository 'vlc' has been removed.

使用 zypper repos 命令來檢視當前系統上的軟體倉庫的狀態:

  1. suse:~ # zypper repos

  2. Repository priorities are without effect. All enabled repositories share the same priority.

  3. #  | Alias                     | Name                                    | Enabled | GPG Check | Refresh

  4. ---|---------------------------|-----------------------------------------|---------|-----------|--------

  5.  1 | repo-debug                | openSUSE-Leap-15.0-Debug                | No      | ----      | ----  

  6.  2 | repo-debug-non-oss        | openSUSE-Leap-15.0-Debug-Non-Oss        | No      | ----      | ----  

  7.  3 | repo-debug-update         | openSUSE-Leap-15.0-Update-Debug         | No      | ----      | ----  

  8.  4 | repo-debug-update-non-oss | openSUSE-Leap-15.0-Update-Debug-Non-Oss | No      | ----      | ----  

  9.  5 | repo-non-oss              | openSUSE-Leap-15.0-Non-Oss              | Yes     | ( p) Yes  | Yes    

  10.  6 | repo-oss                  | openSUSE-Leap-15.0-Oss                  | Yes     | ( p) Yes  | Yes    

zypper 甚至還有和 YUM 相同的功能:搜尋包含檔案或二進位制的包。和 YUM 有所不同的是,它在命令列裡使用破折號(但是這個搜尋方法現在被廢除了……)

  1. localhost:~ # zypper what-provides kate

  2. Command 'what-provides' is replaced by 'search --provides --match-exact'.

  3. See 'help search' for all available options.

  4. Loading repository data...

  5. Reading installed packages...

  6. S  | Name | Summary              | Type      

  7. ---|------|----------------------|------------

  8. i+ | Kate | Advanced Text Editor | application

  9. i  | kate | Advanced Text Editor | package  

YUM、DNF 和 Zypper 三劍客擁有的功能比在這篇小文裡討論的要多得多,請檢視官方檔案來得到更深入的資訊。

基於 Debian 的包管理器

作為一個現今仍在被積極維護的最古老的 Linux 發行版之一,Debian 的包管理系統和基於 RPM 的系統的包管理系統非常類似。它使用副檔名為 “.deb” 的包,這種檔案能被一個叫做 dpkg 的工具所管理。dpgk 同 rpm 非常相似,它被設計成用來管理在存在於本地(硬碟)的包。它不會去做包依賴關係解析(它會做依賴關係檢查,不過僅此而已),而且在同遠端軟體倉庫互動上也並無可靠的途徑。為了提高使用者體驗並便於使用,Debian 專案開始了一個軟體專案:Deity,最終這個代號被丟棄並改成了現在的 高階打包工具Advanced Pack Tool[15](APT)。

在 1998 年,APT 測試版本釋出(甚至早於 1999 年的 Debian 2.1 釋出),許多使用者認為 APT 是基於 Debian 系統標配功能之一。APT 使用了和 RPM 一樣的風格來管理倉庫,不過和 YUM 使用單獨的 .repo 檔案不同,APT 曾經使用 /etc/apt/sources.list 檔案來管理軟體倉庫,後來的變成也可以使用 /etc/apt/sources.d 目錄來管理。如同基於 RPM 的系統一樣,你也有很多很多選項配置來完成同樣的事情。你可以編輯和建立前述的檔案,或者使用圖形介面來完成上述工作(如 Ubuntu 的“Software & Updates”),為了給所有的 Linux 發行版統一的待遇,筆者將會只介紹命令列的選項。 要想不直接編輯檔案內容而直接增加軟體倉庫的話,可以用如下命令:

  1. user@ubuntu:~$ sudo apt-add-repository "deb http://APT.spideroak.com/ubuntu-spideroak-hardy/ release restricted"

這個命令將會在 /etc/apt/sources.list.d 目錄裡建立一個 spideroakone.list檔案。顯而易見,檔案裡的內容依賴於所新增的軟體倉庫,如果你想加一個個人軟體包存檔Personal Package Archive(PPA)的話,你可以用如下的辦法:

  1. user@ubuntu:~$ sudo apt-add-repository ppa:gnome-desktop

註意: Debian 原生並不支援本地 PPA 。

在添加了一個軟體倉庫後,需要通知基於 Debian 的系統有一個新的倉庫可以用來搜尋包,可以執行 apt-get update 來完成:

  1. user@ubuntu:~$ sudo apt-get update

  2. Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]

  3. Hit:2 http://APT.spideroak.com/ubuntu-spideroak-hardy release InRelease

  4. Hit:3 http://ca.archive.ubuntu.com/ubuntu xenial InRelease

  5. Get:4 http://ca.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]              

  6. Get:5 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages [517 kB]

  7. Get:6 http://security.ubuntu.com/ubuntu xenial-security/main i386 Packages [455 kB]      

  8. Get:7 http://security.ubuntu.com/ubuntu xenial-security/main Translation-en [221 kB]    

  9. ...

  10. Fetched 6,399 kB in 3s (2,017 kB/s)                                          

  11. Reading package lists... Done

現在新的軟體倉庫已經在你的系統裡安裝並更新好了,你可以用 apt-cache 來搜尋你想要的包了。

  1. user@ubuntu:~$ apt-cache search kate

  2. aterm-ml - Afterstep XVT - a VT102 emulator for the X window system

  3. frescobaldi - Qt4 LilyPond sheet music editor

  4. gitit - Wiki engine backed by a git or darcs filestore

  5. jedit - Plugin-based editor for programmers

  6. kate - powerful text editor

  7. kate-data - shared data files for Kate text editor

  8. kate-dbg - debugging symbols for Kate

  9. katepart - embeddable text editor component

要安裝 kate,簡單的執行下麵的命令:

  1. user@ubuntu:~$ sudo apt-get install kate

要是刪除一個包,使用 apt-get remove

  1. user@ubuntu:~$ sudo apt-get remove kate

要探索一個包的話,APT 並沒有提供一個類似於 yum whatprovides 的功能,如果你想深入包內部去確定一個特定的檔案的話,也有一些別的方法能幫你完成這個標的,

如: 用 dpkg

  1. user@ubuntu:~$ dpkg -S /bin/ls

  2. coreutils: /bin/ls

或者: apt-file

  1. user@ubuntu:~$ sudo apt-get install apt-file -y

  2. user@ubuntu:~$ sudo apt-file update

  3. user@ubuntu:~$ apt-file search kate

與 yum whatprovides 不同的是,apt-file search 的問題是因為自動添加了萬用字元搜尋而輸出過於詳細(除非你知道確切的路徑),最終在結果裡包括了所有包含有 “kate” 的結果。

  1. kate: /usr/bin/kate

  2. kate: /usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/katebacktracebrowserplugin.so

  3. kate: /usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/katebuildplugin.so

  4. kate: /usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/katecloseexceptplugin.so

  5. kate: /usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/katectagsplugin.so

上面這些例子大部分都使用了 apt-get。請註意現今大多數的 Ubuntu 教程裡都徑直使用了 apt。 單獨一個 apt 設計用來實現那些最常用的 APT 命令的。apt 命令看上去是用來整合那些被分散在 apt-getapt-cache 以及其它一些命令的的功能的。它還加上了一些額外的改進,如色彩、進度條以及其它一些小功能。上述的常用命令都能被 apt 替代,但是並不是所有的基於 Debian 的系統都能使用 apt 接受安全包補丁的,你有可能要安裝額外的包的實現上述功能。

基於 Arch 的包管理器

Arch Linux[6] 使用稱為 packman[16] 的包管理器。和 .deb 以及 .rpm 不同,它使用更為傳統的 LZMA2 壓縮包形式 .tar.xz 。這可以使 Arch Linux 包能夠比其它形式的壓縮包(如 gzip)有更小的尺寸。自從 2002 年首次釋出以來, pacman 一直在穩定釋出和改善。使用它最大的好處之一是它支援 Arch Build System[17],這是一個從原始碼級別構建包的構建系統。該構建系統藉助一個叫 PKGBUILD 的檔案,這個檔案包含瞭如版本號、釋出號、依賴等等的元資料,以及一個為編譯遵守 Arch Linux 需求的包所需要的帶有必要的編譯選項的指令碼。而編譯的結果就是前文所提的被 pacman 所使用的 .tar.xz 的檔案。

上述的這套系統技術上導致了 Arch 使用者倉庫Arch User Respository[18](AUR)的產生,這是一個社群驅動的軟體倉庫,倉庫裡包括有 PKGBUILD 檔案以及支援補丁或指令碼。這給 Arch Linux 帶了無窮無盡的軟體資源。最為明顯的好處是如果一個使用者(或開發者)希望他開發的軟體能被廣大公眾所使用,他不必透過官方途徑去在主流軟體倉庫獲得許可。而不利之處則是它必須將依賴社群的流程,類似於 Docker Hub[19]、 Canonical 的 Snap Packages(LCTT 譯註: Canonical 是 Ubuntu 的發行公司),或者其它類似的機制。有很多特定於 AUR 的包管理器能被用來從 AUR 裡的 PGKBUILD 檔案下載、編譯、安裝,下麵我們來仔細看看怎麼做。

使用 pacman 和官方軟體倉庫

Arch 的主要包管理器:pacman,使用標識位而不是像 yum 或 apt 一樣使用命令詞。例如,要搜尋一個包,你要用 pacman -Ss 。和 Linux 上別的命令一樣,你可以找到 pacman 的手冊頁和線上幫助。pacman 大多數的命令都使用了同步(-S)這個標識位。例如:

  1. user@arch ~ $ pacman -Ss kate

  2. extra/kate 18.04.2-2 (kde-applications kdebase)

  3.     Advanced Text Editor

  4. extra/libkate 0.4.1-6 [installed]

  5.     A karaoke and text codec for embedding in ogg

  6. extra/libtiger 0.3.4-5 [installed]

  7.     A rendering library for Kate streams using Pango and Cairo

  8. extra/ttf-cheapskate 2.0-12

  9.     TTFonts collection from dustimo.com

  10. community/haskell-cheapskate 0.1.1-100

  11.     Experimental markdown processor.

Arch 也使用和別的包管理器類似的軟體倉庫。在上面的輸出中,搜尋結果前面有標明它是從哪個倉庫裡搜尋到的(這裡是 extra/ 和 community/)。同 Red Hat 和 Debian 系統一樣,Arch 依靠使用者將軟體倉庫的資訊加入到一個特定的檔案裡:/etc/pacman.conf。下麵的例子非常接近一個倉庫系統。筆者還開啟了 [multilib] 倉庫來支援 Steam:

  1. [options]

  2. Architecture = auto

  3. Color

  4. CheckSpace

  5. SigLevel    = Required DatabaseOptional

  6. LocalFileSigLevel = Optional

  7. [core]

  8. Include = /etc/pacman.d/mirrorlist

  9. [extra]

  10. Include = /etc/pacman.d/mirrorlist

  11. [community]

  12. Include = /etc/pacman.d/mirrorlist

  13. [multilib]

  14. Include = /etc/pacman.d/mirrorlist

你也可以在 pacman.conf 裡指定具體的 URL。這個功能可以用來確保在某一時刻所有的包來自一個確定的地方,比如,如果一個安裝包存在嚴重的功能缺陷並且很不幸它恰好還有幾個包依賴,你能及時回滾到一個安全點,如果你已經在 pacman.conf 裡加入了具體的 URL 的話,你就用用這個命令降級你的系統。

  1. [core]

  2. Server=https://archive.archlinux.org/repos/2017/12/22/$repo/os/$arch

和 Debian 系統一樣,Arch 並不會自動更新它的本地倉庫。你可以用下麵的命令來掃清包管理器的資料庫:

  1. user@arch ~ $ sudo pacman -Sy

  2. :: Synchronizing package databases...

  3.  core                                                                     130.2 KiB   851K/s 00:00 [##########################################################] 100%

  4.  extra                                                                   1645.3 KiB  2.69M/s 00:01 [##########################################################] 100%

  5.  community                                                                  4.5 MiB  2.27M/s 00:02 [##########################################################] 100%

  6.  multilib is up to date

你可以看到在上述的輸出中,pacman 認為 multilib 包資料庫是更新到最新狀態的。如果你認為這個結果不正確的話,你可以強制執行掃清:pacman -Syy。如果你想升級你的整個系統的話(不包括從 AUR 安裝的包),你可以執行 pacman -Syu

  1. user@arch ~ $ sudo pacman -Syu

  2. :: Synchronizing package databases...

  3.  core is up to date

  4.  extra is up to date

  5.  community is up to date

  6.  multilib is up to date

  7. :: Starting full system upgrade...

  8. resolving dependencies...

  9. looking for conflicting packages...

  10. Packages (45) ceph-13.2.0-2  ceph-libs-13.2.0-2  debootstrap-1.0.105-1  guile-2.2.4-1  harfbuzz-1.8.2-1  harfbuzz-icu-1.8.2-1  haskell-aeson-1.3.1.1-20

  11.               haskell-attoparsec-0.13.2.2-24  haskell-tagged-0.8.6-1  imagemagick-7.0.8.4-1  lib32-harfbuzz-1.8.2-1  lib32-libgusb-0.3.0-1  lib32-systemd-239.0-1

  12.               libgit2-1:0.27.2-1  libinput-1.11.2-1  libmagick-7.0.8.4-1  libmagick6-6.9.10.4-1  libopenshot-0.2.0-1  libopenshot-audio-0.1.6-1  libosinfo-1.2.0-1

  13.               libxfce4util-4.13.2-1  minetest-0.4.17.1-1  minetest-common-0.4.17.1-1  mlt-6.10.0-1  mlt-python-bindings-6.10.0-1  ndctl-61.1-1  netctl-1.17-1

  14.               nodejs-10.6.0-1  

  15. Total Download Size:      2.66 MiB

  16. Total Installed Size:   879.15 MiB

  17. Net Upgrade Size:      -365.27 MiB

  18. :: Proceed with installation? [Y/n]

在前面提到的降級系統的情景中,你可以執行 pacman -Syyuu 來強行降級系統。你必須重視這一點:雖然在大多數情況下這不會引起問題,但是這種可能性還是存在,即降級一個包或幾個包將會引起級聯傳播的失敗並會將你的系統處於不一致的狀態(LCTT 譯註:即系統進入無法正常使用的狀態),請務必小心!

執行 pacman -S kate 來安裝一個包。

  1. user@arch ~ $ sudo pacman -S kate

  2. resolving dependencies...

  3. looking for conflicting packages...

  4. Packages (7) editorconfig-core-c-0.12.2-1  kactivities-5.47.0-1  kparts-5.47.0-1  ktexteditor-5.47.0-2  syntax-highlighting-5.47.0-1  threadweaver-5.47.0-1

  5.              kate-18.04.2-2

  6. Total Download Size:   10.94 MiB

  7. Total Installed Size:  38.91 MiB

  8. :: Proceed with installation? [Y/n]

你可以執行 pacman -R kate 來刪除一個包。這將會只刪除這個包自身而不會去刪除它的依賴包。

  1. user@arch ~ $ sudo pacman -S kate

  2. checking dependencies...

  3. Packages (1) kate-18.04.2-2

  4. Total Removed Size:  20.30 MiB

  5. :: Do you want to remove these packages? [Y/n]

如果你想刪除沒有被其它包依賴的包,你可以執行 pacman -Rs

  1. user@arch ~ $ sudo pacman -Rs kate

  2. checking dependencies...

  3. Packages (7) editorconfig-core-c-0.12.2-1  kactivities-5.47.0-1  kparts-5.47.0-1  ktexteditor-5.47.0-2  syntax-highlighting-5.47.0-1  threadweaver-5.47.0-1

  4.              kate-18.04.2-2

  5. Total Removed Size:  38.91 MiB

  6. :: Do you want to remove these packages? [Y/n]

在筆者看來,Pacman 是搜尋一個指定實用程式中的包名的最齊全的工具。如上所示,YUM 和 APT 都依賴於‘路徑’去搜索到有用的結果,而 Pacman 則做了一些智慧的猜測,它會去猜測你最有可能想搜尋的包。

  1. user@arch ~ $ sudo pacman -Fs updatedb

  2. core/mlocate 0.26.git.20170220-1

  3.     usr/bin/updatedb

  4. user@arch ~ $ sudo pacman -Fs kate

  5. extra/kate 18.04.2-2

  6.     usr/bin/kate

使用 AUR

有很多流行的 AUR 包管理器助手。其中 yaourt 和 pacaur 頗為流行。不過,這兩個專案已經被 Arch Wiki[20] 列為“不繼續開發以及有已知的問題未解決”。因為這個原因,這裡直接討論 aurman,除了會搜尋 AUR 以及包含幾個有幫助的(其實很危險)的選項之外,它的工作機制和 pacman 極其類似。從 AUR 安裝一個包將會初始化包維護者的構建指令碼。你將會被要求輸入幾次授權以便讓程式繼續進行下去(為了簡短起見,筆者截斷了輸出)。

  1. aurman -S telegram-desktop-bin

  2. ~~ initializing aurman...

  3. ~~ the following packages are neither in known repos nor in the aur

  4. ...

  5. ~~ calculating solutions...

  6. :: The following 1 package(s) are getting updated:

  7.    aur/telegram-desktop-bin  1.3.0-1  ->  1.3.9-1

  8. ?? Do you want to continue? Y/n: Y

  9. ~~ looking for new pkgbuilds and fetching them...

  10. Cloning into 'telegram-desktop-bin'...

  11. remote: Counting objects: 301, done.

  12. remote: Compressing objects: 100% (152/152), done.

  13. remote: Total 301 (delta 161), reused 286 (delta 147)

  14. Receiving objects: 100% (301/301), 76.17 KiB | 639.00 KiB/s, done.

  15. Resolving deltas: 100% (161/161), done.

  16. ?? Do you want to see the changes of telegram-desktop-bin? N/y: N

  17. [sudo] password for user:

  18. ...

  19. ==> Leaving fakeroot environment.

  20. ==> Finished making: telegram-desktop-bin 1.3.9-1 (Thu 05 Jul 2018 11:22:02 AM EDT)

  21. ==> Cleaning up...

  22. loading packages...

  23. resolving dependencies...

  24. looking for conflicting packages...

  25. Packages (1) telegram-desktop-bin-1.3.9-1

  26. Total Installed Size:  88.81 MiB

  27. Net Upgrade Size:       5.33 MiB

  28. :: Proceed with installation? [Y/n]

依照你所安裝的包的複雜性程度的高低,有時你將會被要求給出進一步的輸入,為了避免這些反覆的輸入,aurman 允許你使用 --noconfirm 和 --noedit 選項。這相當於說“接受所有的預定設定,並相信包管理器不會幹壞事”。使用這兩個選項時請務必小心!!,雖然這些選項本身不太會破壞你的系統,你也不能盲目的接受他人的指令碼程式。

總結

這篇文章當然只能觸及包管理器的皮毛。還有很多別的包管理器筆者沒有在這篇文章裡談及。有些 Linux 釋出版,如 Ubuntu 或 Elementary OS,已經在圖形版的包管理器的開發上有了長遠的進展。

如果你對包管理器的更高階功能有進一步的興趣,請在評論區留言,筆者很樂意進一步的寫一寫相關的文章。

附錄

  1. # search for packages

  2. yum search <package>

  3. dnf search <package>

  4. zypper search <package>

  5. apt-cache search <package>

  6. apt search <package>

  7. pacman -Ss <package>

  8. # install packages

  9. yum install <package>

  10. dnf install <package>

  11. zypper install <package>

  12. apt-get install <package>

  13. apt install <package>

  14. pacman -Ss <package>

  15. # update package database, not required by yum, dnf and zypper

  16. apt-get update

  17. apt update

  18. pacman -Sy

  19. # update all system packages

  20. yum update

  21. dnf update

  22. zypper update

  23. apt-get upgrade

  24. apt upgrade

  25. pacman -Su

  26. # remove an installed package

  27. yum remove <package>

  28. dnf remove <package>

  29. apt-get remove <package>

  30. apt remove <package>

  31. pacman -R <package>

  32. pacman -Rs <package>

  33. # search for the package name containing specific file or folder

  34. yum whatprovides *<binary>

  35. dnf whatprovides *<binary>

  36. zypper what-provides <binary>

  37. zypper search --provides <binary>

  38. apt-file search <binary>

  39. pacman -Sf <binary>


via: https://opensource.com/article/18/7/evolution-package-managers

作者:Steve Ovens[22] 選題:lujun9972 譯者:DavidChenLiang 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

贊(0)

分享創造快樂

© 2024 知識星球   網站地圖