社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 搜索 帮助
主题 : [原创] RPM深入应用
李明 在线

司令(管理员)


显示用户信息 
楼主  发表于: 2009-08-20   
来源于 经验技巧分类

[原创] RPM深入应用

RPM深入应用


[ 转载请注明出自LAMP兄弟连并附录原文地址链接,谢谢 ]

RPMRed Hat Package ManagementRed Hat软件包管理)提供了一种构架,在这种架构下,可以在Red Hat Enterprise LinuxFedora ProjectSuSe Linux EnterpriseCentOSMandriva Linux等基于RPM系统的Linux发行版本上实现对软件包的管理。
RPM从某种意义上来讲有点像计算器,它具备众多实用的功能,但大多数人只使用它来对软件包进行安装、升级、卸载,就好像大多数人只用计算器计算加减法一样。然而,如果多深入了解RPM一点,就会发现它的查询、校验等功能可以做更多软件包维护管理、系统故障排除、文件安全性检测等工作。
RPM将所有的安装软件信息记录到RPM数据库中,存放于系统的/var/lib/rpm目录下,可以利用RPM数据库对系统中已安装软件包进行查询、校验等操作。本文结合作者实际工作中的案例,介绍几个RPM的深入应用,希望能够对Linux的初学者了解RPM有所帮助。

1、查询软件包帮助信息
在一次讲解Vim应用的课程中,学生问了一个这样的问题:“在Vim的配置文件中如何注释?”。Vim的配置文件存放于用户的宿主目录下,缺省文件名为“.vimrc”,可以写入“set nu”等设置命令,问题是写入到此配置文件的命令如何注释使其不生效。一般来讲Linux系统或系统软件的配置文件可以在行首使用符号“#”来注释,可是当用“#”注释了Vim配置文件保存退出后,编辑文件发生了这样的情况:
# vi /etc/inittab
Error detected while processing /root/.vimrc:
line
1:

E488: Trailing characters: # set nu
系统提示错误,所以“#”并不是Vim的有效注释符号。
诸如此类问题要如何查询得到结果,以下给出一个操作步骤的示例:
思路:Linux中安装的软件包大多都包含应用示例或说明文档,可以查找到其内容,就可以知道此问题的答案。
1)查找系统中所有Vim的安装包
# rpm -qa | grep vim
vim-minimal-7.0.109-3
vim-common-7.0.109-3
vim-enhanced-7.0.109-3
2查询安装包的内容查找是否有应用示例文件看英文含义,“minimal”为最小应用软件包,“common”为通用的基础软件包,“enhanced”为增强功能的软件包,所以先查看“vim-common”软件包安装到系统中的文件是否有示例文件(如含关键字“example”或“sample”的文件):
# rpm -ql vim-common | grep example
/usr/share/vim/vim70/gvimrc_example.vim
/usr/share/vim/vim70/macros/urm/examples
/usr/share/vim/vim70/vimrc_example.vim
根据查找到的文件名称判断vimrc_example.vim”应为Vim配置文件示例,查看其内容:
# head -4 /usr/share/vim/vim70/vimrc_example.vim
" An example for a vimrc file.
"
" Maintainer:
Bram Moolenaar <Bram@vim.org>

" Last change:
2006 Aug 12

当看到此文件中“作者”、“最后更新日期”等信息前面的双引号,我们就已经清楚了它一定就是Vim配置文件的注释符号!
这是一个在应用Linux中碰到的问题,很有代表性,像最常见的配置网络服务器(如DNSDHCP等),查找它们的配置文件示例,都可以采用类似方法。解决此类问题要多利用系统软件本身的帮助信息,使用RPM查询命令解决问题。

