rpm包管理
库文件
linux上,库文件是非常重要的,因为很多的软件都不是将所有的自己在需要的函数库自己写好,而是将一部分自己软件特有的库文件自己写,通用的库文件全部动态链接到公共库上去,这样不仅节省空间,同时用起来也是十分的方便。
查看二进制程序所依赖的库文件
ldd /PATH/TO/BINARY_FILE
[root@CT71 ~]#ldd /bin/ls
linux-vdso.so.1 => (0x00007ffceaa9e000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f282277e000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f2822579000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007f282236f000)
libc.so.6 => /lib64/libc.so.6 (0x00007f2821fae000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2821d4d000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f2821b48000)
/lib64/ld-linux-x86-64.so.2 (0x00007f28229b9000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f2821943000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2821727000)
管理及查看本机装载的库文件
ldconfig 加载库文件
/sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路径映射关系
配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
缓存文件: /etc/ld.so.cache
[root@CT6 ~]# ldconfig -p | less 1097 libs found in cache `/etc/ld.so.cache' libz.so.1 (libc6,x86-64) => /lib64/libz.so.1 libx11globalcomm.so.1 (libc6,x86-64) => /usr/lib64/libx11globalcomm.so.1 libxul.so (libc6,x86-64) => /usr/lib64/xulrunner/libxul.so libxtables.so.4 (libc6,x86-64) => /lib64/libxtables.so.4 libxslt.so.1 (libc6,x86-64) => /usr/lib64/libxslt.so.1 libxshmfence.so.1 (libc6,x86-64) => /usr/lib64/libxshmfence.so.1 libxpcom.so (libc6,x86-64) => /usr/lib64/xulrunner/libxpcom.so libxml2.so.2 (libc6,x86-64) => /usr/lib64/libxml2.so.2 ... ...
RPM包命名原则
name-VERSION-release.arch.rpm
比如:httpd-2.2.15-15.e16.centos.1.i686.rpm
httpd 软件包名
2.2.15 软件版本
15 软件发布次数
e16.centos 适合的linux平台
i686 适合的硬件平台
rpm rpm扩展包名
常见的arch
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平台无关: noarch
rpm包依赖性
- 树形依赖: a->b->c
- 环形依赖:a->b->c->a
- 模块依赖:查询网站:www.rpmfind.net
一般服务器安装都是最小化安装,这样是为了降低被攻击的可能性,由于服务器的最小化安装,导致安装一个软件需要很多依赖,比如树形依赖,在安装依赖a的时候可能需要安装依赖包g,e,y,j,u等,安装b依赖时又需要其他各种依赖,树形依赖虽然麻烦,可以依旧可以解决。环形依赖也不是很难解决,只需要用一条命令a、b、c同时安装就能解决依赖问题。还有一种依赖时模块依赖,它依赖的是某个软件中的程序,我们可以通过查询www.rpmfind.net来安装依赖。
RPM包管理包括rpm命令管理和yum在线管理,rpm命令管理如上所说,遇到各种依赖问题的时候需要我们自己动手查找依赖包,然后手动解决依赖问题,进行后装。后来人们发现有没有一种什么简单的方法进行安装软件,于是就有了yum命令,事先准备一个包含所有rpm包的网站,作为在线服务器源我们只要使用在线命令安装软件,不管我去依赖那一个包,yum都会自动到服务器上把依赖下载安装。
包管理器
二进制应用程序的组成部分:
二进制文件、库文件、配置文件、帮助文件
程序包管理器:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
包文件组成 (每个包独有)
RPM包内的文件
RPM的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本
数据库(公共): /var/lib/rpm
程序包名称及版本
依赖关系
功能说明
包安装后生成的各文件路径及校验码信息
程序包管理器:
debian: deb文件, dpkg包管理器
redhat: rpm文件, rpm包管理器
rpm: Redhat Package Manager
RPM Package Manager
我们要学习的就是Redhat系列的rpm包管理
程序包的来源
管理程序包的方式:
使用包管理器: rpm
使用前端工具: yum, dnf (dnf还未在正式版的红帽中使用)
获取程序包的途径:
(1) 系统发版的光盘或官方的服务器;
CentOS镜像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 项目官方站点
(3) 第三方组织:
Fedora-EPEL:
Extra Packages for Enterprise Linux
Rpmforge:RHEL推荐,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
(4) 自己制作
注意:第三方包建议要检查其合法性来源合法性,程序包的完整性
rpm的安装更新与卸载
包名:如httpd,操作已经安装的软件包时,使用包名,是搜索/var/lib/rpm中的数据库
包全名:如httpd-2.2.15-15.e16.centos.1.i686.rpm,操作没有安装的软件包时,使用
包全名,一定要注意路径。
rpm安装:
rpm -ivh 包全名
-i(install) 安装
-v(verbose) 显示详细信息
-h(hash) 显示进度
--test: 测试安装,但不真正执行安装,即dry run模式
--nodeps:忽略依赖关系
--replacepkgs 已安装过的包重装。
--replacefiles 其他已安装的RPM包的文件,与即将装的RPM中的文件冲突时,则覆盖文件并安装。
--nosignature: 不检查来源合法性
--nodigest:不检查包完整性
--noscripts:不执行程序包脚本
%pre: 安装前脚本; --nopre
%post: 安装后脚本; --nopost
%preun: 卸载前脚本; --nopreun
%postun: 卸载后脚本; --nopostun
上面就是通过rpm命令安装的,会产生各种依赖,这是rpm安装的缺点
@@@@@@@@@@@@@@@@@@@@
rpm更新:
rpm -Uvh 软件包
rpm -Fvh 软件包
-U(upgrade) 升级
upgrade:安装有旧版程序包,则“升级”
如果不存在旧版程序包,则“安装”
freshen:安装有旧版程序包,则“升级”
如果不存在旧版程序包,则不执行升级操作
--oldpackage:降级
--force: 强制安装
有时候可以用更新命令代替安装命令是没问题的,这是由于升级的本质就是将原来的全部或部分软件包删除再重新安装,这对于我们存在很多重要数据的软件来说是绝对不允许的,所以升级命令一定要慎用,一定要慎用,除非软件出现了什么重大的BUG,不升级不行,这时候将重要数据进行备份,再进行升级。
用强制安装或降级安装会保留原来的软件,我们以内核为例,进行降级操作,看看是否会保留两个内核:
[root@CT6 app]# ll total 70964 drwxr-xr-x. 2 root root 4096 Jul 18 14:10 2048.dir drwxr-xr-x. 2 root root 4096 Jul 18 14:27 fk.dir drwxrwx---. 3 root Java_A 4096 Jul 22 15:50 java -r--r--r--. 1 root root 33563248 Aug 12 11:35 kernel-2.6.32-696.el6.x86_64.rpm -rw-r--r--. 1 root root 39071032 Aug 12 11:57 kernel-2.6.32-642.el6.x86_64.rpm drwx------. 2 root root 16384 Jul 11 15:51 lost+found
9 #boot=/dev/sda 10 default=0 11 timeout=5 12 splashimage=(hd0,0)/grub/splash.xpm.gz 13 hiddenmenu 14 title CentOS 6 (2.6.32-696.el6.x86_64) 15 root (hd0,0) 16 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=6df0d47f-1a62-4419-a49c-e57906aa21 73 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet 17 initrd /initramfs-2.6.32-696.el6.x86_64.img ~
进行操作:
-rw-r--r--. 1 root root 33382260 May 12 2016 kernel-2.6.32-642.el6.x86_64.rpm [root@CT6 app]# rpm -ivh kernel-2.6.32-642.el6.x86_64.rpm --force Preparing... ########################################### [100%] 1:kernel ########################################### [100%]
我们在看/boot/grub/grub.conf(现在双内核)
9 #boot=/dev/sda 10 default=0 11 timeout=5 12 splashimage=(hd0,0)/grub/splash.xpm.gz 13 hiddenmenu 14 title CentOS (2.6.32-642.el6.x86_64) 15 root (hd0,0) 16 kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=6df0d47f-1a62-4419-a49c-e57906aa21 73 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet 17 initrd /initramfs-2.6.32-642.el6.x86_64.img 18 title CentOS 6 (2.6.32-696.el6.x86_64) 19 root (hd0,0) 20 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=6df0d47f-1a62-4419-a49c-e57906aa21 73 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet 21 initrd /initramfs-2.6.32-696.el6.x86_64.img
注意:
(1) 不要对内核做升级操作; Linux支持多内核版本并存,因此,对直接安装新版本内核
(2)如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
@@@@@@@@@@@@@@@@@@@@
rpm卸载:
rpm -e 包名
-e(erase) 卸载
--nodeps 不检查依赖性
一般rpm包的卸载顺序是按照安装顺序进行的,安装时是a->b->c,卸载时也是a->b->c。假如要卸载的rpm包是依赖于其他包,而没有其他软件包依赖要卸载的件,则卸载应该没什么问题,如果有其他包依赖于要卸载的软件,则需要考虑依赖,如果你输入rpm -e httpd命令,系统会提示你有依赖关系,不能卸载。所以要加上--nodeps不检查依赖强制删除,这个结果就是只删除了httpd,跟他有依赖关系的其它软件是不会删除的,但是这些软件因为系统里没有了httpd也会不能运行,这是所谓的没有删除干净,而yum -y remove httpd这种方式是把与httpd有依赖关系的所有软件一并删除。比如PHP,mod_ssl等等。这就干净了。
rpm查询
rpm {-q|--query} [select-options] [query-options] [select-options]
-q 软件包名 查询已安装过的软件包名。
-qa 列出所有的已安装过的rpm包
-qa "name*"
-qa |grep name
-qf 查询一个文件来自于哪一个rpm包 (已安装的rpm)
-q --changelog 版本更新日志
-qc 查询软件包的配置文件(不是所有包都有配置文件)
-qd 查询软件包的帮助文档
-qi 查询软件包的详细信息
-ql 查询软件包所安装到系统当中的所有文件路径
-q --scripts 查询软件包自带的脚本
-q --provides 查询自身的功能(能够提供的依赖)
-qR 查询实现自身的功能需要什么能力(需要的外部依赖)
-qp[licd] rpm包 查看未安装的rpm包的各项信息
查询是否安装
rpm -q 包名
-q(query) 查询
查询所有已经安装的rpm包
rpm -qa
-a(all) 所有
不过我们常用的查询命令是rpm -qa | grep 包名
查询软件的配置文件
rpm -qc
查看软件的帮助文档
rpm -qd
查询软件的详细信息
rpm -qip 包名(包全名)
-i(information) 查询软件信息
-p(package) 查询未安装包信息
查询软件包自带的脚本
rpm -q --scripts
查询自身的功能(能够提供的依赖)
rpm -q --provides
查询实现自身的功能需要什么能力(需要的外部依赖)
rpm -qR
查询软件的安装位置
rpm -qlp 包名(包全名)
-l(list) 查询位置
-p(package) 查询未安装的软件打算安装的位置
查询系统文件属于哪个rpm包
rpm -qf 系统文件名
-f(file) 查询系统文件属于哪个软件包
查询软件包的依赖性
rpm -qRp 包名(包全名)
-R(requires) 查询软件包的依赖性
-p(package) 查询未安装包的信息
rpm包的校验
rpm -V 包名
-V(verify) 校验指定rpm包中的文件
如果文件没有进行修改,不会出现变化,如果文件被修改,则会出现修改信息
S.5. . . . T. c 是有含义的:
S 文件大小是否改变
M 文件类型或文件权限是否改变
5 文件MD5校验和是否改变,可以看成文件内容是否改变
D 设备的中,从代码是否被改变
L 文件路径是否被改变
U 文件所有者是否改变
G 文件属组是否被改变
T 文件的修改时间是否被改变
c 配置文件
d 普通文件
g ghost文件,不应该出现的文件
l 授权文件
r 描述文件
上面的验证是基于软件安装完毕后的验证,万一软件在安装前就有问题呢?如何验证一个软件包有没有问题呢?方法是有的,我们的学习平台是基于centos的,它的软件包是rpm包,我们要验证rpm包是否被人改动过,只需要将秘钥导入到我们的系统然后使用rpm -K 来验证软件包的完整性:
第一步,导入秘钥(我们使用的秘钥就是光盘镜像中的)
[root@CT6 ~]# rpm --import /mnt/cdrom/RPM-GPG-KEY-CentOS-6
第二步,验证秘钥是否导入(rpm -qa )
[root@CT6 ~]# rpm -qa "gpg-pubkey*" gpg-pubkey-c105b9de-4e0fd3a3
第三步,验证软件包的完整性
[root@CT6 ~]# cp /mnt/cdrom/Packages/httpd-2.2.15-59.el6.centos.x86_64.rpm . [root@CT6 ~]# ll total 864 -r--r--r--. 1 root root 854072 Aug 12 16:19 httpd-2.2.15-59.el6.centos.x86_64.rpm -rw-r--r--. 1 root root 27440 Aug 12 15:17 httpd_change.log [root@CT6 ~]# rpm -K httpd-2.2.15-59.el6.centos.x86_64.rpm httpd-2.2.15-59.el6.centos.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
第四步,修改软件包,再次验证
[root@CT6 ~]# echo 123 >> httpd-2.2.15-59.el6.centos.x86_64.rpm [root@CT6 ~]# rpm -K httpd-2.2.15-59.el6.centos.x86_64.rpm httpd-2.2.15-59.el6.centos.x86_64.rpm: rsa sha1 (MD5) PGP MD5 NOT OK
rpm包中文件提取
rpm2cpio 包全名 | cpio -idv .文件绝对路径
rpm2cpio:将rpm包转换成cpio格式的命令
cpio:一个标准的工具,用于创建软件档案文件和从文档文件中提取文件
cpio 选项 < [文件|设备]
-i copy-in模式,还原
-d 还原时自动新建目录
-v 显示还原过程
接下来有个示例:
- 查询ls属于哪个软件包
- 造成ls误删的假象
- 提取rpm包中的ls命令到当前目录的/bin/ls下
- 把ls命令复制到/bin/目录下,修复文件
rpm数据库
我们在安装完软件包之后,信息都会被保存在一个数据库下面,只要我们不是吧软件直接卸载掉,我们都可以直接使用到rpm的查询命令查询到我们需要的信息。
数据库重建:
/var/lib/rpm
rpm {--initdb|--rebuilddb}
initdb: 初始化
如果事先不存在数据库,则新建之
否则,不执行任何操作
rebuilddb:重建已安装的包头的数据库索引目录
最好不要去动我们的数据库