• Linux学习-18-提取RPM包文件(cpio命令)


    7.6 Linux提取RPM包文件(cpio命令)
    • cpio 命令用于从归档包中存入和读取文件,换句话说,cpio 命令可以从归档包中提取文件(或目录),也可以将文件(或目录)复制到归档包中。

    归档包,也可称为文件库,其实就是 cpio 或 tar 格式的文件,该文件中包含其他文件以及一些相关信息(文件名、访问权限等)。归档包既可以是磁盘中的文件,也可以是磁带或管道。

    cpio 命令可以看做是备份或还原命令,因为它可以将数据(文件)备份到 cpio 归档库,也可以利用 cpio 文档库对数据进行恢复。

    • 使用 cpio 命令备份或恢复数据,需注意以下几点:
      • 使用 cpio 备份数据时如果使用的是绝对路径,那么还原数据时会自动恢复到绝对路径下;同理,如果备份数据使用的是相对路径,那么数据会还原到相对路径下。
      • cpio 命令无法自行指定备份(或还原)的文件,需要目标文件(或目录)的完整路径才能成功读取,因此此命令常与 find 命令配合使用。
      • cpio 命令恢复数据时不会自动覆盖同名文件,也不会创建目录(直接解压到当前文件夹)。
    7.6.1 cpio 命令主要有以下 3 种基本模式:
    1. “-o” 模式:指的是 copy-out 模式,就是把数据备份到文件库中,命令格式如下:
    [root@CncLucZK ~]# cpio -o[vcB] > [文件丨设备]
    
    • 1
    • 各选项含义如下:

      • -o:copy-out模式,备份;
      • -v:显示备份过程;
      • -c:使用较新的portable format存储方式;
      • -B:设定输入/输出块为 5120Bytes,而不是模式的 512Bytes;
    • 比如,使用 cpio 备份数据的命令如下:

    [root@CncLucZK /]# find /test -print | cpio -ocvB>/root/test.cpio
    #利用find命令指定要备份/test/目录,使用>导出到test.cpio文件
    /test
    /test/demo.txt.bz2
    /test/demo2.txt
    /test/demotmo.txt
    /test/users
    /test/users/u3
    [root@localhost ~]# II -h /root/test.cpio
    -rw-r--r-- 1 root root 5340160 Oct 12 23:04 test.cpio
    #etc.cpio文件生成
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.“-i” 模式:指的是 copy-in 模式,就是把数据从文件库中恢复,命令格式如下:

    [root@CncLucZK ~]# cpio -i[vcdu] < [文件|设备]
    
    • 1
    • 各选项的含义为:

      • -i:copy-in 模式,还原;
      • -v:显示还原过程;
      • -c:较新的 portable format 存储方式;
      • -d:还原时自动新建目录;
      • -u:自动使用较新的文件覆盖较旧的文件;
    • 比如,使用 cpio 恢复之前备份的数据,命令如下:

    [root@CncLucZK /]# cpio -idvcu < /root/test.cpio
    /test
    /test/demo.txt.bz2
    /test/demo2.txt
    /test/demotmo.txt
    /test/users
    /test/users/u3
    
    #还原test的备份
    #如果査看一下当前目录/root/,就会发现没有生成/test/目录。这是因为备份时/test/目录使用的是绝对路径,所以数据直接恢复到/test/系统目录中,而没有生成在/root/test/目录中
    [root@CncLucZK /]# ll test
    total 5264
    -rw-r--r-- 1 root root      38 Oct 12 23:10 add.sh
    -rw-r--r-- 1 root root      41 Oct 12 23:10 awk.sh
    -rw-r--r-- 1 root root 5324748 Oct 12 23:10 blog.docx
    drwxr-xr-x 3 root root    4096 Oct  9 21:11 config
    -rw-r--r-- 1 root root     142 Oct 12 23:10 demo2.txt
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3.“-p” 模式:指的是复制模式,使用 -p 模式可以从某个目录读取所有文件,但并不将其备份到 cpio 库中,而是直接复制为其他文件。

    • 例如,使用 -p 将 /boot/ 复制到 /test/boot 目录中可以执行如下命令:
    [root@CncLucZK tmp]# find /boot/ -print | cpio -p /test
    #备份/boot/目录到/tmp/test/目录中
    [root@CncLucZK tmp]# ls test/boot
    #在/test/目录中备份出了/boot/目录
    
    • 1
    • 2
    • 3
    • 4
    7.6.2 使用 cpio 命令提取 RPM 包中指定文件
    • 在服务器使用过程,如果系统文件被误修改或误删除,可以考虑使用 cpio 命令提取出原 RPM 包中所需的系统文件,从而修复被误操作的源文件。

    • PM 包允许逐个提取包中文件,使用的命令格式如下:

    [root@CncLucZK ~]# rpm2cpio 包全名|cpio -idv .文件绝对路径
    
    • 1
    • 该命令中,rpm2cpio 就是将 RPM 包转换为 cpio 格式的命令,通过 cpio 命令即可从 cpio 文件库中提取出指定文件。

    • 举个例子,假设我们不小心把 /bin/ls 命令删除了,通常有以下 2 种方式修复:

      1. 将 coreutils-8.4-19.el6.i686 包(包含 ls 命令的 RPM 包)通过 -force 选项再安装一遍;
      2. 使用 cpio 命令从 coreutils-8.4-19.el6.i686 包中提取出 /bin/ls 文件,然后将其复制到相应位置;
    • 这里我们选择第 2 种方式,如何知道 ls 命令隶属于那个 RPM 包呢?很简单,使用 rpm -qf 命令即可,如下所示:

    [root@CncLucZK /]# rpm -qf /bin/ls
    coreutils-8.30-6.el8.x86_64
    #查看ls文件属于哪个软件包
    
    • 1
    • 2
    • 3
    • 在此基础上,我们只需从此 RPM 包使用 cpio 命令提取出 ls 命令文件,然后将其复制到对应位置即可,实现命令如下:
    [root@CncLucZK ~]# mv /bin/ls /root/
    #把/bin/ls命令移动到/root/目录下,造成误删除的假象
    [root@CncLucZK ~]# ls
    -bash: ls: command not found
    #这时执行ls命令,系统会报"命令没有找到"错误
    [root@CncLucZK ~]# rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm
    |cpio -idv ./bin/ls
    #提取ls命令文件到当前目录下
    [root@CncLucZK ~]# cp /root/bin/ls /bin/
    #把提取出来的ls命令文件复制到/bin/目录下
    [root@CncLucZK ~]#ls
    anaconda-ks.cfg bin inittab install.log install.log.syslog ls
    #可以看到,ls命令又可以正常使用了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    参考文献:
    Linux提取RPM包文件(cpio命令)详解

    下一篇:Linux学习-19-SRPM源码包安装
  • 相关阅读:
    汽车社媒营销创新玩法,品牌“自爆”不走寻常路
    【Acwing】背包
    使用id限定优化mysql分页查询limit偏移量大问题
    【直播回顾】OpenHarmony知识赋能六期第五课—WiFi子系统
    Java进阶之路--继承中的方法重写与属性覆盖
    神经网络用于控制的优越性,神经网络稳定性理论
    Linux 系统常用命令总结
    C++代码转C#代码,制作DLL,以供python调用
    java中的接口
    我有 7种 实现web实时消息推送的方案,7种!
  • 原文地址:https://blog.csdn.net/weixin_42045639/article/details/127492065