2RPM软件包校验
RPM使用“-V”选项进行校验,可以根据RPM数据库对比系统所有文件属性(大小、日期、所有者、md5sum值等),列出不同之处。如果执行没有输出,表示自从软件包安装之日起就没有发生过任何变化。
RPM检测结果中包含系统上每个文件的八个属性,每个属性表示如下:
S:文件大小被改变
M:文件的权限或文件的属性被改变
5md5校验值被改变(表示文件内容被改变)
D:设备编号被改变
L::链接属性被改变
U:文件所有者被改变
G:文件所属组被改变
T:文件的时间戳被改变
校验软件包openssh-server示例:
# rpm -V openssh-server
S.5....T c /etc/ssh/sshd_config
执行结果表示软件包openssh-server的文件/etc/ssh/sshd_config文件大小被改变了(如添加或删除了字符)、文件内容被改变了(注意:内容改变和文件大小改变不同,因如果只将文件中某个字符替换为另一个字符,文件大小不会有变化,但是内容变了)、时间戳被改变(最后修改时间变了)。如果校验的文件变更在预料之中,那么就没有什么大问题,但如果是非预期的,是否被入侵了呢?这一点非常值得注意。
检测系统上的所有软件包(及其所有文件),可以执行:
# rpm -Va
此命令需要占用大量系统资源,所以一般将RPM检测的输出发送到grep中以便进行过滤,如只检测丢失的文件:
# rpm -Va | grep missing
或者,限制只输出文件路径中有字符串bin/的命令文件
# rpm -Va | grep ’bin\/’
如果一个或多个重要的命令文件发生了变化,就可以检测系统是否被攻击。黑客侵入系统后,会更改或替换如/bin/vi/bin/login/usr/bin/passwd/bin/ps等命令,如将/bin/vi命令设置SetUID
# ls -l /bin/vi
-rwsr-xr-x 1 root root 594740 Sep 29
2006 /bin/vi

则以后任何用户登录系统,都可以使用/bin/vi更改所有文件(包括/etc/passwd/etc/shadow等),关于SetUID概念请参见其他资料。

3、系统故障排除
Linux系统上的某些软件不能正常运转,就需要查看最近添加或升级软件是否是问题所在(类似Windows系统发生因安装、升级软件或补丁包,导致系统无法正常引导,在安全模式修复的情况),使用“--last”选项以安装的时间次序列出RPM软件包(从最近安装的软件包开始),针对问题进行故障分析。
# rpm -qa --last
bind-chroot-9.3.2-41.fc6


Sat Apr 14 08:37:49 2007

samba-swat-3.0.23c-2
Sat Apr 14 06:51:04 2007

xinetd-2.3.14-8

Sat Apr 14 06:50:53 2007

……
如果某个服务启动出现问题,如:
# service sshd start
Starting sshd: /etc/ssh/sshd_config: No such file or directory


[FAILED]

类似的问题如何解决,请参考以下步骤:
1)如果报错信息详细报告了服务哪一个文件丢失,则只需要针对此文件恢复即可;如果报错信息不明确,可以使用“rpm -V”命令进行检测:
# rpm -V openssh-server
missing
c /etc/ssh/sshd_config

结果中出现“missing”标示,即可判断它对应的服务配置文件丢失。如果有此文件的备份则进行恢复即可,如果没有备份请参考第二步。
2)有两种方法可以恢复此文件,一种是覆盖安装此文件对应的RPM软件包,如果不确定丢失文件所属软件包可以通过以下命令查询(即便文件丢失,但是因为RPM数据库有记录,所以依然可以查询到结果):
# rpm -qf /etc/ssh/sshd_config

openssh-server-4.3p2-10
然后执行命令
# rpm -ivh --replacepkgs /mnt/cdrom/Fedora/RPMS/openssh-server-4.3p2-10.i386.rpm
即可从光盘覆盖安装此RPM恢复丢失文件。
另一种方法是把RPM包中对应的文件提取出来拷贝到原所在目录执行命令:
# rpm2cpio /mnt/cdrom/Fedora/RPMS/openssh-server-4.3p2-10.i386.rpm | cpio -idv ./etc/ssh/sshd _config
# cp etc/ssh/sshd_config /etc/ssh/
通过使用rpm2cpio命令可以将RPM软件包转换成cpio格式,cpio是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件。其中选项i表示提取文件、“v表示指示执行进程、d表示根据包中文件原来的路径建立目录,如果需要保持原文件的更新时间还可以增加选项“m”。
注意此命令执行时不能将文件直接恢复至/etc/ssh目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的绝对路径(./etc/ssh/sshd _config)。提取文件成功后,将其复制到/etc/ssh目录下即可。

4RPM数据库问题
有时RPM数据库也会出现故障,其结果是当安装、删除、查询软件包时,请求无法执行,此时需要重建数据库。
首先,删除当前的RPM数据库:
# rm -f /var/lib/rpm/_db.*
重建数据库:
# rpm --rebuilddb
这一步需要花费一定的时间来完成。
黑客侵入系统后,有时为混淆管理员视线,避免管理员通过RPM校验功能检测出问题,会更改RPM数据库(理论上来讲,系统被入侵后,一切都将不再可信),此时我们可以按照以下步骤对文件进行检测:
1)
对于要检查的文件或命令,找出它属于哪个软件包:
# rpm -qf /etc/rc.d/init.d/smb
samba-3.0.23c-2
2)使用--dump选项查看每个文件的信息,使用grep命令提取对应文件信息:
# rpm -ql --dump samba| grep /etc/rc.d/init.d/smb
/etc/rc.d/init.d/smb 2087 1157165946 b1c26e5292157a83cadabe851bf9b2f9 0100755 root root 1 0 0 X
其中:
2087”为文件中最初的字符数
b1c26e5292157a83cadabe851bf9b2f9smb文件内容的md5校验值
0755 root root”为文件权限及所有者、所属组
3)接下来检查实际的文件,看内容是否被更改过:
# ls -l /etc/rc.d/init.d/smb
-rwxr-xr-x 1 root root 2087 Sep
2
2006 /etc/rc.d/init.d/smb

