Linux软件安装管理之1——rpm命令管理

版权声明:本文为 [onefine] 原创文章,转载请注明出处。 https://blog.csdn.net/jiduochou963/article/details/86619233

Linux软件包管理

  1. rpm命令管理 https://blog.csdn.net/jiduochou963/article/details/86619233
  2. yum在线命令 https://blog.csdn.net/jiduochou963/article/details/86653645
  3. 源码包管理 https://blog.csdn.net/jiduochou963/article/details/86653703
  4. 脚本安装包 https://blog.csdn.net/jiduochou963/article/details/86655625

软件包管理简介

软件包分类

源码包

  • 源码包优点
    • 开源,只要有能力,可以修改源代码
    • 可以自由选择所需的功能
    • 软件是编译安装,所以更加适合自己的系统,更加稳定效率也更高
    • 卸载方便
  • 源码包缺点
    • 安装过程步骤较多,尤其安装较大的软件集合时(如LAMP环境搭建),容易出现拼写错误
    • 编译过程时间较长,安装比二进制安装时间长
    • 因为是编译安装,安装过程中一旦报错新手很难解决
  • 脚本安装包——所谓的脚本安装包,就是把复杂的软件包安装过程写成了程序脚本,初学者可以执行脚本实现一键安装。但实际安装的还是源码包和二进制包(下面将会介绍)
    • 优点:安装简单、快捷;
    • 缺点:完全丧失了自定义性。

二进制包(RPM包、系统默认包)

  • 二进制包的优点
    • 包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载
    • 安装速度比源码安装快的多
  • 二进制包缺点
    • 经过编译,不再可以看到源代码
    • 功能选择不如源码包灵活
    • 依赖性(下面将会介绍)
  • RPM包安装命令分两种安装方法:rpm手工命令安装+yum在线安装

报告环境
[root@localhost /]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

一、 rpm命令管理

RPM包命名规则

RPM包的来源

  • RPM包在系统镜像文件ISO中————Linux系统光盘中包含了所有的RPM包
  • 使用
    • 虚拟机设置-> CD/DVD(IDE)->设备状态:已连接打钩。(相当于给光驱加电源)
    • 连接->使用ISO镜像文件(M)->浏览:选择系统镜像文件
    • 给光盘创建一个挂载点
      在这里插入图片描述
[root@localhost cdrom]# mkdir /mnt/cdrom
[root@localhost cdrom]# mount /dev/sr0 /mnt/cdrom/
mount: 在 /dev/sr0 上找不到媒体
[root@localhost cdrom]# mount /dev/sr0 /mnt/cdrom/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost cdrom]# ls -al /mnt/cdrom/
总用量 1643
drwxr-xr-x. 8 root root    2048 5月   4 2018 .
drwxr-xr-x. 3 root root      19 1月  23 20:50 ..
-rw-rw-r--. 1 root root      14 5月   2 2018 CentOS_BuildTag
-rw-r--r--. 1 root root      29 5月   4 2018 .discinfo
drwxr-xr-x. 3 root root    2048 5月   4 2018 EFI
-rw-rw-r--. 1 root root     227 8月  30 2017 EULA
-rw-rw-r--. 1 root root   18009 12月 10 2015 GPL
drwxr-xr-x. 3 root root    2048 5月   4 2018 images
drwxr-xr-x. 2 root root    2048 5月   4 2018 isolinux
drwxr-xr-x. 2 root root    2048 5月   4 2018 LiveOS
drwxrwxr-x. 2 root root 1640448 5月   3 2018 Packages
drwxrwxr-x. 2 root root    4096 5月   7 2018 repodata
-rw-rw-r--. 1 root root    1690 12月 10 2015 RPM-GPG-KEY-CentOS-7
-rw-rw-r--. 1 root root    1690 12月 10 2015 RPM-GPG-KEY-CentOS-Testing-7
-r--r--r--. 1 root root    2883 5月   7 2018 TRANS.TBL
-rw-r--r--. 1 root root     354 5月   4 2018 .treeinfo
[root@localhost cdrom]# cd /mnt/cdrom/Packages/
[root@localhost Packages]# ls		# 这将会列出所有的PRM包,这里省略
...

如果出现/dev/sr0 上找不到媒体,解决办法是在虚拟机底部的状态栏内,找到CD/DVD图标(一个光盘图标),此时一般显示为灰色,鼠标点一下,即可启动CD/DVD,此时CD/DVD即可加载到虚拟机系统内.
在这里插入图片描述

所以RPM包在哪呢? RPM包在/mnt/cdrom/Packages目录下:

[root@localhost Packages]# pwd
/mnt/cdrom/Packages
[root@localhost Packages]# 
[root@localhost Packages]# cd /
[root@localhost /]# umount /mnt/cdrom/

RPM包命名原则

如:httpd-2.2.15-15.el6.centos.1.i686.rpm

  • httpd 软件包名
  • 2.2.15 软件版本
  • 15 软件发布的次数
  • el6.centos 适合的Linux平台(el6是Redhat的企业版)
  • i686 适合的硬件平台
  • rpm rpm包的扩展名
    包名称-版本-发布次数.适合的Linux平台.适合的硬件平台.包的扩展名

