Linux 基础 —— RPM
http://liaoph.com/linux-rpm/
这篇文章主要讲 RPM 软件包管理器的使用。
软件包的演变史
最早期时,软件包是一些可以运行的程序组成的集合,可能还要加上若干配置文件和动态库。例如,程序员将针对某个平台编译好的二进制文件、程序所依赖的动态库文件(如 .so 和 .dll 为扩展名的文件)以及配置文件复制到一个目录中,这个目录就可以称为一个软件包。
为了保证使用的软件包能够方便且快速地复制到别的机器上, 人们开始选用压缩文件的方式来封装软件包。 比如通过 tar 或者 gzip 压缩后得到 .tar.gz、 .rar 或者 .zip 格式的文件, 这时我们就获得了一个较为高级的软件包。
再往后发展, 就出现了更高级的软件包, 比如 .rpm、 .bin 或者 .deb 格式的软件包。 这些格式的软件包, 相对于压缩格式的软件包又有了更进一步的发展, 它们不仅支持文件压缩功能, 还有依赖维护、 脚本的嵌入等功能。RedHat 公司开发贡献的 RedHat Package Manager(RPM) 可以说是这些高级别软件包中最典型的一个。
RPM 软件包的功能
RPM 软件包的功能如下:
- 存储和数据压缩
- 文件安装
- 配置文件生成
- 系统服务注册
- 软件依赖检查和依赖输出
存储数据压缩
RPM具有软件包的基本功能——数据压缩存储,RPM 安装列表中的文件在按照某个指定的算法(如 gzip)压缩后,作为最终 RPM 文件的一个数据块,与其他控制信息存储进同一个文件中。最终所有的数据都存储在同一个 RPM 文件中。
文件安装
文件安装是软件包的一个基本功能,它将压缩的文件解压至目标操作系统上。安装过程中,还可能动态生成一些文件,并安装到系统中。
配置文件生成
配置文件既可能是预先写好的静态文件,也可能是根据安装环境动态生成的文件。
系统服务注册
使用 rpm 安装一些软件包,比如 apache,mysql-server 等,在安装完成后,目录 /etc/init.d/下会生成一个服务启动脚本文件,而且此服务还可能被加入到系统的自动启动服务中。
软件依赖检查
大多数程序都会依赖其他组件,比如数据库操作程序可能需要 libmysql 的支持。为了保证每个软件在安装后都能正常运行,在安装过程中,软件安装程序需要对该软件包所依赖的所有元素进行检查。
其他功能
RPM 还有一个重要功能就是对嵌入脚本的支持:它支持在安装软件或者卸载软件的过程中,执行用户预定义的指令。常用的脚本执行点如下:
- pre install
- post install
- pre uninstall
- post uninstall
pre/post install 表示在安装之前或之后;pre/post uninstall 表示在卸载之前或者之后。
除此之外,RPM 包还可以支持对源包进行数字签名,在安装时可以使用公钥验证 RPM 包的合法性等等。
RPM 包的命名方式
以 httpd-2.2.15-39.el6.centos.x86_64.rpm 为例,这里 httpd 表示软件名,2.2.15 表示主版本号,次版本号,发行版本号分别是2,2,15,39.el6.centos 表示 RPM 包的修订号和 OS 信息,x86_64 表示此软件包适用的平台,常见的有i386,i586,x86_64 等等。
RPM 包管理命令的使用
安装
rpm {-i|--install} [install-options] PACKAGE_FILE1..
安装时可以使用 -h 显式安装进度,使用 -v 显示详细信息。
[root@localhost ~]# rpm -ivh httpd-2.2.15-39.el6.centos.x86_64.rpm
Preparing... ########################################### [100%]
1:httpd ########################################### [100%]
使用 --test 可以用于测试安装是否能够成功,而不实际安装。
在安装过程中,可能遇到软件包的依赖问题,而需要先安装其他软件包,这时可以使用 --nodeps 忽略依赖强制安装,但是这样安装的软件包通常也会因为依赖缺失而无法正常工作。
如果需要重新安装并覆盖原有的文件,可以使用 --replacepkgs 选项。
使用 --force 可以进行强制覆盖安装,它等同于--replacepkgs, --replacefiles, 和 --oldpackage。
升级
升级或安装
如果不知道一个软件包是否已经安装,并希望如果已经安装那么升级次软件包,使用 -U 选项。
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
如果仅仅希望升级软件包,使用 -F 选项
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
升级软件包和安装软件包一样,可以使用 --test,--nodeps,--force 等选项。
示例:安装并升级 zsh 软件包
[root@localhost rpm]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
[root@localhost rpm]# rpm -Uvh zsh-4.3.10-9.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
如果想要将软件包降级到旧版本,使用 --oldpackage 选项
[root@localhost rpm]# rpm -Uvh --oldpackage zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
在升级软件包时,原来软件包的配置文件可能已经被修改,升级时,新版本的文件不会将老版本的配置文件覆盖,而是将新版本的配置文件加上 .rpmnew 后缀后保存。
注意:内核也是软件包,但是不要直接对内核进行升级(如果新的内核有兼容问题启动不了而旧内核又被覆盖就悲剧了),因为 Linux 允许多内核共存,所以可以直接安装多个不同版本内核。
卸载
rpm {-e|--erase} [--allmatches] [--nodeps] [--test] PACKAGE_NAME ...
通常使用 rpm -e PACKAGE_ANEM 即可简单卸载一个软件包。
使用 --nodeps 忽略依赖关系。--test 测试卸载。--allmatches 表示如果一个程序包同时安装多个版本,则次选项一次全部卸载之。
如果卸载正常,不会输出任何信息。
注意:如果程序包的配置文件安装后曾被修改,卸载时,此文件通常不会被删除,而是被重命名为 .rpmsave 后缀后留存。
查询:
查询使用 -q 选项,可以检查安装的所有包,还可以查看某包的详细信息。
rpm {-q|--query} [select-options] [query-options]
查询某包是否已经安装
rpm -q PACKAGE_NAME...
如:
[root@localhost rpm]# rpm -q zsh
zsh-4.3.10-9.el6.x86_64
查询安装的所有包
rpm -qa
查询未安装包的信息
在 -q 同时使用 -p 选项
注意:查询未安装包的信息指定的是 RPM 包的文件名而不是某个包的软件名。
查询选项
查询某包的简要说明信息
rpm -qi PACKAGE_NAME
如:
[root@localhost rpm]# rpm -qi zsh
Name : zsh Relocations: (not relocatable)
Version : 4.3.10 Vendor: CentOS
Release : 9.el6 Build Date: Wed 05 Nov 2014 07:20:52 PM CST
Install Date: Sat 11 Apr 2015 11:37:12 PM CST Build Host: c6b8.bsys.dev.centos.org
Group : System Environment/Shells Source RPM: zsh-4.3.10-9.el6.src.rpm
Size : 5009102 License: BSD
Signature : RSA/SHA1, Wed 05 Nov 2014 08:05:42 PM CST, 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.
这里显式了 zsh 这个包的各类元信息,如名字,版本,发行商,打包作者,描述信息等。
查询软件包安装的文件列表
rpm -ql PACKAGE_NAME
如:
[root@localhost rpm]# rpm -ql zsh
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
/usr/lib64/zsh
/usr/lib64/zsh/4.3.10
...
/usr/share/zsh/4.3.10/functions/zstyle+
/usr/share/zsh/4.3.10/scripts
/usr/share/zsh/4.3.10/scripts/newuser
/usr/share/zsh/site-functions
使用 rpm -qc PACKAGE_NAME 可以查看软件包安装后生成的所有配置文件。
使用 rpm -qd PACKAGE_NAME 可以查看软件包安装后生成的所有说明文件和帮助文件。
查看软件包制作时随版本变化的 changelog 信息
rpm -q --changelog PACKAGE_NAME
查看软件包提供的 capabilities (即输出给其他软件包的依赖)
rpm -q --provides PACKAGE_NAME
查看软件包所需的依赖
rpm -q --requires PACKAGE_NAME
查看软件包安装或卸载时执行的脚本
rpm -q --scripts PACKAGE_NAME
如:
[root@localhost rpm]# rpm -q --scripts zsh
postinstall scriptlet (using /bin/sh):
if [ ! -f /etc/shells ] ; then
echo "/bin/zsh" > /etc/shells
else
grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells
fi
if [ -f /usr/share/info/zsh.info.gz ]; then
# This is needed so that --excludedocs works.
/sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir \
--entry="* zsh: (zsh). An enhanced bourne shell."
fi
:
preuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ] ; then
if [ -f /usr/share/info/zsh.info.gz ]; then
# This is needed so that --excludedocs works.
/sbin/install-info --delete /usr/share/info/zsh.info.gz /usr/share/ info/dir \
--entry="* zsh: (zsh). An enhanced bourne shell."
fi
fi
:
postuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ] ; then
if [ -f /etc/shells ] ; then
TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX`
grep -v '^/bin/zsh$' /etc/shells > $TmpFile
cp -f $TmpFile /etc/shells
rm -f $TmpFile
fi
fi
这里包含了安装后,卸载前/后脚本。
检验
还可以查询软件包安装之后的文件是否发生了改变
rpm {-V|--verify} [select-options] [verify-options]
如:
[root@localhost rpm]# rpm -V httpd
S.5....T. c /etc/httpd/conf/httpd.conf
检验时使用了多个位表示文件的多个属性是否发生了变化:
S 文件大小
M 文件权限
5 文件摘要信息(通常是 MD5 码)
D 设备文件的主/次设备号
L 软链接变化
U 属主
G 属组
T 文件的 mtime
P caPabilities
程序包的合法性验证
在软件包制作时,为了防止软件包被人修改植入后门,制作者可以使用自己私钥对软件包进行数字签名,安装者就可以使用公钥验证软件包的合法性。同时还可以使用摘要算法提取软件包的摘要信息用于验证软件包的完整性。
通常,RHEL 系的安装光盘中包含有用于验证其软件包合法性的公钥文件。
导入公钥
rpm --import /path/to/RPM-GPG-KEY-FILE
验证合法性
rpm {-K|--checksig} PACKAGE_FILE
RPM 管理器的数据库
每次安装 rpm 包时,rpm 系统会将一些元信息存储在它的数据库中,使用 rpm -q 命令查询软件包的相关信息时将会查询这些数据库,数据库文件位于 /var/lib/rpm 目录中。如果 RPM 的数据库损坏,将会导致一些 RPM 数据丢失,一些功能将无法正常使用。
[root@bogon ~]# file /var/lib/rpm/*
/var/lib/rpm/Basenames: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Conflictname: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/__db.001: Applesoft BASIC program data
/var/lib/rpm/__db.002: 386 pure executable
/var/lib/rpm/__db.003: 386 pure executable not stripped
/var/lib/rpm/__db.004: 386 pure executable
/var/lib/rpm/Dirnames: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Filedigests: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Group: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Installtid: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Name: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Obsoletename: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Packages: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Providename: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Provideversion: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Pubkeys: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Requirename: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Requireversion: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Sha1header: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Sigmd5: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Triggername: Berkeley DB (Hash, version 9, native byte-order)
可以看到这里有很多 Berkeley DB 格式的数据库文件和几个 __db 数据文件。
重建数据库
如果 RPM 的数据库损坏,首先可以尝试重建它,如果无法重建,那么需要重新初始化数据库。
rpm --rebuilddb 表示重建数据库
这个命令会从已安装的软件包提取信息重建数据库,它从 /var/lib/rpm/Packages 这个文件中提取信息,其他所有的数据库文件都可以由这个文件重建。如果 RPM 的数据库是完好的,这个命令不会重建,而是对数据库中未使用的条目进行空间回收。
rpm --initdb 创建一个新的 RPM 数据
如果已经没有其他别的办法了,--initdb 会创建一个新的空的 RPM 数据库。由于新建的数据库是空的,不要万不得已不要使用这个命令。
Linux 基础 —— RPM的更多相关文章
- 8、Linux基础--rpm、yum、yum私有仓库、系统优化
笔记 1.晨考 1.文件的三种时间属性,每一种时间属性在什么情况下改变 atime : 访问时间 mtime :修改时间 ctime :修改属性时间 2.权限的类型 可读(r, 4) 可写(w, 2) ...
- Linux基础-rpm软件包管理
任务:挂载光盘文件到/media目录,进去/media目录下的Packages目录,查看系统已安装的所有rpm包,查看系统是否安装dhcp软件包,安装dhcp软件包,查看dhcp软件包的信息,查看dh ...
- 大数据攻城狮之Linux基础------rpm软件管理
rpm的英文名称为: Redhat package manager 常用的命令加组合: i 安装 rpm -ivh 软件包名 当然我们的rpm也可以支持多包同时操作 rpm -ivh 软件包1 软件包 ...
- Linux 基础教程 34-软件包管理-RPM
对于Linux而言管理各类软件,如安装.卸载和升级等是常有的事情和必备的技能.以CentOS为例,常用的安装包命令有rpm和yum. RPM基础 RPM(RedHat Package ...
- Linux基础3(用户/组管理,rpm,yum,源码安装软件)
用户管理 与用户相关的配置文件 /etc/passwd /etc/shadow /etc/skel /etc/defalut/useradd /etc/login.defs useradd userm ...
- Linux课程实践一:Linux基础实践(SSH)
一.SSH服务 1. 安装SSH (1)查看是否已经安装过ssh服务 rpm -qa |grep ssh (2)进行安装 sudo apt-get install openssh-server Ubu ...
- Linux基础3(文件权限)
文件权限 1.普通权限 (登陆用户对文件或目录的读写执行的权限) 普通权限对管理员用户无效 文件和目录 都有4中类型的用户u 所有者 : 文件.目录的创建者g 所属组 : 文件.目录属于的用户组o 其 ...
- 实践一:Linux基础实践
一.Linux基础实践 1.1 1. 掌握软件源的维护方法,配置系统使用软件源镜像.掌握通过软件源来查找,安装,卸载,更新软件的方法. 这部分内容在许多学长学姐的报告里都有很详细的讲解,我在此就不赘述 ...
- Linux基础入门
第一节,linux系统简介 一.实验内容 了解 Linux 的历史,Linux 与 Windows 的区别等入门知识. 二.实验要求 阅读linux简介与历史 三.实验步骤 (一).Linux 为何物 ...
随机推荐
- C# List 用法与示例
Problem. You have questions about the List collection in the .NET Framework, which is located in the ...
- mysqldump使用
mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump ...
- 《Python基础教程(第二版)》学习笔记 -> 第五章 条件、循环 和 其他语句
条件和条件语句 下面的值在作为布尔表达式的时候,会被解释器看作假(False):False None 0 "" () [] {} 条件执行和if语句 ...
- 《转》高级Unix命令
原文链接:http://coolshell.cn/articles/1044.html 在Unix操作中有太多太多的命令,这些命令的强大之处就是一个命令只干一件事,并把这件事干好.Do one thi ...
- MFC菜单、工具栏和状态栏
菜单:CMenu类 CMenu类的主要成员函数 BOOL LoadMenu(UINT nIDResource); 加载菜单资源,并将其附加到CMenu对象上.参数nIDResource指定了要加载的菜 ...
- windows下python配置
1.下载安装 Pythonpython-2.7.5.msi http://www.python.org/download/如下载 Python 2.7.5,安装目录为 C:\Python27 2.添 ...
- HDU-4647 Another Graph Game 贪心,博弈
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4647 注意这题两人的决策是想要使得自己的分数与对方的差值最大.. 注意到数据范围,显然是贪心之类的,如 ...
- HDU-4622 Reincarnation 后缀数组 | Hash,维护和,扫描
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给一个字符串,询问某字串的不同字串的个数. 可以用后缀数组来解决,复杂度O(n).先求出倍 ...
- ovirt user guide
Contents [hide] 1 Accessing the User Portal 1.1 Logging in to the User Portal 1.2 Logging out of t ...
- 设置Windows 远程协助与远程桌面
家庭局域网组建完成后,即可通过远程协助解决各种问题,或联机玩游戏等. 使用Windows 7\8\10 远程协助与远程桌面 Windows 8系统中自带了远程协助功能,家庭用户只需要做简单的设置,就可 ...