RPM包中文件提取

    1cpio命令

    cpio命令主要有三种基本模式:“-o”模式指的是copy-out模式,就是把数据备份到文件库中;"-i"模式指的是copy-in模式,就是把数据从文件库中恢复;“-p”模式指的是复制模式,就是不把数据备份到cpio库中,而是直接复制为其他文件。命令如下:

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

一下举例说明:

利用find命令找到文件,备份

[root@localhost sdc1]# find /etc/ -print |cpio -ocvB > /root/etc.cpio
#利用find指定要备份/etc/目录,使用>导出到etc.cpio文件
[root@localhost ~]# ll -h etc.cpio 
-rw-r--r--. 1 root root 24M 4月  2215:27 etc.cpio   #etc.cpio文件生成

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

[root@localhost ~]# cpio -idvcu </root/etc.cpio   #还原etc的备份
#但是如果打架查看下当前目录/root,会发现没有生存etc目录。这是因为备份是/etc目录使用的绝对路
径,所以恢复的数据直接恢复到了/etc系统目录中,而没有生成在/root/etc中。

    CentOS5.x的版本中,是可以利用上面的命令备份与恢复指定的文件。但是到CentOS6.x当中,需要更加严禁。如果备份时使用绝对路径,则恢复的数据会直接到绝对路径指定的路径中,如果需要把数据恢复到当前目录中,则需要使用相对路径,例如:

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

恢复:

[root@localhost etc]# cd /root/         #回到/root目录中
[root@localhost ~]# mkdir etc_test      #建立恢复测试目录
[root@localhost ~]# cdetc_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/目录中
[root@localhost tmp]# ls test/          #在/tmp/test/目录中备份出了boot目录
boot

2)提取RPM包中文件

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

举个例子,现在我假设把系统中的/bin/ls命令不小心误删除了,那么可以修复过来吗?这时有两种方法修复,要不就是使用--force选项覆盖安装一遍coreutils-8.4-31.el6.x86_64包,要不就可以使用cpio命令提取出/bin/ls命令文件,再把它拷贝到对应位置就可以了。不过我是怎么知道/bin/ls命令是属于coreutils-8.4-31.el6.x86_64这个软件包的呢?命令如下:

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

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

[root@localhost ~]# mv /bin/ls/root/ #把/bin/ls命令移动到/root目录下,造成误删除的假象
[root@localhost ~]#ls
-bash:ls: command notfound          #这时执行ls命令,系统会报错“命令没有找到”
[root@localhost ~]# rpm2cpio/mnt/cdrom/Packages/coreutils-8.4-31.el6.x86_64.rpm | cpio -idv /root/bin/ls
25227 块                            #提取ls命令到/root/目录下
[root@localhost ~]#ls               #ls命令可以正常使用
anaconda-ks.cfg  bin  comp install.log  install.log.syslog  tmp

 cpio的标准格式

 #cpio 选项<[文件|设备]> 
  选项:    -i:copy-in            #模式,还原
            -d:                    #还原时自动新建目录
            -v:                   #显示还原过程

  例:

#rpm-qf /bin/ls    #查询ls命令属于哪个软件包    #mv/bin/ls /tmp/    #造成ls命令误删除假象
#rpm2cpio /mnt/cdrom/Pachages/coreutils-8.4-19.e16.i686.rpm | cpio-dv./bin/ls
#提取RPM包中ls命令到当前目录的/bin/ls下  #cp/root/bin/ls /bin/  
 #把ls命令复制会/bin目录,修改文件丢失   网络yum源  #vi/etc/yum.repos.d/CentOS-Base.repo 
  [base]  容器名称,一定要放在[]中  name   容器说明,可以自己随便写  mirrorlist 镜像站点,
  这个可以注释掉

  baseurl 我们的yum源服务器的地址。默认是CentOS官方的yum源服务器,是可以使用的,如果你觉的慢可以改成你喜欢的yum源地址
  enabled 此容器是否生效,如果不写或者写成enable=1都是生效,写成enable=0就是不生效
  gpgchech 如果是1是指RPM的数字证书生效,如果是0则不生效
  gpgkey  数字证书的公钥文件保存位置。不用修改

 yum命令

  查询

#yumlist                #查询所有可用软件包列表
#yumsearch 关键字       #搜索服务器上所有和关键字相关的包

 安装

#yum-y install 包名
  选项:
      install  安装
          -y   自动回答yes

  升级

#yum -yupdate 包名
  选项:
         update   升级
             -y   自动回答yes

   卸载

#yum -y remove 包名
    选项:
      remove  卸载       
          -y  自动回答yes

   更新软件

#yum -y update 包名          
#yum  list        #查询所有可以安装的包    YUM软件组管理命令  
#yum grouplist    #列出所有可用的软件组列表   
#yum groupinstall 软件组名    #安装指定软件组,组名可以由grouplist查询出来   
#yum groupremove 软件组名     #卸载指定软件组  
pkill-9 yum-updatesd       如果yum报错正在升级,执行此命令,强制杀死升级进程
#yum  -y install  gcc       (gcc是c语言编译器,不装gcc,源码包不能安装)