软件包管理

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 e8562897Preparing...                ########################################### [100%]   1:zsh                    ########################################### [100%]

查询

系统上所有包的数量

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

显示"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.el5fileutils  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-1rpmlib(PayloadFilesHavePrefix) <= 4.0-1rtld(GNU_HASH)

显示"zsh"的详细信息

[root@localhost CentOS]# rpm -qi zshName        : zsh                          Relocations: (not relocatable)Version     : 4.2.6                             Vendor: CentOSRelease     : 9.el5                         Build Date: Wed 02 Oct 2013 03:36:59 AM CSTInstall Date: Sun 13 Dec 2015 06:59:59 AM CST      Build Host: builder17.centos.orgGroup       : System Environment/Shells     Source RPM: zsh-4.2.6-9.el5.src.rpmSize        : 3565812                          License: BSDSignature   : DSA/SHA1, Wed 02 Oct 2013 08:39:49 AM CST, Key ID a8a447dce8562897URL         : http://zsh.sunsite.dk/Summary     : A powerful interactive shellDescription :The zsh shell is a command interpreter usable as an interactive loginshell and as a shell script command processor.  Zsh resembles the kshshell (the Korn shell), but includes many enhancements.  Zsh supportscommand line editing, built-in spelling correction, programmablecommand completion, shell functions (with autoloading), a historymechanism, 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 zshpackage 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=1hinstallonly_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 - Basemirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=osbaseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/gpgcheck=1gpgkey=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.11baseurl=file:///mediaenabled=1gpgcheck=0gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

清除缓存

[root@localhost yum.repos.d]# yum clean allLoaded plugins: fastestmirror, securityCleaning up EverythingCleaning 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                            statusbase                             CentOS-5 - Base                      enabled: 0contrib                          CentOS-5 - Contrib                   disabledextras                           CentOS-5 - Extras                    enabled: 0extras-source                    CentOS-5 - Extras Sources            disabledfasttrack                        CentOS-5 - fasttrack                 disabledmedia                            CentOS_5.11                          enabled: 0updates                          CentOS-5 - Updates                   enabled: 0updates-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]# lsAUTHORS.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() ... foundchecking for PCRE library ... not foundchecking for PCRE library in /usr/local/ ... not foundchecking for PCRE library in /usr/include/pcre/ ... not foundchecking for PCRE library in /usr/pkg/ ... not foundchecking 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_moduleoption, or install the PCRE library into the system, or build the PCRE librarystatically 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 -tnlpActive 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