6章 包管理

本章将为读者详细介绍在红帽的Linux发行版中常用的软件包管理工具YUMRPM的使用技巧,撑握定制操作系统的流程及配置的私有软件仓库等知识点。 

6.1 包的类型

软件包主要分两大类:源码包和二进程包。源码包也就是还没有经过编译的源代码,需要自己编译安装;而二进程包,就是已经被编译过的软件包,比如windows下的.exe文件。

linux中,二进程软件包主要又分为RPM软件包和DEB软件包两类,其中redhatcentos等系统使用RPM软件包;ubuntu等系统使用DEB软件包。本文主要介绍redhat的包管理方法。

 

6.1.1 源码包

linux下的很多软件都是通过源码包方式发布的,这样做对于最终用户而言,虽然相对于二进制软件包,配置和编译起来繁琐点,但是它的可移植性却好得多,针对不同的体系结构,软件开发者往往仅需发布同一份源码包,不同的最终用户经过编译就可以正确运行,这也是非常符合c语言的设计哲学的一次编写,到处编译

 

6.1.2 rpm

RPM是“Red Hat Package Manager”的简称,也叫“RPM Package Manager”。是由Red Hat公司开发出来的一套软件包管理机制,主要以数据库记录的方式管理所有RPM类型的软件包。它需要将软件的源代码编译并打包成RPM包,通过编译时在软件包中设置好的数据库来记录这个软件在安装时必须具备的条件即软件包的依赖性(依赖性指的是在安装某个软件包的时候需要先安装好其他的软件包才能完成该软件包的安装过程),当用户在安装软件包的时候,首先查询系统是否满足软件包的安装需求,如果满足就安装该软件,并将软件包的信息写入RPM数据库,以便将来查询、验证、升级或反安装需要。反之系统会提示用户如果需要安装这个软件包必须要先解决哪些条件。
使用RPM包最大的好处就是安装、升级、查询、验证与反安装都非常方便,也非常适合网络传输。不足的地方就是在安装之前用户需要先准备好系统环境、确认RPM包可用的系统平台以及适用的软件包版本。RPM包一般分成两种,即已经编译并封装好的可以用于直接安装的rpm类型的应用程序,以*.rpm方式命名;另一种是SRPM,也叫原代码软件包,这种软件包提供的是没有经过编译的原程序,通常以*.src.rpm方式命名。SRPMRPM不同之处就是它封装的是原程序,在这些原程序中包含有参数配置文件用来记录软件包的依赖性,用户在下载这种类型的软件包需要用RPM管理工具进行编译封装成RPM包才能安装。 SRPM包是Linux的发行商为用户提供的源码包,为方便用户定制软件而提供的。
每一个RPM类型的软件包都有固定的命名规则,用于区分软件包的版本与适用的平台。其命令方式通常为:“软件包名称-软件包版本-软件包修订次数.适用的硬件平台.扩展名”。 如zsh-html-4.2.6-3.el5.i386.rpm文件名称解释如下:
软件包名称:即zsh-html-4.2.6-3.el5.i386.rpm的软件包名称为zsh-html
软件的版本信息:即zsh-html-4.2.6-3.el5.i386.rpm的软件包的版本为4.2.6;用于区分软件包的新旧,其中版又分区主版本号与次版本号, 以zsh-html-4.2.6-3.el5.i386.rpm文件为例, 主版本号为4,次版本号为2;次版本即为在主版本的基础上扩展而来的新版本。
注意:主版本号与次版本号在定义内核的时候具有特别的意义,当内核次版本号为奇数时,代表该内核为开发版或测试版本,适用于内核开发与测试人员;当内核次版本号为偶数时,代表该内核为稳定版本,适用于生产环境;如2.6.18代表稳定版本,而2.33.164代表测试版。
修订次数:即zsh-html-4.2.6-3.el5.i386.rpm的软件包的修订次数为3.el5;也叫软件的编译次数,通常指软件小幅度更新或修复之后发布的RPM软件包。
适用的硬件平台:即zsh-html-4.2.6-3.el5.i386.rpm的软件包硬件平台为i386;硬件平台以CPU的等级进行区分,在Linux系统中RPM包适用的平台有很多种,主要是为不同的软件适用不同的CPU做了些特定的优化, 因此用户在选择软件包的时候需注意硬件平台的不同,关于硬件平台说明见下表所示;

硬件平台

功能说明

i386

适用于所有x86平台(或所有的CPU),i指的是intelCPU386代表CPU的级别;

i586

适用于CPU级别为586的计算机平台,如intel的奔腾I以下,386以上级别的CPU以及AMDk5k6系列的CPU等;

i686

适用于Intel奔腾IIAMD K7以上级别CPU的硬件平台,并进行优化过的应用程序;

x86-64

适用于64位的CPU硬件平台,如当前主流的CPU都属于这一类型;

noarch

此种软件没有硬件平台限制,通常这类型的软件属于shell脚本方面的软件包;

 

6.2 源码包安装

