浅谈RPM
[先絮叨下编译啊]
1、 库:其实就是一个程序模块(它没有执行入口,不能独立执行,只能被能独立运行的程序调用时执行)你可以把它想象成工具螺丝刀,可执行的程序是就是你自己;螺丝刀能自己干活吗?没有螺丝刀能拧螺丝吗?或者说你现在制作一个?螺丝刀可以实现这个功能但需要你来执行这个动作。
2、静态编译:将程序所需要的所有的库都编译进二进制程序,不依赖于共享库运行;就好像随身携带螺丝刀一样。
3、动态编译:程序所依赖的共享库并不会被编译进整个二进制程序,运行环境依赖于共享库;需要找到螺丝刀才能拧螺丝。
4、动态库文件:linux以[.so]结尾 dll是windows的。
5、因为大部分的程序都是动态编译的方式来编译的,可想而知我们的程序会产生依存关系链;也就是说你想装一个A程序,A可能需要B的支持而B又需要X和Y的支持才能运行。当然BXY可能使库也可能是程序。
6、不通的编译平台(硬件、系统)编译的程序是不通用的。就好像螺丝刀有梅花有一子有内六角一样,要对套才能使用。
7、新平台兼容老平台;所以呢在在新平台上编译的软件到老平台上一般会出现兼容性问题。我们安装的操作系统能够在过个平台上使用呢高低都兼容呢,难道在很老的平台上编译的吗?
[程序包管理器的两大主流]
dpkg:由 Debian Linux 社群所开发出来的, Debian 系的其他 Linux distributions 大多使用它来管理软件,例如B2D, Ubuntu 等,其前端工具有apt-get。
RPM:由 Red Hat 最早开发,后期使用C语言重新编写,效率和处理方式都非常好用。因此很多distributions 就使用其来作为软件安装的管理方式。例如 Fedora, CentOS, SuSE 等等,其前端工具有yum。
[Linux程序文件的组成及存放]
程序安装完成后由二进制文件、库文件、配置文件、帮助文件组成。
二进制程序 /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, /usr/local/APP/{bin,sbin} 注意: 有些特殊的应用程序放置于libexec目录中 有些第三方应用默认安装于/opt目录 库文件(开发库、运行库) /lib64, /usr/lib64, /usr/local/lib64, /usr/local/APP/lib 配置文件 /etc, /usr/local/APP/etc或conf目录 帮助文件 /usr/share/man, /usr/local/share/man, /usr/local/APP/man 帮助文件:man, info, doc: README, INSTALL, ChangeLog
[应用程序的命名格式]
源代码包的命名格式,一般都为压缩文件name-version.tar.{gz,bz2,xz}。 name-major.minor.release.tar.gz 名字-主版本号.次版本号.修订号.tar.gz 示例:bash-4.2.3.tar.gz keepalived-1.2.13.tar.gz rpm包的命名格式 name-version-relase.arch.rpm 名字-版本-rpm包发行号.适用平台.rpm version: major.minor.release,版本命名格式同源代码,就是从源码包上拷贝过来的 release: rpm自身的发行号,与程序源码的发行号无关,仅用于标识对rpm包不同制作的修订;同时,release还包含此包适用的OS arch: 适用于的硬件平台:x86: i386, i486, i586, i686,ppc(Power PC)、noarch(没有平台就是虚拟机)
示例:
xorg-x11-fonts-ISO8859-15-75dpi-7.2-9.1.el6.noarch.rpm
qemu-kvm-0.12.1.2-2.445.el6.x86_64.rpm
名字好长啊,这就是下面我们要将的分包的名字
[分包]
我想我们都装过精简版的office吧,或者安装自身的需要对office进行选择性的安装,这其实就是程序的分包。这在Linux上是一样存在的,这个应该就是个操作系统的实现方式上的区别了毕竟他们都要实现同样功能的螺丝刀就是样子和手感不一样而已。同样的在Linux上一个程序的功能可能很强大强大到我们使用不过来那么为了节省安装空间同样也可以选择安装。这在Linux上被叫做程序包分包
一般把程序分包成主包与子包。例如一个bash程序有N多个功能(其实这个同样也遵循28原则):可能最常用功能有10个,A功能:4个,二次开发相关功能:3个,那么包在分包的时候就会把这最常用的功能房子核心包内,其它各相关的功能被分别打包成子安装包。
核心包,主包:命名与源程序一致 bash-4.2.3-3.centos7.x86_64.rpm 子包: bash-a-4.2.3-3.centos7.x86_64.rpm name-分包名-major.minor.release.tar.gz bash-devel-4.2.3-3.centos7.x86_64.rpm (devel 开发)
以下下测试所使用的RPM包均来自系统安装光盘
[root@zhuzw-centos6 CentOS_6.6_Final]# ll 总用量 712 -r--r--r--. 2 root root 14 10月 24 21:59 CentOS_BuildTag dr-xr-xr-x. 3 root root 2048 10月 24 22:12 EFI -r--r--r--. 2 root root 212 11月 28 2013 EULA -r--r--r--. 2 root root 18009 11月 28 2013 GPL dr-xr-xr-x. 3 root root 204 8 10 月 24 22:17 images dr-xr-xr-x. 2 root root 2048 10月 24 22:12 isolinux dr-xr-xr-x. 2 root root 686080 10月 24 22:16 Packages #就在这个文件夹里 -r--r--r--. 2 root root 1354 10月 20 00:00 RELEASE-NOTES-en-US.html dr-xr-xr-x. 2 root root 4096 10月 24 22:17 repodata #yum仓库的元数据 -r--r--r--. 2 root root 1706 11月 28 2013 RPM-GPG-KEY-CentOS-6 #相应的包程序的认证KEY -r--r--r--. 2 root root 1730 11月 28 2013 RPM-GPG-KEY-CentOS-Debug-6 #相应的包程序的认证KEY -r--r--r--. 2 root root 1730 11月 28 2013 RPM-GPG-KEY-CentOS-Security-6 #相应的包程序的认证KEY -r--r--r--. 2 root root 1734 11月 28 2013 RPM-GPG-KEY-CentOS-Testing-6 #相应的包程序的认证KEY -r--r--r--. 1 root root 3380 10月 24 22:17 TRANS.TBL
[使用RPM-安装程序包]
命令格式: rpm [option]/path/to/package_file... rpm [选项] [包路径] (绝对路径、相对路径、网络路径)
常用选项说明:
-i:install安装程序;
-v:显示安装执行过程;
-vv:显示更详细安装执行过程;
-vvv:详细了在详细的过程;
-h:安装进度条,#一个#表示2%
常用组合选项:-ivh
--test: 仅作测试,没有真正执行安装
--nodeps:忽略依赖关系,强制安装,能安装上,但有可能无法运行
--replacepkgs:重新安装,会检测已安装的程序的文件,如原配置文件修改过,则有可能不执行替换,并将新的配置文件重命名为 .rpmnew。同样删除时也会将修改过的配置文件进行备份并在平面上输出备份文件名。
示例测试强制安装(测试) [root@zhuzw-centos6 Packages]# rpm -ihv --test qemu-kvm-0.12.1.2-2.445.el6.x86_64.rpm --nodeps warning: qemu-kvm-0.12.1.2-2.445.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 如果不强制忽略这个依赖关系就会出现 [root@zhuzw-centos6 Packages]# rpm -iv --test qemu-kvm-0.12.1.2-2.445.el6.x86_64.rpm warning: qemu-kvm-0.12.1.2-2.445.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY error: Failed dependencies: /usr/share/gpxe/e1000-0x100e.rom is needed by qemu-kvm-2:0.12.1.2-2.445.el6.x86_64 /usr/share/gpxe/pcnet32.rom is needed by qemu-kvm-2:0.12.1.2-2.445.el6.x86_64 /usr/share/gpxe/rtl8029.rom is needed by qemu-kvm-2:0.12.1.2-2.445.el6.x86_64 /usr/share/gpxe/rtl8139.rom is needed by qemu-kvm-2:0.12.1.2-2.445.el6.x86_64 还有就不做详细的拷贝了,这就是我们一开始说的依存关系链(我这么叫而已,仅供参考)
[使用RPM-卸载程序包]
命令格式:rpm [option] package_name
常用选项说明:-e: 卸载程序 同样删除时也会将修改过的配置文件进行备份并在平面上输出备份文件名。
--nodeps:忽略依赖关系,强行卸载,其他依赖于此包的程序可能无法正常运行,慎用啊
[root@zhuzw-centos6 Packages]# rpm -e --nodeps qemu-kvm [root@zhuzw-centos6 Packages]# echo $? 0
[使用RPM-升级程序包]
命令格式:rrpm [-Uvh | -Fvh] /path/to/package_file
常用组合选项:-Uvh: 升级或安装,后面的程序安装此电脑已安装则进行升级,如没有安装则现在安装;
-Fvh: 升级,只对电脑上已安装的程序进行升级,如没有安装则不进行安装;
--force:强制升级
内核不要进行升级,有可能会发生不可预料的错误出现,可以安装新内核,系统运行多内核并存。
[使用RPM-进行查询操作]
命令格式:rpm [option] package_name|file
-q: 查询某包是否安装,可以一次查询多个,彼此间用空格隔离; rpm -q kvm zsh
[root@zhuzw-centos6 Packages]# rpm -q kvm zsh package kvm is not installed zsh-4.3.10-7.el6.x86_64
-qa: 查询所有已经安装的包,组合管道使用效果更佳。
[root@zhuzw-centos6 Packages]# rpm -qa | grep bash bash-4.1.2-15.el6_4.x86_64
-qi: 查询包的描述信息(只能查询已经安装的包的描述信息);
[root@zhuzw-centos6 Packages]# rpm -qi bash Name : bash Relocations: (not relocatable) # 是否保留缓存的安装包 Version : 4.1.2 Vendor: CentOS Release : 15.el6_4 Build Date: 2013年07月18日 星期四 21时21分24秒 #包创建日期 Install Date: 2015年03月09日 星期一 07时43分42秒 Build Host: c6b10.bsys.dev.centos.org #安装日期 #编译主机 Group : System Environment/Shells Source RPM: bash-4.1.2-15.el6_4.src.rpm Size : 3139291 License: GPLv3+ Signature : RSA/SHA1, 2013年07月18日 星期四 21时46分10秒, Key ID 0946fca2c105b9de Packager : CentOS BuildSystem <http://bugs.centos.org> URL : http://www.gnu.org/software/bash Summary : The GNU Bourne Again 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 C shell (csh). Most sh scripts can be run by bash without modification.
-ql: 查询某包安装生成了哪些文件(所有);
-qc: 查询某包安装生成了哪些配置文件;不记得了那个程序的配置文件的时候非常常用。
-qd: 查询某包安装生成了哪些帮助文件;
--q--scripts package_name: 查询程序包的相关脚本;
脚本有四类: preinstall:安装前脚本,包安装之前的脚本
postinstall: 安装后脚本
preuninstall:卸载前脚本
postuninstall:卸载后脚本
[root@zhuzw-centos6 Packages]# rpm -q --scripts preinstall bash package preinstall is not installed 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 # 后面的内容不做详细叙述了
查询没有安装的包的相关信息,只需要在选项里加入-p即可,如下:
-qpi 包的描述信息
-qpl 包安装会生成的文件
-qpc 包安装会生成的配置文件
-qpd 包安装会生成的帮助文件
查询某文件是由哪个包安装生成的:rpm -qf /path/to/some_file
[root@zhuzw-centos6 Packages]# rpm -qf /bin/bash bash-4.1.2-15.el6_4.x86_64
[使用RPM-进行校验]
用于检查包安装生成的文件属性是否发生变化
命令格式:rpm [option] package_name|file
常用选项说明:
-V :后面加的是程序名称,若该程序属有的文件发生改变就会显示;
-Va :显示目前系统上面所有可能被修改过的文件;
-Vp :后面加的是文件名,显示该程序内可能被更改过的文件;
-Vf :后面加的是文件名,显示某个文件是否被修改过。
[root@zhuzw-centos6 Packages]# vi /etc/skel/.bashrc # 添加了一条#ceshi [root@zhuzw-centos6 Packages]# rpm -V bash S.5....T. c /etc/skel/.bashrc
对应属性位说明:
S file Size differs 文件大小发生改变 M Mode differs (includes permissions and file type) 文件的权限或类型被修改 5 digest (formerly MD5 sum) differs 文件内容发生改变 D Device major/minor number mismatch 主设备号、次设备号发生改变 L readLink(2) path mismatch 路径改变 U User ownership differs 属主发生改变 G Group ownership differs 属组发生改变 T mTime differs 文件的修改时间发生改变 P caPabilities differ 包的能力发生改变 在文件属性发生某项属性变化时,对应属性位的标识才会显示,若属性无变化,则显示为[.]
RPM包的校验与数字签名说明:
RPM包的校验主要有来源合法性验证与包的完整性验证。
数字签名:包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特性码,附加原始数据后面。
验正过程:
前提:必须有可靠机制获取到包制作者的公钥;
1、使用制作者的公钥解密加密的特征码,能解密则意味着来源合法。
2、对文件进行相应的完整性校验工具MD5|SHA-1 等得到特征码对比制作者提供的加密特征码,一致则认为包完整。
rpm包来源合法性及完整性检验:
在当前系统上导入包的制作者的公钥:
rpm--import /path/to/key_file 【公钥路径】
显示所有已经导入的gpg格式的公钥:
rpm -qa gpg-pubkey* 【通配符方式检查】
显示密钥的详细信息
rpm -qi gpg-pubkey-NAME
[root@zhuzw-centos6 Packages]# rpm --import /media/CentOS_6.6_Final/RPM-GPG-KEY-CentOS-6 [root@zhuzw-centos6 Packages]# rpm -qa gpg-pu* gpg-pubkey-c105b9de-4e0fd3a3 [root@zhuzw-centos6 Packages]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3 Name : gpg-pubkey Relocations: (not relocatable) Version : c105b9de Vendor: (none) Release : 4e0fd3a3 Build Date: 2015 年04月17日 星期五 19时49分12秒 Install Date: 2015年04月17日 星期五 19时49分12秒 Build Host: localhost Group : Public Keys Source RPM: (none) Size : 0 License: pubkey Signature : (none) Summary : gpg(CentOS-6 Key (CentOS 6 Official Signing Key) <[email protected]>) Description : -----BEGIN PGP PUBLIC KEY BLOCK----- Version: rpm-4.8.0 (NSS-3) mQINBE4P06MBEACqn48FZgYkG2QrtUAVDV58H6LpDYEcTcv4CIFSkgs6dJ9TavCW NyPBZRpM2R+Rg5eVqlborp7TmktBP/sSsxc8eJ #余下的内部不做详细拷贝了
安装过程中会只要有相对应的公钥就会自动用已经导入的的公钥,对程序包进行检验,一般无需进行手动校验。
手动检查:前提是导入KEY文件
rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE
选项说明:
-K :等同于 --checksig ,进行检查并显示结果;
--nodigest:不检查包完整性;
--nosignature:不检查来源合法性。
[ RPM的数据库重建]
万一哪天发现rpm不能管理我们的程序包了,可以通过RPM数据库重建来尝试解决。
数据库目录: /var/lib/rpm
重建数据库:
rpm--initdb:初始化
如果事先没有库,会新建一个;如果有,则不新建。
rpm--rebuilddb : 重建
直接重建,覆盖原有的数据库。
RPM速查表 RPM-安装程序包 #命令格式: rpm [option] /path/to/package_file... rpm [选项] [包路径] -i install安装程序; -v 显示安装执行过程; -vv 显示更详细安装执行过程; -vvv 详细了在详细的过程; -h 安装进度条,#一个#表示2% -ivh 常用组合选项 --test 仅作测试,没有真正执行安装 --nodeps 忽略依赖关系,强制安装,能安装上,但有可能无法运行 --replacepkgs 重新安装,会检测已安装的程序的文件,如原配置文件修改过,则有可能不执行替换,并将新的配置文件重命名为 .rpmnew。同样删除时也会将修改过的配置文件进行备份并在平面上输出备份文件名 使用RPM-卸载程序包 #命令格式:rpm [option] package_name -e: 卸载程序 --nodeps 忽略依赖关系,强制安装,能安装上,但有可能无法运行 使用RPM-升级程序包 #命令格式:rrpm [-Uvh | -Fvh] /path/to/package_file -Uvh 升级或安装,后面的程序安装此电脑已安装则进行升级,如没有安装则现在安装; -Fvh 升级,只对电脑上已安装的程序进行升级,如没有安装则不进行安装; --force 强制升级; 内核不要进行升级,有可能会发生不可预料的错误出现,可以安装新内核,系统运行多内核并存。 使用RPM-查询操作 #命令格式:rpm [option] package_name|file -q 查询某包是否安装,可以一次查询多个,彼此间用空格隔离; rpm -q kvm zsh -p 查询某包是否安装,可以一次查询多个 -qa 查询所有已经安装的包,组合管道使用效果更佳 -qi 查询包的描述信息(只能查询已经安装的包的描述信息); -ql 查询某包安装生成了哪些文件(所有); -qc 查询某包安装生成了哪些配置文件;不记得了那个程序的配置文件的时候非常常用。 -qd 查询某包安装生成了哪些帮助文件; -q --scripts package_name" 查询程序包的相关脚本 preinstall:安装前脚本,包安装之前的脚本 postinstall: 安装后脚本 preuninstall:卸载前脚本 postuninstall:卸载后脚本" -qpi 未安装包的描述信息 -qpl 未安装包安装会生成的文件 -qpc 未安装包安装会生成的配置文件 -qpd 未安装包安装会生成的帮助文件 rpm -qf /path/to/some_file 查询某文件是由哪个包安装生成的 使用RPM-校验 用于检查包安装生成的文件属性是否发生变化 #命令格式:rpm [option] package_name|file -V 后面加的是程序名称,若该程序属有的文件发生改变就会显示; -Va 显示目前系统上面所有可能被修改过的文件; -Vp 后面加的是文件名,显示该程序内可能被更改过的文件; -Vf 后面加的是文件名,显示某个文件是否被修改过。 rpm --import /path/to/key_file 在当前系统上导入包的制作者的公钥: rpm -qa gpg-pubkey* 显示所有已经导入的gpg格式的公钥: rpm -qi gpg-pubkey-NAME 显示密钥的详细信息 手动检查:rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE -K 等同于 --checksig ,进行检查并显示结果; --nodigest 不检查包完整性; --nosignature 不检查来源合法性。 RPM- 数据库重建: rpm --initdb 初始化;如果事先没有库,会新建一个;如果有,则不新建; rpm --rebuilddb 重建;直接重建,覆盖原有的数据库