RPM包依赖性:

  • 树形依赖:a->b->c 解决方法:从后往前安装
  • 环形依赖:a->b->c->a 解决方法:所有包放在一条命令中安装即可
  • 模块依赖:库文件依赖,库也叫模块,就是linux当中的函数,它有一个典型的特征,就是以.so.数字结尾,它依赖的其实是一个文件,而不是软件包。该文件藏身在某一个软件包当中,我们只要将该文件所在的软件包安装上,该文件也就安装了。
    • 如:
    [root@localhost Packages]# rpm -ivh mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm 
    警告:mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
    错误:依赖检测失败:
            libodbc.so.2()(64bit) 被 mysql-connector-odbc-5.2.5-7.el7.x86_64 需要
            libodbcinst.so.2()(64bit) 被 mysql-connector-odbc-5.2.5-7.el7.x86_64 需要
    [root@localhost Packages]# 
    # 提示说要安装libodbc.so.2()(64bit),凡是以`.so.数字`结尾的依赖称库文件依赖(库也称模块,库就是linux中的函数,这里的函数就是一个文件,使用称库文件)。
    # 安装时找不到如libodbc.so.2()这种依赖,为啥呢?因为mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm 依赖的是一个文件而不是Packages目录下的这些PRM软件包,
    # 即被依赖的库文件是藏身在众多PRM软件包中的一个文件,只要把这个文件所在PRM软件包装上,自然就有了被依赖的这个文件。
    
    那我怎么知道这个文件在哪个包里面呢?
    三个方法:
    1. 根据文件猜在哪个包中,额 可行性不大
    2. 查询http://www.rpmfind.net,输入库文件名称查询到对应的rpm包,然后安装即可。(详下)
    3. yum在线安装(下面将会介绍):Redhat或CentOS等Linux系统在远程搭建一个服务器放置所有用到的软件,只要Linux能正常访问这台远程服务器,那么执行一条yum命令,在服务器上会自动匹配依赖性(不管是树形依赖、环形依赖、库依赖etc),自动下载所有依赖的包,一条命令装好包括依赖包在内的需要安装的所有软件包。在不联网情况下,镜像光盘可以作为本地yum(下面将会介绍)。CentOS的yum是免费的。yum安装的包是二进制包。

在这里插入图片描述
在这里插入图片描述

安装命令

包全名与包名

mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm就是包全名(完整的包名),而mysql-connector-odbc是包名。

  • 包全名:操作的包是还没有安装的软件包时,必须使用包全名,而且要注意路径。(主要是安装和升级的时候)
  • 包名:操作已经安装的软件包时,使用包名,原因是会搜索/var/lib/rpm/中的数据库。(主要是卸载和查询的时候)

RPM安装

  • rpm -ivh 包全名
  • 选项
    • -i(install) 安装
    • -v(verbose) 显示详细信息
    • -h(hash) 显示进度
    • --nodeps 不检测依赖性(实际生产环境——服务器上是不允许使用,必须解决依赖性)
实践——安装Apache

先装主包,再安装附加包(附加包依赖主包)

[root@localhost Packages]# rpm -ivh httpd-
httpd-2.4.6-80.el7.centos.x86_64.rpm         httpd-manual-2.4.6-80.el7.centos.noarch.rpm  
httpd-devel-2.4.6-80.el7.centos.x86_64.rpm   httpd-tools-2.4.6-80.el7.centos.x86_64.rpm   
[root@localhost Packages]# rpm -ivh httpd-2.4.6-80.el7.centos.x86_64.rpm 
警告:httpd-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
错误:依赖检测失败:
        /etc/mime.types 被 httpd-2.4.6-80.el7.centos.x86_64 需要
        httpd-tools = 2.4.6-80.el7.centos 被 httpd-2.4.6-80.el7.centos.x86_64 需要
        libapr-1.so.0()(64bit) 被 httpd-2.4.6-80.el7.centos.x86_64 需要
        libaprutil-1.so.0()(64bit) 被 httpd-2.4.6-80.el7.centos.x86_64 需要
[root@localhost Packages]# rpm -ivh httpd-
httpd-2.4.6-80.el7.centos.x86_64.rpm         httpd-manual-2.4.6-80.el7.centos.noarch.rpm  
httpd-devel-2.4.6-80.el7.centos.x86_64.rpm   httpd-tools-2.4.6-80.el7.centos.x86_64.rpm   
[root@localhost Packages]# rpm -ivh httpd-tools-2.4.6-80.el7.centos.x86_64.rpm 
警告:httpd-tools-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
错误:依赖检测失败:
        libapr-1.so.0()(64bit) 被 httpd-tools-2.4.6-80.el7.centos.x86_64 需要
        libaprutil-1.so.0()(64bit) 被 httpd-tools-2.4.6-80.el7.centos.x86_64 需要
[root@localhost Packages]# rpm -ivh ^C
[root@localhost Packages]# ^C
[root@localhost Packages]# rpm -ivh apr-1.4.8-3.el7_4.1.x86_64.rpm 
警告:apr-1.4.8-3.el7_4.1.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:apr-1.4.8-3.el7_4.1              ################################# [100%]
[root@localhost Packages]# ^C
[root@localhost Packages]# rpm -ivh apr-util-1.5.2-6.el7.x86_64.rpm 
警告:apr-util-1.5.2-6.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:apr-util-1.5.2-6.el7             ################################# [100%]
[root@localhost Packages]# rpm -ivh httpd-tools-2.4.6-80.el7.centos.x86_64.rpm
警告:httpd-tools-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:httpd-tools-2.4.6-80.el7.centos  ################################# [100%]
[root@localhost Packages]# ^C
[root@localhost Packages]# rpm -ivh apr-1.4.8-3.el7_4.1.x86_64.rpm 
警告:apr-1.4.8-3.el7_4.1.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
        软件包 apr-1.4.8-3.el7_4.1.x86_64 已经安装
[root@localhost Packages]# ^C
[root@localhost Packages]# rpm -ivh apr-util-1.5.2-6.el7.x86_64.rpm 
警告:apr-util-1.5.2-6.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
        软件包 apr-util-1.5.2-6.el7.x86_64 已经安装
