linux上,库文件是很是重要的,由于不少的软件都不是将全部的本身在须要的函数库本身写好,而是将一部分本身软件特有的库文件本身写,通用的库文件所有动态连接到公共库上去,这样不只节省空间,同时用起来也是十分的方便。前端
查看二进制程序所依赖的库文件
ldd /PATH/TO/BINARY_FILEjava
[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: 显示本机已经缓存的全部可用库文件名及文件路径映射关系node
配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
缓存文件: /etc/ld.so.cachelinux
[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 ... ...
name-VERSION-release.arch.rpm
数据库
好比:httpd-2.2.15-15.e16.centos.1.i686.rpmcentos
httpd 软件包名缓存
2.2.15 软件版本服务器
15 软件发布次数app
e16.centos 适合的linux平台less
i686 适合的硬件平台
rpm rpm扩展包名
常见的arch
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平台无关: noarch
rpm包依赖性
通常服务器安装都是最小化安装,这样是为了下降被攻击的可能性,因为服务器的最小化安装,致使安装一个软件须要不少依赖,好比树形依赖,在安装依赖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 -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 -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 -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 {-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 -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 -qf 系统文件名
-f(file) 查询系统文件属于哪一个软件包
rpm -qRp 包名(包全名)
-R(requires) 查询软件包的依赖性
-p(package) 查询未安装包的信息
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 显示还原过程
接下来有个示例:
咱们在安装完软件包以后,信息都会被保存在一个数据库下面,只要咱们不是吧软件直接卸载掉,咱们均可以直接使用到rpm的查询命令查询到咱们须要的信息。
数据库重建:
/var/lib/rpm
rpm {--initdb|--rebuilddb}
initdb: 初始化
若是事先不存在数据库,则新建之
不然,不执行任何操做
rebuilddb:重建已安装的包头的数据库索引目录
最好不要去动咱们的数据库