Chinaunix首页 | 论坛 | 博客
  • 博客访问: 304882
  • 博文数量: 58
  • 博客积分: 2763
  • 博客等级: 少校
  • 技术积分: 731
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-04 19:07
文章分类

全部博文(58)

文章存档

2011年(55)

2009年(1)

2008年(2)

分类:

2011-07-22 10:05:48

原文地址:RPM深入应用 作者:肥同小可

RPM深入应用

 

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有所帮助。

   一点说明:很多朋友认为RPM过时了,实际我倒是觉得,如果是安装、升级、卸载我支持使用YUM ,但是如果是类似校验、查询、提取文件等操作,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 <
>

    
" 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”为文件中最初的字符数
“b1c26e5292157a83cadabe851bf9b2f9”smb文件内容的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项目网站:rpm.org RPM软件包下载网站 可获得各种Linux发行版本的RPM软件包。

阅读(1178) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~