作為后端開發,平時在看博客以及學習時,經常遇到需要在Linux系統上進行部署、軟件安裝等操作,也遇到過很多安裝命令,比如yum
、apt-get
、dpkg
等等,這些命令有什么區別?又有什么聯系?獨立開發時,如何確定使用哪一個?下面來詳細說一說。下述內容出自《Linux命令行大全》William E.Shotts,jr著。
軟件包系統
不同的Linux發行版使用的時不同的軟件包系統,並且原則上適用於一種的發行版的軟件包和其他版本是不兼容的。大多數的Linux系統不外乎兩種軟件包:
- Debian
.deb
技術
- Red Hat
.rpm
技術
此處忽略Gentoo、Slackware和Foresight等
下面是兩個軟件包系統和其對應的軟件包系統:
軟件包系統 | 發行版本(部分) |
---|---|
Debian類 | Debian、Ubuntu、Xandros、Linspire |
Red Hat | Fedora、CentOS、Red Hat Enterprise Linux、openSUSE、Mandriva、PCLinuxOS |
可見,我們常用的CentOS、Ubuntu正好屬於兩個不同的軟件包系統,正因為如此,后面我們會看到一些很眼熟的軟件安裝命令。
軟件
首先是軟件包,包文件是組成軟件包系統的基本軟件單元,它是由組成軟件包的文件壓縮成的文件集。這里面可能包含大量的程序以及相關的數據,或者安裝腳本等等。包文件一般由開發者維護。成千上萬的軟件包集中起來就形成了庫。最后是最重要的依賴關系,幾乎沒有哪個程序是獨立的,程序之間相互依賴彼此,以完成既定工作。比如輸入輸出的工作就是由多個程序共享的例程執行。這些例程存儲在共享庫里面,共享庫里面的文件為多個程序提供必須的服務。如果一個軟件包需要共享庫之類的共享資源,說明對其有依賴性。顯然共享庫的存在就是為了解決多個程序都需要使用某個例程,如果安裝時每個都帶着這個必須的例程安裝,那一定會出現安裝包過大的問題。因此解決依賴性是一個很重要的能力,而現代軟件包管理系統都提供依賴性解決策略。
高級和低級軟件包工具
軟件包管理系統通常包含兩類工具:
- 執行安裝、刪除軟件包文件等任務的低級工具;
- 進行元數據搜索及依賴性解決的高級工具。
下面是不同發行版本使用的高級、低級軟件包系統工具
發行版本 | 低級工具 | 高級工具 |
---|---|---|
Debian 類(Ubuntu等) | dpkg | apt-get、aptitude |
Fedora、CentOS、Red Hat Enterprise Linux | rpm | yum |
常見軟件包管理任務
下面介紹一些常見的軟件包管理操作,另外低級工具也支持軟件包的創建(但我不會(是指我,不是指作者))。下述內容中package_name
指軟件包的名稱,package_file
則是指包含在該軟件包中的文件名。
在庫里查找軟件包
使用高級工具來搜索庫元數據時,可以根據包文件名或其描述來查找該包:
系統類型 | 命令行 |
---|---|
Debian 系統 | apt-get apt-cache search search_string |
Red Hat 系統 | yum search search_string |
舉例來說,在Red Hat系統的yum 庫中搜索emac文本編輯器的代碼如下:
yum search emacs
查找展示:
[asuka@localhost ~]$ yum search emacs
CentOS-8 - AppStream 3.4 MB/s | 8.9 MB 00:02
CentOS-8 - Base 1.6 MB/s | 7.4 MB 00:04
CentOS-8 - Extras 2.9 kB/s | 10 kB 00:03
=================================== Name & Summary Matched: emacs ====================================
emacs.x86_64 : GNU Emacs text editor
emacs-common.x86_64 : Emacs common files
emacs-filesystem.noarch : Emacs filesystem layout
emacs-filesystem.noarch : Emacs filesystem layout
emacs-nox.x86_64 : GNU Emacs text editor without X support
pinentry-emacs.x86_64 : Passphrase/PIN entry dialog based on emacs
emacs-terminal.noarch : A desktop menu item for GNU Emacs terminal.
emacs-lucid.x86_64 : GNU Emacs text editor with LUCID toolkit X support
安裝庫中的軟件包
高級工具允許從庫中下載、安裝軟件包,同時安裝所有的依賴包
系統類型 | 命令行 |
---|---|
Debian 系統 | apt-get update apt-get install package_name |
Red Hat 系統 | yum install package_name |
例如,在Debian系統下安裝命令為:
-
先更新:
apt-get update
-
再安裝:
apt-get install emacs
jungle@EVANGELION-01:~$ sudo apt-get install emacs
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libllvm11
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
emacs-bin-common emacs-common emacs-el emacs-gtk gsfonts imagemagick-6-common libfftw3-double3
liblqr-1-0 libmagickcore-6.q16-6 libmagickwand-6.q16-6
Suggested packages:
mailutils emacs-common-non-dfsg libfftw3-bin libfftw3-dev libmagickcore-6.q16-6-extra
The following NEW packages will be installed:
emacs emacs-bin-common emacs-common emacs-el emacs-gtk gsfonts imagemagick-6-common
libfftw3-double3 liblqr-1-0 libmagickcore-6.q16-6 libmagickwand-6.q16-6
0 upgraded, 11 newly installed, 0 to remove and 16 not upgraded.
Need to get 38.8 MB of archives.
After this operation, 144 MB of additional disk space will be used.
Do you want to continue? [Y/n]
可見這里有安裝依賴的說明。為后續講解刪除軟件包,此處就先安裝上。
安裝軟件包文件中的軟件包
如果我們僅有一個軟件包文件,那么可以使用低級工具進行安裝,這樣的安裝顯然並不安裝依賴關系。
系統類型 | 命令行 |
---|---|
Debian 系統 | dpkg --install package_file |
Red Hat 系統 | rpm -i package_file |
由於我手頭並沒有現成的軟件包文件,下述例子出自書中:
rpm -i emacs-22.1-7.fc7-i386.rpm
顯然Red Hat 體系下的軟件包后綴為.rpm
。
注意,由於是采用低級工具安裝,所以並不會解決依賴問題,一旦安裝過程缺少依賴包,rpm就會拋出錯誤后退出。
刪除軟件包
卸載軟件既可以使用高級工具也可以使用低級工具,高級工具的命令如下
系統類型 | 命令行 |
---|---|
Debian 系統 | apt-get rmove package_name |
Red Hat 系統 | rpm erase package_name |
下面卸載上文安裝的emacs:
apt-get remove emacs
jungle@EVANGELION-01:~$ sudo apt-get remove emacs
...
dpkg: warning: files list file for package 'libgeocode-glib0:amd64' missing; assuming package has no files currently installed
dpkg: warning: files list file for package 'laptop-detect' missing; assuming package has no files currently installed
...
(Reading database ... 1402 files and directories currently installed.)
Removing emacs (1:26.3+1-1ubuntu2) ...
更新庫中的軟件包
系統類型 | 命令行 |
---|---|
Debian 系統 | apt-get update ; apt-get upgrade |
Red Hat 系統 | rpm update |
過於直白,此處不再演示。
更新軟件包文件中的軟件包
與上文安裝相對應:
系統類型 | 命令行 |
---|---|
Debian 系統 | dpkg --install package_file |
Red Hat 系統 | rpm -U package_file |
當然此處的文件都是新版。
列出已安裝的軟件包列表
系統類型 | 命令行 |
---|---|
Debian 系統 | dpkg --list |
Red Hat 系統 | rpm -qa |
由於內容過長,為了方便查看,可以將輸出用管道交由less
命令查看,完成后按q
退出:
rpm -qa | less
---------------
dpkg --list | less
判斷軟件包是否安裝
系統類型 | 命令行 |
---|---|
Debian 系統 | dpkg --status package_name |
Red Hat 系統 | rpm -q package_name |
dpkg --status emacs
dpkg-query: package 'emacs' is not installed and no information is available
Use dpkg --info (= dpkg-deb --info) to examine archive files.
顯示已安裝軟件包的相關信息
在已知已安裝軟件包名稱的情況下,可以使用如下命令查看描述信息
系統類型 | 命令行 |
---|---|
Debian 系統 | apt-cache show package_name |
Red Hat | yum info package_name |
此處展示vim
的安裝信息:
apt-cache show vim | less
----------------------------
Package: vim
Architecture: amd64
Version: 2:8.1.2269-1ubuntu5
Priority: optional
Section: editors
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Vim Maintainers <pkg-vim-maintainers@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 3038
Provides: editor
...
(END)
查看某具體文件由哪個安裝包得到
系統類型 | 命令行 |
---|---|
Debian 系統 | dpkg --search file_name |
Red Hat | rpm -qf file_name |
同樣的我們來檢查一下vim
:
[asuka@localhost ~]$ rpm -qf /usr/bin/vim
vim-enhanced-8.0.1763-10.el8.x86_64
結語
僅做學習交流使用,不足之處還請諒解,如有建議還望補充,和平交流,共同進步。
本文發布於B站專欄、博客園。