rpm包管理
库文件
linux上,库文件是非常重要的,因为很多的软件都不是将所有的自己在需要的函数库自己写好,而是将一部分自己软件特有的库文件自己写,通用的库文件全部动态链接到公共库上去,这样不仅节省空间,同时用起来也是十分的方便。
查看二进制程序所依赖的库文件
ldd /PATH/TO/BINARY_FILE
[root@CT71 ~]#ldd /bin/ls
linux-vdso.so. => (0x00007ffceaa9e000)
libselinux.so. => /lib64/libselinux.so. (0x00007f282277e000)
libcap.so. => /lib64/libcap.so. (0x00007f2822579000)
libacl.so. => /lib64/libacl.so. (0x00007f282236f000)
libc.so. => /lib64/libc.so. (0x00007f2821fae000)
libpcre.so. => /lib64/libpcre.so. (0x00007f2821d4d000)
libdl.so. => /lib64/libdl.so. (0x00007f2821b48000)
/lib64/ld-linux-x86-.so. (0x00007f28229b9000)
libattr.so. => /lib64/libattr.so. (0x00007f2821943000)
libpthread.so. => /lib64/libpthread.so. (0x00007f2821727000)
管理及查看本机装载的库文件
ldconfig 加载库文件
/sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路径映射关系
配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
缓存文件: /etc/ld.so.cache
[root@CT6 ~]# ldconfig -p | less libs found in cache `/etc/ld.so.cache'
libz.so. (libc6,x86-) => /lib64/libz.so.
libx11globalcomm.so. (libc6,x86-) => /usr/lib64/libx11globalcomm.so.
libxul.so (libc6,x86-) => /usr/lib64/xulrunner/libxul.so
libxtables.so. (libc6,x86-) => /lib64/libxtables.so.
libxslt.so. (libc6,x86-) => /usr/lib64/libxslt.so.
libxshmfence.so. (libc6,x86-) => /usr/lib64/libxshmfence.so.
libxpcom.so (libc6,x86-) => /usr/lib64/xulrunner/libxpcom.so
libxml2.so. (libc6,x86-) => /usr/lib64/libxml2.so.
... ...
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
drwxr-xr-x. root root Jul : .dir
drwxr-xr-x. root root Jul : fk.dir
drwxrwx---. root Java_A Jul : java
-r--r--r--. root root Aug : kernel-2.6.-.el6.x86_64.rpm
-rw-r--r--. root root Aug :57 kernel-2.6.32-642.el6.x86_64.rpm
drwx------. root root Jul : lost+found
#boot=/dev/sda
default=
timeout=
splashimage=(hd0,)/grub/splash.xpm.gz
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--. root root May kernel-2.6.-.el6.x86_64.rpm
[root@CT6 app]# rpm -ivh kernel-2.6.-.el6.x86_64.rpm --force
Preparing... ########################################### [%]
:kernel ########################################### [%]
我们在看/boot/grub/grub.conf(现在双内核)
#boot=/dev/sda
default=
timeout=
splashimage=(hd0,)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-642.el6.x86_64)
root (hd0,)
kernel /vmlinuz-2.6.-.el6.x86_64 ro root=UUID=6df0d47f-1a62--a49c-e57906aa21 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF- rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.-.el6.x86_64.img
title CentOS 6 (2.6.32-696.el6.x86_64)
root (hd0,)
kernel /vmlinuz-2.6.-.el6.x86_64 ro root=UUID=6df0d47f-1a62--a49c-e57906aa21 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF- rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.-.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-
第二步,验证秘钥是否导入(rpm -qa )
[root@CT6 ~]# rpm -qa "gpg-pubkey*"
gpg-pubkey-c105b9de-4e0fd3a3
第三步,验证软件包的完整性
[root@CT6 ~]# cp /mnt/cdrom/Packages/httpd-2.2.-.el6.centos.x86_64.rpm .
[root@CT6 ~]# ll
total
-r--r--r--. root root Aug : httpd-2.2.-.el6.centos.x86_64.rpm
-rw-r--r--. root root Aug : httpd_change.log
[root@CT6 ~]# rpm -K httpd-2.2.-.el6.centos.x86_64.rpm
httpd-2.2.15-59.el6.centos.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
第四步,修改软件包,再次验证
[root@CT6 ~]# echo >> httpd-2.2.-.el6.centos.x86_64.rpm
[root@CT6 ~]# rpm -K httpd-2.2.-.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:重建已安装的包头的数据库索引目录
最好不要去动我们的数据库
rpm包管理的更多相关文章
- RPM包管理命令rpm
RPM包管理器是Linux系统中最早的软件包管理软件之一,也是目前最流行的软件包管理器,许多发行版都使用RPM作为默认的软件包管理软件. RPM软件包名称格式: samba-client-3.0.33 ...
- Linux学习之RPM包管理-yum管理(十七)
Linux学习之RPM包管理-yum管理 目录 IP地址配置 网络yum源 yum命令 光盘yum源搭建 IP地址配置 IP+子网掩码就可以在局域网(内网)使用. IP+子网掩码+网关+DNS就可以访 ...
- Linux学习之RPM包管理-rpm命令管理(十六)
Linux学习之RPM包管理-rpm命令管理 目录 简介 RPM包依赖性 包全名与包名 rpm软件包安装 rpm软件包卸载 升级降级rpm软件包 rpm软件包的查询 rpm软件包校验 简介 RPM是R ...
- rpm包管理和源码包管理
(1)软件类型 源码包 需要gcc编译 nginx-1.12.1.tar.gz 二进制包 已编译 mysql-community-common-5.7.12-1.el7.x86_64.rpm 常见的二 ...
- 【Linux相识相知】rpm包管理
我们日常在使用Windows的时候,如果要安装某个软件,最简单的方法就是在程序包的官网直接下载软件包到本地,一般是以.exe或者.msi格式的文件,然后一直下一步下一步就能安装成功了,但是在使用lin ...
- rpm 包管理器
rpm 包管理器 二进制应用程序的组成部分: 二进制文件.库文件.配置文件.帮助文件 程序包管理器:不同厂商的程序,包管理器也不同. debian:deb文件, dpkg包管理器 redhat: rp ...
- Linux rpm包管理工具
1.什么是rpm包 是一种编译好的二进制软件包,安装速度快. 2.rpm包命名 el6:软件包用于在Red Hat 6.x, CentOS 6.x, and CloudLinux 6.x进行安装 el ...
- Linux软件安装——软件包分类、RPM包管理
1.软件包分类: (1)源码包: 优点:开源,即用户可以看到源代码,用户可以修改源代码:可以自由选择所需的功能:软件是编译安装,效率更高. 缺点:需要手动安装,安装慢. (2)二进制包(RPM包.系统 ...
- Linux学习—rpm包管理
前言 在linux上,一个软件通常由二进制程序,库文件,配置文件和帮助文件组成.其中: 二进制程序一般都放在/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin和/ ...
随机推荐
- JAVA在win10上的安装环境配置
[TOC] 第一步: 打开右击电脑选择属性 第二步: 选择高级系统设置 第三部: 选择环境变量 第四部: 选择在系统变量中新建:JAVA_HOME 属性值为你的java的jdk的位置比如我的:E:\J ...
- LINQ to Entities 中的查询
MSDN地址:https://msdn.microsoft.com/zh-cn/library/bb399367%28v=vs.100%29.aspx .NET Framework 4 查询是一种从数 ...
- JavaScript 日期处理类库
Moment.js http://momentjs.cn/
- 【win10】大水牛主机插入耳机没有声音
主机:大水牛,技嘉主板 操作系统:win10 问题:主机前面插入耳机,没有声音,扬声器图标出错 解决 一..插入耳机 二..Realtek高清晰音频管理器 1.打开音频管理器,点击右下角的设置 2.点 ...
- 【可视化】Echarts3图层
默认echarts中canvas组件的z-index等于2,所以如果想让一个块元素如div覆盖echarts组件,需要指定z-index:3或者更大
- Java温故而知新-插入排序
插入排序 插入排序的基本思想是将待排序的元素依次插入序列合适的位置,然后将这个位置后面的元素依次向后移动一位 位置1 2 3 4 5 6 序列5 4 2 1 8 3 设第1位为最初始的基础元素,也就是 ...
- python+selenium自动化软件测试(第6章):selenium phantomjs页面解析使用
我们都知道Selenium是一个Web的自动化测试工具,可以在多平台下操作多种浏览器进行各种动作,比如运行浏览器,访问页面,点击按钮,提交表单,浏览器窗口调整,鼠标右键和拖放动作,下拉框和对话框处理等 ...
- Django创建应用、模型、配置后台自动管理
1.创建应用 python manage.py startapp myblog 2.应用结构 3.创建模型(models.py) from django.db import models # Crea ...
- 关于i++和++i
初学Java,经常看到i++和++i的一些问题,在此整理一下. 首先看下面一个小程序: public class atest{ public static void main(String args[ ...
- firebird常用语句
分页写法小例 SELECT FIRST templateid,code,name FROM template ; SELECT FIRST SKIP templateid,code,name FROM ...