要进行源码包的安装,首先要知道linx系统上真正认识的可执行程序是二进制程序,而源码,只是程序员编写的纯文本而已。所以我们需要将源代码编译成系统看的懂的二进制程序,而要编译就需要用到编译器。在linux下最常用的一个编译器就是gcc

事实上,使用类似gcc的编译器来进行编译的过程非常复杂。这个时候,我们需要使用make命令的相关功能来简化编译过程。

make命令会在当前路径下搜索makefile文件,makefile文件里记录了源码该如何编译的详细信息,从而根据这些信息对源码进行编译。但是makefile文件该怎么产生呢?通常软件开发商都会写一个检测程序,用来检测使用者的系统环境,以及该系统环境中是否有该软件所需要的其他功能。检测程序检测完毕后,就会自动的建立这个makefile文件。通常这个检测程序的名称叫configureconfig

一般来说,检测程序会检测如下内容:

1)系统环境中是否有适合的编译器可以编译本软件的源代码;

2)系统环境中是否已经存在本软件所需要的函数库,或其他需要的依赖软件;

3)系统平台是否适合本软件,包括linux的内核版本。

最后,使用make install命令安装本程序。

 

1:源码安装inotify-tools工具

[root@server ~]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.13.tar.gz

#下载inotify-tools工具源码包

[root@server ~]# tar -zxvf inotify-tools-3.13.tar.gz

#解压压缩包

[root@server ~]# cd inotify-tools-3.13

#切换工作目录到解压之后的目录中

[root@server ~]# .configure --prefix=/program

#执行环境检测程序

#并指定程序将安装到/program目录下

[root@server ~]# make

#执行编译

[root@server ~]# make install

#执行安装

[root@server ~]# ln -s /program/bin/* /usr/bin

#将安装的二进制程序,也就是inotify的命令,软链接到/usr/bin

#这样,以后就可以直接输入inotify工具的命令,而不用指定路径了

 

6.3 RPM包的安装

关于rpm包的安装,共有两种方式:rpmyum

 

6.3.1 rpm安装

rpmredhat packages manager),为rpm包的原生安装工具,但它有个致命弱点,即不能自动解决软件包之间的依赖关系。

 

1:使用rpm工具安装samba软件包

[root@server ~]# echo "/dev/sr0 /mnt/dvd iso9660 defaults 0 0" >> /etc/fstab

#配置光盘开机自动挂载到/mnt/dvd目录

[root@server ~]# mkdir /mnt/dvd

#创建挂载点

[root@server ~]# mount -a

#立即挂载

[root@server ~]# rpm -ivh /mnt/dvd/Packages/samba-4.2.3-10.el7.x86_64.rpm

warning: /mnt/dvd/Packages/samba-4.2.3-10.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY

error: Failed dependencies:

samba-common = 4.2.3-10.el7 is needed by samba-0:4.2.3-10.el7.x86_64

samba-common-libs = 4.2.3-10.el7 is needed by samba-0:4.2.3-10.el7.x86_64

samba-common-tools = 4.2.3-10.el7 is needed by samba-0:4.2.3-10.el7.x86_64

samba-client-libs = 4.2.3-10.el7 is needed by samba-0:4.2.3-10.el7.x86_64

samba-libs = 4.2.3-10.el7 is needed by samba-0:4.2.3-10.el7.x86_64

。。。以下省略

 

通过上面的例子,我们发现,包与包之间是有依赖关系的,在安装想要的软件包之前,必须先将它所依赖的包装好,才能再安装,此过程太过繁琐,所以在实际工作中,我们一般不直接使用rpm工具来安装软件包,而是使用yum

但是rpm工具,除了用来安装软件包,还有其它功能,比如:查询系统已安装的软件包、查询软件包的安装文件等,这些功能才是我们使用最广的。

 

2:使用rpm工具查询软件包

[root@server ~]# rpm -qa

jansson-2.4-6.el7.x86_64

redhat-release-server-7.2-9.el7.x86_64

dmidecode-2.12-9.el7.x86_64

filesystem-3.2-20.el7.x86_64

libestr-0.1.9-2.el7.x86_64

.....以下省略

#查询系统当前已经安装的所有软件包

[root@server ~]# rpm -ql openssh-server-6.6.1p1-22.el7.x86_64

/etc/pam.d/sshd

/etc/ssh/sshd_config

/etc/sysconfig/sshd

/usr/lib/systemd/system/sshd-keygen.service

/usr/lib/systemd/system/sshd.service

/usr/lib/systemd/system/sshd.socket

/usr/lib/systemd/system/sshd@.service

/usr/lib64/fipscheck/sshd.hmac

/usr/libexec/openssh/sftp-server

/usr/sbin/sshd

/usr/sbin/sshd-keygen

/usr/share/man/man5/moduli.5.gz

/usr/share/man/man5/sshd_config.5.gz

/usr/share/man/man8/sftp-server.8.gz

/usr/share/man/man8/sshd.8.gz