# md5sum /etc/rc.d/init.d/smb
b1c26e5292157a83cadabe851bf9b2f9
/etc/rc.d/init.d/smb

检测文件大小、所有者、所属组、权限、md5校验值是否匹配。
4)此例子中smb文件与--dump选获得项信息匹配,如果确信RPM数据库可能遭到修改,就要基于从光盘或者其他值得信赖的来源处获得Samba RPM文件进行检查,如:
# rpm -ql --dump -p /mnt/cdrom/Fedora/RPMS/samba-3.0.23c-2.i386.rpm | grep /etc/rc.d/init.d/smb
warning: samba-3.0.23c-2.i386.rpm: Header V3 DSA signature: NOKEY, key ID 4f2a6fd2
/etc/rc.d/init.d/smb 2087 1157165946 b1c26e5292157a83cadabe851bf9b2f9 0100755 root root 1 0 0 X
如果得到的结果与基于RPM数据库运行的命令结果不同,就可以判断一定是数据库被更改,需要修正文件错误和系统漏洞,重建RPM数据库。

5、检查软件包的脚本
很多RPM软件包都包含脚本,包括在安装、卸载、升级软件包过程中要运行的脚本,以及安装期间满足某些条件时将触发的触发器脚本。这些脚本对于了解Linux系统管理、了解软件的应用很有帮助。
使用带“--scripts”查询选项的rpm命令来查看安装、卸载软件包前后要运行的脚本。举例如下
# rpm -q --scripts openssh-server
preinstall scriptlet (using /bin/sh):
/usr/sbin/useradd -c "Privilege-separated SSH" -u 74 \



-s /sbin/nologin -r -d /var/empty/sshd sshd 2> /dev/null || :

postinstall scriptlet (using /bin/sh):
/sbin/chkconfig --add sshd
preuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ]
then



/sbin/service sshd stop > /dev/null 2>&1 || :




/sbin/chkconfig --del sshd

fi
……
这个例子显示了openssh-server软件包中包含的脚本安装openssh-server软件包之前preinstall),调用useradd命令添加sshd用户;软件包安装后(postinstall),调用chkconfig命令打开sshd服务--add sshd);卸载软件包之前preuninstall),停止sshd服务service sshd stop并删除服务chkconfig --del sshd)……
触发器脚本在安装期间如果条件满足就会运行。如在升级的时候,如果软件包有不同的安装动作发生,触发器脚本将特别有用。
# rpm -q --triggers openssh-server
triggerun scriptlet (using /bin/sh) -- ssh-server
if [ "$1" != 0 -a -r /var/run/sshd.pid ] ; then

touch /var/run/sshd.restart

fi
……
查看RPM脚本信息对于了解系统软件的安装、卸载时所做的操作,对出现问题时的解决,将会有更清晰的思路。

获得更多RPM使用信息请访问RPM项目网站http://www.rpm.org RPM软件包下载网站 http://www.rpmfind.net可获得各种Linux发行版本的RPM软件包。
清空我的评分动态本帖最近评分记录: 共1条评分记录
钟永茂 金钱 +6 2009-08-20 .............
隐藏评分记录
像外行一样思考,
像专家一样实践。

免费就业指导在线讲座报名中
钟永茂 离线

连长(超版)


显示用户信息 
沙发  发表于: 2009-08-20   


我只是用来升级和安装软件


这个真是长知识了啊
隋成龙 离线

排长(版主)

显示用户信息 
板凳  发表于: 2009-08-20   
感谢李明老师的精彩文章!
不过rpm 这东西已经过时了!
推荐学习yum!
李明 在线

司令(管理员)


显示用户信息 
地板  发表于: 2009-08-20   
引用
感谢李明老师的精彩文章!
不过rpm 这东西已经过时了!
推荐学习yum!
隋成龙 发表于 2009-8-20 17:03


小龙子,你太会说话了…… 这是以前写的文章呢,确实有点过时了,呵呵
像外行一样思考,
像专家一样实践。

