软件包管理

Linux中软件安装通常有两种形式:

一是源码安装(Tarball);

一是使用软件包软件包管理器;

在Linux发行版中,几乎每一个发行版都有自己的软件包管理器。常见的有:

管理deb软件包的dpkg以及它的前端apt(使用于Debian、Ubuntu);

管理rmp软件包的rpm以及它的前端yum(使用于RedHat、Fedora、CentOS)、前端ZYpp(使用于openSUSE)、前端urpmi(使用于Mandriva Linux、Mageia)等。


RPM软件包管理

软件包管理器可以将二进制程序、库文件、配置文件和帮助文件打包成一个文件,生成数据库并追踪所安装的每一个文件;其核心功能是制作软件包,安装、卸载、升级、查询、校验、重建数据库、验证数据包等。

RPM是一个开放的软件包管理系统,最初的全称是Red Hat Package Manager,现在是Linux Standard Base(LSB)中采用的包管理系统。


RPM默认安装路径

  • 二级制程序    /usr/bin,sbin

  • 库文件          /usr/lib

  • 配置文件        /etc

  • 帮助文件        /usr/share/doc,man


RPM软件包格式

name-version.release.arch.rpm

  • name:软件包名称,包括主包名与分包名

  • version:软件包的版本号

  • release:软件包的发行号

  • arch:主机平台,noarch表示此包可以安装到任意平台

  • rpm:文件扩展名


rpm命令格式

安装(install)

rpm    -ivh    PACKAGE_FILE...

OPTIONS:

-i:install安装

-v:显示详细安装过程

-h:显示安装进度,以#表示,每个#代表2%


-vv:显示更详细的安装信息

--nodeps:忽略依赖关系

--replacepkgs:重新安装,替换原有安装

--force:强行安装,可以实现重装或降级

--test:测试安装,可找出是否有依赖问题


查询(query)

已安装软件

rpm    -qa

rpm    -q[licdR]    PACKAGE_NAME

rpm    -qf    FILE_NAME

未安装软件

rpm    -qp[licdR]    PACKAGE_FILE

OPTIONS:

-q:query查询

-qa:显示所有已安装的软件(all)

-qi:显示该软件的详细信息(information)

-ql:显示该软件所有的文件与目录所在的完整文件名(list)

-qc:显示该软件的所有配置文件

-qd:显示该软件的所有帮助文件

-qR:显示与该软件有关的依赖软件所含的文件

-qf:查询该文件属于哪一个已安装的软件

-qp[licdR]:查询未安装的软件包信息


升级与更新(Upgrade/Freshen)

若有旧版本,则升级至新版本;若未安装,则安装

rpm    -Uvh    PACKAGE_FILE

若有旧版本,则升级至新版本;若未安装,则不安装

rpm    -Fvh    PACKAGE_FILE


验证与数字证书(Verify/Signature)

验证是使用/var/lib/rpm下的数据库内容来比较目前Linux系统环境下的所有软件文件。

rpm    -Va

rpm    -V    PACKAGE_NAME

rpm    -Vp    PACKAGE_FILE

rpm    -Vf    FILE_NAME

OPTIONS:

-V:后面加的是软件名称,若该软件所含的文件被改动过,才会显示出来

-Va:显示目前系统上面所有可能被改动过的文件

-Vp:后面加的是RPM文件的文件名,显示该软件内可能被改动过的文件

-Vf:显示某个文件是否被改动过


若没有显示任何信息,则该软件中的文件没有被改动过;

若有信息显示,则文件被改动过,显示的是被改动的信息类型:

SM5DLUGT ▇ filename

  • S:file Size differs

  • M:Mode differs (includes permissions and file type)

  • 5:MD5 sum differs

  • D:Device major/minor number mismatch

  • L:readLink(2) path mismatch

  • U:User ownership differs

  • G:User ownership differs

  • T:mTime differs

    ▇:指文件类型



  • c:configuration file

  • d:documentation file

  • g:ghost file (i.e. the file contents are not included in the package payload)

  • l:license file

  • r:readme file

数字证书是通过证书比对,来检查软件包的来源合法性与软件完整性。

导入密钥文件

rpm    --import    /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

验证

rpm    -K    PACKAGE_FILE

  • dsa、gpg:验证来源合法性,即签名,用--nosignature略过此项

  • sha1、md5:验证软件包完整性,用--nodigest略过此项


卸载(erase)

rpm    -e    PACKAGE_NAME

