《Linux系统》之"深入浅出"(一)软件包管理机制RPM

在window系统下,我们只需要点击软件的安装程序,然后傻瓜式的连续点击下一步下一步即可;想卸载的话,我们只需要去控制面板里选择我们要卸载的软件,然后点击卸载按键,是非常的方便。但是在安全系数上,就没有Linux系统高了。

那么,如何在Linux系统上安装我们想要的软件呢?又如何对已经安装的软件进行升级或者是卸载呢?

一、 软件包管理技术的简介

为了使用户更方便的在Linux系统上管理应用程序,Red Hat公司和Debian Linux社群各自开发了一个管理机制,来帮助用户管理Linux系统上的应用程序,比如安装,升级或者卸载。让用户不再烦恼Linux系统上的程序管理(最开始的程序安装,要通过原始代码来安装,又要编译,有要检查环境的,特别麻烦)。

1、RPM与YUM

RPM这个机制最早是又RedHat公司开发出来的,后来由于特别好用,因此许多Linux厂商就使用这个机制来做为软件安装的管理方式,包括Fedora,CentOS,SuSe等等知名的Linux厂商。而RPM在管理软件的依赖关系上有一些短板,因此RedHat又在RPM机制上推出了YUM线上升级技术,来管理软件的依赖性。

2、DPKG与APT

这个机制最早是由DebianLinux设社群开发的。通过这个机制,Debian提供的软件就可以轻松的安装成功,同时还可以记录安装后的软件资讯。只要是衍生字Debian的其他Linux版本,都是用了dpkg这种机制来管理软件,如B2D,Ubuntu等。同样的问题,dpkg机制也是有的,那就是在管理软件的依赖关系上。不过,Debian后来推出了APT线上升级技术,来弥补dpkg的不足。

distribution 代表 软件管理机制 使用指令 线上升级机制(指令)
Red Hat/Fedora RPM rpm, rpmbuild YUM (yum)
Debian/Ubuntu DPKG dpkg APT (apt-get)

3、软件包的命名规则

如:mariadb-10.0.15-linux-i686.rpm

第一部分:表示软件名称

第二部分:表示版本信息,通常最前面的数字表示版本号,如10,后面的小数字表示此版本的小改动次数

第三部分:表示适用的操作平台

二、RPM的使用

1、RMP的安装原理

rpm的使用,其实很简单,只需要熟知几个选项和语法,就可以用来安装软件了。不过,我们仍然要知道rpm的安装原理。

我们使用rpm来安装一个应用程序时,rpm会先读取该应用程序的文档内记载的预设参数内容,然后用来与Linux系统的环境做对比,找出是否有依赖的程序尚未安装。如果有依赖的程序,且尚未安装,则提示用户需要什么程序。

如果Linux系统环境合格,rpm就会将该程序安装到Linux系统上。安装过程中,该程序相关的资讯信息就会被写入/var/lib/rpm目录下的资料库中(这个目录很重要的)。而该程序的核心文件会默认放置在下面的目录中。

/etc 一些配置文档存储的目录,例如 /etc/ssh
/usr/bin 一些可执行文件的目录
/usr/lib 一些程式使用的动态函数库
/usr/share/doc 一些基本的程序使用手册和说明文档
/usr/share/man 一些 man page 文档

这里说明一下资料库,以后如果对软件升级,版本的比较信息就来源于这里,还有,我们可能会经常查询系统已经安装的程序,也是从这里进行查询的。

2、RPM查询软件包

在Linux系统上安装一个程序之前,我们在习惯上,会先查询是否安装过这款程序,如果安装过,我们就不用再安装了,如果没有安装过,我们再去安装,这是一个好习惯。

rpm的查询是我们最常用的一项功能,我们可以查询很多关于已装程序或未装程序的信息,它可以在/var/lib/rpm这个目录的资料库进行查询,也可以查询未安装的rpm文档内的信息。

常用写法:

[root@study ~]# rpm -qa                                                                 <==查询系统内已安裝程序
[root@study ~]# rpm -q【licdR】 【已安装的程序名】                  <==查询系统内某个已安裝程序的信息 
[root@study ~]# rpm -q【f】 【系统内的文档名】                         <==查询系统内某个已安裝程序 
[root@study ~]# rpm -qp【licdR】 【未安装的程序名称】             <==查询系统内某个未安装RPM文档

常用的选项参数介绍:

-q :用于查询指定的程序是否已经安装 
-qa :列出所有已经安装在Linux系统下的程序名称
-qi :列出该程序的详细信息 ,如版本号,发行时间,安装时间等
-ql :列出该程序所有的文档与目录
-qc :列出该程序的所有配置文件 (通常是指在 /etc/ 底下的文件)
-qd :列出该程序的所有說明文档 (指与 man 有关的文件)
-qR :列出与该程序有关的依赖软件所含的文件 (Required 的意思)
-qf :找出指定文件属于哪一个已经安装的程序 

应用案例1:查询Linux中是否安装了jdk1.8

[root@master bin]# rpm -q jdk1.8
jdk1.8-1.8.0_172-fcs.x86_64
[root@master bin]# rpm -q jdk
package jdk is not installed                 <==由此可见,必须指定软件名称,可以不用加上版本号

应用案例2:查询Linux系统下安装的的所有软件

[root@master bin]# rpm -qa | more                     <==可以借助 more指令来分页显示
control-center-2.28.1-39.el6.x86_64
m17n-db-punjabi-1.5.5-1.1.el6.noarch
valgrind-3.8.1-3.2.el6.x86_64
libreport-newt-2.0.9-19.el6.centos.x86_64
iso-codes-3.16-2.el6.noarch
xorg-x11-drv-vmmouse-12.9.0-10.el6.x86_64
......
[root@master bin]# rpm -qa | grep jdk          <==可以借助 grep指令来指定关键字,适用于不知道软件全名的情况下
java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
jdk1.8-1.8.0_172-fcs.x86_64
java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64