[root@localhost Packages]# rpm -ivh httpd-2.4.6-80.el7.centos.x86_64.rpm
警告:httpd-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
错误:依赖检测失败:
        /etc/mime.types 被 httpd-2.4.6-80.el7.centos.x86_64 需要
[root@localhost Packages]# rpm -ivh /etc/mime.types
错误:打开 /etc/mime.types 失败: 没有那个文件或目录
[root@localhost Packages]# ^C
[root@localhost Packages]# rpm -ivh mailcap-2.1.41-2.el7.noarch.rpm 
警告:mailcap-2.1.41-2.el7.noarch.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:mailcap-2.1.41-2.el7             ################################# [100%]
[root@localhost Packages]# rpm -ivh httpd-2.4.6-80.el7.centos.x86_64.rpm
警告:httpd-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:httpd-2.4.6-80.el7.centos        ################################# [100%]
[root@localhost Packages]# 
[root@localhost Packages]# 
[root@localhost Packages]# rpm -ivh httpd-
httpd-2.4.6-80.el7.centos.x86_64.rpm         httpd-manual-2.4.6-80.el7.centos.noarch.rpm  
httpd-devel-2.4.6-80.el7.centos.x86_64.rpm   httpd-tools-2.4.6-80.el7.centos.x86_64.rpm   
[root@localhost Packages]# rpm -ivh httpd-manual-2.4.6-80.el7.centos.noarch.rpm 
警告:httpd-manual-2.4.6-80.el7.centos.noarch.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:httpd-manual-2.4.6-80.el7.centos ################################# [100%]
[root@localhost Packages]# rpm -ivh httpd-devel-2.4.6-80.el7.centos.x86_64.rpm 
警告:httpd-devel-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
错误:依赖检测失败:
        apr-devel 被 httpd-devel-2.4.6-80.el7.centos.x86_64 需要
        apr-util-devel 被 httpd-devel-2.4.6-80.el7.centos.x86_64 需要
[root@localhost Packages]# rpm -ivh apr-devel-1.4.8-3.el7_4.1.
错误:打开 apr-devel-1.4.8-3.el7_4.1. 失败: 没有那个文件或目录
[root@localhost Packages]# rpm -ivh apr-devel-1.4.8-3.el7_4.1.
apr-devel-1.4.8-3.el7_4.1.i686.rpm    apr-devel-1.4.8-3.el7_4.1.x86_64.rpm  
[root@localhost Packages]# rpm -ivh apr-devel-1.4.8-3.el7_4.1.x86_64.rpm 
警告:apr-devel-1.4.8-3.el7_4.1.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:apr-devel-1.4.8-3.el7_4.1        ################################# [100%]
[root@localhost Packages]# rpm -ivh apr-util-devel-1.5.2-6.el7.
apr-util-devel-1.5.2-6.el7.i686.rpm    apr-util-devel-1.5.2-6.el7.x86_64.rpm  
[root@localhost Packages]# rpm -ivh apr-util-devel-1.5.2-6.el7.x86_64.rpm 
警告:apr-util-devel-1.5.2-6.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
错误:依赖检测失败:
        expat-devel(x86-64) 被 apr-util-devel-1.5.2-6.el7.x86_64 需要
        libdb-devel(x86-64) 被 apr-util-devel-1.5.2-6.el7.x86_64 需要
        openldap-devel(x86-64) 被 apr-util-devel-1.5.2-6.el7.x86_64 需要
[root@localhost Packages]# ^C
[root@localhost Packages]# rpm -ivh expat-devel-2.1.0-10.el7_3.x86_64.rpm 
警告:expat-devel-2.1.0-10.el7_3.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:expat-devel-2.1.0-10.el7_3       ################################# [100%]
[root@localhost Packages]# ^C
[root@localhost Packages]# rpm -ivh lib
Display all 2016 possibilities? (y or n)
[root@localhost Packages]# rpm -ivh libdb-devel-5.3.21-24.el7.x86_64.rpm 
警告:libdb-devel-5.3.21-24.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:libdb-devel-5.3.21-24.el7        ################################# [100%]
[root@localhost Packages]# rpm -ivh apr-util-devel-1.5.2-6.el7.x86_64.rpm
警告:apr-util-devel-1.5.2-6.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
错误:依赖检测失败:
        openldap-devel(x86-64) 被 apr-util-devel-1.5.2-6.el7.x86_64 需要
[root@localhost Packages]# ^C
[root@localhost Packages]# rpm -ivh openldap-devel-2.4.44-13.el7.x86_64.rpm 
警告:openldap-devel-2.4.44-13.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
错误:依赖检测失败:
        cyrus-sasl-devel(x86-64) 被 openldap-devel-2.4.44-13.el7.x86_64 需要
[root@localhost Packages]# rpm -ivh apr-util-devel-1.5.2-6.el7.x86_64.rpm
警告:apr-util-devel-1.5.2-6.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
错误:依赖检测失败:
        openldap-devel(x86-64) 被 apr-util-devel-1.5.2-6.el7.x86_64 需要
[root@localhost Packages]# ^C
[root@localhost Packages]# rpm -ivh openldap-devel-2.4.44-20.el7.x86_64.rpm
错误:打开 openldap-devel-2.4.44-20.el7.x86_64.rpm 失败: 没有那个文件或目录
[root@localhost Packages]# rpm -ivh openldap-devel-2.4.44-13.el7.x86_64.rpm 
警告:openldap-devel-2.4.44-13.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
错误:依赖检测失败:
        cyrus-sasl-devel(x86-64) 被 openldap-devel-2.4.44-13.el7.x86_64 需要
