Linux 之旅 22:使用RPM与YUM安装软件
图源:pexels
在Linux 之旅 21:编译安装软件中我们介绍了怎么通过源码来编译和安装软件,在以前,这的确是Linux上主要的安装软件的方式,但现在已经不多见了,在新的Linux发行版中,主要是通过RPM或YUM来安装软件。
软件管理简介
RPM与DPKG
虽然Linux的创始人一直所提倡的是“Free Software”,即自由软件。鼓励软件的发行商随软件本体一起发布源码,这样就算是不适应某种软件平台,或者是没有所需的功能,依靠社区的力量还是可以通过修改源码后重新编译来满足开发者们的需求的。但这样有一个问题,即增加了Linux上安装软件的门槛和难度,至少普通用户是很难搞懂怎么下载解压源码和进行编译安装的。更别提要修改配置文件或者进行卸载的时候根本无从查找软件的安装目录之类的麻烦事了。
所以就产生了一种“软件包管理”(Software Package Manager)的技术,这种技术有点像是Windows上的更新卸载管理程序和软件安装包的效果。
SPM的实现原理也不难理解,虽然说经过源码编译后的软件本体是和操作系统环境以及硬件平台直接相关的,不同的操作系统环境和硬件平台编译后的软件是不能互换的,但是换个思路,如果我们保持一样版本的操作系统,一样的硬件平台(通常是x86_64),那是不是编译一次就可以所有同类的设备可以通用了?
SPM正是这样做的,发行版的厂商会针对自己的发行版,将一些常用的工具在使用主流硬件平台(x86_64)的该发行版上进行编译,然后打包分发给使用该发行版的客户机,客户机就可以像Windows上使用安装程序那样进行安装了,无需再次编译。
而且SPM的优点不止如此,其不仅包含了编译后的可执行文件用于部署,还包括了软件的部署信息,即在哪个目录安装可执行文件,哪个目录安装配置文件等等,这些信息由包含在SPM中的数据库保存,在使用SPM安装的时候,本地主机上的管理工具就会读取这些信息用于软件安装,并且会记录在本地的管理工具中。这样就可以用管理工具很方便的对通过这种方式安装的软件进行管理,包括卸载。
而不同Linux发行版使用的包管理技术不同,大致可以分为两类:
-
dpkg
dpkg由Debian Linux社区主导,使用此类包管理技术的发行版包括
Dibian
、B2D
、Ubuntu
等。 -
RPM
RPM
全称Redhat Package Manager
,是由Red Hat公司主导的包管理技术,使用该技术的发行版包括Fedora
、CentOS
、SUSE
等。
这两种包管理技术的主要区别为:
发行版代表 | 软件管理机制 | 使用命令 | 在线升级功能 |
---|---|---|---|
Red Hat/Fedora | RPM | rpm, rpmbuild | YUM (yum) |
Debian/Ubuntu | DPKG | dpkg | APT (apt-get) |
RPM与SRPM
RPM的运行机制前边已经说过了,其优点是:
- 由于已经编译完成并打包,无需再次编译。
- 安装时会检查软件依赖,如果缺少所需的依赖会禁止安装。
- 安装后软件相关信息会记录在本地的数据库中,方便查询、升级和卸载。
需要再次提醒的是,正因为RPM提供的是编译后的软件,所以是和操作系统版本以及硬件平台密切相关的,所以通常来说不同的发行版提供的RPM是不能混用的。
此外,使用RPM需要遵守一些要求:
- 软件安装的环境必须与编译环境一致
- 需要满足软件对其它软件和函数库的依赖
- 卸载时需要从顶层软件开始卸载,即先要卸载依赖底层的软件,才能卸载底层的软件。
RPM最大的缺陷是不附带源码,如果我们当前的环境和编译软件的环境不同就没法安装了,所以就出现了SRPM(source RPM),即附带源码的RPM,安装文件通常以xxx.src.rpm
命名(以和RPM的xxx.rpm
区分)。
SRMP中因为有源码,所以即使环境不同也可以编译后再使用RPM的机制进行安装。
硬件平台
RPM
的安装包通常的命名方式是这样的:rp-pppoe-3.11-5.el7.x86_64.rpm
。这其中包含了这样几方面信息:
rp-ppoe
:软件名3.11
:软件版本5
:发布次数,即该版本第几次编译后发布(可以简单看作是小小版本号)el7.x86_64
:硬件平台,这里指x86_64架构.rpm
:后缀名
主要的硬件平台有:
平台名称 | 说明 |
---|---|
i386 | 幾乎適用於所有的 x86 平台,不論是舊的 Pentium 或者是新的 Intel Core 2 與 K8 系列的 CPU 等等,都可以正常的工作!那個 i 指的是 Intel 相容的 CPU 的意思,至於 386 不用說,就是 CPU 的等級啦! |
i586 | 就是針對 586 等級的電腦進行最佳化編譯。那是哪些 CPU 呢?包括 Pentium 第一代 MMX CPU, AMD 的 K5, K6 系列 CPU (socket 7 插腳) 等等的 CPU 都算是這個等級; |
i686 | 在 Pentium II 以後的 Intel 系列 CPU ,及 K7 以後等級的 CPU 都屬於這個 686 等級! 由於目前市面上幾乎僅剩 P-II 以後等級的硬體平台,因此很多 distributions 都直接釋出這種等級的 RPM 檔案。 |
x86_64 | 針對 64 位元的 CPU 進行最佳化編譯設定,包括 Intel 的 Core 2 以上等級 CPU ,以及 AMD 的 Athlon64 以後等級的 CPU ,都屬於這一類型的硬體平台。 |
noarch | 就是沒有任何硬體等級上的限制。一般來說,這種類型的 RPM 檔案,裡面應該沒有 binary program 存在, 較常出現的就是屬於 shell script 方面的軟體。 |
以上摘抄自鸟哥的Linux私房菜。
其中目前主流硬件平台是x86_64
,其它的老式平台已经不常见了,当然除了Intel的X86架构,近些年ARM架构的硬件也很多。
RPM的优点
YUM
事实上,相比从官方网站或者软件提供商的网站那理下载对应的RPM安装包进行安装,更常见的方式是通过yum
工具从提供RPM安装包的软件源自动下载RPM安装包进行安装或更新。这种方式可以用下图表示:
图源:鸟哥的Linux私房菜
RPM软件管理程序
RPM默认安装路径
默认情况下,RPM会按照以下路径安装软件:
目录 | 说明 |
---|---|
/etc | 一些設定檔放置的目錄,例如 /etc/crontab |
/usr/bin | 一些可執行檔案 |
/usr/lib | 一些程式使用的動態函式庫 |
/usr/share/doc | 一些基本的軟體使用手冊與說明檔 |
/usr/share/man | 一些 man page 檔案 |
安装
这里尝试从CentOS 7
的安装镜像上安装RPM
安装包:
[root@xyz ~]# mount /dev/sr0 /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@xyz ~]# find /mnt/Packages/ -name '*pppoe*'
/mnt/Packages/rp-pppoe-3.11-7.el7.x86_64.rpm
[root@xyz ~]# rpm -ivh /mnt/Packages/rp-pppoe-3.11-7.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:rp-pppoe-3.11-7.el7 ################################# [100%]
这里要确保虚拟机的光驱成功加载系统的安装镜像。
当然也可以同时安装多个安装包或者通过网络上的安装包安装:
範例二、一口氣安裝兩個以上的軟體時:
[root@study ~]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm
# 後面直接接上許多的軟體檔案!
範例三、直接由網路上面的某個檔案安裝,以網址來安裝:
[root@study ~]# rpm -ivh http://website.name/path/pkgname.rpm
这里-i
参数指使用rpm
工具进行安装(install),-v
参数用于显示安装信息,-h
参数用于显示安装进度。
除此之外,还有一些其它的可选参数:
可选参数 | 含义 |
---|---|
–nodeps | 使用時機:當發生軟體屬性相依問題而無法安裝,但你執意安裝時 危險性: 軟體會有相依性的原因是因為彼此會使用到對方的機制或功能,如果強制安裝而不考慮軟體的屬性相依, 則可能會造成該軟體的無法正常使用! |
–replacefiles | 使用時機: 如果在安裝的過程當中出現了『某個檔案已經被安裝在你的系統上面』的資訊,又或許出現版本不合的訊息 (confilcting files) 時,可以使用這個參數來直接覆蓋檔案。 危險性: 覆蓋的動作是無法復原的!所以,你必須要很清楚的知道被覆蓋的檔案是真的可以被覆蓋喔!否則會欲哭無淚! |
–replacepkgs | 使用時機: 重新安裝某個已經安裝過的軟體!如果你要安裝一堆 RPM 軟體檔案時,可以使用 rpm -ivh *.rpm ,但若某些軟體已經安裝過了, 此時系統會出現『某軟體已安裝』的資訊,導致無法繼續安裝。此時可使用這個選項來重複安裝喔! |
–force | 使用時機:這個參數其實就是 --replacefiles 與 --replacepkgs 的綜合體! |
–test | 使用時機: 想要測試一下該軟體是否可以被安裝到使用者的 Linux 環境當中,可找出是否有屬性相依的問題。範例為: rpm -ivh pkgname.i386.rpm --test |
–justdb | 使用時機: 由於 RPM 資料庫破損或者是某些緣故產生錯誤時,可使用這個選項來更新軟體在資料庫內的相關資訊。 |
–nosignature | 使用時機: 想要略過數位簽章的檢查時,可以使用這個選項。 |
–prefix 新路徑 | 使用時機: 要將軟體安裝到其他非正規目錄時。舉例來說,你想要將某軟體安裝到 /usr/local 而非正規的 /bin, /etc 等目錄, 就可以使用『 --prefix /usr/local 』來處理了。 |
–noscripts | 使用時機:不想讓該軟體在安裝過程中自行執行某些系統指令。 說明: RPM 的優點除了可以將檔案放置到定位之外,還可以自動執行一些前置作業的指令,例如資料庫的初始化。 如果你不想要讓 RPM 幫你自動執行這一類型的指令,就加上他吧! |
摘抄自鸟哥的Linux私房菜。
下面再展示一个安装示例:
[root@xyz ~]# find /mnt -name 'pam-devel*'
/mnt/Packages/pam-devel-1.1.8-23.el7.x86_64.rpm
/mnt/Packages/pam-devel-1.1.8-23.el7.i686.rpm
[root@xyz ~]# rpm -ivh /mnt/Packages/pam-devel-1.1.8-23.el7.x86_64.rpm --test
准备中... ################################# [100%]
您在 /var/spool/mail/root 中有新邮件
[root@xyz ~]# rpm -ivh /mnt/Packages/pam-devel-1.1.8-23.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:pam-devel-1.1.8-23.el7 ################################# [100%]
升级与更新
要使用rpm
升级软件只要使用-U
(upgrade)或-F
(freshen)参数即可,它们的区别是:
-U
:如果软件没有安装,直接安装,如果安装了但是版本过老,就升级。-F
:如果软件没有安装,不安装,如果安装了但是版本过老,升级。
-F
参数可以用于批量更新软件,这样做就不会出现某个软件没有安装但再更新时候被安装上的情况。
查询
可以使用-q
(query)参数进行软件相关的查询工作,具体的查询方式可以分为这么几种:
-qa
:输出所有软件名称-q 软件名
:查询某个软件的情况-qf 文件
:根据给定的某个文件查询相关的软件情况-qp 软件包
:查询指定的某个软件安装包(.rpm)的相关情况
此外,查询时还可以结合其它参数:
-i
(information):查询软件的详情-l
(list):查询软件部署的目录信息-c
(config):查询软件的配置文件-d
(document):查询软件的说明文档-R
(Require):查询软件的依赖信息
下面看实际示例,如果要查询是否安装了某个软件包:
[root@xyz ~]# rpm -q logrotate
logrotate-3.8.6-19.el7.x86_64
[root@xyz ~]# rpm -q logrotating
未安装软件包 logrotating
如果要查看某个软件包的部署情况:
[root@xyz ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/etc/rwtab.d/logrotate
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate
/var/lib/logrotate/logrotate.status
如果要查看软件包的详细信息:
[root@xyz ~]# rpm -q logrotate -i
Name : logrotate
Version : 3.8.6
Release : 19.el7
Architecture: x86_64
Install Date: 2021年07月24日 星期六 14时35分07秒
Group : System Environment/Base
Size : 107068
License : GPL+
Signature : RSA/SHA256, 2020年04月04日 星期六 05时01分10秒, Key ID 24c6a8a7f4a80eb5
Source RPM