在RHEL系列的Linux中安装软件包,一般来说分为三种方式,rpm/yum/编译安装。


1. rpm

rpm自不必说,在RHEL系列的Linux中提供的软件包大多都是以.rpm后缀结尾的格式提供的。比起编译源码包来说确实方便很多,但是linux中的软件包往往存在复杂的依赖关系,而rpm并不能自动解决依赖关系,这让rpm使用起来很不方便。因此真实场景中很少会用rpm去安装软件包,这并不说rpm没什么用,事实上yum的广泛使用正是依赖于rpm建立的软件包信息库,也正因为它提供了这样一个信息库,我们可以用它去查询软件包信息。

```

# 查询软件基本信息

[root@localhost ~]# rpm -qi httpd

# 查询软件配置文件

[root@localhost ~]# rpm -qc httpd

# 查询软件文档文件

[root@localhost ~]# rpm -qd httpd

```

rpm的基本用法可见此[链接],详细用法看man手册。


2. yum

yum就是为了解决rpm包的依赖关系问题而生的,它是一个C/S架构的。在服务器端建立rpm包仓库,并通过ftp/http/nfs等网络协议发布出来,在客户端配置访问仓库的URL路径,安装过程yum自动解决依赖关系,然后去包仓库找到相应的包下载下来按依赖的先后顺序安装。

也可以在客户端将系统安装光盘挂载至文件系统某目录下,将其作为服务器端包仓库。

yum的基本用法可见此[链接],详细用法看man手册。


客户端配置包仓库的最简模式如下:

```

[base]

name=Local repo on dvd rom

http://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/

# or baseurl=file:///mnt

gpgcheck=0

enabled=1

```


详细配置参数见man手册

```

man yum.conf

```


这里想指出一个在服务端制作包仓库时需要注意的一个问题。制作包仓库是使用createrepo这个命令将仓库中所有的rpm包的元数据信息抽取出来。客户端访问仓库是需要先下载仓库的元数据信息的,然后根据这些信息去下载包。元数据信息中就有每个rpm包通过单向加密算法计算出来的特征码(也叫做指纹信息),它是用来防止传输过程中包不完整或者被篡改的。

而这个单向加密算法,在5系列以前的使用的是sha1算法,而6和7系列中默认使用sha256算法,可手动指定为sha1算法。因此这就存在一个问题,在6或7系列上创建仓库给5系列机器用时如果没有手动指定加密算法为sha1,那么5系列的机器下载下来的元数据信息所使用的加密算法就会使sha256算法,而5系列的机器的yum使用的是sha1算法,没有办法匹配。

因此在6或7系列机器上创建给5系列机器使用的仓库时需要指定加密算法为sha1。而反之是不需要的,高版本的yum设计时考虑了后向兼容。

```

[root@localhost repo]# createrepo -s sha ./

```


另外,因为元数据信息中记录的是仓库中所有rpm包的信息,那么更新或者增加了包,需要相应地更新元数据信息。

```

[root@localhost repo]# createrepo --update ./

```


3. 编译安装

当有些软件没有rpm包提供,或者以rpm包形式提供的时候有一些特性没有启用,或者开启业务无关但相当消耗资源的特性时,就需要用手动编译源代码的方式安装软件了。


编译安装一般来说是三个步骤

```

./configure prefix=/usr/local

make

make install

```

  • configure是配置文件,可以指定安装路径,启用或关闭某些特性,指定额外的编译参数等等,用来生成Makefile文件。

  • make,安装Makefile中描述的代码组织逻辑去调用编译器、链接器等去完成软件编译。

  • make install, 将编译好的文件安装到指定目录,修改用户/组,权限等等。


编译安装一般会将文件安装到某一指定目录中,这样卸载时只需要删除整个目录即可卸载干净。

而这种用户自己指定的目录一般不会加入系统环境变量,使用起来不方便,因此软件安装完成后一般还需要以下四步。

  • 导出二进制文件路径至PATH环境变量中。

    ```

    [root@localhost ~]# echo "export PATH=/PATH/TO/BIN:$PATH" > /etc/profile.d/NAME.sh

    ```

  • 导出库文件路径,并让系统重新生成缓存。

    ```

    [root@localhost ~]# echo "/PATH/TO/LIB" > /etc/profile.d/ld.so.conf.d/NAME.conf

    [root@localhost ~]# ldconfig -v

    ```

  • 导出头文件。

    ```

    [root@localhost ~]# ln -sv /PATH/TO/INCLUDE /usr/include

    ```

  • 导出帮助手册。

    ```

    [root@localhost ~]# echo "MANDATORY_MANPATH /PATH/TO/MAN" /etc/man_db.conf

    ```