/var/empty/sshd

#查询openssh-server-6.6.1p1-22.el7.x86_64这个软件所包含的文件,安装的时候,分别保存到了系统的哪些位置。

[root@server ~]# rpm -qc openssh-server-6.6.1p1-22.el7.x86_64

/etc/pam.d/sshd

/etc/ssh/sshd_config

/etc/sysconfig/sshd

#仅查询ssh这个服务的配置文件在哪儿

[root@server ~]# rpm -qf /etc/ssh/ssh_config

openssh-clients-6.6.1p1-22.el7.x86_64

#查询/etc/ssh/ssh_config这个文件是由哪个软件包提供的。

 

6.3.2 yum安装

yum(全称为 Yellow dog Updater, Modified)是一个在FedoraRedHat以及SUSE发行版专门针对RPM包进行管理与维护的前端软件包管理器,它能够通过分析RPM包中的标题数据为软件包的安装提供一种合适的解决方案, 并自动下载与安装所需要的软件,帮助用户解决在安装、删除与更新rpm包的时候存在的各种问题。
yum实现的软件包管理机制就是将RPM类型的软件包存放到一个yum可以管理的容器内(也叫软件仓库),yum通过分析软件存在的依赖性问题,并将其汇总成清单列表,这些列表与软件包都存储在软件仓库内(repository),当客户端有安装软件的需求时,客户端会从可用的yum服务器上下载软件信息清单列表,并与本机中的RPM数据库中记录的软件数据进行比较就会得出软件的安装结果,系统在完成软件包的安装之后会将这些软件包的清单列表信息缓存在/var/cache/yum目录,以便下次使用。使用yum仓库的目的在于区分rpm包的内容与版本之间的区别。
Yum支持的软件仓库可以是本地主机特定目录内的软件包文件,也可以是通过网络文件共享协议发布出来的资源如ftphttp等。

 

1:配置yum仓库

[root@server ~]# vi /etc/yum.repos.d/dvd.repo

[dvd]

name=dvd

baseurl=file:///mnt/dvd/

enabled=1

gpgcheck=0

#生成一个以.repo结尾的文件,这就是yum的仓库配置文件

#[],指定仓库的id

#name,指定仓库的名称

#baseurl,指定仓库地址,注意:仓库地址路径必须为repodata目录的上一级目录

#enabled,是否开启这个仓库

#gpgcheck,指定要不要对软件包进行完整性、安全检查

 

2:查询yum仓库中的所有软件包名称

[root@server ~]# yum list

#列出仓库中的所有软件包名称

 

3:在yum仓库中查询包含ssh关键字的软件包

[root@server ~]# yum search ssh

Loaded plugins: product-id, search-disabled-repos, subscription-manager

This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.

====================================== N/S matched: ssh =======================================

fence-agents-ilo-ssh.x86_64 : Fence agent for HP iLO devices via SSH

ksshaskpass.x86_64 : A KDE version of ssh-askpass with KWallet support

libssh2.i686 : A library implementing the SSH2 protocol

libssh2.x86_64 : A library implementing the SSH2 protocol

openssh.x86_64 : An open source implementation of SSH protocol versions 1 and 2

openssh-askpass.x86_64 : A passphrase dialog for OpenSSH and X

openssh-clients.x86_64 : An open source SSH client applications

openssh-keycat.x86_64 : A mls keycat backend for openssh

openssh-server.x86_64 : An open source SSH server daemon

 

  Name and summary matches only, use "search all" for everything.

 

4:查询ping命令是由哪个软件包提供的

[root@server ~]# yum provides ping

Loaded plugins: product-id, search-disabled-repos, subscription-manager

This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.

dvd/filelists_db                                                       | 3.2 MB  00:00:00     

iputils-20121221-7.el7.x86_64 : Network monitoring tools including ping

Repo        : dvd

Matched from:

Filename    : /usr/bin/ping

 

iputils-20121221-7.el7.x86_64 : Network monitoring tools including ping

Repo        : @anaconda/7.2

Matched from:

Filename    : /usr/bin/ping

 

5:使用yum安装httpd软件包

[root@server ~]# yum install -y httpd

Loaded plugins: product-id, search-disabled-repos, subscription-manager

This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.

Resolving Dependencies

--> Running transaction check

---> Package httpd.x86_64 0:2.4.6-40.el7 will be installed

--> Processing Dependency: httpd-tools = 2.4.6-40.el7 for package: httpd-2.4.6-40.el7.x86_64

--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-40.el7.x86_64

--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-40.el7.x86_64

--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-40.el7.x86_64

--> Running transaction check

---> Package apr.x86_64 0:1.4.8-3.el7 will be installed

---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed

---> Package httpd-tools.x86_64 0:2.4.6-40.el7 will be installed

---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed

--> Finished Dependency Resolution

.....以下省略

 

6.4 练习

1)挂载系统光盘到本地/mnt/dvd/目录

2)配置yum仓库,指定仓库地址为光盘

3)安装httpd软件包