[root@localhost Packages]# ^C
[root@localhost Packages]# rpm -ivh cyrus-sasl-devel-2.1.26-23.el7.x86_64.rpm 
警告:cyrus-sasl-devel-2.1.26-23.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:cyrus-sasl-devel-2.1.26-23.el7   ################################# [100%]
[root@localhost Packages]# rpm -ivh apr-util-devel-1.5.2-6.el7.x86_64.rpm
警告:apr-util-devel-1.5.2-6.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
错误:依赖检测失败:
        openldap-devel(x86-64) 被 apr-util-devel-1.5.2-6.el7.x86_64 需要
[root@localhost Packages]# rpm -ivh openldap-devel-2.4.44-13.el7.x86_64.rpm
警告:openldap-devel-2.4.44-13.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:openldap-devel-2.4.44-13.el7     ################################# [100%]
[root@localhost Packages]# rpm -ivh apr-util-devel-1.5.2-6.el7.x86_64.rpm
警告:apr-util-devel-1.5.2-6.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:apr-util-devel-1.5.2-6.el7       ################################# [100%]
[root@localhost Packages]# rpm -ivh apr-util-devel-1.5.2-6.el7.x86_64.rpm
警告:apr-util-devel-1.5.2-6.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
        软件包 apr-util-devel-1.5.2-6.el7.x86_64 已经安装
[root@localhost Packages]# rpm -ivh httpd-
httpd-2.4.6-80.el7.centos.x86_64.rpm         httpd-manual-2.4.6-80.el7.centos.noarch.rpm  
httpd-devel-2.4.6-80.el7.centos.x86_64.rpm   httpd-tools-2.4.6-80.el7.centos.x86_64.rpm   
[root@localhost Packages]# rpm -ivh httpd-manual-2.4.6-80.el7.centos.noarch.rpm 
警告:httpd-manual-2.4.6-80.el7.centos.noarch.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
        软件包 httpd-manual-2.4.6-80.el7.centos.noarch 已经安装
[root@localhost Packages]# rpm -ivh httpd-2.4.6-80.el7.centos.x86_64.rpm 
警告:httpd-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
        软件包 httpd-2.4.6-80.el7.centos.x86_64 已经安装
[root@localhost Packages]# rpm -ivh httpd-devel-2.4.6-80.el7.centos.x86_64.rpm 
警告:httpd-devel-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:httpd-devel-2.4.6-80.el7.centos  ################################# [100%]
[root@localhost Packages]# rpm -ivh httpd-tools-2.4.6-80.el7.centos.x86_64.rpm 
警告:httpd-tools-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
        软件包 httpd-tools-2.4.6-80.el7.centos.x86_64 已经安装
[root@localhost Packages]#
检查:
[root@localhost Packages]# rmp -ivh httpd-
httpd-2.4.6-80.el7.centos.x86_64.rpm         httpd-manual-2.4.6-80.el7.centos.noarch.rpm  
httpd-devel-2.4.6-80.el7.centos.x86_64.rpm   httpd-tools-2.4.6-80.el7.centos.x86_64.rpm   
[root@localhost Packages]# rmp -ivh httpd-2.4.6-80.el7.centos.x86_64.rpm 
bash: rmp: 未找到命令...
相似命令是: 'rpm'
[root@localhost Packages]# rmp -ivh httpd-2.4.6-80.el7.centos.x86_64.rpm 
bash: rmp: 未找到命令...
相似命令是: 'rpm'
[root@localhost Packages]# rmp -ivh httpd-2.4.6-80.el7.centos.x86_64.rpm 
bash: rmp: 未找到命令...
相似命令是: 'rpm'
[root@localhost Packages]# rpm -ivh httpd-2.4.6-80.el7.centos.x86_64.rpm 
警告:httpd-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
        软件包 httpd-2.4.6-80.el7.centos.x86_64 已经安装
[root@localhost Packages]# rpm -ivh httpd-manual-2.4.6-80.el7.centos.noarch.rpm 
警告:httpd-manual-2.4.6-80.el7.centos.noarch.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
        软件包 httpd-manual-2.4.6-80.el7.centos.noarch 已经安装
[root@localhost Packages]# rpm -ivh httpd-devel-2.4.6-80.el7.centos.x86_64.rpm 
警告:httpd-devel-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
        软件包 httpd-devel-2.4.6-80.el7.centos.x86_64 已经安装
[root@localhost Packages]# rpm -ivh httpd-tools-2.4.6-80.el7.centos.x86_64.rpm 
警告:httpd-tools-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
        软件包 httpd-tools-2.4.6-80.el7.centos.x86_64 已经安装
[root@localhost Packages]# 

累趴…

升级与卸载

RPM包升级

-rpm -Uvh 包全名

  • 选项
    • -U(upgrade)升级
    • 若果没安装,则升级即安装
    [root@localhost ~]# cd /mnt/cdrom/Packages/
    [root@localhost Packages]# rpm -Uvh httpd-2.4.6-80.el7.centos.x86_64.rpm 
    警告:httpd-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
    准备中...                          ################################# [100%]
          软件包 httpd-2.4.6-80.el7.centos.x86_64 已经安装
    [root@localhost Packages]# 
    

卸载

  • rpm -e 包名
  • 选项:
    • -e(erase) 卸载
    • --nodeps 不检查依赖性(同样,实际生产环境————服务器上是不允许使用,必须解决依赖性)
  • 因为会查找数据库(位置/var/lib/rpm/),使用不用使用包全名,而且在任何位置都可以执行卸载命令(不用注意路径, 而安装命令一定要进入/mnt/cdrom/Packages/)

