Linux中國

包管理器的進化

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

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

那麼在包管理器出現之前在 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 所使用的格式。

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

軟體倉庫到底是什麼?

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

在 Arch Linux 下使用 aurman

user@arch ~ $  aurman -Ss kate

extra/kate 18.04.2-2 (kde-applications kdebase)
    Advanced Text Editor
aur/kate-root 18.04.0-1 (11, 1.139399)
    Advanced Text Editor, patched to be able to run as root
aur/kate-git r15288.15d26a7-1 (1, 1e-06)
    An advanced editor component which is used in numerous KDE applications requiring a text editing component

在 CentOS 7 下使用 yum

[user@centos ~]$ yum search kate

kate-devel.x86_64 : Development files for kate
kate-libs.x86_64 : Runtime files for kate
kate-part.x86_64 : Kate kpart plugin

在 Ubuntu 下使用 apt

user@ubuntu ~ $ apt search kate
Sorting... Done
Full Text Search... Done

kate/xenial 4:15.12.3-0ubuntu2 amd64
  powerful text editor

kate-data/xenial,xenial 4:4.14.3-0ubuntu4 all
  shared data files for Kate text editor

kate-dbg/xenial 4:15.12.3-0ubuntu2 amd64
  debugging symbols for Kate

kate5-data/xenial,xenial 4:15.12.3-0ubuntu2 all
  shared data files for Kate text editor

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

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

基於 PRM 包格式的包管理器

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

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

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

使用 YUM

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

[local_base]
name=Base CentOS  (local)
baseurl=http://7-repo.apps.home.local/yum-repo/7/
enabled=1
gpgcheck=0

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

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

[user@centos ~]$ sudo yum update
Loaded plugins: fastestmirror, product-id, search-disabled-repos, subscription-manager
local_base                             | 3.6 kB  00:00:00    
local_epel                             | 2.9 kB  00:00:00    
local_rpm_forge                        | 1.9 kB  00:00:00    
local_updates                          | 3.4 kB  00:00:00    
spideroak-one-stable                   | 2.9 kB  00:00:00    
zfs                                    | 2.9 kB  00:00:00    
(1/6): local_base/group_gz             | 166 kB  00:00:00    
(2/6): local_updates/primary_db        | 2.7 MB  00:00:00    
(3/6): local_base/primary_db           | 5.9 MB  00:00:00    
(4/6): spideroak-one-stable/primary_db |  12 kB  00:00:00    
(5/6): local_epel/primary_db           | 6.3 MB  00:00:00    
(6/6): zfs/x86_64/primary_db           |  78 kB  00:00:00    
local_rpm_forge/primary_db             | 125 kB  00:00:00    
Determining fastest mirrors
Resolving Dependencies
--> Running transaction check

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

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

[user@centos ~]$ yum search kate

artwiz-aleczapka-kates-fonts.noarch : Kates font in Artwiz family
ghc-highlighting-kate-devel.x86_64 : Haskell highlighting-kate library development files
kate-devel.i686 : Development files for kate
kate-devel.x86_64 : Development files for kate
kate-libs.i686 : Runtime files for kate
kate-libs.x86_64 : Runtime files for kate
kate-part.i686 : Kate kpart plugin

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

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

[user@centos ~]$ sudo yum install updatedb
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
No package updatedb available.
Error: Nothing to do

你可以搜索實用程序來自哪個包:

[user@centos ~]$ yum whatprovides *updatedb
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile

bacula-director-5.2.13-23.1.el7.x86_64 : Bacula Director files
Repo        : local_base
Matched from:
Filename    : /usr/share/doc/bacula-director-5.2.13/updatedb

mlocate-0.26-8.el7.x86_64 : An utility for finding files by name
Repo        : local_base
Matched from:
Filename    : /usr/bin/updatedb

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

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

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

使用 Zypper

Zypper 是用來管理 RPM 包的另外一個包管理器。這個包管理器主要用於 SUSE(和 openSUSE),在MeeGoSailfish OSTizen 上也有使用。它最初開發於 2006 年,已經經過了多次迭代。除了作為系統管理工具 YaST 的後端和有些用戶認為它比 YUM 要快之外也沒有什麼好多說的。

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

zypper search kate
zypper update
zypper install kate
zypper remove kate

主要的不同來自於使用 Zypper 的系統在添加軟體倉庫的做法上,Zypper 使用包管理器本身來添加軟體倉庫。最通用的方法是通過一個 URL,但是 Zypper 也支持從倉庫文件里導入。

suse:~ # zypper addrepo http://download.videolan.org/pub/vlc/SuSE/15.0 vlc
Adding repository 'vlc' [done]
Repository 'vlc' successfully added

Enabled     : Yes
Autorefresh : No
GPG Check   : Yes
URI         : http://download.videolan.org/pub/vlc/SuSE/15.0
Priority    : 99

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

suse:~ # zypper removerepo vlc
Removing repository 'vlc' ...................................[done]
Repository 'vlc' has been removed.

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

