阅读:0

Linux提取RPM包文件方法详解

在讲 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] < [文件|设备]
#还原

选项:
  • -i:copy-in 模式,还原;
  • -v:显示还原过程;
  • -c:较新的 portable format 存储方式;
  • -d:还原时自动新建目录;
  • -u:自动使用较新的文件覆盖较旧的文件;

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

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

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

[root@localhost ~]# cpio -idvcu < /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 <—这是一个标准工具,用于创建软件档案文件和从档案文件中提取文件

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

不过,怎么知道 /bin/ls 命令属于 coreutils-8.4-19.el6.i686 软件包呢?还记得 -qt 选项吗?命令如下:

[root@localhost ~]# rpm -qf /bin/ls
coreutils-8.4-19.el6.i686
#查看ls文件属于哪个软件包

我们先使用 cpio 命令提取出 ls 命令文件,然后复制到对应位置,命令如下:

[root@localhost ~]# mv /bin/ls /root/
#把/bin/ls命令移动到/root/目录下,造成误删除的假象
[root@localhost ~]# ls
-bash: ls: command not found
#这时执行ls命令,系统会报"命令没有找到"错误
[root@localhost ~]# rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm
|cpio -idv ./bin/ls ./bin/ls 24772块
#提取ls命令文件到当前目录下
[root@localhost ~]# cp /root/bin/ls /bin/
#把提取出来的ls命令文件复制到/bin/目录下
[root@localhost ~]#ls
anaconda-ks.cfg bin inittab install.log install.log.syslog ls
#恭喜,ls命令又可以正常使用了