例子:

Last login: Wed Jan 23 17:59:27 2019 from 192.168.249.1

[root@localhost ~]# cd /mnt/cdrom/Packages/
[root@localhost Packages]# rpm -Uvh httpd-2.4.6-80.el7.centos.x86_64.rpm 
警告:httpd-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
        软件包 httpd-2.4.6-80.el7.centos.x86_64 已经安装
[root@localhost Packages]# ls /var/lib/rpm/
Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5
Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername
[root@localhost Packages]# ^C
[root@localhost Packages]# rpm -e httpd
错误:依赖检测失败:
        httpd = 2.4.6-80.el7.centos 被 (已安裝) httpd-manual-2.4.6-80.el7.centos.noarch 需要
        httpd = 2.4.6-80.el7.centos 被 (已安裝) httpd-devel-2.4.6-80.el7.centos.x86_64 需要
[root@localhost Packages]# 

使用--nodeps————这里只是演示

[root@localhost Packages]# rpm -e httpd --nodeps 
[root@localhost Packages]# rpm -Uvh httpd-2.4.6-80.el7.centos.x86_64.rpm 
警告:httpd-2.4.6-80.el7.centos.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:httpd-2.4.6-80.el7.centos        ################################# [100%]
[root@localhost Packages]# 

RPM包查询

查询是否安装

  • rpm -q 包名 # 查询包是否安装
    • -q(query) 查询
  • rpm -qa # 查询所有已经安装的RPM包
    • -a(all) 所有
[root@localhost Packages]# rpm -q httpd
httpd-2.4.6-80.el7.centos.x86_64
[root@localhost Packages]# rpm -q onefine
未安装软件包 onefine 
[root@localhost Packages]# rpm -qa  # 列出所有安装的包,省略
...

利用管道符————一旦使用grep,后面的就是正则表达式————推荐使用

[root@localhost Packages]# rpm -qa | grep httpd
httpd-manual-2.4.6-80.el7.centos.noarch
httpd-2.4.6-80.el7.centos.x86_64
httpd-tools-2.4.6-80.el7.centos.x86_64
httpd-devel-2.4.6-80.el7.centos.x86_64
[root@localhost Packages]# 

查询软件包详细信息

  • rpm -qi 包名
  • 选项:
    • -i(information) 查询软件信息
    • -p(package) 查询未安装包信息

查询已安装包的信息:

[root@localhost Packages]# rpm -qi httpd
Name        : httpd
Version     : 2.4.6
Release     : 80.el7.centos
Architecture: x86_64
Install Date: 2019年01月24日 星期四 00时13分06秒
Group       : System Environment/Daemons
Size        : 9817285
License     : ASL 2.0
Signature   : RSA/SHA256, 2018年04月25日 星期三 19时04分41秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : httpd-2.4.6-80.el7.centos.src.rpm
Build Date  : 2018年04月21日 星期六 02时12分22秒
Build Host  : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://httpd.apache.org/
Summary     : Apache HTTP Server
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web server.
[root@localhost Packages]# 

查询未安装包的信息(存在但没安装的包,此时跟包全名并且要注意位置————切换目录)

[root@localhost Packages]# pwd
/mnt/cdrom/Packages
[root@localhost Packages]# rpm -qip mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm 
警告:mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
Name        : mysql-connector-odbc
Version     : 5.2.5
Release     : 7.el7
Architecture: x86_64
Install Date: (not installed)
Group       : System Environment/Libraries
Size        : 428611
License     : GPLv2 with exceptions
Signature   : RSA/SHA256, 2018年04月25日 星期三 19时28分41秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : mysql-connector-odbc-5.2.5-7.el7.src.rpm
Build Date  : 2018年04月11日 星期三 09时41分42秒
Build Host  : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://dev.mysql.com/downloads/connector/odbc/
Summary     : ODBC driver for MySQL
Description :
An ODBC (rev 3) driver for MySQL, for use with unixODBC.
[root@localhost Packages]# 

查询包中文件的安装位置

  • rpm -ql 包名
  • 选项
    • -l(list) 列表
    • -p(package) 查询未安装包信息
[root@localhost Packages]# rpm -ql httpd 
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d
...省略好多

RPM包默认安装位置

RPM包默认(习惯、推荐、常规)安装路径
/etc/ 配置文件安装目录
/usr/bin/ 可执行的命令安装目录
/usr/lib/ 程序所使用的函数库保存位置
/usr/share/doc/ 基本的软件使用手册保存位置
/usr/share/man/ 帮助文件保存位置

这是包安装的推荐位置,但是实际上不一定,这取决与写包的作者的安排。正是因为这样,所以才有RPM包的卸载命令。下面的实践就更好理解了。

查询未安装包的默认安装(还没装,但安装之后会在的位置)位置(存在但没安装的包,此时跟包全名并且要注意位置————切换目录)

[root@localhost Packages]# pwd
/mnt/cdrom/Packages
[root@localhost Packages]# rpm -qlp mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm
警告:mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
/usr/lib64/libmyodbc5.so
/usr/lib64/libmyodbc5w.so
/usr/share/doc/mysql-connector-odbc-5.2.5
/usr/share/doc/mysql-connector-odbc-5.2.5/COPYING
/usr/share/doc/mysql-connector-odbc-5.2.5/ChangeLog
/usr/share/doc/mysql-connector-odbc-5.2.5/README
/usr/share/doc/mysql-connector-odbc-5.2.5/README.debug
[root@localhost Packages]# 

