二进制RPM包中文件的提取

在工作中我们可能会遇到这种情况:以apache的配置文件/etc/httpd/conf/httpd.conf为例,我们在配置的时候可能修改后改不回来了;那么我们通过前面讲解的覆盖强制安装的方式是不能将源文件恢复的,强制安装后打开配置文件还是之前修改过的,当然也可以在强制安装前先将配置文件删除,然后在强制安装;那么这里我们可以使用另一种方式进行源文件的提取。

在讲RPM包文件提取之前,先介绍一下cpio命令。Cpio命令可以把文件或目录从文件库中提取出来,也可以把文件或目录复制到文件库中,可以把cpio命令看成备份或还原命令,它既可以把数据备份成cpio文件库,也可以把cpio文件库中的数据还原出来。不过,cpio命令最大的问题是不能自己指定备份或还原的文件是什么,而必须由其他命令告诉cpio命令要备份和还原哪个文件,这必须依赖数据流重定向的命令。

Cpio命令主要有是那种基本模式:

  • “-o”模式指的copy-out模式,就是把数据备份到文件可以中;
  • “-i”模式指的是copy-in模式,就是把数据库从文件中恢复;
  • “-p”模式指的是复制模式,就是不把数据分贝到cpio库中,而是直接复制为其他文件。

命令格式如下:

[root@localhost ~]# cpio -o[vcB] > [文件|设备]
#备份
选项 说明
-o copy-out模式,备份;
-v 显示还原过程;
-c 使用较新的portable format存储方式;
-B 设定输入/输出块为5120Bytes,而不是模式的512Bytes;
[root@localhost ~]# cpio -i[vcdu] < [文件|设备]
#还原
选项 说明
-o copy-out模式,备份;
-i copy-in模式,还原;
-v 显示还原过程;
-c 使用较新的portable format存储方式;
-d 还原时自动新建目录;
-u 自动使用较新的文件覆盖较旧的文件;
[root@localhost ~]# cpio -p 目标目录
#复制

先来看一下使用cpio备份数据的方法,命令如下:

[root@localhost ~]# find /etc -print | cpio -ocvB > /root/etc.cpio
#利用find命令指定要备份/etc/目录,使用>导出到ete.cpio 文件
[root@localhost ~]# 11 -h etc.cpio 
---.1 root root 21M6月 5 12:29 etc.cpio
#fetc.cpio文件生成

再来看如何恢复opio 的备份数据,命令如下:

[root@localhost ~]# cpio -idveu < /root/etc.cpio
#还原etc的备份,如果大家查看一下/root/,就会发现没有生成/etc/目录。
#这是因为备份时/etc/目录使用的是绝对路劲,所以数据直接恢复到/etc/系统目录中,而没有生成在/root/etc/目录中

在CentOS 5.x中可以利用上面的命令备份与恢复指定的文件,但是在CentOS 6.x中需要更加严谨。如果备份时使用绝对路径,则会恢复到绝对路径指定的路径中;如果需要把数据恢复到当前目录中,则需要使用相对路劲,例如:
备份:

[root@localhost ~]# cd /etc/
#进入/ETC/目录
[root@localhost etc]# find ./ -print | cpio -ocvB > /root/etc.cpio
#利用find命令指定要备份/etc/目录,使用>导出到etc.cpio文件

恢复:

[root@localhost ~]# cd /root/
#回到/root/目录中
[root@localhost ~]# mkdir etc_test
#建立恢复测试目录
[root@localhost ~]# cd etc_test/
#进入测试目录,数据恢复到此
[root@localhost etc_test]# cpio -idvcu < /root/etc.cpio
#还原/etc/目录中的数据,如果备份时使用的是相对路劲,则会还原到/root/etc_test/目录下
最后来演示一下 cpio 命令的“-p”复制模式,命令如下:
[root@localhost ~]# cd /tmp/ 
#进入/tmp 目录 
[root@localhost tmp]# rm -rf * 
#删除/tmp 目录中所有数据 
[root@localhost tmp]# mkdir test 
#建立备份目录 
[root@localhost tmp]# find /boot/ -print | cpio -p /tmp/test 
#备份/boot/目录到/tmp/test/目录中 
[root@localhost tmp]# ls test/ 
boot 
#在/tmp/test/目录中备份出了 boot 目录 

接下来介绍如何在RPM包中提取某个特定的文件。假设在服务器使用过程中,我们发现某个系统文件被人动了手脚,或者不小心删除了某个系统重要文件,那么我们可以在RPM包中把这个系统文件提取出来修复有问题的源文件吗?当然可以。RPM包中的文件虽然众多,但也是可以逐个提取的。命令格式如下:

[root@localhost ~]# rpm2cpio 包全名 | cpio -idv .文件绝对路径 
#rpm2cpio将 rpm 包转换为 cpio 格式的命令;
#cpio是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件;

“.” 代表的是当前目录下,意思就是将提取的文件提取到当前目录,因为rpm包里面的配置文件路劲是/etc/httpd/conf/httpd.conf,如果不加“.”,那么提取的文件会直接覆盖当前的配置文件。

举个例子,假设把系统中的/bin/ls 命令不小心误删除了,可以修复回来吗?这时有两 种方法修复:一种方法是使用—force 选项覆盖安装一遍 coreutils-8.4-19.el6.i686 包;另一种方法是先使用 cpio 命令提取出/bin/ls 命令文件,再把它拷贝到对应位置。

那么我们在讲 RPM 包中文件提取,所以我们使用第二种方法,cpio 命令提取出 ls 命令文件,然后拷贝到对应位置,命令如下:

[root@localhost ~]# mv /bin/ls /tmp/
#把/bin/ls命令移动到/tmp目录下,造成误删除的假象
[root@localhost ~]# ls
-bash: ls: command not found
#这时执行ls命令,系统会报“命令没有找到的”错误

[root@localhost ~]# rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-43.el6.x86_64.rpm | cpio -idv ./bin/ls
./bin/ls
25240 blocks
#提取ls命令文件到当前目录下
[root@localhost ~]# cp /root/bin/ls /bin/
#把提取出来的命令文件复制到/bin/目录下
[root@localhost ~]# ls
anaconda-ks.cfg  bin  etc.cpio  etc_test  install.log  install.log.syslog
#ls命令又可以正常使用了

你可能感兴趣的:(Linux运维手册,#,软件安装)