Linux 笔记2:软件安装方式总结

前言

学习 Linux 除了掌握一些必要的命令,也必须要学会如何在 Linux 系统上安装和卸载软件。

在讲之前,我们先了解下 Linux 应用软件的安装包有哪几种:

  1. tar 包,如 software-1.2.3-1.tar.gz,它是使用 Unix 系统的打包工具 tar 打包的。

  2. rpm 包,如 software-1.2.3-1.i386.rpm,它是 RedHat Linux 系列提供的一种包封装格式。

  3. dpkg 包,如 software-1.2.3-1.deb,它是 Debain Linux 系列提供的一种包封装格式。

而且,大多数 Linux 应用软件包的命名也有一定的规律,它遵循:名称-版本-修正版-类型

例如:

  1. software-1.2.3-1.tar.gz 意味着:

    软件名称:software
    版本号:1.2.3
    修正版本:1
    类型:tar.gz,说明是一个 tar 包。
  2. sfotware-1.2.3-1.i386.rpm 意味着:

    软件名称:software
    版本号:1.2.3
    修正版本:1
    可用平台:i386,适用于 Intel 80x86 平台。
    类型:rpm,说明是一个 rpm 包。

    注:由于 rpm 格式的通常是已编译的程序,所以需指明平台。

  3. software-1.2.3-1.deb 可类比,就不用再说了吧。

一、源代码编译安装

1.1 源码包安装介绍

源代码包的安装一般为下载软件源代码,然后编译安装。常见的 C 程序软件的安装步骤是 configuremakemake install 三部曲。简单解释下整个过程:

根据源码包中 Makefile.in 文件的指示,configure 脚本检查当前的系统环境和配置选项,在当前目录中生成 Makefile 文件(还有其它本文无需关心的文件),然后 make 程序就按照当前目录中的 Makefile 文件的指示将源代码编译为二进制文件,最后将这些二进制文件移动(即安装)到指定的地方(仍然按照 Makefile 文件的指示)。

这到底是一种什么方式呢?其实简单来理解就是拿到程序源码自己编译再安装这么个过程。那上面讲的过程到底是怎么回事?

再回答之前,我们先看下在 Linux 系统上如何执行我们自己编写的 C 语言程序,首先我们用 Vim 编辑器编写一个 C 语言程序代码输出 “Hello World”:

然后我们可以直接使用 gcc 编译该源代码:

如上直接以 gcc 编译原始码,并且没有加上任何参数,则执行档的档名会被自动设定为 a.out 这个文件名! 所以你就能够直接执行 ./a.out 这个执行档啦!上面的例子很简单吧!那个 hello.c 就是原始码,而 gcc 就是编译程序,至于 a.out 就是编译成功的可执行 binary program 啰! <以上来自《鸟哥Linux私房菜-基础篇》>

对于什么是 make 和 configure 的解释,下图截自《鸟哥Linux私房菜-基础篇》第四版:

另外,在获取源码的时候,一般获取到的都是有打包和压缩了的文件,下图是《鸟哥私房菜-基础篇》的解释:

1.2 安装和卸载

1.2.1 安装

整个安装过程可以分为以下几步:

1)取得应用软件:通过下载、购买光盘的方法获得;

2)解压缩文件:一般 tar 包,都会再做一次压缩,如 gzip、bz2 等,所以需要先解压,如果是最常见的 gz 格式,则可以执行:tar –xvzf 软件包名,就可以一步完成解压与解包工作。如果不是,则先用解压软件,再执行tar –xvf 解压后的tar包进行解包;

3)阅读附带的 INSTALL 文件、README 文件;

4)执行 ./configure 命令为编译做好准备;

5)执行 make 命令进行软件编译;

6)执行 make install 完成安装;

7)执行 make clean 删除安装时产生的临时文件。

注:① 若为 tar.gz 源代码包也可参考下面更详细步骤:

1、找到相应的软件包,比如soft.tar.gz,下载到本机某个目录;
2、打开一个终端,su -成root用户;
3、cd soft.tar.gz所在的目录;
4、tar -xzvf soft.tar.gz //一般会生成一个soft目录
5、cd soft
6、./configure
7、make
8、make install

