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
標識,這些標識能為你的系統最佳化最終生成出來的二進位制可執行檔案。在計算機世界的早期,這些最佳化是非常重要的,因為彼時的計算機硬體正在為了跟上軟體迅速的發展而疲於奔命。今日今時,編譯標識變得更加通用而不是為了最佳化哪些具體的硬體型號,這得益於現代硬體和現代軟體相比已經變得成本低廉,唾手可得。
最後,在 make
完成之後, 你需要執行 make install
(或 sudo make install
)(LCTT 譯註:依賴於你的使用者許可權) 來“真正”將這個軟體安裝到你的系統上。可以想象,為你係統上的每一個軟體都執行上述的流程將是多麼無聊費時,更不用說如果更新一個已經安裝的軟體將會多複雜,多麼需要精力投入。(LCTT 譯註:上述流程也稱 CMMI 安裝, 即Configure、Make、Make Install)
那麼軟體包是什麼?
軟體包(LCTT 譯註:下文簡稱“包”)這個概念是用來解決在軟體安裝、升級過程中的複雜性的。包將軟體安裝升級中需要的多個資料檔案合併成一個單獨的檔案,這將便於傳輸和(透過壓縮檔案來)減小儲存空間(LCTT 譯註:減少儲存空間這一點在現在已經不再重要),包中的二進位制可執行檔案已根據開發者所選擇的編譯標識預編譯。包本身包括了所有需要的元資料,如軟體的名字、軟體的說明、版本號,以及要執行這個軟體所需要的依賴包等等。
不同流派的 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[2] 版本(用於 企業級發行版)和 DNF[3](用於社群版)就融合了好幾個開源專案來提供它們現在的功能。
Red Hat 最初使用的包管理器,被稱為 RPM[4](紅帽包管理器),時至今日還在使用著。不過,它的主要作用是安裝本地的 RPM 包,而不是去在軟體倉庫搜尋軟體。後來開發了一個叫 up2date
的包管理器,它被用來通知使用者包的最新更新,還能讓使用者在遠端倉庫裡搜尋軟體並便捷的安裝軟體的依賴。儘管這個包管理器盡職盡責,但一些社群成員還是感覺 up2date
有著明顯的不足。
現在的 YUM 來自於好幾個不同社群的努力。1999-2001 年一群在 Terra Soft Solution 的夥計們開發了黃狗更新器(YUP),將其作為 Yellow Dog Linux[5] 圖形安裝器的後端。杜克大學喜歡這個主意就決定去增強它的功能,它們開發了黃狗更新器--修改版[6](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[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 非常相像。它被用來搜尋、更新、安裝和刪除包,簡單的使用命令如下:
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
的工具所管理。dpgk
同 rpm
非常相似,它被設計成用來管理在存在於本地(硬碟)的包。它不會去做包依賴關係解析(它會做依賴關係檢查,不過僅此而已),而且在同遠端軟體倉庫互動上也並無可靠的途徑。為了提高使用者體驗並便於使用,Debian 專案開始了一個軟體專案:Deity,最終這個代號被丟棄並改成了現在的 高階打包工具[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 發行版統一的待遇,筆者將會只介紹命令列的選項。 要想不直接編輯檔案內容而直接增加軟體倉庫的話,可以用如下命令:
user@ubuntu:~$ sudo apt-add-repository "deb http://APT.spideroak.com/ubuntu-spideroak-hardy/ release restricted"
這個命令將會在 /etc/apt/sources.list.d
目錄裡建立一個 spideroakone.list
檔案。顯而易見,檔案裡的內容依賴於所新增的軟體倉庫,如果你想加一個個人軟體包存檔(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-get
、apt-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 使用者倉庫[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
)這個標識位。例如:
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 包管理器助手。其中 yaourt
和 pacaur
頗為流行。不過,這兩個專案已經被 Arch Wiki[20] 列為“不繼續開發以及有已知的問題未解決”。因為這個原因,這裡直接討論 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 'telegram-desktop-bin'...
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[22] 選題:lujun9972 譯者:DavidChenLiang 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出