31 RPM 与 YUM
RPM 的优点
- RPM 内含已经编译过的程序与配置文件等数据,可以让用户免除重新编译的困扰;
- RPM 在被安装之前,会先检查系统的硬盘容量、操作系统版本等,可避免文件被错误安装;
- RPM 文件本身提供软件版本信息、依赖软件名称、软件用途说明、软件所含文件等信息,便于了解软件;
- RPM 管理的方式使用数据库记录 RPM 文件的相关参数,便于升级、移除、查询与验证。
1. rpm指令⚓
rpm [OPTION...]
安装 选项
-i, --install install package(s)
--nodeps do not verify package dependencies
--replacefiles 文件冲突时覆盖掉就文件
--replacepkgs 重新安装已经安装过的软件
--force --replacepkgs --replacefiles
--test don't install, but tell if it would work or not
--justdb 由于 RPM 数据库损坏或者是某些缘故产生错误时,可使用这个选项来更新软件在数据库内的相关信息
--prefix=<dir> 将软件安装到其他非正规目录
升级 选项
-U, --upgrade=<packagefile>+ upgrade package(s)
-F, --freshen=<packagefile>+ 只升级已安装的软件
查询/验证 共用的选项
-a, --all query/verify 所有包(已安装)
-f, --file query 文件属于哪个包;verify 文件是否被改动过(已安装)
-p, --package query/verify 包文件
查询 选项(与 -p 配合使用)
-q 查询是否安装
-c, --configfiles list all configuration files
-l, --list list files in package
-s, --state display the states of the listed files
-i 列出该软件的详细信息
-R 列出软件依赖的文件
验证 选项(与 -V 配合使用)
使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有软件文件,可用于查询文件是否被改动过
--nodeps don't verify package dependencies
卸载 选项
-e, --erase=<package>+ erase (uninstall) package
由于 RPM 文件常常会安装/移除/升级等,某些动作或许可能会导致 RPM 数据库 /var/lib/rpm/
内的文件损坏。可以通过下面的指令重建数据库:
rpmdb [OPTION...]
原来的 rpm --rebuilddb 移动到该命令下来了
Database options:
--initdb initialize database
--rebuilddb rebuild database inverted lists from installed package headers
查询
[root@dev ~]# rpm -q tree
tree-1.6.0-10.el7.x86_64
[root@dev ~]# rpm -q treee
package treee is not installed
验证
[root@dev ~]# rpm -V rootfiles
S.5....T. c /root/.bashrc
[root@dev ~]# rpm -Vf /root/.bashrc
S.5....T. c /root/.bashrc
[root@dev ~]# rpm -Vf test.py
file /root/test.py is not owned by any package
前面9个字段代表的意义:
- S :(file Size differs) 文件的容量大小是否被改变
- M :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可执行等参数已被改变
- 5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同
- D :(Device major/minor number mis-match) 设备的主/次代码已经改变
- L :(readLink(2) path mis-match) Link 路径已被改变
- U :(User ownership differs) 文件的所属人已被改变
- G :(Group ownership differs) 文件的所属群组已被改变
- T :(mTime differs) 文件的建立时间已被改变
- P :(caPabilities differ) 功能已经被改变
后面的一个字符表示属于什么文件类型:
- c :配置文件 (config file)
- d :文件数据文件 (documentation)
- g :鬼文件~通常是该文件不被某个软件所包含,较少发生 (ghost file)
- l :许可证文件 (license file)
- r :自述文件 (read me)
1.1 数字签名(digital signature)⚓
当你要安装一个 RPM 文件时:
- 首先你必须要先安装原厂发布的公钥文件;
- 实际安装原厂的 RPM 软件时,rpm 指令会去读取 RPM 文件的签名信息,与本机系统内的签名信息比对;
- 若签名相同则予以安装,若找不到相关的签名信息时,则给予警告并且停止安装。
数字公钥一般位于 /etc/pki/rpm-gpg/
目录:
[root@dev ~]# ls -1 /etc/pki/rpm-gpg/
RPM-GPG-KEY-CentOS-7
RPM-GPG-KEY-CentOS-Debug-7
RPM-GPG-KEY-CentOS-Testing-7
RPM-GPG-KEY-EPEL-7
安装公钥:
[root@dev ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# 安装完成之后,这个密钥的内容会以软件的形式呈现
[root@dev ~]# rpm -qa | grep pubkey
gpg-pubkey-f4a80eb5-53a7ff4b
gpg-pubkey-7bd9bf62-5762b5f8
gpg-pubkey-fe590cb7-5337fb76
gpg-pubkey-352c64e5-52ae6884
[root@dev ~]# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b | grep Summary
Summary : gpg(CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>)
2. yum⚓
yum provides
除了搜寻指令的提供包之外,也可以搜寻文件的提供包:
[root@dev ~]# yum provides /root/.bashrc
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.neusoft.edu.cn
* epel: www.ftp.ne.jp
rootfiles-8.1-11.el7.noarch : The basic required files for the root user's directory
Repo : base
Matched from:
Filename : /root/.bashrc
rootfiles-8.1-11.el7.noarch : The basic required files for the root user's directory
Repo : @anaconda
Matched from:
Filename : /root/.bashrc
2.1 yum 仓库的配置文件⚓
[root@dev ~]# cat /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled = 1
常见字段(man yum.conf
):
- base:代表仓库的名字。中括号一定要存在,里面的名称则可以随意取但必须唯一;
- name:只是说明一下这个软件库的意义而已,重要性不高;
- mirrorlist:列出这个软件库可以使用的映射网站,如果不想使用,可以批注到这行;
- baseurl:这个最重要,因为后面接的就是软件库的实际网址。mirrorlist 是由 yum 程序自行搜寻映像网站, baseurl 则是指定固定的一个软件库网址。支持
http://, ftp://, file://
三种协议; - enable=1:是否启用该仓库;
- gpgcheck=1:是否需要查阅 RPM 文件内的数字签名;
- gpgkey:就是数字签名的公钥文件所在位置,使用默认值即可。
2.2 数据同步⚓
yum 会先下载软件库的清单到本机的 /var/cache/yum
。那我们修改了网址却没有修改软件库名称 (中括号内的文字),可能就会造成本机的列表与 yum 服务器的列表不同步,此时就会出现无法更新的问题。那么就清除掉本机上面的旧数据吧:
yum clean [options]
options
packages 将已下载的包文件删除
headers 将下载的包文件头删除
all 将所有包数据都删除
2.3 yum 的软件群组功能⚓
yum groups [actions]
actions
install
list
remove
info
可是当你下达安装命令时,却没有安装:
[root@dev ~]# yum groups install "Scientific Support"
……
No packages in any requested group available to install or update
这是因为 Scientific Support 里面的软件都是可选择的 (optional),而不是主要的 (mandatory),默认情况下不会安装 optional 的软件,所以需要修改配置文件(使用 man yum.conf
查看),添加一行喽:
[root@dev ~]# vi /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
……
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
# 这里就是新增的配置!
group_package_types=default, mandatory, optional
然后就可以安装啦!
3. RPM 还是 Tarball⚓
如果我要升级的话,或者是全新安装一个新的软件,那么该选择 RPM 还是 Tarball 来安装呢?事实上考虑的因素很多,不过鸟哥通常是这样建议的:
-
优先选择原厂的 RPM 功能
-
选择软件官网释出的 RPM 或者是提供的软件库网址
-
利用 Tarball 安装特殊软件
某些特殊用途的软件并不会特别帮你制作 RPM 文件的。此时建议你也不要妄想自行制作 SRPM 来转成 RPM 啦,因为你只有区区一部主机而已。若是你要管理相同的 100 部主机,那么将原始码转制作成 RPM 就有价值。
- 用 Tarball 测试新版软件
可以用 tarball 安装新软件到 /usr/local 底下, 那么该软件就能够同时安装两个版本在系统上面了。而且大多数软件安装数种版本时还不会互相干扰。
如果软件的架构差异性太大,或者是无法解决依赖问题,那么与其花大把的时间与精力在解决依赖问题上,还不如直接以 tarball 来安装。
4. rpmbuild⚓
对于 SRPM 文件:
--rebuild 编译、打包
--recompile 编译、打包、安装
更多说明参考:打包软件