查询系统文件属于哪个RPM包

  • rpm -qf 系统文件名
  • 选项:
    • -f(file) 查询系统文件属于哪个安装包
[root@localhost Packages]# rpm -qf /etc/httpd/conf.d
httpd-2.4.6-80.el7.centos.x86_64
[root@localhost Packages]# 

来捣乱:

[root@localhost Packages]# rpm -qf onefine
错误:文件 /mnt/cdrom/Packages/onefine:没有那个文件或目录
[root@localhost Packages]# touch abc
touch: 无法创建"abc": 只读文件系统
[root@localhost Packages]# touch /home/onefine/hahaha
[root@localhost Packages]# ls -al /home/onefine/
总用量 12
drwx------. 3 onefine onefine  92 1月  24 01:24 .
drwxr-xr-x. 3 root    root     21 1月  23 17:45 ..
-rw-r--r--. 1 onefine onefine  18 4月  11 2018 .bash_logout
-rw-r--r--. 1 onefine onefine 193 4月  11 2018 .bash_profile
-rw-r--r--. 1 onefine onefine 231 4月  11 2018 .bashrc
-rw-r--r--. 1 root    root      0 1月  24 01:24 hahaha
drwxr-xr-x. 4 onefine onefine  39 1月  23 17:33 .mozilla
[root@localhost Packages]# rpm -qf /home/onefine/hahaha 
文件 /home/onefine/hahaha 不属于任何软件包
[root@localhost Packages]# rm /home/onefine/hahaha 
rm:是否删除普通空文件 "/home/onefine/hahaha"?y
[root@localhost Packages]# ls -al /home/onefine/
总用量 12
drwx------. 3 onefine onefine  78 1月  24 01:26 .
drwxr-xr-x. 3 root    root     21 1月  23 17:45 ..
-rw-r--r--. 1 onefine onefine  18 4月  11 2018 .bash_logout
-rw-r--r--. 1 onefine onefine 193 4月  11 2018 .bash_profile
-rw-r--r--. 1 onefine onefine 231 4月  11 2018 .bashrc
drwxr-xr-x. 4 onefine onefine  39 1月  23 17:33 .mozilla
[root@localhost Packages]# 

所以,这个文件必须是由RPM包安装的,才能方向追踪所属的包————'系统文件名’的意思。

再来:已知未安装包将来的位置。。查这个不存在的文件会怎么样?以上面的MySQL为例

[root@localhost Packages]# rpm -qf /usr/lib64/libmyodbc5w.so
错误:文件 /usr/lib64/libmyodbc5w.so:没有那个文件或目录
[root@localhost Packages]# 
[root@localhost Packages]# rpm -qf #/usr/lib64/libmyodbc5w.so
错误:文件 /usr/lib64/libmyodbc5w.so:没有那个文件或目录
[root@localhost Packages]# rpm -qfp /usr/lib64/libmyodbc5w.so  # 当然了,这是错误的
rpm:每次仅能执行一种类型的查询/检验
[root@localhost Packages]# 

查询软件包的依赖性

  • rpm -qR 包名
  • 选项:
    • -R(requires) 查询软件包的依赖性
    • -p(package) 查询未安装包的信息
[root@localhost Packages]# rpm -qR httpd
/etc/mime.types
system-logos >= 7.92.1-1
httpd-tools = 2.4.6-80.el7.centos
/usr/sbin/useradd
/usr/sbin/groupadd
systemd-units
systemd-units
systemd-units
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/bin/sh
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(FileCaps) <= 4.6.1-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
/bin/sh
libapr-1.so.0()(64bit)
libaprutil-1.so.0()(64bit)
libcrypt.so.1()(64bit)
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libdb-5.3.so()(64bit)
libdl.so.2()(64bit)
libexpat.so.1()(64bit)
liblua-5.1.so()(64bit)
libm.so.6()(64bit)
libpcre.so.1()(64bit)
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
libselinux.so.1()(64bit)
libsystemd-daemon.so.0()(64bit)
libsystemd-daemon.so.0(LIBSYSTEMD_DAEMON_31)(64bit)
libz.so.1()(64bit)
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1
[root@localhost Packages]# 

列出所有所有所有……如果要查看包的依赖去安装包,这个意义不大,还不如直接安装,安装提示安装缺失的依赖。

[root@localhost Packages]# pwd
/mnt/cdrom/Packages
[root@localhost Packages]# rpm -qR mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm
未安装软件包 mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm 
[root@localhost Packages]# rpm -qRp mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm
警告:mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
/sbin/ldconfig
/sbin/ldconfig
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libdl.so.2()(64bit)
libdl.so.2(GLIBC_2.2.5)(64bit)
libm.so.6()(64bit)
libmysqlclient.so.18()(64bit)
libmysqlclient.so.18(libmysqlclient_18)(64bit)
libodbc.so.2()(64bit)
libodbcinst.so.2()(64bit)
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1
[root@localhost Packages]# 

RPM包校验

RPM包校验

  • rpm -V 已安装的包名
  • 选项:
    • -V(verify) 校验指定RPM包中的文件
