在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