② 若为 tar.bz2 源代码包可参考下面更详细步骤:

1、找到相应的软件包,比如soft.tar.bz2,下载到本机某个目录;
2、打开一个终端,su -成root用户;
3、cd soft.tar.bz2所在的目录;
4、tar -xjvf soft.tar.bz2 //一般会生成一个soft目录
5、cd soft
6、./configure
7、make
8、make install

好了,到此大功告成。我们就可以运行应用程序了。但这时,有的读者就会问,我怎么执行呢?这也是一个 Linux 特色的问题。其实,一般来说, Linux 的应用软件的可执行文件会存放在 /usr/local/bin 目录下!不过这并不是“放四海皆准”的真理,最可靠的还是看这个软件的 INSTALL 和 README 文件,一般都会有说明。

安装目录:注意 make install 命令过程中的安装目录,或者阅读安装目录里面的 readme 文件,当然最好的办法是在安装的过程中指定安装目录,即在 ./configure 命令后面加参数 --prefix=/**, 如:./configure --prefix=/usr/local/aaaa,即把软件装在 /usr/local/ 路径的 aaaa 这个目录里。一般的软件的默认安装目录在 /usr/local 或者 /opt 里,可以到那里去找找。

1.2.2 卸载

通常软件的开发者很少考虑到如何卸载自己的软件,而 tar 又仅是完成打包的工作,所以并没有提供良好的卸载方法。

那么是不是说就不能够卸载呢!其实也不是,有两个软件能够解决这个问题,那就是 Kinstall 和 Kife,它们是 tar 包安装、卸载的黄金搭档。

1.2.3 优缺点

1、优点

  1. 开源,如果有足够的能力,可以修改源代码

    举个例子,如果你要安装 nginx 服务器,如果你怕黑客通过 http headers 知道你的服务器与版本信息,黑客可能会通过这个版本的漏洞来侵入你主机,所以你会通过修改 nginx 源码来阻止服务器返回这些信息。

  2. 可以自由选择所需的功能;

  3. 软件是编译安装,所以更加适合自己的系统,更加稳定、效率更高;

  4. 卸载方便;

2、缺点

  1. 安装过程步骤较多,尤其安装较大的软件集合时(如LAMP环境搭建),容易出现拼写错误;

  2. 编译过程时间较长,安装比二进制安装时间长;

  3. 因为是编译安装,安装过程中一旦报错新手很难解决;

注:对于要求效率的软件,要安装源码包版本,因为是本机编译,更具有兼容性和效率,而rpm包是软件开发者提供的大众版本,可用于不注重效率的应用。

二、借助软件包管理安装

2.1 软件包管理介绍

以下摘自《鸟哥Linux私房菜-基础篇》第四版:

以原始码的方式来安装软件,也就是利用厂商释出的 Tarball 来进行软件的安装。不过,应该很容易发现,那就是每次安装软件都需要侦测操作系统与环境、设定编译参数、实际的编译、 最后还要依据个人喜好的方式来安装软件到定位。这过程是真的很麻烦的,而且对于不熟整个系统的朋友来说,还真是累人啊!

那有没有想过,如果我的 Linux 系统与厂商的系统一模一样,那么在厂商的系统上面编译出来的执行档, 自然也就可以在我的系统上面跑啰!也就是说,厂商先在他们的系统上面编译好了我们用户所需要的软件, 然后将这个编译好的可执行的软件直接释出给用户来安装,如此一来,由于我们本来就使用厂商的 Linux distribution ,所以当然系统 (硬件与操作系统) 是一样的,那么使用厂商提供的编译过的可执行文件就没有问题啦! 说的比较白话一些,那就是利用类似 Windows 的安装方式,由程序开发者直接在已知的系统上面编译好,再将该程序直接给用户来安装,如此而已。

那么如果在安装的时候还可以加上一些与这些程序相关的信息,将他建立成为数据库,那不就可以进行安装、反安装、 升级与验证等等的相关功能啰 (类似 Windows 底下的『新增移除程序』)?确实如此,在 Linux 上面至少就有两种常见的这方面的软件管理员,分别是 RPM 与 Debian 的 dpkg 。我们的 CentOS 主要是以 RPM 为主,但也不能不知道 dpkg 啦!所以底下就来约略介绍一下这两个玩意儿。

由于自由软件的蓬勃发展,加上大型 Unix-Like 主机的强大效能,让很多软件开发者将他们的软件使用 Tarball 来释出。 后来 Linux 发展起来后,由一些企业或社群将这些软件收集起来制作成为 distributions 以发布这好用的 Linux 操作系统。但后来发现到,这些 distribution 的软件管理实在伤脑筋, 如果软件有漏洞时,又该如何修补呢?使用 tarball 的方式来管理吗?又常常不晓得到底我们安装过了哪些程序? 因此,一些社群与企业就开始思考 Linux 的软件管理方式。

如同刚刚谈过的方式,Linux 开发商先在固定的硬件平台与操作系统平台上面将需要安装或升级的软件编译好, 然后将这个软件的所有相关文件打包成为一个特殊格式的文件,在这个软件文件内还包含了预先侦测系统与相依软件的脚本, 并提供记载该软件提供的所有文件信息等。最终将这个软件文件释出。客户端取得这个文件后,只要透过特定的指令来安装, 那么该软件文件就会依照内部的脚本来侦测相依的前驱软件是否存在,若安装的环境符合需求,那就会开始安装, 安装完成后还会将该软件的信息写入软件管理机制中,以达成未来可以进行升级、移除等动作呢。

目前在 Linux 界软件安装方式最常见的有两种,分别是:

  • dpkg:

    这个机制最早是由 Debian Linux 社群所开发出来的,透过 dpkg 的机制, Debian 提供的软件就能够简单的安装起来,同时还能提供安装后的软件信息,实在非常不错。只要是衍生于 Debian 的其他 Linux distributions 大多使用 dpkg 这个机制来管理软件的, 包括 B2D, Ubuntu 等等。

  • RPM:

    这个机制最早是由 Red Hat 这家公司开发出来的,后来实在很好用,因此很多 distributions 就使用这个机制来作为软件安装的管理方式。包括 Fedora, CentOS, SuSE 等等知名的开发商都是用这咚咚。

如前所述,不论 dpkg/rpm 这些机制或多或少都会有软件属性相依的问题,那该如何解决呢? 其实前面不是谈到过每个软件文件都有提供相依属性的检查吗?那么如果我们将相依属性的数据做成列表, 等到实际软件安装时,若发生有相依属性的软件状况时,例如安装 A 需要先安装 B 与 C ,而安装 B 则需要安装 D 与 E 时,那么当你要安装 A ,透过相依属性列表,管理机制自动去取得B, C, D, E 来同时安装, 不就解决了属性相依的问题吗?

没错!您真聪明!目前新的 Linux 开发商都有提供这样的『在线升级』机制,透过这个机制, 原版光盘就只有第一次安装时需要用到而已,其他时候只要有网络,你就能够取得原本开发商所提供的任何软件了呢! 在 dpkg 管理机制上就开发出 APT 的在线升级机制,RPM 则依开发商的不同,有 Red Hat 系统的 yum , SuSE 系统的 Yast Online Update (YOU) 等。

2.2 RPM机制方式

先聊聊:RPM 与 SRPM

RPM 全名是『 RedHat Package Manager 』简称则为 RPM 啦!顾名思义,当初这个软件管理的机制是由 Red Hat 这家公司发展出来的。 RPM 是以一种数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制。他最大的特点就是将你要安装的软件先编译过, 并且打包成为 RPM 机制的包装文件,透过包装好的软件里头默认的数据库记录, 记录这个软件要安装的时候必须具备的相依属性软件,当安装在你的 Linux 主机时, RPM 会先依照软件里头的数据查询 Linux 主机的相依属性软件是否满足, 若满足则予以安装,若不满足则不予安装。那么安装的时候就将该软件的信息整个写入 RPM 的数据库中,以便未来的查询、验证与反安装!这样一来的优点是:

  1. 由于已经编译完成并且打包完毕,所以软件传输与安装上很方便 (不需要再重新编译);

  2. 由于软件的信息都已经记录在 Linux 主机的数据库上,很方便查询、升级与反安装

但是这也造成些许的困扰。由于 RPM 文件是已经包装好的数据,也就是说, 里面的数据已经都『编译完成』了!所以,该软件文件几乎只能安装在原本默认的硬件与操作系统版本中。 也就是说,你的主机系统环境必须要与当初建立这个软件文件的主机环境相同才行! 举例来说,rp-pppoe 这个 ADSL 拨接软件,他必须要在 ppp 这个软件存在的环境下才能进行安装!如果你的主机并没有 ppp 这个软件,那么很抱歉,除非你先安装 ppp 否则 rp-pppoe 就是不让你安装的 (当然你可以强制安装,但是通常都会有点问题发生就是了!)。

所以,通常不同的 distribution 所释出的 RPM 文件,并不能用在其他的 distributions 上。举例来说,Red Hat 释出的 RPM 文件,通常无法直接在 SuSE 上面进行安装的。更有甚者,相同 distribution 的不同版本之间也无法互通,例如 CentOS 6.x 的 RPM 文件就无法直接套用在 CentOS 7.x !因此,这样可以发现这些软件管理机制的问题是:

  1. 软件文件安装的环境必须与打包时的环境需求一致或相当;

  2. 需要满足软件的相依属性需求;

  3. 反安装时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题!

那怎么办?如果我真的想要安装其他 distributions 提供的好用的 RPM 软件文件时? 呵呵!还好,还有 SRPM 这个东西!SRPM 是什么呢?顾名思义,他是 Source RPM 的意思,也就是这个 RPM 文件里面含有原始码哩!特别注意的是,这个 SRPM 所提供的软件内容『并没有经过编译』, 它提供的是原始码喔!

通常 SRPM 的扩展名是以 ***.src.rpm 这种格式来命名的。不过,既然 SRPM 提供的是原始码,那么为什么我们不使用 Tarball 直接来安装就好了?这是因为 SRPM 虽然内容是原始码, 但是他仍然含有该软件所需要的相依性软件说明、以及所有 RPM 文件所提供的数据。同时,他与 RPM 不同的是,他也提供了参数配置文件 (就是 configure 与 makefile)。所以,如果我们下载的是 SRPM ,那么要安装该软件时,你就必须要:

  • 先将该软件以 RPM 管理的方式编译,此时 SRPM 会被编译成为 RPM 文件;

  • 然后将编译完成的 RPM 文件安装到 Linux 系统当中

怪了,怎么 SRPM 这么麻烦吶!还要重新编译一次,那么我们直接使用 RPM 来安装不就好了?通常一个软件在释出的时候,都会同时释出该软件的 RPM 与 SRPM 。我们现在知道 RPM 文件必须要在相同的 Linux 环境下才能够安装,而 SRPM 既然是原始码的格式,自然我们就可以透过修改 SRPM 内的参数配置文件,然后重新编译产生能适合我们 Linux 环境的 RPM 文件,如此一来,不就可以将该软件安装到我们的系统当中,而不必与原作者打包的 Linux 环境相同了?这就是 SRPM 的用处了!

Tips:为何说 CentOS 是『社群维护的企业版』呢? Red Hat 公司的 RHEL 释出后,连带会将 SRPM 释出。 社群的朋友就将这些 SRPM 收集起来并重新编译成为所需要的软件,再重复释出成为 CentOS,所以才能号称与 Red Hat 的 RHEL 企业版同步啊!真要感谢 SRPM 哩!如果你想要理解 CentOS 是如何编译一支程序的, 也能够透过学习 SRPM 内含的编译参数,来学习的啊! <摘自《鸟哥的Linux私房菜-基础篇》第四版>

2.2.1 rpm打包的软件安装

rpm 包安装几乎在所有 Linux 平台上都支持,它就像 Windows 下的 exe 安装文件一样,各种文件已经编译好,并打包,哪个文件在哪个文件夹里面都已经被指定好,所以很方便。

rpm 可谓是 Red Hat 公司的一大贡献,它使 Linux 的软件安装工作变得更加简单容易。

1、RPM包命名规则

规则:软件包名-软件版本-软件发布的次数-适合的Linux平台-适合的硬件平台-包扩展名

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

httpd 软件包名
2.2.15 软件版本
15 发布的次数
el6.centos 适合的Linux平台
i686 适应的硬件平台
rpm 包扩展名
el6 是redhat的企业版

2、RPM包依赖性

  1. 树形依赖:a->b->c 解决方法:从后往前安装

  2. 环形依赖:a->b->c->a 解决方法:放在一条命令中安装即可

  3. 模块依赖:库文件依赖,库也叫模块,就是linux当中的函数,它有一个典型的特征,就是以.so.数字结尾,它依赖的其实是一个文件,而不是软件包。该文件藏身在某一个软件包当中。我们只要将该文件所在的软件包安装上,该文件也就安装了。

    解决方法:登录 www.rpmfind.net 网站,输入库文件名称查询到对应的rpm包,然后安装即可。

yum在线安装可以方便的解决依赖文件,一条命令就可以帮用户从网上(本地也可以)找到安装包进行安装。

注:RedHatyum是收费服务,而CentOSyum是免费服务。

3、RPM安装

安装命令:rpm -ivh 包全名。rpm 参数说明:

-i 安装软件
-t 测试安装,不是真的安装
-p 显示安装进度
-f 忽略任何错误
-U 升级安装
-v 检测套件是否正确安装

这些参数可以同时采用。更详细安装步骤可参考:

1、找到相应的软件包,比如soft.version.rpm,下载到本机某个目录;
2、打开一个终端,su -成root用户;
3、cd soft.version.rpm所在的目录;
4、输入rpm -ivh soft.version.rpm

4、RPM升级和卸载

  1. 升级命令:rpm -Uvh 包全名(要升级到的软件版本),如果没有安装这个软件的任何版本,这个命令可以代替rpm -ivh

  2. 卸载命令:rpm -e 包名(比如 httpd,不需要包全名)

    这个命令不同于安装和升级,它可以在任何目录运行,原理是去/var/lib/rpm目录中的数据库(如__db0))中查找对应的软件包(已经安装过的 rpm 包都在这些数据库中),然后卸载。

关于--nodeps--force

--nodeps 就是安装时不检查依赖关系,比如你这个 rpm 需要 A,但是你没装 A,这样你的包就装不上,用了--nodeps你就能装上了。

--force 就是强制安装,比如你装过这个 rpm 的版本 1,如果你想装这个 rpm 的版本 2,就需要用 --force 强制安装

注:--nodeps这个选项不管是在安装和卸载的时候,最好都不要使用。

另外:rpm安装包安装的位置是由软件包开发者决定的,安装后的位置会非常凌乱,所以最好是使用rpm -e命令卸载。相对于这种二进制安装方式,源码安装是指定安装目录了,卸载的时候只需要删除对应的目录就可以完全的卸载,不留一点残余。

5、RPM包查询

  1. 查询是否安装

    rpm -q 包名
    rpm -qa
    # q ==> query a ==> all

    查询所有已经安装的 RPM 包

    rpm -qa | grep httpd

    grep 后跟正则表达式, find 后跟通配符。

  2. 查询软件包详情

    rpm -qi 包名
    rpm -qip 包全名
    # i ==> infomation
    # p ==> package : 查询**`未安装包`**信息

    有时遇到问题, 可根据未安装包信息中所提供的网站进行查询资料。

  3. 查询包中文件安装位置

    rpm -ql 包名
    # l ==> list
    # -p ==> package : 查询未安装包信息

    可查看包作者欲将包安装的位置。

    RPM 包默认安装位置:

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

    rpm -qf 系统文件名
    # f ==> file : 查询系统文件属于哪个软件包

    该文件必须是通过 RPM 包安装的。

  5. 查询软件包的依赖性

    rpm -qR 包名
    R ==> requires : 查询软件包的依赖性
    p ==> package : 查询未安装包的信息

6、RPM包校验

rpm -V 已安装的包名
-V ==> (verify) : 校验指定RPM包中的文件

例如:执行 rpm -V httpd 后,无任何提示,代表该文件没有被做任何修改。

验证内容中的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) : 描述文件
MD5校验

作用:用来校验文件的完整性(文件内容是否被改变)。

例如,在官网下载的游戏,官方会给出MD5校验码,将下载的游戏通过专用的MD5校验工具校验后生成一份MD5校验码,对比两份校验码是否一致,不一致则说明,下载的文件可能丢包,可能文件损坏,可能被其他人动过手脚一直木马等。

2.2.2 yum在线安装

1、yum源文件

rpm 是 Linux 的一种软件包名称,以 .rmp 结尾,安装的时候语法为:rpm -ivh。rpm 包的安装有个很大的缺点就是文件的关联性太大,有时装一个软件要安装很多其他的软件包,很麻烦。所以为此 RedHat 小红帽开发了 yum 安装方法,它可以彻底解决这个关联性的问题,很方便,只要配置两个文件即可安装,安装方法是:yum -y install

简单的说: rpm 只能安装已经下载到本地机器上的 rpm 包。yum 能在线下载并安装 rpm 包,能更新系统,且还能自动处理包与包之间的依赖问题,这个是 rpm 工具所不具备的。

yum 的优点:将所有软件包放到官方服务器上,当进行yum在线安装时,可以自动解决依赖性问题。(rpm缺点:安装过程中,rpm包依赖性太强)。

/etc/yum.repos.d/目录中,默认有4yum源文件,其中CentOS-Base.repo是基本yum源文件,如果我们能上网,那它是默认生效的,而其他的都是默认不生效的。

2、yum命令

  1. 查询

    • yum list:列出 yum 服务器上面提供的所有软件名称

    • yum search 关键字:搜索服务器上所有和关键字相关的包

  2. 安装

    • yum install 包名:会询问

  • yum -y install 包名(-y 表示安装过程自动回答 yes),例如:yum -y install gcc

  1. 升级和卸载

    • 升级:yum -y update 包名(-y 表示安装过程自动回答 yes)

    • 卸载:yum -y remove 包名

  2. 其他命令汇集:

    • yum info 包名:找出该软件的功能为何

    • yum list updates:列出目前服务器上可供本机进行升级的软件有哪些

    • yum provides passwd:列出提供 passwd 这个文件的软件有哪些

    • yum repolist all:列出目前 yum server 所使用的软件库有哪些

    • yum clean all:删除已下载过的所有软件库的相关数据 (含软件本身与列表)

    • yum grouplist:查阅目前软件库与本机上面的可用与安装过的软件群组有哪些

    • ......

注:服务器使用最小化安装,用什么软件安装什么,尽量不要卸载!

2.3.3 问答

来源《鸟哥的Linux私房菜-基础篇》:

  1. 如果你曾经修改过 yum 配置文件内的软件库设定 (/etc/yum.repos.d/*.repo) ,导致下次使用 yum 进行安装时老是发现错误, 此时你该如何是好?

    先确认你的配置文件确实是正确的,如果没问题,可以将 yum 的快取清除,使用『yum clean all』即可。 事实上, yum 的所有快取、下载软件、下载软件的表头数据,都放置于 /var/cache/yum/ 目录下。

  2. 简单说明 RPM 与 SRPM 的异同?

    RPM 文件是由程序打包者 (通常是由 distribution 的开发商) 藉由程序的原始码,在特定的平台上面所编译成功的 binary program 的数据,并将该数据制作成为 RPM 的格式,以方便相同软、硬件平台的用户之安装使用。 在安装时显的很简单,因为程序打包者的平台与使用者所使用的平台预设为相同。

    至于 SRPM 则是藉由与 RPM 相同的配置文件数据,不过将原始码直接包在 SRPM 文件当中,而不经过编译。 因为 SRPM 所内含的数据为原始码,所以安装时必须要再经过编译的行为才能成为 RPM 并提供使用者安装。

  3. 假设我想要安装一个软件,例如 pkgname.i386.rpm,但却老是发生无法安装的问题,请问我可以加入哪些参数来强制安装他?

    可以加入 --nodeps 等参数。例如 rpm -ivh --nodeps pkgname.i386.rpm

  4. 承上题,你认为强制安装之后,该软件是否可以正常执行?为什么?

    一般来说,应该是『不能执行』的,因为该软件具有相依属性的问题, 某些时刻该软件的程序可能需要呼叫外部的函式库,但函式库可能未安装,因此当然无法执行成功。

  5. 有些人使用 CentOS 7.x 安装在自己的 Atom CPU 上面,却发现无法安装,在查询了该原版光盘的内容,发现里面的文件名为 ***.x86_64.rpm。请问,无法安装的可能原因为何?

    Atom 虽然也是属于 x86 的架构,但是某些 atom 是属于 32 位的系统。但是 CentOS 7 已经仅释出 64 位的版本,所以当然无法安装了!

  6. 请问我使用 rpm -Fvh *.rpmrpm -Uvh *.rpm 来升级时,两者有何不同?

    -Uvh 后面接的软件,如果原本未安装,则直接安装,原本已安装时,则直接升级;

    -Fvh 后面接的软件,如果原本未安装,则不安装,原本已安装时,则直接升级;

  7. 假设有一个厂商推出软件时,自行处理了数字签名,你想要安装他们的软件所以需要使用数字签名,假设 数字签名的档名为 signe, 那你该如何安装?

    rpm --import signe

  8. 承上,假设该软件厂商提供了 yum 的安装网址为: http://their.server.name/path/ ,那你该如何处理 yum 的配置文件?

    可以自行取个档名,在此例中我们使用『 vim /etc/yum.repos.d/their.repo 』,扩展名要正确! 内容有点像这样即可:

    [their]
    name=their server name
    baseurl=http://their.server.name/path/
    enable=1
    gpgcheck=0

    然后使用 yum 去安装该软件看看。

2.3 dpkg机制方式

2.3.1 deb打包的软件安装

这是 Debian Linux 提供的一个包管理器,它与 RPM 十分类似。但由于 RPM 出现得更早,所以在各种版本的 Linux 都常见到。而 Debian 的包管理器 dpkg 则只出现在 Debina Linux 中,其它 Linux 版本一般都没有。

1、安装:dpkg –i deb软件包名,如:dpkg –i software-1.2.3-1.deb

详细安装步骤可参考:

1、找到相应的软件包,比如 software-1.2.3-1.deb,下载到本机某个目录;
2、打开一个终端,su -成root用户;
3、cd software-1.2.3-1.deb所在的目录;
4、输入dpkg -i software-1.2.3-1.deb

2、卸载:dpkg –e 软件名,如:dpkg –e software

3、查询:dpkg –l ‘*软件包名*’,如:dpkg –l '*software*'

2.3.2 apt在线安装

apt-get 是 Debian,Ubuntu 发行版的包管理工具,与红帽中的 yum 工具非常类似。

apt-get 命令一般需要 root 权限执行,所以一般跟着 sudo 命令,例 sudo apt-get xxxx

详细安装步骤可参考:

1、打开一个终端,su -成root用户;
2、apt-cache search soft 注:soft是你要找的软件的名称或相关信息
3、如果2中找到了软件soft.version,则用 apt-get install soft.version 命令安装软件

注:只要可以上网,只需要用 apt-cache search 查找软件,用 apt-get install 软件。

相关命令列举:

  • apt-get install packagename——安装一个新软件包

  • apt-get remove packagename——卸载一个已安装的软件包(保留配置文件)

  • apt-get --purge remove packagename——卸载一个已安装的软件包(删除配置文件)

  • dpkg --force-all --purge packagename ——有些软件很难卸载,而且还阻止了别的软件的应用,就可以用这个,不过有点冒险。

  • apt-get autoremove——因为apt会把已装或已卸的软件都备份在硬盘上,所以如果需要空间的话,可以让这个命令来删除你已经删掉的软件。

  • apt-get autoclean——定期运行这个命令来清除那些已经卸载的软件包的.deb文件。通过这种方式,可以释放大量的磁盘空间。如果需求十分迫切,可以使用 apt-get clean 以释放更多空间。这个命令会将已安装软件包裹的.deb文件一并删除。

  • apt-get clean——这个命令会把安装的软件的备份也删除,不过这样不会影响软件的使用的。

  • apt-get upgrade——更新所有已安装的软件包

  • apt-get dist-upgrade——将系统升级到新版本

  • apt-cache search string——在软件包列表中搜索字符串

  • apt-cache showpkg pkgs——显示软件包信息。

  • apt-cache stats——查看库里有多少软件

  • apt-cache dumpavail——打印可用软件包列表。

  • apt-cache show pkgs——显示软件包记录,类似于 dpkg –print-avail

  • apt-cache pkgnames——打印软件包列表中所有软件包的名称

常用的几个命令(掌握):

  1. sudo apt-get update:从网上的源更新安装包信息

  2. sudo apt-get upgrade : 升级软件包到最新版本

  3. sudo apt-get -f install : 修复软件依赖包的关系

  4. sudo apt-get install software_name : 安装软件

  5. sudo apt-get remove software_name : 卸载软件,但是卸载不完全

  6. sudo apt-get remove --purge software : 常用卸载方式,卸载完全

简单的说: dpkg 只能安装已经下载到本地机器上的 deb 包,apt-get 能在线下载并安装 deb 包,能更新系统,且还能自动处理包与包之间的依赖问题,这个是 dpkg 工具所不具备的。

三、二进制格式安装

编译好的文件,类似于 Windows 下的 exe,后缀一般为 bin,如 jdk 就有 bin 后缀(虽然 Linux 下没有后缀的概念,但为了好区分,一般文件名都加后缀)。如下为在 Oracle 官网找到的 JDK6下载页:

安装就是先给它可执行权限,然后执行,例如:

chmod 777 xxx.bin
./xxx.bin

举例:如果你下载到的软件名是 soft.bin,一般情况下是个可执行文件,详细安装方法参考:

1、打开一个终端,su -成root用户;
2、chmod +x soft.bin
3、./soft.bin //运行这个命令就可以安装软件了

四、脚本安装

4.1 脚本安装包

所谓的脚本安装包如:lnmp/lamp LNMP一键安装包,就是把复杂的软件包安装过程写成了程序脚本,初学者可以执行脚本实现一键安装。但实际安装的还是源码包和二进制包。

优点:简单,快速,方便。

缺点:

  1. 不能定义安装软件的版本;

  2. 不能定义所需要的软件功能;

  3. 源码包的优势几乎完全丧失;

4.2 脚本安装包:准备工作

1、以安装LNMP1.0为例,所以需要先停止之前安装的apachemysql服务(最好也将源码包安装的apache/usr/local/apache2目录删除)

nignx非常优秀,可以支持更大的并发量。apache的默认并发量是400,如果给它改大,比如到 > 2000,就要测一测了,如果稳定才能再继续增加。nginx 不用测试就可以设置到50000(用户同一时刻刷新网页)。可以说一台nignx服务器顶3apache

2、保证yum源正常:可以使用yum list命令测试(若是光盘yum源,记得挂载光盘)

3、关闭SELinux和防火墙:

a、永久关闭SELinux的方法:
编辑文件 /etc/selinux/config,将 SELINUX=enforcing 改为 SELINUX=disabled,然后重启系统即可。
b、永久关闭防火墙的方法:chkconfig iptables off
开启为:chkconfig iptables on
临时关闭防火墙的方法:service iptables stop
开启为:service iptables start

4、脚本安装过程中,会将系统中已有的apachemysqlphp等卸载掉。下面是安装脚本centOS.sh的部分内容:

yum install -y ntp
ntpdate -u pool.ntp.org
date
rpm -qa|grep httpd
rpm -e httpd
rpm -qa|grep mysql
rpm -e mysql
rpm -qa|grep php
rpm -e php
yum -y remove httpd*
yum -y remove php*
yum -y remove mysql-server mysql
yum -y remove php-mysql

部分内容省略。。。

注:安装后,如果安装卡在了php-fpm那里,通常表示已安装成功,只是php-fpm那里卡住了(物理机少见,但虚拟机比较常见),解决的方法就是:使用命令pkill -9 php-fpm杀掉php-fpm进程,然后重新启动该进程/etc/rc.d/init.d/php-fpm start即可。

参考资料: