RPM 是 Red Hat PackageManager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理;在Fedora 、Redhat、Mandriva、SuSE、YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用;
RPM包里面都包含什么?里面包含可执行的二进制程序,这个程序和Windows的软件包中的.exe文件类似是可执行的;RPM包中还包括程序运行时所需要的文件,这也和Windows的软件包类似,Windows的程序的运行,除了.exe文件以外,也有其它的文件;
一个RPM 包中的应用程序,有时除了自身所带的附加文件保证其正常以外,还需要其它特定版本文件,这就是软件包的依赖关系;依赖关系并不是Linux特有的,Windows操作系统中也是同样存在的;比如我们在Windows系统中运行3D游戏,在安装的时候,他可能会提示,要安装Direct 9 ;Linux和Windows原理是差不多的。
源代码命名格式:
name-VERSION.tar.gz
VERSION:major.minor.release
例如:
nginx-1.4.7.tar.gz
1:是主版本号
4:是次版本号
7:是发行号
rpm包命名格式:
name-VERSION-release.arch.rpm
VERSION:major.minor.release
release.arch:rpm包的发行号
archetecture(架构或平台):i386,x64(amd64), ppc, noarch
例如:
zsh-4.3.10-7.el6.x86_64.rpm
4:是主版本号
3:是次版本号
10:修订
7:是第几次发布版本
el6:适用于RHEL6或兼容Centos6
x86_64:CPU架构系统平台
el6 :enterprice linux 6 RHEL 6或centos 6
el5: rhel5
redis-3.0.2.tar.gz -->redis-3.0.2-1.centos7.x64.rpm
拆包:主包和支包
主包:name-VERSION-release.arch.rpm
支包:name-function-VERSION-release.arch.rpm
function:devel(开发), utils(工具程序), libs(库文件), ...
前端工具:自动解决依赖关系;
yum:rhel系列系统上rpm包管理器的前端工具;
apt-get (apt-cache):deb包管理器的前端工具;
zypper:suse的rpm管理器前端工具;
dnf:Fedora 22+系统上rpm包管理器的前端工具;
功能:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作;
1、程序包的组成清单(每个程序包都单独实现);
文件清单
安装或卸载时运行的脚本
2、数据库(公共)
程序包的名称和版本;
依赖关系;
功能说明;
安装生成的各文件的文件路径及校验码信息;
等等等
rpm包的数据库文件:/var/lib/rpm/
[root@Linux_1 mysql]# cd /var/lib/rpm/
[root@Linux_1 rpm]# ls
Basenames Dirnames Packages Sha1header
Conflictname Filedigests Providename Sigmd5
__db.001 Group Provideversion Triggername
__db.002 Installtid Pubkeys
__db.003 Name Requirename
__db.004 Obsoletename Requireversion
系统发行版的光盘或官方的文件服务器(或镜像站点):
a) http://mirrors.aliyun.com,
b) http://mirrors.sohu.com,
c) http://mirrors.163.com
项目的官方站点。例如:http://www.zabbix.com/
第三方组织:
i. EPEL
ii. 搜索引擎
1. http://pkgs.org
2. http://rpmfind.net
3. http://rpm.pbone.net
iii. (4) 自己制作rpm包
建议:检查其合法性
来源合法性;
程序包的完整性;
如果既想获得 RHEL 的高质量、高性能、高可靠性,又需要方便易用(关键是免费)的软件包更新功能,那么 Fedora Project 推出的 EPEL(Extra Packages for Enterprise Linux)正好适合你。EPEL(http://fedoraproject.org/wiki/EPEL)是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。
rpm [OPTIONS] [PACKAGE_FILE]
安装:-i, --install
升级:-U, --update, -F, --freshen
卸载:-e, --erase
查询:-q, --query
校验:-V, --verify
数据库维护:--builddb, --initdb
提示:
-Fvh是升级RPM包的命令,它表示如果后面的软件包没有安装在系统上,则这个软件包不会安装。也就是说只有安装到系统上的软件包才会被升级。
rpm {-i|--install} [install-options]PACKAGE_FILE ...
GENERAL OPTIONS:
-v:verbose,详细信息
-vv:更详细的输出
[install-options]:
-h:hash marks输出进度条;每个#表示2%的进度;
--test:测试安装,检查并报告依赖关系及冲突消息等;
--nodeps:忽略依赖关系;不建议;
--replacepkgs:重新安装(如果文件被修改错了,重新安装并不会覆盖这些文件,需要将这些文件删除之后再重新安装才能够覆盖还原。)
--justdb 使用时机: 由於 RPM 数据库破损或者是某些缘故产生错误时,可使用这个选项来升级软件在数据库内的相关资讯。
--prefix 新路径 使用时机: 要将软件安装到其他非正规目录时。举例来说,你想要将某软件安装到 /usr/local 而非正规的 /bin,/etc 等目录, 就可以使用『 --prefix /usr/local 』来处理了。
--replacefiles 使用时机: 如果在安装的过程当中出现了『某个文件已经被安装在你的系统上面』的资讯,又或许出现版本不合的信息 (confilcting files) 时,可以使用这个参数来直接覆盖文件。
危险性: 覆盖的动作是无法复原的!所以,你必须要很清楚的知道被覆盖的文件是真的可以被覆盖喔!否则会欲哭无泪!
示例:安装rpm包
[root@Linux_11 mnt]# rpm -ivhPackages/zsh
error: open of Packages/zsh failed: 没有那个文件或目录
[root@Linux_11 mnt]# rpm -ivhPackages/zsh-4.3.10-7.el6.i686.rpm
Preparing... ########################################### [100%]
提示:
" 安装包的时候使用的是PACKAGE_FILE,指定安装软件包的完整路径和完整名称。
示例:重新安装
注意:rpm可以自带脚本;
四类:
preinstall:安装过程开始之前运行的脚本,%pre ,--nopre
postinstall:安装过程完成之后运行的脚本,%post , --nopost
preuninstall:卸载过程真正开始执行之前运行的脚本,%preun, --nopreun
postuninstall:卸载过程完成之后运行的脚本,%postun , --nopostun
--noscripts:不运行脚本
--nosignature:不检查包签名信息,不检查来源合法性;
--nodigest:不检查包完整性信息;
依赖于制作者的公钥
rpm {-U|--upgrade} [install-options]PACKAGE_FILE ...
rpm {-F|--freshen} [install-options]PACKAGE_FILE ...
-U:升级或安装,如果事先安装了老版本包则升级,没有安装老版本包则安装此包
-F:升级,如果事先没有安装老版本的包则不升级
--oldpackage:降级;
--force:强制升级;
注意:
不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;
如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
rpm {-e|--erase} [--allmatches] [--nodeps][--noscripts] [--test] PACKAGE_NAME ...
-e:卸载包
--allmatches:卸载所有匹配指定名称的程序包的各版本;
--nodeps:忽略依赖关系
--test:测试卸载,dry run模式
rpm {-q|--query} [select-options][query-options]
[select-options]
-a, --all:查询所有已经安装过的包;
-f FILE:查询指定的文件由哪个程序包安装生成;
-p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;查询提供了 CAPABILITY 功能的软件包。
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;查询所有需要 CAPABILITY 功能才能运行的软件包。
[query-options]
--changelog:查询rpm包的历史变更信息changlog;
-l, --list:程序安装生成的所有文件列表;
-i, --info:程序包相关的信息,版本号、大小、所属的包组,等;
-c, --configfiles:查询指定的程序包提供的配置文件;
-d, --docfiles:查询指定的程序包提供的说明文档;
--provides:列出指定的程序包提供的所有的CAPABILITY;
-R, --requires:查询指定的程序包的依赖关系;
--scripts:查看程序包自带的脚本片断;
[root@Linux_1 Packages]# rpm �Cqa #查看所有已经安装的rpm包
setuptool-1.19.9-4.el6.i686
giflib-4.1.6-3.1.el6.i686
pidgin-2.7.9-11.el6.i686
libgsf-devel-1.14.15-5.el6.i686
libhangul-0.0.10-1.el6.i686
pyxdg-0.18-1.el6.noarch
keyutils-1.4-4.el6.i686
cheese-2.28.1-8.el6.i686
……
[root@Linux_1 Packages]# rpm -q bash #仅查询bash包安装了没有,安装了就显示出包名
bash-4.1.2-15.el6_4.i686
[root@Linux_1 Packages]# rpm -qf /usr/bin/crontab
cronie-1.4.4-12.el6.i686
[root@Linux_1 Packages]# rpm -ql rpcbind
/etc/rc.d/init.d/rpcbind
/sbin/rpcbind
/usr/sbin/rpcinfo
/usr/share/doc/rpcbind-0.2.0
/usr/share/doc/rpcbind-0.2.0/AUTHORS
/usr/share/doc/rpcbind-0.2.0/ChangeLog
/usr/share/doc/rpcbind-0.2.0/README
/usr/share/man/man8/rpcbind.8.gz
/usr/share/man/man8/rpcinfo.8.gz
/var/cache/rpcbind
[root@Linux_1 Packages]# rpm -qi bash
Name : bash Relocations: (notrelocatable)
Version : 4.1.2 Vendor: CentOS
Release : 15.el6_4 Build Date: 2013年07月18日星期四 21时17分24秒
Install Date: 2015年11月14日 星期六 23时51分34秒 Build Host: c6b10.bsys.dev.centos.org
Group : SystemEnvironment/Shells Source RPM:bash-4.1.2-15.el6_4.src.rpm
Size : 3104719 License: GPLv3+
Signature : RSA/SHA1, 2013年07月18日星期四 21时46分09秒, Key ID 0946fca2c105b9de
Packager : CentOSBuildSystem <http://bugs.centos.org>
URL :http://www.gnu.org/software/bash
Summary : The GNU BourneAgain shell
Description :
The GNU Bourne Again shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the Cshell
(csh). Most sh scripts can be run by bash without modification.
[root@Linux_1 Packages]# rpm -qc vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
[root@Linux_1 Packages]# rpm -qdnfs-utils
/usr/share/doc/nfs-utils-1.2.3/ChangeLog
/usr/share/doc/nfs-utils-1.2.3/INSTALL
/usr/share/doc/nfs-utils-1.2.3/KNOWNBUGS
/usr/share/doc/nfs-utils-1.2.3/Makefile
/usr/share/doc/nfs-utils-1.2.3/Makefile.am
/usr/share/doc/nfs-utils-1.2.3/Makefile.in
/usr/share/doc/nfs-utils-1.2.3/NEW
/usr/share/doc/nfs-utils-1.2.3/README
/usr/share/doc/nfs-utils-1.2.3/THANKS
[root@Linux_1 Packages]# rpm -qR bash
/bin/sh
/bin/sh
config(bash) = 4.1.2-15.el6_4
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.11)
libc.so.6(GLIBC_2.2)
libc.so.6(GLIBC_2.3)
libc.so.6(GLIBC_2.3.4)
libc.so.6(GLIBC_2.4)
libdl.so.2
libdl.so.2(GLIBC_2.0)
libdl.so.2(GLIBC_2.1)
libtinfo.so.5
ncurses-libs
rpmlib(BuiltinLuaScripts) <= 4.2.2-1
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1
[root@Linux_1 Packages]# rpm -q--scripts bash
postinstall scriptlet (using <lua>):
bashfound = false;
shfound = false;
f = io.open("/etc/shells", "r");
if f == nil
then
f =io.open("/etc/shells", "w");
else
repeat
t = f:read();
if t =="/bin/bash"
then
bashfound = true;
end
if t =="/bin/sh"
then
shfound = true;
end
until t == nil;
end
f:close()
f = io.open("/etc/shells", "a");
if not bashfound
then
f:write("/bin/bash\n")
end
if not shfound
then
f:write("/bin/sh\n")
end
f:close()
postuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ]; then
/bin/grep -v '^/bin/bash$'< /etc/shells | \
/bin/grep -v '^/bin/sh$'> /etc/shells.new
/bin/mv /etc/shells.new/etc/shells
fi
rpm {-V|--verify} [select-options][verify-options]
-V:后面接软件名称,若该软件所含的文件被改动过才会列出来
-Va:列出目前系统上面所有可能被改动过的文件
-Vp:后面加的是文件名称,列出该软件内可能被改动过的文件
-Vf:列出某个文件是否被改动过
S file Size differs:文件的容量大小是否被改变
M Mode differs (includespermissions and file type):文件的类型或文件的属性(rwx)是否被改变
5 digest (formerly MD5 sum)differs:MD5这一种指纹码的内容已经不同
D Device major/minor numbermismatch:设备的主/次代码已经改变
L readLink(2) path mismatch:Link路径已被改变
U User ownership differs:文件的所有者已被改变
G Group ownership differs:文件的所有属用户组已被改变
T mTime differs:文件的创建时间已被改变
P capabilities differ:capabilities已经改变
提示:当一个软件包的文件被被动过,那么它的显示就会是:
SM5DLUGTP c filename
c表示文件的类型
c:config file:设置文件
d:documentation:文档文件
g:ghost file:“鬼”文件,通常是该文件不被某个软件所包含,较少发生
l:linense file:授权文件
r:read line:自述文件
示例:查看某个已经安装的软件包中的哪些文件被改动过
[root@Linux_1 ~]# rpm -V vsftpd #查看vsftpd软件包中的哪些文件被改动过
S.5....T. c /etc/vsftpd/user_list
示例:列出系统上所有的rpm包中的文件中被改动的文件有哪些(针对所有rpm包中的所有文件查询)
[root@Linux_1 ~]# rpm -Va
prelink: /usr/lib/libgweather.so.1.5.2: at least one of file'sdependencies has changed since prelinking
S.?...... /usr/lib/libgweather.so.1.5.2
prelink: /usr/bin/gtkhtml-editor-test: at least one of file'sdependencies has changed since prelinking
S.?...... /usr/bin/gtkhtml-editor-test
prelink: /usr/lib/libgtkhtml-3.14.so.19.1.1: at least one of file'sdependencies has changed since prelinking
S.?...... /usr/lib/libgtkhtml-3.14.so.19.1.1
示例:查看某个文件是否被改动过(这个文件一定要属于某个rpm包才行)
[root@Linux_1 ~]# rpm -Vf /etc/zshrc
S.5....T. c /etc/zshrc
提示:列出的是这个文件被改动的类型
示例:根据完整的软件包名查看包内文件是否被动过
[root@Linux_1 Packages]# rpm -Vp ./zsh-4.3.10-7.el6.i686.rpm
S.5....T. c /etc/zshrc
包来源合法性验正和完整性验正:
p 来源合法性验正:
p 文件完整性验正:
获取并导入信任的包制作者的密钥:
对于CentOS发行版来说:rpm--import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
(1) 安装此组织签名的程序时,会自动执行验正;
(2) 手动验正:rpm -K PACKAGE_FILE
[root@Linux_1 Packages]# rpm -Kzsh-4.3.10-7.el6.i686.rpm
zsh-4.3.10-7.el6.i686.rpm: rsa sha1 (md5) pgpmd5 OK
rpm管理器数据库路径:/var/lib/rpm/
查询操作就是通过此处的数据库进行;
获取帮助:
CentOS 6:man rpm
CentOS 7:man rpmdb
rpm {--initdb|--rebuilddb} [--dbpathDIRECTORY] [--root DIRECTORY]
--initdb:初始化数据库,当前无任何数据库,可初始化创建一个新的;当前有时不执行任何操作;
--rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;
--dbpath:指明要创建数据库的目录
说明:
如果rpm数据库系统损坏可以使用此命令重建
[root@Linux_1 tmp]# mkdir -p /tmp/rpm #创建用于放置数据库的目录
[root@Linux_1 tmp]# rpm --initdb--dbpath /tmp/rpm/ #初始化数据库
[root@Linux_1 tmp]# ls /tmp/rpm/
__db.001 __db.002 __db.003 __db.004 Packages
[root@Linux_1 tmp]# rpm --rebuilddb--dbpath /tmp/rpm/ #重新构建数据库
[root@Linux_1 tmp]# ls /tmp/rpm/
Packages
1、 如果把/var/lib/rpm目录下的所有内容删除了,那么怎么办?
答:如果将此目录删除了,那么使用rpm �Cinitdb和rpm �Crebuilddb是不能够重建的。因为此目录下的文件不光有数据文件,还有其它的相关文件,--initdb和―rebuilddb只能够重建数据库,而不能重建其它的文件,可以这种方法是无效的。
本文出自 “静心&清心” 博客,谢绝转载!