免费就业指导在线讲座报名中
隋成龙 离线

排长(版主)

显示用户信息 
4楼  发表于: 2009-08-20   
1.列出所有可更新的软件清单
命令:yum check-update

2.安装所有更新软件
命令:yum update

3.仅安装指定的软件
命令:yum install

4.仅更新指定的软件
命令:yum update

5.列出所有可安裝的软件清单
命令:yum list

用YUM安装删除软件
装了系统添加删除软件是常事,yum同样可以胜任这一任务,只要软件是rpm安装的。
安装的命令是,yum install xxx,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲突关系,如果没有依赖冲突,那么最好,下载安装;如果有,则会给出提示,询问是否要同时安装依赖,或删除冲突的包,你可以自己作出判断。
删除的命令是,yum remove xxx,同安装一样,yum也会查询数据库,给出解决依赖关系的提示。


1.用YUM安装软件包
命令:yum install

2.用YUM删除软件包
命令:yum remove

用YUM查询软件信息
我 们常会碰到这样的情况,想要安装一个软件,只知道它和某方面有关,但又不能确切知道它的名字。这时yum的查询功能就起作用了。你可以用 yum search keyword这样的命令来进行搜索,比如我们要则安装一个Instant Messenger,但又不知到底有哪些,这时不妨用 yum search messenger这样的指令进行搜索,yum会搜索所有可用rpm的描述,列出所有描述中和messeger有关的rpm包,于 是我们可能得到gaim,kopete等等,并从中选择。
有时我们还会碰到安装了一个包,但又不知道其用途,我们可以用yum info packagename这个指令来获取信息。


1.使用YUM查找软件包
命令:yum search

2.列出所有可安装的软件包
命令:yum list

3.列出所有可更新的软件包
命令:yum list updates

4.列出所有已安装的软件包
命令:yum list installed

5.列出所有已安装但不在 Yum Repository 內的软件包
命令:yum list extras

6.列出所指定的软件包
命令:yum list

7.使用YUM获取软件包信息
命令:yum info

8.列出所有软件包的信息
命令:yum info

9.列出所有可更新的软件包信息
命令:yum info updates

10.列出所有已安裝的软件包信息
命令:yum info installed

11.列出所有已安裝但不在 Yum Repository 內的软件包信息
命令:yum info extras

12.列出软件包提供哪些文件
命令:yum provides

清除YUM缓存
yum 会把下载的软件包和header存储在cache中,而不会自动删除。如果我们觉得它们占用了磁盘空间,可以使用yum clean指令进行清除,更精确 的用法是yum clean headers清除header,yum clean packages清除下载的rpm包,yum clean all一 股脑儿端


1.清除缓存目录(/var/cache/yum)下的软件包
命令:yum clean packages

2.清除缓存目录(/var/cache/yum)下的 headers
命令:yum clean headers

3.清除缓存目录(/var/cache/yum)下旧的 headers
命令:yum clean oldheaders

4.清除缓存目录(/var/cache/yum)下的软件包及旧的headers
命令:yum clean, yum clean all (= yum clean packages; yum clean oldheaders)
隋成龙 离线

排长(版主)

显示用户信息 
5楼  发表于: 2009-08-20   
以上内容非原创,搜集得到的!!
YUM是Yellow dog Updater, Modified的缩写,是由Duke University所发起的计划,目的就是为了解决RPM的依赖关系的问题,方便使用者进行软件的安装、升级等等工作。在此在特别说明的是,YUM只是为了解决RPM的依赖关系的问题,而不是一种其它的软件安装模式。当然可以实现这样功能的除了YUM外,还有APT (Advanced Package Tool,是由debian所发展的一个软件管理工具)。
其实YUM的工作原理并不复杂,每一个 RPM软件的头(header)里面都会纪录该软件的依赖关系,那么如果可以将该头的内容纪录下来并且进行分析,可以知道每个软件在安装之前需要额外安装哪些基础软件。也就是说,在服务器上面先以分析工具将所有的RPM档案进行分析,然后将该分析纪录下来,只要在进行安装或升级时先查询该纪录的文件,就可以知道所有相关联的软件。所以YUM的基本工作流程如下:
服务器端:在服务器上面存放了所有的RPM软件包,然后以相关的功能去分析每个RPM文件的依赖性关系,将这些数据记录成文件存放在服务器的某特定目录内。
客户端:如果需要安装某个软件时,先下载服务器上面记录的依赖性关系文件(可通过WWW或FTP方式),通过对服务器端下载的纪录数据进行分析,然后取得所有相关的软件,一次全部下载下来进行安装。