[root@localhost ~]# rpm -V httpd
[root@localhost ~]# pwd
/root
[root@localhost ~]# rpm -ql httpd | more
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d
/etc/httpd/conf.modules.d/00-base.conf
/etc/httpd/conf.modules.d/00-dav.conf
/etc/httpd/conf.modules.d/00-lua.conf
/etc/httpd/conf.modules.d/00-mpm.conf
/etc/httpd/conf.modules.d/00-proxy.conf
/etc/httpd/conf.modules.d/00-systemd.conf
/etc/httpd/conf.modules.d/01-cgi.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/httpd/logs
/etc/httpd/modules
/etc/httpd/run
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
/run/httpd
/run/httpd/htcacheclean
/usr/lib/systemd/system/htcacheclean.service
/usr/lib/systemd/system/httpd.service
/usr/lib/tmpfiles.d/httpd.conf
/usr/lib64/httpd
/usr/lib64/httpd/modules
/usr/lib64/httpd/modules/mod_access_compat.so
/usr/lib64/httpd/modules/mod_actions.so
/usr/lib64/httpd/modules/mod_alias.so
/usr/lib64/httpd/modules/mod_allowmethods.so
/usr/lib64/httpd/modules/mod_asis.so
/usr/lib64/httpd/modules/mod_auth_basic.so
/usr/lib64/httpd/modules/mod_auth_digest.so
/usr/lib64/httpd/modules/mod_authn_anon.so
/usr/lib64/httpd/modules/mod_authn_core.so
/usr/lib64/httpd/modules/mod_authn_dbd.so
/usr/lib64/httpd/modules/mod_authn_dbm.so
/usr/lib64/httpd/modules/mod_authn_file.so
/usr/lib64/httpd/modules/mod_authn_socache.so
/usr/lib64/httpd/modules/mod_authz_core.so
/usr/lib64/httpd/modules/mod_authz_dbd.so
/usr/lib64/httpd/modules/mod_authz_dbm.so
/usr/lib64/httpd/modules/mod_authz_groupfile.so
--More--  # 后面的省略
...
# ...修改/etc/httpd/conf/httpd.conf文件
[root@localhost ~]# vi /etc/httpd/conf/httpd.conf
# ...添加下面一句话
# 你被改了你知道不
# ...省略其他
# ...保存退出后
[root@localhost ~]# rpm -V httpd
S.5....T.  c /etc/httpd/conf/httpd.conf
# ...修改回来
[root@localhost ~]# vi /etc/httpd/conf/httpd.conf
# ...修改回来之后
[root@localhost ~]# rpm -V httpd
.......T.  c /etc/httpd/conf/httpd.conf
[root@localhost ~]#
验证内容中的8个信息的具体内容(依次)如下:
  • S 文件大小是否改变
  • M 文件的类型或文件的权限(rwx)是否被改变
  • 5 文件的MD5校验和是否改变(可以看成文件内容是否改变)
  • D 设备的主从代码是否改变
  • L 文件的路径是否改变
  • U 文件的属主(所有者)是否改变
  • G 文件的属组是否改变
  • T 文件的修改时间是否改变
文件类型
  • c(config file) 配置文件
  • d(documentation) 普通文件
  • g(ghost file) "鬼"文件,很少见,就是该文件不应该被这个RPM所包含
  • L(license file) 授权文件
  • r(read me) 描述文件

RPM包中文件提取

  • rpm2cpio 包全名 | cpio -idv .文件绝对路径
    • rpm2cpio 将rpm包转换为cpio格式的命令
      • 2谐音to,就是将rpm格式的包转换成cpio格式的包
    • cpio 是一个标准工具,它用于创建软件归档文件和从档案文件中提取文件
      • cpio并不知道我们所要提取的文件的位置在哪,
    • cpio命令的完整格式:cpio 选项 <[文件|设备]
      • 选项:
        • -i copy-in模式,还原
        • -d 还原时自动新建目录
        • -v 显示还原过程