卸载时可能会出现库文件的依赖关系导致卸载不成功,可以将依赖的文件全部删除或使用--nodeps强制删除,但是这会导致用到这些库的软件无法运行!


重建数据库

rpm    --rebuilddb

初始化数据库,没有才重建,有就不用建立

rpm    --initdb


实例:

安装本地软件包

注:安装时有可能产生依赖关系

[root@localhost CentOS]# rpm -ivh zsh-4.2.6-9.el5.i386.rpm 
warning: zsh-4.2.6-9.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]

查询

系统上所有包的数量

[root@localhost CentOS]# rpm -qa | wc -l
492

显示"zsh"的所有配置文件

[root@localhost CentOS]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc

显示"zsh"的依赖关系

[root@localhost CentOS]# rpm -qR zsh
/bin/sh  
/bin/sh  
/bin/sh  
/sbin/install-info  
config(zsh) = 4.2.6-9.el5
fileutils  
grep  
libc.so.6  
libc.so.6(GLIBC_2.0)  
libc.so.6(GLIBC_2.1)  
libc.so.6(GLIBC_2.1.3)  
libc.so.6(GLIBC_2.2)  
libc.so.6(GLIBC_2.3)  
libc.so.6(GLIBC_2.3.4)  
libc.so.6(GLIBC_2.4)  
libcap  
libdl.so.2  
libdl.so.2(GLIBC_2.0)  
libdl.so.2(GLIBC_2.1)  
libm.so.6  
libm.so.6(GLIBC_2.0)  
libnsl.so.1  
libtermcap.so.2  
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)

显示"zsh"的详细信息

[root@localhost CentOS]# rpm -qi zsh
Name        : zsh                          Relocations: (not relocatable)
Version     : 4.2.6                             Vendor: CentOS
Release     : 9.el5                         Build Date: Wed 02 Oct 2013 03:36:59 AM CST
Install Date: Sun 13 Dec 2015 06:59:59 AM CST      Build Host: builder17.centos.org
Group       : System Environment/Shells     Source RPM: zsh-4.2.6-9.el5.src.rpm
Size        : 3565812                          License: BSD
Signature   : DSA/SHA1, Wed 02 Oct 2013 08:39:49 AM CST, Key ID a8a447dce8562897
URL         : http://zsh.sunsite.dk/
Summary     : A powerful interactive shell
Description :
The zsh shell is a command interpreter usable as an interactive login
shell and as a shell script command processor.  Zsh resembles the ksh
shell (the Korn shell), but includes many enhancements.  Zsh supports
command line editing, built-in spelling correction, programmable
command completion, shell functions (with autoloading), a history
mechanism, and more.

校验

