使用rpm2cpio,cpio提取rpm包中的特定文件
当在linux rescue模式中,修复系统时明确知道是丢了哪个文件,但是在此时强制安装丢失文件相应的rpm包时又会出现很多依赖关系提示。
或者可换种思路,我们只需要这个丢掉的文件而已,可以找到丢失文件的相关rpm包,然后用cpio及rpm2cpio组合,把文件提取出来,然后再复制到丢失文件的相应位置,此问题亦可解决。
模拟/etc/inittab文件被删除,通过rpm2cpio,cpio恢复文件。
先查看/etc/inittab文件由哪个包安装的
[root@localhost ~]# rpm -qf /etc/inittab
initscripts-9.49.30-1.el7.x86_
1. 将/etc下的所有普通文件都归档到/opt/etc.cpio.
# find /etc/ –type f | cpio –ocvB > /opt/etc.cpio
2. 创建一个备份文档并删除inittab(重命名)
# mv /etc/inittab{,.bak}
3. 通过挂载点读取光盘中的二进制包到当前目录
# rpm2cpio /media/Packages/initscripts-9.49.30-1.el7.x86_.rpm | cpio -idv /root/etc/inittab
4. 复制恢复被删除的文件
# cp etc/inittab /etc/inittab
cpio:是通过重定向的方式将文件进行打包备份,还原恢复的工具, 它可以解压以“.cpio”或者“.tar”结尾的文件。
-o :将数据copy到文件或设备上
-i :将数据从文件或设备上还原到系统中
-t :查看cpio建立的文件或设备内容
-c :一种比较新的portableformat方式存储
-v :在屏幕上显示备份过程中的文件名
-B :让预设的blocks可以增加到5120bytes,默认是512bytes,这样可以使备份速度加快
-d :自动建立目录,这样还原时才不会出现找不到路径的问题
-u :更新,用较新的文件覆盖旧的文件
注意:
1)cpio恢复的路径,如果cpio在打包备份的时候用的是绝对路径,那么在恢复的时候会自动恢复到这些绝对路径下,
同理,如果在打包备份用的是相对路径,还原时也将恢复到相对路径下。
2)cpio无法直接读取文件,它需要每个文件或者目录的完整路径名才能识别读取,而find命令的输出刚好做到了这点,
因此,cpio命令一般和find命令配合使用。
3)cpio恢复的时候不会自动覆盖同名文件。
4)不会创建目录而是直接解压到当前文件夹。
备份:cpio -covB > [file|device] 将数据备份到文件或设备上
还原:cpio -icduv < [file|device} 将数据还原到系统中
需要RPM包中的某个文件,如何解压RPM包呢?
RPM包括是使用cpio格式打包的,因此可以先转成cpio然后解压:
rpm2cpio命令用于将rpm软件包转换为cpio格式的文件。
格式:rpm2cpio xxx.rpm | cpio -div