[root@localhost ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
[root@localhost ~]# ls -al  /tmp/
总用量 936
drwxrwxrwt. 16 root root   4096 1月  24 10:32 .
dr-xr-xr-x. 17 root root    224 1月  23 17:45 ..
-rw-r--r--.  1 root root   1149 1月  23 17:49 anaconda.log
drwx------.  2 root root     20 1月  23 17:55 .esd-0
drwx------.  2 root root     25 1月  23 17:57 firefox_root
drwxrwxrwt.  2 root root      6 1月  23 17:35 .font-unix
drwxr-xr-x.  2 root root     18 1月  23 17:35 hsperfdata_root
drwxrwxrwt.  2 root root     42 1月  23 17:55 .ICE-unix
-rw-r--r--.  1 root root    415 1月  23 17:49 ifcfg.log
-rwx------.  1 root root    836 1月  23 17:46 ks-script-L9LDqY
-rw-r--r--.  1 root root      0 1月  23 17:49 packaging.log
-rw-r--r--.  1 root root      0 1月  23 17:49 program.log
-rw-r--r--.  1 root root      0 1月  23 17:49 sensitive-info.log
drwx------.  2 root root     24 1月  23 17:55 ssh-2uFxXSQ6gkGr
-rw-r--r--.  1 root root      0 1月  23 17:49 storage.log
drwx------.  3 root root     17 1月  23 17:54 systemd-private-7e3b8f68675b40e9897b290377d43299-colord.service-aG1lXN
drwx------.  3 root root     17 1月  23 17:54 systemd-private-7e3b8f68675b40e9897b290377d43299-cups.service-3UD9lx
drwx------.  3 root root     17 1月  23 17:54 systemd-private-7e3b8f68675b40e9897b290377d43299-rtkit-daemon.service-nv9Cuu
drwxrwxrwt.  2 root root      6 1月  23 17:35 .Test-unix
drwx------.  2 root root      6 1月  23 17:55 tracker-extract-files.0
drwx------.  2 root root      6 1月  23 17:49 vmware-root
-r--r--r--.  1 root root     11 1月  23 17:54 .X0-lock
drwxrwxrwt.  2 root root     16 1月  23 17:54 .X11-unix
drwxrwxrwt.  2 root root      6 1月  23 17:35 .XIM-unix
-rw-------.  1 root root      0 1月  23 17:32 yum.log
-rw-------.  1 root root 466361 1月  23 17:57 yum_save_tx.2019-01-23.17-57.TSYLg6.yumtx
-rw-------.  1 root root 469566 1月  24 09:45 yum_save_tx.2019-01-24.09-45.UL5IOq.yumtx
[root@localhost ~]# mv /bin/ls /tmp/
[root@localhost ~]# ls -al  /tmp/
-bash: /usr/bin/ls: 没有那个文件或目录
[root@localhost ~]# ls
-bash: /usr/bin/ls: 没有那个文件或目录
[root@localhost ~]# 

这时,假如是误操作导致ls找不到,可以找到另一台Linux,把缺失的命令文件找出来复制,但要保证版本号和缺失的一致。额,要是mv也丢了呢?这时可以通过RPM包中提取文件的方法:
我们知道所有的文件RPM包安装得到的,所有的系统文件,重要文件等都在RPM包当中。此时可以把丢失文件所在的RPM包打开,从里面提取出所需要的RPM命令,这就是所谓RPM包文件提取。当然了,从新安装缺失文件所在RPM包也可以解决问题。

[root@localhost ~]# rpm -qf /bin/ls
coreutils-8.22-21.el7.x86_64
[root@localhost ~]# ls
-bash: /usr/bin/ls: 没有那个文件或目录
# 还原ls
[root@localhost ~]# mv /tmp/ls /bin/
[root@localhost ~]# ls -al /bin/ls 
-rwxr-xr-x. 1 root root 117672 4月  11 2018 /bin/ls

# 实验从这里开始
# 查询ls命令属于哪个软件包
[root@localhost ~]# rpm -qf /bin/ls
coreutils-8.22-21.el7.x86_64
# 移走ls,造成ls命令误删除假象
[root@localhost ~]# mv /bin/ls /tmp/
# 提取RPM包中ls命令到当前目录的/bin/ls下
[root@localhost ~]# rpm2cpio /mnt/cdrom/Packages/coreutils-8.22-21.el7.x86_64.rpm | cpio -idv ./bin/ls
28594 块
[root@localhost ~]# pwd
/root
[root@localhost ~]# cp /root/bin/ls /bin/
cp: 无法获取"/root/bin/ls" 的文件状态(stat): 没有那个文件或目录
[root@localhost ~]# ls
-bash: /usr/bin/ls: 没有那个文件或目录
[root@localhost ~]# cp /root/
anaconda-ks.cfg       .bashrc               .dbus/                .local/               模板/                 下载/                 
.bash_history         .cache/               .esd_auth             .mozilla/             视频/                 音乐/                 
.bash_logout          .config/              .ICEauthority         .tcshrc               图片/                 桌面/                 
.bash_profile         .cshrc                initial-setup-ks.cfg  公共/                 文档/                 
[root@localhost ~]# dir
anaconda-ks.cfg  initial-setup-ks.cfg  公共  模板  视频  图片  文档  下载  音乐  桌面
[root@localhost ~]# find / -name 'ls'
/tmp/ls
[root@localhost ~]#

好郁闷呐,找了半天最终还是找出来了:

# 提取RPM包中ls命令到当前目录的/usr/bin/ls下
# rpm2cpio是说把RPM包/mnt/cdrom/Packages/coreutils-8.22-21.el7.x86_64.rpm的数据转换为cpio格式的。
# cpio -idv ./usr/bin/ls 是说cpio知道了要从/mnt/cdrom/Packages/coreutils-8.22-21.el7.x86_64.rpm中提取数据——/usr/bin/ls,`.`表示从把/usr/bin/ls这个文件提取到当前所在目录下
# 参数`-d`表示自动新建目录,所以提取的文件ls会保存在当前目录下的/usr/bin/目录下
# 管道符的作用是将第一个命令的结果作为第二个命令的操作对象
[root@localhost ~]# rpm2cpio /mnt/cdrom/Packages/coreutils-8.22-21.el7.x86_64.rpm | cpio -idv ./usr/bin/ls
./usr/bin/ls
28594 块
[root@localhost ~]# dir
anaconda-ks.cfg  initial-setup-ks.cfg  usr  公共  模板  视频  图片  文档  下载  音乐  桌面
[root@localhost ~]# dir ./usr/bin/
ls
# 把ls命令复制回/bin/目录,修复文件丢失
[root@localhost ~]# cp ./usr/bin/ls /bin/
[root@localhost ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  usr  公共  模板  视频  图片  文档  下载  音乐  桌面
[root@localhost ~]# rm -rf ./usr
[root@localhost ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  公共  模板  视频  图片  文档  下载  音乐  桌面
[root@localhost ~]#

注:./usr是当前目录下的usr文件夹,是相对路径。/usr是根目录下的usr文件夹,是绝对路径。.千万不能省略,代表缺失文件要保存在命令执行时所在的当前目录的位置。

但这是什么原因呢?查看一下ls命令所在RPM包的默认安装位置:

[root@localhost /]# pwd
/
[root@localhost /]# rpm -ql coreutils 
/etc/DIR_COLORS
/etc/DIR_COLORS.256color
/etc/DIR_COLORS.lightbgcolor
/etc/profile.d/colorls.csh
/etc/profile.d/colorls.sh
/usr/bin/[
...
/usr/bin/ls  # 前后被省略
...
[root@localhost /]# 

恍然大悟。。。


  1. yum在线命令 https://blog.csdn.net/jiduochou963/article/details/86653645

猜你喜欢

转载自blog.csdn.net/jiduochou963/article/details/86619233