上面这些都是理论知识,下面开始实际操作:
1,安装vsftpd服务
[root@localhost Server]# rpm -ivh vsftpd-2.0.5-12.el5.i386.rpm
warning: vsftpd-2.0.5-12.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing... ########################################### [100%]
1:vsftpd ########################################### [100%]
[root@localhost Server]#
2,设置vsftpd开机启动
[root@localhost Server]# chkconfig vsftpd on
3,将RHEL 5光盘中的Server、VT、Cluster、ClusterStorage四个目录复制到/var/ftp/pub下(如不使用虚拟化及群集后三个目录可不复制)。
root@localhost cdrom]# cd /var/ftp/pub
[root@localhost pub]# ls
Cluster ClusterStorage Server VT
4,删除几个文件
[root@localhost pub]# rm -f *.html
[root@localhost pub]# rm -f Server/repodata/TRANS.TBL
[root@localhost pub]# rm -f VT/repodata/TRANS.TBL
5,安装createrepo(用于生成rpm依赖关系及组信息)包。
[root@localhost Server]# rpm -ivh createrepo-0.4.11-3.el5.noarch.rpm
warning: createrepo-0.4.11-3.el5.noarch.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing... ########################################### [100%]
1:createrepo ########################################### [100%]
6,建立分组文件
在RHEL 5中每个目录下的repodata目录下都有一个repomd.xml,该文件中就记录了rpm包的依赖关系,还有一个comps-rhel5-*.xml文件,这个文件主要记录分组情况,建立yum仓库时,需要先重建该文件.
[root@localhost pub]# createrepo -g /var/ftp/pub/Server/repodata/comps-rhel5-server-core.xml /var/ftp/pub/Server/
1336/2223 - jakarta-commons-collections-testframework-javadoc-3.2-2jpp.3.i386.rp2223/2223 - pcmciautils-014-5.i386.rpm
Saving Primary metadata
Saving file lists metadata
Saving other metadata
[root@localhost pub]# createrepo -g /var/ftp/pub/VT/repodata/comps-rhel5-vt.xml /var/ftp/pub/VT/
32/32 - Virtualization-it-IT-5.2-9.noarch.rpm
Saving Primary metadata
Saving file lists metadata
Saving other metadata
[root@localhost pub]#
7,重起FTP服务
[root@localhost pub]# service vsftpd restart
8,修改配置文件
[root@localhost ~]# vi /etc/yum.repos.d/rhel-debuginfo.repo
[rhel-debuginfo]
name=Red Hat Enterprise Linux $releasever - $basearch - Debug
baseurl=ftp://ftp.redhat.com/pub/redhat/linux/enterprise/$releasever/en/os/$basearch/Debuginfo/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[Server]
name=Server
baseurl=ftp://192.168.0.253/pub/Server
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[VT]
name=VT
baseurl=ftp://192.168.0.253/pub/VT
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[Cluster]
name=Cluster
baseurl=ftp://192.168.0.253/pub/Cluster
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[ClusterStorage]
name=ClusterStorage
baseurl=ftp://192.168.0.253/pub/ClusterStorage
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

安装结束!!

再介绍一下yun常用命令
yum update package 更新指定程序包package
yum check-update 检查可更新的程序
yum info 显示安装包信息
yum list 显示所有已经安装和可以安装的程序包
yum list 显示指定程序包安装情况
yum search 查找软件包
yum remove | erase package1 删除程序包
yum clean headers 清除header
yum clean packages 清除下载的rpm包
yum clean all 清除header与rpm包

PS:在copy那4个文件夹的时候,存放路径可以更改,相应的/etc/yum.repos.d/rhel-debuginfo.repo中FTP路径也要对应。同时需要修改vsftpd的设置,在/etc/vsftpd/vsftpd.conf中增加一行anno_root=对应路径
本文出自 “allen的学习笔记” 博客,请务必保留此出处http://allenyu.blog.51cto.com/193668/143481
james1981 离线

下士

显示用户信息 
6楼  发表于: 2009-08-20   
不懂啊,顶一个!!
快速回复 顶端
内容
HTML 代码不可用
 使用签名
 Wind Code自动转换
 匿名帖
 隐藏此帖
 隐藏附件
 出售
 加密
限 100 字节
验证问题:LAMP兄弟连的口号是什么?(无兄弟不编程) 正确答案:无兄弟不编程
如果您在写长篇帖子又不马上发表,建议存为草稿
限 50000 字节
按 Ctrl+Enter 直接提交