图源:
在
软件管理简介
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 方面的軟體。 |
以上摘抄自。
其中目前主流硬件平台是x86_64
,其它的老式平台已经不常见了,当然除了Intel的X86架构,近些年ARM架构的硬件也很多。
RPM的优点
YUM
事实上,相比从官方网站或者软件提供商的网站那理下载对应的RPM安装包进行安装,更常见的方式是通过yum
工具从提供RPM安装包的软件源自动下载RPM安装包进行安装或更新。这种方式可以用下图表示:
图源:
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 幫你自動執行這一類型的指令,就加上他吧! |
摘抄自。
下面再展示一个安装示例:
[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 : logrotate-3.8.6-19.el7.src.rpm
Build Date : 2020年04月01日 星期三 11时26分19秒
Build Host : x86-02.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : https://github.com/logrotate/logrotate
Summary : Rotates, compresses, removes and mails system log files
Description :
The logrotate utility is designed to simplify the administration of
log files on a system which generates a lot of log files. Logrotate
allows for the automatic rotation compression, removal and mailing of
log files. Logrotate can be set to handle a log file daily, weekly,
monthly or when the log file gets to a certain size. Normally,
logrotate runs as a daily cron job.
Install the logrotate package if you need a utility to deal with the
log files on your system.
如果要查看软件对应的配置文件和说明文档:
[root@xyz ~]# rpm -q logrotate -c
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/rwtab.d/logrotate
[root@xyz ~]# rpm -q logrotate -d
/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
如果要查看某个文件是属于哪个软件的:
[root@xyz ~]# rpm -qf /bin/sh
bash-4.2.46-34.el7.x86_64
如果要查看某个软件包的依赖关系:
[root@xyz ~]# ll /mnt/Packages/ | head
总用量 9334187
...省略
-rw-rw-r--. 6 root root 1119920 7月 4 2014 a2ps-4.14-23.el7.i686.rpm
-rw-rw-r--. 3 root root 1123756 7月 4 2014 a2ps-4.14-23.el7.x86_64.rpm
-rw-rw-r--. 19 root root 152952 8月 10 2017 abattis-cantarell-fonts-0.0.25-1.el7.noarch.rpm
-rw-rw-r--. 3 root root 550448 10月 15 2020 abrt-2.1.11-60.el7.centos.x86_64.rpm
-rw-rw-r--. 3 root root 199288 10月 15 2020 abrt-addon-ccpp-2.1.11-60.el7.centos.x86_64.rpm
[root@xyz ~]# rpm -qp /mnt/Packages/a2ps-4.14-23.el7.x86_64.rpm -R
/bin/sh
/bin/sh
/bin/sh
/sbin/install-info
/sbin/install-info
/sbin/ldconfig
/usr/bin/perl
ImageMagick
bzip2
config(a2ps) = 4.14-23.el7
coreutils
file
fileutils
groff-perl
gzip
html2ps
...省略
如果要查看系统中已安装的软件中以c
开头的有哪些:
[root@xyz ~]# rpm -qa | grep '^c'
curl-7.29.0-59.el7.x86_64
coreutils-8.22-24.el7.x86_64
celt051-0.5.1.3-8.el7.x86_64
cyrus-sasl-plain-2.1.26-23.el7.x86_64
centos-release-7-9.2009.0.el7.centos.x86_64
control-center-filesystem-3.28.1-7.el7.x86_64
clutter-gst3-3.0.26-1.el7.x86_64
compat-exiv2-026-0.26-2.el7.x86_64
checkpolicy-2.5-8.el7.x86_64
...省略
如果要查看Apache
的配置文件:
[root@xyz ~]# rpm -q httpd -c
验证与数字签名
rpm
工具提供验证软件完整性的功能,使用-V
(Verify)参数即可:
[icexmoon@xyz ~]$ rpm -V logrotate
..?...... c /etc/cron.daily/logrotate
[icexmoon@xyz ~]$ ll /etc/cron.daily/logrotate
-rwx------. 1 root root 219 4月 1 2020 /etc/cron.daily/logrotate
[icexmoon@xyz ~]$ file /etc/cron.daily/logrotate
/etc/cron.daily/logrotate: regular file, no read permission
[icexmoon@xyz ~]$ su -
密码:
上一次登录:二 9月 14 13:31:12 CST 2021pts/0 上
[root@xyz ~]# rpm -V logrotate
需要注意的是,虽然使用非root
权限也可以执行rpm -V
,但执行结果是有问题的,比如一开始使用icexmoon
用户执行,就显示/etc/cron.daily/logrotate
这个文件,但实际上这个文件并没有被我们修改过,再检查这个文件就知道,当前用户是没有读取权限的,所以rpm -V
执行的时候也就无法判断该文件有没有发生过改变,如果使用root
用户执行就不会发生此类问题。
通过执行rpm -V
可以发现软件所属的文件中哪些相对安装时已经发生改变:
[root@xyz ~]# rpm -qc logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/rwtab.d/logrotate
[root@xyz ~]# cp /etc/logrotate.conf /etc/logrotate.conf.bak
[root@xyz ~]# vim /etc/logrotate.conf
[root@xyz ~]# diff /etc/logrotate.conf /etc/logrotate.conf.bak
6c6
< rotate 5
---
> rotate 4
[root@xyz ~]# rpm -V logrotate
..5....T. c /etc/logrotate.conf
这种功能有点像我们在中提到的
md5
用于文件完整性校验的效果,很可能rpm
正是使用了类似的技术实现这一功能的。当然,Linux中的文件改变并不仅仅局限于内容,还包括其它信息。
此外,除了会列出发生改变的文件,还会通过一些特殊标识来简单说明文件的哪些部分发生改变:
-
S
:(file Size differs)文件的大小是否发生改变 -
M
:(Mode differs)文件的属性(rwx)是否发生改变 -
D
:(MD5 sum differs)MD5值是否发生改变(内容发生改变) -
L
:(read Link path mis-match)链接路径是否发生改变 -
U
:(User ownership differs)文件的拥有者是否发生改变 -
G
:(Group ownership differs)文件的用户组是否发生改变 -
T
:(mtime differs)文件的mtime是否发生改变 -
P
:(caPabilities differs)功能是否发生改变
上边示例中的..5....T. c /etc/logrotate.conf
就表示文件的MD5
值和mtime发生了改变,如果一个文件的所有信息都发生了变化,就会输出这样的结果:
SM5DLUGTP c filename
特殊标识之后,文件名之前的字符c
表示config file
,即代表该文件的类型,有以下类型:
-
c
:(config file)配置文件 -
d
:(documentation)普通文件 -
g
:(ghost file)幽灵文件,即没有被删除干净,所属的软件已经不存在的遗留文件 -
l
:(lisense file)许可证文件,如MIT之类的开源许可证 -
r
:(readme)说明文档
可以看出,这个rpm -V
比自己编写脚本通过md5值检查系统中软件完整性更方便和强大,我们可以通过它定期检查系统中关键软件的完整性,如果出现意料之外的改变,就可能是被入侵了。
当然这并不能代替所有的md5校验功能,比如某些我们修改了的配置文件或者自定义脚本,就可以生成md5后进行完整性验证,在这方面
rpm -V
是帮不上忙的。
与rpm -q
类似,rpm -V
也可以结合其它参数,比如rpm -Vf
可以检查某个软件下的某个具体文件,这里不再一一说明。
数字签名
虽然我们可以使用md5
之类的技术验证软件包的完整性,但是这依然不是很方便,并且软件发行商的官网也有可能被入侵,提供的md5
本身有可能就有问题。
事实上现代互联网几乎所有的安全体系都是建立在非对称加密(RSA)基础上的,RSA有两大使用场景:加密和签名。用于加密的场景最常见的就是基于OpenSSL的https协议,当然,其中的证书签发部分也涉及了签名的应用。而签名部分的使用场景也相当广泛,最常见的要属安卓apk安装了,每一个安卓的apk包都是被开发者使用私钥签名过的,每当你下载一个新版本的apk包进行升级安装时候,安卓会自动比对新的apk包的签名和老版本的软件的签名,看两者签名使用的私钥是否一致,如果一致才会允许升级安装,否则是不会允许的。事实上谷歌应用商店会对所有的apk包检查私钥是否正确,所以不存在“仿冒app”存在,但国内没有那样的环境。但是上面的机制依然是存在的,所以即使在国内,只要你能确保一开始安装的APP是官方提供的,之后在升级安装的时候,即使是从某个小网站下的新版APP,也可以放心地进行升级安装,因为签名不一致是无法完成安装的。
rpm
也具有类似于安卓的签名机制,即rpm
软件包会被开发者使用私钥进行签名,客户在下载软件包进行安装时,rpm
会使用开发者公开的对应公钥(可能需要额外下载安装)对签名进行验证,确认签名无误后才会进行安装。
CentOS
使用的数字签名系统为GnuPG(GNU Privacy Guard,GPG)。
我不清楚GPG和RSA算法之间的关系,但原理上应该是一致的。
我们来看一下CentOS中的密钥文件:
[root@xyz ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
-rw-r--r--. 1 root root 1690 10月 23 2020 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@xyz ~]# cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.5 (GNU/Linux)
mQINBFOn/0sBEADLDyZ+DQHkcTHDQSE0a0B2iYAEXwpPvs67cJ4tmhe/iMOyVMh9
Yw/vBIF8scm6T/vPN5fopsKiW9UsAhGKg0epC6y5ed+NAUHTEa6pSOdo7CyFDwtn
4HF61Esyb4gzPT6QiSr0zvdTtgYBRZjAEPFVu3Dio0oZ5UQZ7fzdZfeixMQ8VMTQ
...省略
rpm
需要有签名对应的公钥才能验证签名,有时候没有的话需要通过网络或其他途径获取后进行安装,比如:
[root@xyz ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
安装后的公钥可以通过查看软件的方式查看相关信息:
[root@xyz ~]# rpm -qa | grep pubkey
gpg-pubkey-f4a80eb5-53a7ff4b
[root@xyz ~]# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
Name : gpg-pubkey
Version : f4a80eb5
Release : 53a7ff4b
Architecture: (none)
Install Date: 2021年08月13日 星期五 15时12分07秒
Group : Public Keys
...省略
一般安装后的公钥的软件名都有
pubkey
的字样。
卸载与重建数据库
卸载软件的命令很简单:rpm -e
,参数-e
的意思为erase。但是需要注意的是,卸载的时候需要考虑软件依赖,要卸载某个软件时候必须将依赖于该软件的其它软件先卸载才行:
[root@xyz ~]# rpm -qa | grep pam
pam-devel-1.1.8-23.el7.x86_64
pam-1.1.8-23.el7.x86_64
fprintd-pam-0.8.1-2.el7.x86_64
gnome-keyring-pam-3.28.2-1.el7.x86_64
[root@xyz ~]# rpm -e pam
错误:依赖检测失败:
libpam.so.0()(64bit) 被 (已安裝) libpwquality-1.2.3-5.el7.x86_64 需要
libpam.so.0()(64bit) 被 (已安裝) libuser-0.60-9.el7.x86_64 需要
libpam.so.0()(64bit) 被 (已安裝) passwd-0.79-6.el7.x86_64 需要
libpam.so.0()(64bit) 被 (已安裝) util-linux-2.23.2-65.el7.x86_64 需要
...省略
这里的pam
模块被大量其它软件依赖,所以是无法直接卸载的。但如果是卸载没有被依赖关系的软件就不存在以上问题:
[root@xyz ~]# rpm -e pam-devel
[root@xyz ~]# rpm -q pam-devel
未安装软件包 pam-devel
rpm
所有的安装、查询和验证等功能都依赖于rpm
的数据库,该数据库文件保存在/var/lib/rpm
目录,如果因为某些原因,rpm
的数据库出现损坏,就会影响到rpm
的功能,要想修复也很简单:
[root@xyz ~]# rpm --rebuilddb
YUM
我们之前说过,事实上现在已经很少直接手动下载PRM包后进行安装了,更多的是使用yum
这个工具在线下载和安装。但是我们要记住,yum
实际上是基于rpm
的,只不过是通过整合软件源等技术让软件的在线安装和更新更方便了。
使用YUM进行查询、安装、升级与删除
查询
如果要从可用的软件源中查找某个软件:
[root@xyz ~]# yum search raid
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
========================================================= N/S matched: raid =========================================================
dmraid.i686 : dmraid (Device-mapper RAID tool and library)
dmraid.x86_64 : dmraid (Device-mapper RAID tool and library)
dmraid-devel.x86_64 : Development libraries and headers for dmraid.
dmraid-events-logwatch.x86_64 : dmraid logwatch-based email reporting
libblockdev-mdraid.i686 : The MD RAID plugin for the libblockdev library
libblockdev-mdraid.x86_64 : The MD RAID plugin for the libblockdev library
libblockdev-mdraid-devel.i686 : Development files for the libblockdev-mdraid plugin/library
libblockdev-mdraid-devel.x86_64 : Development files for the libblockdev-mdraid plugin/library
libstoragemgmt-megaraid-plugin.noarch : Files for LSI MegaRAID support for libstoragemgmt
dmraid-events.x86_64 : dmevent_tool (Device-mapper event tool) and DSO
iprutils.x86_64 : Utilities for the IBM Power Linux RAID adapters
mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays)
名称和简介匹配 only,使用“search all”试试。
通常Linux主机中可能会配置多个软件源(软件仓库),而yum
会自动使用访问速度最快的软件源(这里我已经将默认的软件源的地址替换为了阿里镜像站),除了输出查询所使用的软件源,还会显示查询到的结果,包括软件名称、硬件平台和相关说明。
软件源和镜像站的关系可以理解为:软件源是一个软件仓库,就像是你在Github上开的一个项目,而镜像站就好比你在Gittee上从Github上拉了一个该项目的镜像。
默认的软件源有三个:
-
base
:基础的软件源,安装新软件会从这个源下载安装 -
updates
:更新软件时候会从这个源下载安装 -
extras
:一些其它的特殊用途
如果要查看软件源中的某个软件的详细信息:
[root@xyz ~]# yum info mdadm
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
已安装的软件包
名称 :mdadm
架构 :x86_64
版本 :4.1
发布 :6.el7
大小 :1.0 M
源 :installed
来自源:anaconda
简介 : The mdadm program controls Linux md devices (software RAID arrays)
网址 :http://www.kernel.org/pub/linux/utils/raid/mdadm/
协议 : GPLv2+
描述 : The mdadm program is used to create, manage, and monitor Linux MD (software
...省略
此外还可以列出软件源上的所有软件:
[root@xyz ~]# yum list | less
输出的内容会非常多,分为已安装软件和未安装软件两部分。
如果想查看Linux主机上哪些软件可以更新:
[root@xyz ~]# yum list updates
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
更新的软件包
NetworkManager.x86_64 1:1.18.8-2.el7_9 updates
NetworkManager-adsl.x86_64 1:1.18.8-2.el7_9 updates
NetworkManager-glib.x86_64 1:1.18.8-2.el7_9 updates
NetworkManager-libnm.x86_64 1:1.18.8-2.el7_9 updates
NetworkManager-ppp.x86_64 1:1.18.8-2.el7_9 updates
NetworkManager-team.x86_64 1:1.18.8-2.el7_9 updates
NetworkManager-tui.x86_64 1:1.18.8-2.el7_9 updates
...省略
如果我们不知道软件名,仅知道软件使用的命令,也是可以通过yum
查询相关软件的:
[root@xyz ~]# yum provides passwd
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
passwd-0.79-6.el7.x86_64 : An utility for setting or changing passwords using PAM
源 :base
passwd-0.79-6.el7.x86_64 : An utility for setting or changing passwords using PAM
源 :@anaconda
当然,yum
命令也支持通配符,比如要列出pam
开头的软件:
[root@xyz ~]# yum list pam*
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
已安装的软件包
pam.x86_64 1.1.8-23.el7 @anaconda
可安装的软件包
pam.i686 1.1.8-23.el7 base
pam-devel.i686 1.1.8-23.el7 base
pam-devel.x86_64 1.1.8-23.el7 base
pam_krb5.i686 2.4.8-6.el7 base
pam_krb5.x86_64 2.4.8-6.el7 base
pam_pkcs11.i686 0.6.2-30.el7 base
pam_pkcs11.x86_64 0.6.2-30.el7 base
pam_snapper.i686 0.2.8-4.el7 base
pam_snapper.x86_64 0.2.8-4.el7 base
pam_ssh_agent_auth.i686 0.10.3-2.21.el7 base
pam_ssh_agent_auth.x86_64 0.10.3-2.21.el7 base
安装/升级
安装软件的命令很简单:
[root@xyz ~]# yum install pam-devel
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 pam-devel.x86_64.0.1.1.8-23.el7 将被 安装
--> 解决依赖关系完成
...省略
安装软件只要输入软件名即可,不需要硬件平台和软件版本。整个安装过程包括下载rpm
软件包、检查软件依赖、输出安装概要让用户确认、签名检查、安装等。所有这一系列动作yum
都可以自动完成,只需要用户在需要的时候输入y
进行确认,甚至你可以使用-y
参数让yum
自动确认,相当的方便。
升级软件也很简单:
[root@xyz ~]# yum update mdadm
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 mdadm.x86_64.0.4.1-6.el7 将被 升级
---> 软件包 mdadm.x86_64.0.4.1-7.el7_9 将被 更新
--> 解决依赖关系完成
...省略
删除
要使用yum
删除软件:
[root@xyz ~]# yum remove pam-devel
已加载插件:fastestmirror, langpacks
正在解决依赖关系
--> 正在检查事务
---> 软件包 pam-devel.x86_64.0.1.1.8-23.el7 将被 删除
--> 解决依赖关系完成
...省略
YUM的配置文件
之前我们已经简单介绍了软件源和镜像站的概念,通常我们需要将官方的默认源的地址替换为大陆的镜像站地址才会获得比较好的yum
体验。
这里以中科院的CentOS软件源镜像举例,官方的说明页面是,包含了CentOS7和CentOS8的镜像站地址替换脚本,可以使用该脚本直接完整默认源的替换。
在替换前先以yum
使用的CentOS
默认源的配置文件举例说明:
[root@xyz ~]# cat -n /etc/yum.repos.d/CentOS-Base.repo | head -n 20 | tail -n 8
13 [base]
14 name=CentOS-$releasever - Base - mirrors.aliyun.com
15 failovermethod=priority
16 baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
17 http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
18 http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
19 gpgcheck=1
20 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
该配置文件中包含了多个软件源,这里以base
这个软件源说明,包含了以下信息:
-
[base]
:软件源名称 -
name=xxx
:软件源的说明 -
baseurl=xxx
:软件源的网址 -
gpgcheck=1
:在通过该软件源下载安装软件包时是否检查GPG签名 -
gpgkey=xxx
:检查签名时使用的公钥 -
enable=1
:是否启用软件源,enable=0
为不启用
如果要替换默认软件源的地址,只要将baseurl
配置项修改即可,不过更简单的方式就是直接将官方软件源的配置文件编程备份文件,然后下载镜像站提供的配置文件即可:
[root@xyz yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak
[root@xyz yum.repos.d]# wget https://mirror.iscas.ac.cn/mirror/centos-7.repo
--2021-09-14 16:37:24-- https://mirror.iscas.ac.cn/mirror/centos-7.repo
正在解析主机 mirror.iscas.ac.cn (mirror.iscas.ac.cn)... 124.16.138.121
正在连接 mirror.iscas.ac.cn (mirror.iscas.ac.cn)|124.16.138.121|:443... 已连接。
...省略
[root@xyz yum.repos.d]# mv centos-7.repo CentOS-ISRC.repo
[root@xyz yum.repos.d]# sudo yum makecache
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
base
...省略
最后的yum makecache
不是必须的,创建缓存有利于减轻镜像站的压力,如果不想使用缓存可以yum clean expire-cache
。
如果要查看当前软件源的状态:
[root@xyz yum.repos.d]# yum repolist all
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
源标识 源名称 状态
C7.0.1406-base/x86_64 CentOS-7.0.1406 - Base 禁用
C7.0.1406-centosplus/x86_64 CentOS-7.0.1406 - CentOSPlus 禁用
C7.0.1406-extras/x86_64 CentOS-7.0.1406 - Extras 禁用
C7.0.1406-fasttrack/x86_64 CentOS-7.0.1406 - Fasttrack 禁用
C7.0.1406-updates/x86_64 CentOS-7.0.1406 - Updates 禁用
...省略
也可以只显示启用的软件源:
[root@xyz yum.repos.d]# yum repolist enabled
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
源标识 源名称 状态
base/7/x86_64 CentOS-7 - Base 10,072
extras/7/x86_64 CentOS-7 - Extras 500
updates/7/x86_64 CentOS-7 - Updates 2,747
repolist: 13,319
这样就表示我们替换源成功了。
我还是决定换回阿里源,毕竟阿里源超快的:
[root@xyz yum.repos.d]# yum repolist enabled 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com 源标识 源名称 状态 base/7/x86_64 CentOS-7 - Base - mirrors.aliyun.com 10,072 extras/7/x86_64 CentOS-7 - Extras - mirrors.aliyun.com 500 updates/7/x86_64 CentOS-7 - Updates - mirrors.aliyun.com 2,747 repolist: 13,319关于如何使用阿里源,大家自行检索吧,网上很多的。
解决软件源地址替换的问题
有时候修改软件源的地址,会导致本地的软件列表与服务器上的软件列表不一致,此时需要使用其它命令来清除本地的软件源相关数据后重新从服务器下载:
[root@xyz yum.repos.d]# yum clean all
已加载插件:fastestmirror, langpacks
正在清理软件源: base extras updates
Cleaning up list of fastest mirrors
软件群组
有的大型软件是包含了很多小的软件的,比如X Window,以及我们一开始安装CentOS时可选的各种软件套件。这些在yum
中被称作软件群组(group)。
要查看软件源中的软件群组:
[root@xyz yum.repos.d]# yum grouplist
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
可用的环境分组:
最小安装
基础设施服务器
计算节点
文件及打印服务器
基本网页服务器
虚拟化主机
带 GUI 的服务器
GNOME 桌面
KDE Plasma Workspaces
开发及生成工作站
已安装的组:
开发工具
可用组:
传统 UNIX 兼容性
兼容性程序库
图形管理工具
安全性工具
控制台互联网工具
智能卡支持
科学记数法支持
系统管理
系统管理工具
完成
其中包含“可用的环境群组”、“已安装的群组”、“可用的群组”几个部分。
如果要查看软件群组的详情:
[root@xyz yum.repos.d]# yum groupinfo 科学记数法支持
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
组:科学记数法支持
组编号:scientific
描述:用于数学和科学计算以及平行计算的工具。
可选的软件包:
atlas
fftw
fftw-devel
fftw-static
...省略
中文群组名居然可以使用我是没想到的,本来还以为要被迫切换语言环境...
如果要安装群组:
[root@xyz yum.repos.d]# yum groupinstall '科学记数法支持'
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
警告:分组 scientific 不包含任何可安装软件包。
Maybe run: yum groups mark install (see man yum)
指定组中没有可安装或升级的软件包
默认不会安装任何软件,这是因为在默认情况下,使用yum
安装群组时仅会安装群组中必要的(mandatory)软件,而不会安装可选的软件,如果像示例中那样,群组scientific
包含的软件都是可选的软件的时候,就不会安装任何软件。
如果想在使用yum groupinstall
安装群组时将可选软件一并安装,需要修改yum
的配置文件:
[root@xyz yum.repos.d]# cp /etc/yum.conf /etc/yum.conf.bak
[root@xyz yum.repos.d]# vim /etc/yum.conf
[root@xyz yum.repos.d]# diff /etc/yum.conf /etc/yum.conf.bak
13c13
< group_package_types=default,mandatory,optional
---
>
再尝试安装软件组就可以安装了。
EPEL/ELRepo外挂软件
CentOS官方提供的软件源往往只包含一些常用软件,如果我们需要的软件不包含在内,我们就要借助一些其它的软件源了,这其中比较有名的是EPEL计划(Extra Packages for Enterprise Linux,企业Linux扩展软件)发展来的软件源。
EPEL的官网:https://fedoraproject.org/wiki/EPEL
EPEL的CentOS7软件源:https://dl.fedoraproject.org/pub/epel/7/x86_64/
添加EPEL源也很简单:
[root@xyz yum.repos.d]# pwd
/etc/yum.repos.d
[root@xyz yum.repos.d]# vim CentOS-EPEL.repo
[root@xyz yum.repos.d]# cat CentOS-EPEL.repo
[epel]
name = epel packages
baseurl = https://dl.fedoraproject.org/pub/epel/7/x86_64/
gpgcheck = 0
enabled = 0
稳妥起见,我们可以将这个源设置为enabled=0
,即不启用这个源,这样就不影响我们平时的软件更新和安装了,但对于要安装官方源没有,但EPEL源有的软件,我们可以这样:
[root@xyz yum.repos.d]# yum --enablerepo=epel install ntcdf R
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
这个源在国内的访问速度很慢。
对于其它的源,我们可以使用类似的方式添加和使用。
使用光盘
除了使用额外的源,挂载到本地的CentOS系统安装镜像也是可以作为yum
的软件源使用的:
[root@xyz yum.repos.d]# mount /dev/sr0 /mnt
[root@xyz yum.repos.d]# vim CentOS-CDROM.repo
[root@xyz yum.repos.d]# cat CentOS-CDROM.repo
[mycdrom]
name = mycdrom
baseurl = file:///mnt
gpgcheck = 0
enabled = 0
[root@xyz yum.repos.d]# yum --enablerepo=mycdrom list all
系统自动升级
我们可以将yum update
命令写入crontab
以实现通过定时任务定期自动更新系统,比如:
[root@study ~]# echo '10 1 * * * root /usr/bin/yum -y --enablerepo=epel update' > /etc/cron.d/yumupdate
[root@study ~]# vim /etc/crontab
RPM or Tarball
对于安装软件,可以优先使用yum
通过Linux发行版的默认源来安装,如果没有,就寻找软件开发商提供的源或者RPM软件包安装,如果还是没有,就寻找软件开发者提供的源码来安装。
Apache的安装
下面用安装Apache以及相关必要的软件作为示例来说明如何通过yum
完整软件安装:
[root@xyz yum.repos.d]# rpm -q httpd php mariadb php-mysql
未安装软件包 httpd
未安装软件包 php
未安装软件包 mariadb
未安装软件包 php-mysql
[root@xyz yum.repos.d]# yum install httpd php mariadb-server php-mysql
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
...省略
[root@xyz yum.repos.d]# systemctl daemon-reload
[root@xyz yum.repos.d]# systemctl start httpd
[root@xyz yum.repos.d]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@xyz yum.repos.d]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since 二 2021-09-14 18:35:05 CST; 17s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 6671 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─6671 /usr/sbin/httpd -DFOREGROUND
├─6675 /usr/sbin/httpd -DFOREGROUND
├─6676 /usr/sbin/httpd -DFOREGROUND
├─6678 /usr/sbin/httpd -DFOREGROUND
├─6680 /usr/sbin/httpd -DFOREGROUND
└─6681 /usr/sbin/httpd -DFOREGROUND
9月 14 18:34:59 xyz.icexmoon.centos systemd[1]: Starting The Apache HTTP Server...
9月 14 18:35:05 xyz.icexmoon.centos systemd[1]: Started The Apache HTTP Server.
[root@xyz yum.repos.d]# firewall-cmd --add-service='http'
success
[root@xyz yum.repos.d]# firewall-cmd --permanent --add-service='http'
success
[root@xyz yum.repos.d]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
如果你和我一样是使用虚拟机,并通过桥接方式接入到局域网的话,可以在虚拟机之外通过虚拟机的IP访问其上的Web Service:
SRPM
考虑到SRPM的使用场景应该不多,这里不做总结和演示,感兴趣的可以阅读。
以上就是RPM和YUM的相关内容,谢谢阅读。
文章评论