suse:~ # zypper repos
Repository priorities are without effect. All enabled repositories share the same priority.

#  | Alias                     | Name                                    | Enabled | GPG Check | Refresh
---|---------------------------|-----------------------------------------|---------|-----------|----- 1 | repo-debug                | openSUSE-Leap-15.0-Debug                | No      | ----      | ----  
 2 | repo-debug-non-oss        | openSUSE-Leap-15.0-Debug-Non-Oss        | No      | ----      | ----  
 3 | repo-debug-update         | openSUSE-Leap-15.0-Update-Debug         | No      | ----      | ----  
 4 | repo-debug-update-non-oss | openSUSE-Leap-15.0-Update-Debug-Non-Oss | No      | ----      | ----  
 5 | repo-non-oss              | openSUSE-Leap-15.0-Non-Oss              | Yes     | ( p) Yes  | Yes    
 6 | repo-oss                  | openSUSE-Leap-15.0-Oss                  | Yes     | ( p) Yes  | Yes    

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

localhost:~ # zypper what-provides kate
Command 'what-provides' is replaced by 'search --provides --match-exact'.
See 'help search' for all available options.
Loading repository data...
Reading installed packages...

S  | Name | Summary              | Type      
---|------|----------------------|---------i+ | Kate | Advanced Text Editor | application
i  | kate | Advanced Text Editor | package  

YUM、DNF 和 Zypper 三劍客擁有的功能比在這篇小文里討論的要多得多,請查看官方文檔來得到更深入的信息。

基於 Debian 的包管理器

作為一個現今仍在被積極維護的最古老的 Linux 發行版之一,Debian 的包管理系統和基於 RPM 的系統的包管理系統非常類似。它使用擴展名為 「.deb」 的包,這種文件能被一個叫做 dpkg 的工具所管理。dpgkMARKDOWN_HASH455385f5d8493917cb83541909b7cfa9MARKDOWNHASH 非常相似,它被設計成用來管理在存在於本地(硬碟)的包。它不會去做包依賴關係解析(它會做依賴關係檢查,不過僅此而已),而且在同遠程軟體倉庫交互上也並無可靠的途徑。為了提高用戶體驗並便於使用,Debian 項目開始了一個軟體項目:Deity,最終這個代號被丟棄並改成了現在的 <a href="https://en.wikipedia.org/wiki/APT(Debian)"> 高級打包工具 Advanced Pack Tool (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 發行版統一的待遇,筆者將會只介紹命令行的選項。 要想不直接編輯文件內容而直接增加軟體倉庫的話,可以用如下命令:

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)的話,你可以用如下的辦法:

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

注意: Debian 原生並不支持本地 PPA 。

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

user@ubuntu:~$ sudo apt-get update
Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
Hit:2 http://APT.spideroak.com/ubuntu-spideroak-hardy release InRelease
Hit:3 http://ca.archive.ubuntu.com/ubuntu xenial InRelease
Get:4 http://ca.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]              
Get:5 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages [517 kB]
Get:6 http://security.ubuntu.com/ubuntu xenial-security/main i386 Packages [455 kB]      
Get:7 http://security.ubuntu.com/ubuntu xenial-security/main Translation-en [221 kB]    
...

Fetched 6,399 kB in 3s (2,017 kB/s)                                          
Reading package lists... Done

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

user@ubuntu:~$ apt-cache search kate
aterm-ml - Afterstep XVT - a VT102 emulator for the X window system
frescobaldi - Qt4 LilyPond sheet music editor
gitit - Wiki engine backed by a git or darcs filestore
jedit - Plugin-based editor for programmers
kate - powerful text editor
kate-data - shared data files for Kate text editor
kate-dbg - debugging symbols for Kate
katepart - embeddable text editor component

要安裝 kate,簡單的運行下面的命令:

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

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

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

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

如: 用 dpkg

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

或者: apt-file

user@ubuntu:~$ sudo apt-get install apt-file -y
user@ubuntu:~$ sudo apt-file update
user@ubuntu:~$ apt-file search kate

yum whatprovides 不同的是,apt-file search 的問題是因為自動添加了通配符搜索而輸出過於詳細(除非你知道確切的路徑),最終在結果里包括了所有包含有 「kate」 的結果。

kate: /usr/bin/kate
kate: /usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/katebacktracebrowserplugin.so
kate: /usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/katebuildplugin.so
kate: /usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/katecloseexceptplugin.so
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 使用稱為 packman 的包管理器。和 .deb 以及 .rpm 不同,它使用更為傳統的 LZMA2 壓縮包形式 .tar.xz 。這可以使 Arch Linux 包能夠比其它形式的壓縮包(如 gzip)有更小的尺寸。自從 2002 年首次發布以來, pacman 一直在穩定發布和改善。使用它最大的好處之一是它支持 Arch Build System,這是一個從源代碼級別構建包的構建系統。該構建系統藉助一個叫 PKGBUILD 的文件,這個文件包含了如版本號、發布號、依賴等等的元數據,以及一個為編譯遵守 Arch Linux 需求的包所需要的帶有必要的編譯選項的腳本。而編譯的結果就是前文所提的被 pacman 所使用的 .tar.xz 的文件。

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