[root@localhost CentOS]# rpm -K zsh-4.2.6-9.el5.i386.rpm 
zsh-4.2.6-9.el5.i386.rpm: (SHA1) DSA sha1 md5 (GPG) NOT OK (MISSING KEYS: GPG#e8562897)
[root@localhost CentOS]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 
[root@localhost CentOS]# rpm -K zsh-4.2.6-9.el5.i386.rpm 
zsh-4.2.6-9.el5.i386.rpm: (sha1) dsa sha1 md5 gpg OK

卸载

[root@localhost CentOS]# rpm -e zsh
[root@localhost CentOS]# rpm -q zsh
package zsh is not installed


YUM软件包管理

YUM是Yellow dog Updater,Modified的简称,其宗旨是自动化升级、安装/移除RPM包、收集RPM包的相关信息、检查依赖性并自动提示用户解决。YUM的关键之处在于要有可靠的Repository,顾名思义,这是软件的仓库,它可以是HTTP或FTP站点,也可以是本地软件池,但必须是包含RPM包的各种信息,包括描述、功能、提供的文件、依赖性等。正是收集了这些header并加以分析,才能自动化的完成余下的任务。


yum的命令格式

yum [options] [command] [package ...]

command:

  • install package1 [package2] [...]安装

  • update [package1] [package2] [...]升级

  • update-to [package1] [package2] [...]升级至指定版本

  • remove | erase package1 [package2] [...]卸载

  • list [all|available|installed|updates]列表

  • info [...]详细信息

  • provides | whatprovides feature1 [feature2] [...]搜索

  • search string1 [string2] [...]

  • clean [ packages | headers | metadata | dbcache | all ]清楚缓存

  • deplist package1 [package2] [...]显示软件依赖信息

  • repolist [all|enabled|disabled]显示repo列表

  • groupinstall group1 [group2] [...]安装指定软件组中的软件包

  • groupupdate group1 [group2] [...]

  • grouplist [hidden] [groupwildcard] [...]

  • groupremove group1 [group2] [...]

  • groupinfo group1 [...]


options:

  • -y:自动提供yes响应

  • --installroot=/some/path:指定安装路径


yum仓库的元数据文件repodata

repodata数据库中的文件主要是XML格式,精确描述一个rpm包的详细信息,如依赖关系,包含文件、校验信息。目前,这个格式被apt-rpm、smartpm、red carpet和yum支持。通常有以下几个文件:

  • primary.xml.gz:所有rpm包的列表,依赖关系,每个rpm安装生成的文件列表;

  • filelist.xml.gz:当前仓库中所有rpm包的所有文件信息;

  • other.xml.gz:额外信息,如rpm包的修改日志;

  • repomd.xml:记录的是以上三个文件的时间戳和校验和;

  • comps*.xml:rpm包分组信息


yum的配置文件/etc/yum.conf

[main]
cachedir=/var/cache/yum        指定YUM存储缓存和数据库文件的默认位置
keepcache=0              YUM成功安装软件后是否保留缓存的头文件和软件包
debuglevel=2              指定排错级别(0-10)
logfile=/var/log/yum.log        指定YUM的日志文件
distroverpkg=redhat-release    
tolerant=1                YUM是否容忍命令行发生与软件包有关的错误
exactarch=1               是否升级与已安装软件包CPU体系结构一致的包
obsoletes=1               是否升级已经过时的软件包
gpgcheck=1               是否启用软件仓库中软件的GPG签名验证
plugins=1                是否启用插件    
bugtracker_url=http://bugs.centos.org/yum5bug

# Note: yum-RHN-plugin doesn't honor this.
metadata_expire=1h

installonly_limit = 5         安装内核类型软件包的数量

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d


设置yum源

CentOS 5.11的默认YUM源定义文件放在/etc/yum.repos.d/目录下,用户可以自行定义任意可以使用的YUM源,但文件的扩展名必须是*.repo。

[root@localhost yum.repos.d]# vim /etc/yum.repos.d/CentOS-Base.repo 

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#released updates

以上面的基础容器为例,介绍*.repo文件的配置语法:

  • [base]:[]中填写YUM源唯一的ID,可以为任意字符串;

  • name=:指定YUM源名称,可以为任意字符串;

  • mirrorlist=:指定镜像站点目录;

  • baseurl=:指定YUM源的URL地址,可以是如下几种类型:

      • http://用于指定远程HTTP协议的源;

      • ftp://用于指定远程FTP协议的源;

      • file:///用于本地镜像或NFS挂载文件系统;

  • enabled=:是否激活该YUM源(0代表禁用,1代表激活);

  • gpgcheck=:安装软件时是否检查签名(0代表禁用,1代表激活);

  • gpgkey=:检查签名的秘钥文件。

设置本地yum源(使用系统光盘作为yum源)

挂载光盘

[root@localhost ~]# mount /dev/cdrom /media/
mount: block device /dev/cdrom is write-protected, mounting read-only

配置本地YUM源文件

注:让其他YUM源文件失效

[root@localhost yum.repos.d]# vim /etc/yum.repos.d/media.repo
[media]
name=CentOS_5.11
baseurl=file:///media
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

清除缓存

[root@localhost yum.repos.d]# yum clean all
Loaded plugins: fastestmirror, security
Cleaning up Everything
Cleaning up list of fastest mirrors

缓存本地YUM源包信息

[root@localhost yum.repos.d]# yum makecache

显示可用的YUM仓库

[root@localhost yum.repos.d]# yum repolist all
...(中间省略)...
repo id                          repo name                            status
base                             CentOS-5 - Base                      enabled: 0
contrib                          CentOS-5 - Contrib                   disabled
extras                           CentOS-5 - Extras                    enabled: 0
extras-source                    CentOS-5 - Extras Sources            disabled
fasttrack                        CentOS-5 - fasttrack                 disabled
media                            CentOS_5.11                          enabled: 0
updates                          CentOS-5 - Updates                   enabled: 0
updates-source                   CentOS-5 - Updates Sources           disabled

使用本地YUM源安装软件

[root@localhost yum.repos.d]# yum --enablerepo=media install httpd


配置外网YUM源(以EPEL源为例)

EPEL(Extra Package for Enterprise Linux)是由Fedora社区打造(http://fedoraproject.org/wiki/EPEL),为RHEL及衍生发行版(比如CentOS、Scientific Linux等)提供高质量软件包的项目。

[root@localhost mnt]# rpm -ivh 

[root@localhost ~]# sed -i -e "s/enabled = 1/enabled = 0/g" /etc/yum.repos.d/epel.repo 

[root@localhost ~]# yum --enablerepo=epel install [PACKAGE]


yum使用技巧

创建YUM源

当我们收集的软件越来越多时,有必要将这个软件汇总并创建属于自己的yum源,最终实现软件的搞笑、集中管理。实现步骤如下:

  • 安装createrepo;

  • 将所有软件保存在某个目录下,如/mysoft/;

  • 运行createrepo    /mysoft。

YUM变量

  • $releasever    系统发行版本号

  • $arch              CPU架构

  • $basearch        系统架构

  • $YUM0-9            使用shell对应的0-9个同名变量替换


源码编译安装软件

使用源码管理软件所需的基础软件

  • gcc或cc等c语言编译程序(compiler)

  • make及autoconfig等软件

  • kernel提供的library以及相关的include文件


CentOS 5.11下创建编译环境,可以安装"Development Tools"和"Development Libraries"

[root@localhost ~]# yum -y groupinstall "Development Tools"  "Development Libraries"

源码安装的一般步骤:

  • ./configure

建立Makefile文件,可加--prefix=PREFIX等选项,具体信息可以参考该目录下的README和INSTALL相关的文件;

  • makeclean

make会读取Makefile中关于clean的工作,这个步骤不一定有;

  • make

make会依据Makefile中的默认工作进行编译的行为;

  • make install

通常这就是最后安装步骤了,make会依据Makefile文件里关于install的选项,将上一个步骤所编译完成的数据安装到默认目录中,就此安装完成。


实例(以安装tengine源码包为例)

解压缩

[root@localhost ~]# tar -zxvf tengine-1.4.2.tar.gz -C /usr/src

[root@localhost ~]# cd /usr/src/engine-1.4.2

[root@localhost tengine-1.4.2]# ls
AUTHORS.te  CHANGES           CHANGES.ru  conf       contrib        html     
man         README.markdown   tests       auto       CHANGES.cn     CHANGES.te  
configure   docs              LICENSE     README     src            THANKS.te

[root@localhost tengine-1.4.2]# ./configure --prefix=/usr/local/tengine/ --conf-path=/etc/tengine/tengine.conf
...(中间省略)...
checking for openat(), fstatat() ... found
checking for PCRE library ... not found
checking for PCRE library in /usr/local/ ... not found
checking for PCRE library in /usr/include/pcre/ ... not found
checking for PCRE library in /usr/pkg/ ... not found
checking for PCRE library in /opt/local/ ... not found

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre= option.

[root@localhost tengine-1.4.2]# yum install pcre-devel

[root@localhost tengine-1.4.2]# ./configure --prefix=/usr/local/tengine/ --conf-path=/etc/tengine/tengine.conf

[root@localhost tengine-1.4.2]# make

[root@localhost tengine-1.4.2]# make install

[root@localhost tengine-1.4.2]# /usr/local/tengine/sbin/nginx 

[root@localhost tengine-1.4.2]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2876/portmap        
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      31522/nginx         
tcp        0      0 0.0.0.0:978                 0.0.0.0:*                   LISTEN      2916/rpc.statd      
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      3213/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      3251/sendmail       
tcp        0      0 :::22                       :::*                        LISTEN      3213/sshd


源码安装后通常要进行以下修改

  1. 修改PATH环境变量,以能够识别此程序的二进制文件路径;

    修改/etc/profile文件;

    在/etc/profile.d目录下建立一个以.sh为扩展名的文件,定义export    PATH=$PATH:/path_to_somewhere;

  2. 默认情况下,系统库文件的路径为/lib、/usr/lib,要增添额外搜寻路径,在/etc/ld.so.conf.d中创建以.conf为扩展名的文件,而后把要增添的路径直接写至此文件中;

    命令ldconfig [-v]通知系统重新搜索库文件

                      -v:显示重新搜索库的过程

  3. 头文件是要输出给系统的,默认在/usr/include目录下,要增添头文件搜寻路径,可使用链接进行,如:

    将/usr/local/tengine/include链接至/usr/include中,可以

    ln    -s    /usr/local/tengine/include/*     /usr/include或

    ln    -s    /usr/local/tengine/include      /usr/include/tengine

  4. man文件默认安装在/usr/share/man目录下

    man    -M        /path_to_man_dir    COMMAND或

    在/etc/man.config中添加一条MANPATH