应用案例3:查看软件jdk1.8的所有目录和文档

[root@master bin]# rpm -ql jdk1.8 | more  
/usr
/usr/java
/usr/java/jdk1.8.0_172-amd64
/usr/java/jdk1.8.0_172-amd64/.java
/usr/java/jdk1.8.0_172-amd64/.java/.systemPrefs
.......:   
<==可以看出该程序到底提供了多少文件与目录,也可以用于追踪程序的资料

应用案例4:查看软件jdk1.8的信息详情。

[hyxy@master 桌面]$ rpm -qi jdk1.8
Name        : jdk1.8                       Relocations: /usr/java 
Version     : 1.8.0_172                         Vendor: Oracle Corporation
Release     : fcs                           Build Date: 2018年03月29日 星期四 13
.....................

应用案例5:若要成功安裝 jdk1.8 ,它还需要什么文档的帮助?      

[hyxy@master 桌面]$ rpm -qR jdk1.8         
/bin/basename  
/bin/cat  
/bin/cp  
....<== 选项-qR只能查询已经成功安装的软件所需要的文档,未安装的请参考应用案例7

应用案例6:查询 /bin/sh文档是哪个软件提供的

[hyxy@master test]$ rpm -qf /bin/sh
bash-4.1.2-15.el6_4.x86_64

应用案例7::查询刚刚上传的RPM 软件需要什么必须的文档

[hyxy@master test]$ rpm -qpR jdk-8u172-linux-x64.rpm 
/bin/basename  
/bin/cat  
/bin/cp 

3、RPM安装软件包

这个得强调一下,使用RPM安装软件包时,必须要获取root身份。

基本语法:rpm  [-ivh]   软件包名

选项解析:

-i : 安装的含义
-v:安装过程中显示详情
-h:以进度条的形式显示安装进度

应用案例1:

[root@master test]# rpm -ivh jdk-8u172-linux-x64.rpm 
Preparing...                ########################################### [100%]
   1:jdk1.8                 ########################################### [100%]
Unpacking JAR files...
    tools.jar...
    plugin.jar...
    javaws.jar...
    deploy.jar...
    rt.jar...
    jsse.jar...
    charsets.jar...
    localedata.jar...
[root@master test]# 

通常在安装软件包的时候,这三个选项就够了,如果有软件依赖关系,会进行提醒需要提前安装什么,这样我们在异议解决问题的时候,就会了解很多东西。不过,我们也可以通过一些参数来进行安装测试、强制安装、覆盖安装、指定安装路径等操作。

参数 代表意义
--nodeps 安装或卸载软件时,有依赖关系时,可以进行强制安装或卸载。
有一定的危险性,安装后可以能造成软件无法正常使用!
--replacefiles 安装时,软件中的某个文件可能已经安装过,或者版本冲突时,可以进行强制覆盖操作。
覆盖操作无法还原,因此要不要覆盖,请一定要注意!
--replacepkgs 当使用 rpm -ivh *.rpm 安装一堆软件时,可能会报某些软件已经安装过,此时可以使用此参数进行覆盖安装。
--force 相当于--replacefiles和--replacepkgs的综合体
--test 在安装前,可以进行安装测试,查看软件的依赖关系。rpm -ivh pkgname.i386.rpm --test
--justdb 当某软件的资料库破损或者产生错误时,可以使用这个参数来进行修复
--prefix 新路径 用于指定软件的安装路径,不使用默认路径

4、RPM的升级与更新

格式:rpm -Uvh 软件包名

使用rpm对软件进行升级很简单,只要使用-Uvh选项就可以咯。如果后面指定的安装包没有安装过,就会自动安装此软件包,如果安装过旧版,就会进行升级。

5、RPM卸载安装包

格式:rpm -e 软件名称

当你想卸载某一个软件时,就可以使用选项【-e】。

不过,一般情况下,安装某个软件包后,在Linux系统下,该软件的名称并不是软件包名,因此我们可以通过关键字进行查询该软件的名称。如:

[root@master test]# rpm -qa | grep jdk
jdk1.8-1.8.0_172-fcs.x86_64

那么卸载时就要用到上面显示的软件名称

[root@master test]# rpm -e jdk1.8-1.8.0_172-fcs.x86_64

如果在卸载某软件A时,发现如下字样
error: Failed dependencies:
              ................. is needed by .....
则表示,你要卸载的软件A被某些软件依赖。那么就要先卸载其他依赖软件A的软件,再回来卸载软件A。这就好比高楼大厦,8楼依赖7楼,你在销毁7楼的时候,应该先销毁八楼一样。

不过,我们可以通过--nodeps参数来强制卸载软件A,但是,可能就会影响到其他软件的使用了。这是你需要考虑的事情。

由于RPM 经常进行安装、卸载或升级操作等,某些行为可能会导致 RPM 资料库 /var/lib/rpm/ 內的文件破损破損。別担心,我们可以使用 --rebuilddb 这个参数来重建资料库! 如下:

[root@master test]# rpm --rebuilddb

6、RPM的缺点

由于Linux中的程序大多是小程序。程序与程序之间存在非常复杂的依赖关系。RPM无法解决软件包的依赖关系。因此我们还是要学习YUM机制,请参考下一篇文章:《Linux系统》之"皮毛系列"(十一)软件包的线上升级机制YUM

猜你喜欢

转载自blog.csdn.net/Michael__One/article/details/85247627