使用 pacman 和官方軟體倉庫

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

user@arch ~ $ pacman -Ss kate

extra/kate 18.04.2-2 (kde-applications kdebase)
    Advanced Text Editor
extra/libkate 0.4.1-6 [installed]
    A karaoke and text codec for embedding in ogg
extra/libtiger 0.3.4-5 [installed]
    A rendering library for Kate streams using Pango and Cairo
extra/ttf-cheapskate 2.0-12
    TTFonts collection from dustimo.com
community/haskell-cheapskate 0.1.1-100
    Experimental markdown processor.

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

[options]
Architecture = auto

Color
CheckSpace

SigLevel    = Required DatabaseOptional
LocalFileSigLevel = Optional

[core]
Include = /etc/pacman.d/mirrorlist

[extra]
Include = /etc/pacman.d/mirrorlist

[community]
Include = /etc/pacman.d/mirrorlist

[multilib]
Include = /etc/pacman.d/mirrorlist

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

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

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

user@arch ~ $ sudo pacman -Sy

:: Synchronizing package databases...
 core                                                                     130.2 KiB   851K/s 00:00 [##########################################################] 100%
 extra                                                                   1645.3 KiB  2.69M/s 00:01 [##########################################################] 100%
 community                                                                  4.5 MiB  2.27M/s 00:02 [##########################################################] 100%
 multilib is up to date

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

user@arch ~ $ sudo pacman -Syu

:: Synchronizing package databases...
 core is up to date
 extra is up to date
 community is up to date
 multilib is up to date
:: Starting full system upgrade...
resolving dependencies...
looking for conflicting packages...

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
              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
              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
              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
              nodejs-10.6.0-1  

Total Download Size:      2.66 MiB
Total Installed Size:   879.15 MiB
Net Upgrade Size:      -365.27 MiB

:: Proceed with installation? [Y/n]

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

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

user@arch ~ $ sudo pacman -S kate

resolving dependencies...
looking for conflicting packages...

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
             kate-18.04.2-2

Total Download Size:   10.94 MiB
Total Installed Size:  38.91 MiB

:: Proceed with installation? [Y/n]

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

user@arch ~ $ sudo pacman -S kate

checking dependencies...

Packages (1) kate-18.04.2-2

Total Removed Size:  20.30 MiB

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

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

user@arch ~ $ sudo pacman -Rs kate

checking dependencies...

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
             kate-18.04.2-2

Total Removed Size:  38.91 MiB

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

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

user@arch ~ $ sudo pacman -Fs updatedb
core/mlocate 0.26.git.20170220-1
    usr/bin/updatedb

user@arch ~ $ sudo pacman -Fs kate
extra/kate 18.04.2-2
    usr/bin/kate
使用 AUR

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

aurman -S telegram-desktop-bin
~~ initializing aurman...
~~ the following packages are neither in known repos nor in the aur
...
~~ calculating solutions...

:: The following 1 package(s) are getting updated:
   aur/telegram-desktop-bin  1.3.0-1  ->  1.3.9-1

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

~~ looking for new pkgbuilds and fetching them...
Cloning into &apos;telegram-desktop-bin&apos;...

remote: Counting objects: 301, done.
remote: Compressing objects: 100% (152/152), done.
remote: Total 301 (delta 161), reused 286 (delta 147)
Receiving objects: 100% (301/301), 76.17 KiB | 639.00 KiB/s, done.
Resolving deltas: 100% (161/161), done.
?? Do you want to see the changes of telegram-desktop-bin? N/y: N

[sudo] password for user:

...
==> Leaving fakeroot environment.
==> Finished making: telegram-desktop-bin 1.3.9-1 (Thu 05 Jul 2018 11:22:02 AM EDT)
==> Cleaning up...
loading packages...
resolving dependencies...
looking for conflicting packages...

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

Total Installed Size:  88.81 MiB
Net Upgrade Size:       5.33 MiB

:: Proceed with installation? [Y/n]

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

總結

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

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

附錄

# search for packages
yum search <package>
dnf search <package>
zypper search <package>
apt-cache search <package>
apt search <package>
pacman -Ss <package>

# install packages
yum install <package>
dnf install <package>
zypper install <package>
apt-get install <package>
apt install <package>
pacman -Ss <package>

# update package database, not required by yum, dnf and zypper
apt-get update
apt update
pacman -Sy

# update all system packages
yum update
dnf update
zypper update
apt-get upgrade
apt upgrade
pacman -Su

# remove an installed package
yum remove <package>
dnf remove <package>
apt-get remove <package>
apt remove <package>
pacman -R <package>
pacman -Rs <package>

# search for the package name containing specific file or folder
yum whatprovides *<binary>
dnf whatprovides *<binary>
zypper what-provides <binary>
zypper search --provides <binary>
apt-file search <binary>
pacman -Sf <binary>

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

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

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


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國