在早期我们使用源代码的方式来安装软件时,都需要先把源程序代码编译成可执行的二进制安装程序,然后进行安装。这就意味着每次安装软件都需要经过预处理-->编译-->汇编-->链接-->生成安装文件--> 安装,这个复杂而艰辛的过程。为简化安装步骤,便于广大用户的安装部署程序,程序提供商就在特定的系统上面编译好相关程序的安装文件并进行打包,提供给大家下载,我们只需要根据自己的系统去下载相应的安装包进行安装即可,其类似 Windows 的安装方式,由程序开发者直接在已知的系统上面编译好,再将该程序直接给用户来安装,如此而已。但是,程序包该怎么管理呢,这就是我们程序包管理器的事啦!
什么是程序包管理器
用于管理Linux 下软件包的软件,其主要功能为:将编译好的程序打包成一个文件或有限的几个文件,可用于实现安装、卸载、升级、查询等功能。
程序包管理器的两大主流
dpkg:最早是由 Debian Linux 社群所开发出来的, 只要是衍生亍 Debian 的其他 Linux distributions 大多使用 dpkg 这个机制来管理软件的, 包括B2D, Ubuntu 等等,其前端工具有apt-get。
RPM:最早是由Red Hat这家公司开发出来的,后来实在太好用,因此很多distributions 就使用其来作为软件安装的管理方式。包括 Fedora, CentOS, SUSE 等等,其前端工具有yum。
程序包的组成格式与存放路径:
1、二进制程序
主要存放的路径:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, /usr/local/APP/{bin,sbin}
注意:有些特殊的应用程序放置于libexec目录中;有些第三方应用默认安装于/opt目录。
2、库文件(开发库、运行库)
主要存放的路径:/lib64, /usr/lib64, /usr/local/lib64, /usr/local/APP/lib
3、配置文件
主要存放的路径:/etc, /usr/local/APP/etc或conf目录
4、帮助文件
主要存放的路径:/usr/share/man, /usr/local/share/man, /usr/local/APP/man
RPM程序包管理器使用详解
RPM包的命名格式:
但对于一个程序来说,其可能具有很多功能,其中有些是常用功能,有些是特殊功能,有些是二次开发相关的功能,如果把所有的功能打包在一块,无疑程序包会增大很多,对一些普通用户无需使用的功能都需一并下载安装,无形间就造成了资源的浪费,特此在对程序包的打包就衍生出了分包机制,一般把程序分包成主包与子包。例如一个bash程序有20个功能:常用功能有10个,特殊A:4个,特殊B:3个,二次开发相关功能:3个,那么包的命名方式如下:
核心包,主包:命名与源程序一致
bash-4.2.3-3.centos7.x86_64.rpm
子包:
bash-a-4.2.3-3.centos7.x86_64.rpm
bash-b-4.2.3-3.centos7.x86_64.rpm
bash-devel-4.2.3-3.centos7.x86_64.rpm
CentOS系统上rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护
安装:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
-v: verbose
-vv: 显示更多信息
-h: 以#显示程序包管理执行进度;每个#表示2%的进度
rpm -ivh PACKAGE_FILE ...
[install-options]
--test: 测试安装,但不真正执行安装过程;dry run模式;
--nodeps:忽略依赖关系;
--replacepkgs: 重新安装;
--nosignature: 不检查来源合法性;
--nodigest:不检查包完整性;
--noscipts:不执行程序包脚本片断;
%pre: 安装前脚本; --nopre
%post: 安装后脚本; --nopost
%preun: 卸载前脚本; --nopreun
%postun: 卸载后脚本; --nopostun
在没有网络的前提下,你想要安装一个名为 pam-devel 的软件,你手边只有原版光盘你可以透过挂载原版光盘来进行数据的查询与安装。请将原版光盘放入光驱,底下我们尝试将光盘挂载到 /media 当中, 并据以处理软件的下载罗:
- 挂载光盘,使用: mount /dev/cdrom /media/cdrom
- 找出文件的实际路径:find /media -name ‘pam-devel*‘
- 测试此软件是否具有相依性: rpm -ivh pam-devel... --test
- 直接安装: rpm -ivh pam-devel...
- 卸载光盘: umount /dev/cdrom
[[email protected] Packages]# rpm -ivh python-netaddr-0.7.5-4.el6.noarch.rpm warning: python-netaddr-0.7.5-4.el6.noarch.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] package python-netaddr-0.7.5-4.el6.noarch is already installed |
[注意]:该命令后面接的是RPM包文件,可以用空格做分割同时安装多个程序,如电脑可以上网的话,也可以直接指定网络上的RPM包,进行安装。
升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”;
rpm {-F|--freshen} [install-options] PACKAGE_FILE ... freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作; rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
--oldpackage:降级;
--force: 强行升级;
注意:(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核;
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;
查询:
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a: 所有包
-f: 查看指定的文件由哪个程序包安装生成
-p /PATH/TO/PACKAGE_FILE:针对尚未安装的程序包文件做查询操作;
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
[query-options]
--changelog:查询rpm包的changlog
-c: 查询程序的配置文件
-d: 查询程序的文档
-i: information
-l: 查看指定的程序包安装后生成的所有文件;
--scripts:程序包自带的脚本片断
-R: 查询指定的程序包所依赖的CAPABILITY;
--provides: 列出指定程序包所提供的CAPABILITY;
组合的 用法:
-qi PACKAGE:列出该软件的详细信息,包括开发商,版本与说明
-qf FILE:由后面接的文件名称,找出该文件属于哪一个已经安装的软件
-qc PACKAGE:列出该软件的所有配置文档
-ql PACKAGE:查看指定的程序包安装后生成的所有文件;
-qd PACKAGE:列出该软件的所有说明档
-qpi PACKAGE_FILE:未安装包的描述信息
-qpl PACKAGE_FILE:包安装生成的文本
-qa:列出所有的已经安装的软件
-qR:列出与该软件有关的被需要的其他文件
-qpc:包安装会生成的配置文件
-qpd:包安装会生成的帮助文件
[[email protected] Packages]# rpm -qi zsh Name : zsh Relocations: (not relocatable) Version : 4.3.10 Vendor: CentOS Release : 7.el6 Build Date: 2013年11月25日 星期一 01时40分59秒 Install Date: 2015年08月31日 星期一 04时35分11秒 Build Host: c6b9.bsys.dev.centos.org Group : System Environment/Shells Source RPM: zsh-4.3.10-7.el6.src.rpm Size : 5009102 License: BSD Signature : RSA/SHA1, 2013年11月25日 星期一 03时33分46秒, Key ID 0946fca2c105b9de Packager : CentOS BuildSystem <http://bugs.centos.org> URL : http://zsh.sunsite.dk/ Summary : A powerful interactive shell Description : The zsh shell is a command interpreter usable as an interactive login shell and as a shell script command processor. Zsh resembles the ksh shell (the Korn shell), but includes many enhancements. Zsh supports command line editing, built-in spelling correction, programmable command completion, shell functions (with autoloading), a history mechanism, and more. |
[[email protected] bin]# rpm -qf /bin/cat coreutils-8.4-37.el6.x86_64 ###被查询文件的安装包 [[email protected] bin]# rpm -qc coreutils-8.4-37.el6.x86_64 /etc/DIR_COLORS /etc/DIR_COLORS.256color /etc/DIR_COLORS.lightbgcolor /etc/pam.d/runuser /etc/pam.d/runuser-l /etc/pam.d/su /etc/pam.d/su-l /etc/profile.d/colorls.csh /etc/profile.d/colorls.sh ###/etc/*都是以安装软件包的配置文档 [[email protected] bin]# |
卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts]
[--notriggers] [--test] PACKAGE_NAME ...
校验:
rpm {-V|--verify} [select-options] [verify-options]
-V :后面加的是程序名称,若该程序属有的文件发生改变就会显示;
-Va :显示目前系统上面所有可能被修改过的文件;
-Vp :后面加的是文件名,显示该程序内可能被更改过的文件;
-Vf :后面加的是文件名,显示某个文件是否被修改过。 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 caP abilities differ:包的能力发生改变
例如:
[[email protected] ~]# rpm -V zsh S.5....T. /usr/share/zsh/4.3.10/scripts/newuser [[email protected] ~]# |
RPM包的校验主要有来源合法性验证与包的完整性验证。
数字签名:包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特性码,附加原始数据后面。
验正过程:
前提:必须有可靠机制获取到包制作者的公钥;
1、使用制作者的公钥解密加密的特征码,能解密则意味着来源合法;
2、使用与制作者同样的意向加密算法提取原始数据的特征码,并与解密出来的特征作比对,相同,则意味着完整性没问题;
rpm包来源合法性及完整性检验:
在当前系统上导入包的制作者的公钥:
rpm --import /path/to/key_file
显示所有已经导入的gpg格式的公钥:
[[email protected] Packages]# rpm -ivh zip-3.0-1.el6.x86_64.rpm Preparing... ########################################### [100%] package zip-3.0-1.el6.x86_64 is already installed [[email protected] Packages]# |
从上面的执行结果中可以看到,导入公钥后就没有警告了
【注意】安装过程中会自动用已经导入的的公钥,对程序包进行检验,一般无需进行手动校验。
手动检查:
rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE
选项说明:
-K :等同于 --checksig ,进行检查并显示结果;
--nodigest:不检查包完整性;
--nosignature:不检查来源合法性。
数据库重建:
rpm {--initdb|--rebuilddb}
initdb: 初始化
如果事先不存在数据库,则新建之;否则,不执行任何操作;
rebuilddb:重建
无论当前存在与否,直接重新创建数据库;