Linux 程序包管理-YUM
前端工具yum管理程序包:
rpm管理软件虽然方便,但是需要手工解决软件包的依赖关系;很多时候安装一个软件需要首先安装一个或多个(有时多达上百个)其它软件,手工解决很复杂;使用yum可以解决这个问题
注意:yum并不是rpm的取代者,只是rpm包管理器的前端工具,是依赖于rpm包管理器的,使用yum来解决安装问题
yum(yellowdog updater modified)是一个rpm包的前端管理工具,主要目的是用来自动解决rpm安装的依赖关系。其特点:自动解决依赖关系、可以对rpm进行分组,并基于组进行安装操作(一次性安装一类软件)、引入仓库概念,支持多个仓库、配置简单。
yum引入了仓库(repository)概念,仓库用来存放所有现有的rpm软件包以及包的相关的元数据文件(元数据文件放置于特定目录repodata下),当使用yum安装一个rpm软件时候,如果存在依赖关系,会自动在仓库中查找依赖软件并安装;仓库可以是本地的,也可以通过http、ftp或nfs形式。
yum的工作原理:
yum的工作需要两部分来,一部分是yum服务器,还有就是client的yum工具。
yum服务器
所有要发行的rpm包都放在yum服务器上以提供别人来下载,rpm包根据kernel的版本号,cpu的版本号分别编译发布。yum服务器只要提供简单的下载就可以了,ftp或者http的形式都可以。yum服务器有一个最重要的环节就是整理出每个rpm包的基本信息,包括rpm包对应的版本号,conf文件,binary信息,以及很关键的依赖信息。在yum服务器上提供了createrepo工具,用于把rpm包的基本概要信息做成一张"清单",这张"清单"就是xml格式的文件,这些xml文件会存放在repodata目录下,服务器端的repository(仓库)就建立好了。注意repodata目录所在的位置,就是yum仓库的位置
yum 客户端
client每次调用yum install或者search的时候,都会去解析/etc/yum.repos.d下面所有以.repo结尾的配置文件,这些配置文件指定了yum服务器的地址。yum会定期去"更新"yum服务器上的rpm包"清单",然后把"清单"下载保存到yum自己的cache里面,根据/etc/yum.conf里配置(默认是在/var/cache/yum下面),每次调用yum装包的时候都会去这个cache目录下去找"清单",根据"清单"里的rpm包描述从而来确定安装包的名字,版本号,所需要的依赖包等,然后再去yum服务器下载rpm包安装。
yum配置文件:
为所有仓库提供公共配置和yum软件自身的配置:
/etc/yum.conf
[main] 主配置文件
cachedir=/var/cache/yum/$basearch/$releasever yum下载后的缓存目录
keepcache=0 缓存是否保存
debuglevel=2 调试级别
logfile=/var/log/yum.log yum安装日志文件
exactarch=1 是否严格检查程序包对应硬件平台与当前硬件平台是否匹配,匹配才安装
obsoletes=1 这是一个update的参数,具体请参阅yum(8),简单的说就是相当于upgrade,允许更新旧的rpm包
gpgcheck=1 默认是否检查软件包的来源合法性和完整性
plugins=1 是否支持插件功能
installonly_limit=3 同时能安装几个包
仓库指向配置:
/etc/yum.repos.d/*.repo
[repositoryid] 仓库id自己指定,不要与其它配置同名
name=some name for this repository 仓库名字自己指定
mirrorlist=url://path/to/ 指定获取镜像服务器地址列表的url(需要支持插件yum-fastestmirror)
baseurl=url://path/to/repository/ 仓库的网络路径
enabled={1|0} 是否启用该配置(没配置enabled属性默认是开启的)
gpgcheck={1|0} 是否检查软件包的来源合法性和完整性
gpgkey=url 指定检查来源合法性所需秘钥文件的网络路径
enablegroups={1|0} 是否支持组批量管理程序包
cost={1..1000} 该配置的访问优先级,较小的优先(默认为1000)
failovermethod={roundrobin|priority} 如果配置了多个仓库地址,配置选用哪个地址的选择方式,默认为roundrobin(轮询)就是随机挑选一个地址;priority(优先级)从上到下顺序选择;
yum的repo配置文件中可用的变量:
$releasever 当前os的发行版的主版本号;如redhat 6.5,则替换为6
$arch 系统架构平台
$basearch 基础平台,如i686,i586等的基本架构为i386
$yum0-$yum9 在系统中定义的环境变量,可以在yum中使用
http://mirrors.link.com/centos/$releasever/$basearch/os
yum命令使用:
显示仓库列表:all显示所有,enabled显示启用的,disabled显示停用的
yum repolist [all|enabled|disabled]
显示程序包:
yum list [all | glob_exp1] [glob_exp2] [...] 显示所有程序包,可以使用通配符过滤
yum list {available|installed|updates} [glob_exp1] [...]
安装程序包:
yum install package1 [package2] [...]
yum reinstall package1 [package2] [...] (重新安装)
升级程序包:
yum update [package1] [package2] [...] 升级程序
yum downgrade package1 [package2] [...] 降级程序
检查可用升级:
yum check-update
卸载程序包:
yum remove | erase package1 [package2] [...]
查看程序包描述信息:
yum info [package1] [...]
查看指定的特性(可以是某文件)是由哪个程序包所提供:
yum provides | whatprovides feature1 [feature2] [...]
清理本地缓存:
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
构建缓存:
yum makecache
搜索:以指定的关键字搜索程序包名及summary(摘要)信息
yum search string1 [string2] [...]
查看指定包所依赖的capabilities(功能):
yum deplist package1 [package2] [...]
查看yum事务历史:只有变化时才记录事物,如安装、卸载、更新数据包
yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
安装及升级本地程序包:本地下载了rpm包,通过yum安装该rpm包;这样的好处是可以解决安装该rpm包的依赖关系;不过新版本的yum工具通过install和update就可以直接安装升级rpm包
yum localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use install)
yum localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use update)
包组管理的相关命令:
yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum grouplist [hidden] [groupwildcard] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]
yum的命令行选项:在执行yum命令时,以命令指定的选项为准,忽略配置文件中的配置
--nogpgcheck 禁止进行gpgcheck
-y 分析完依赖关系,自动安装,不在提示用户是否安装
-q 静默模式,不在输出详细信息
--disablerepo=repoidglob 临时禁用此处指定的repo(如果某个repo在配置文件中为启用的,可以在这里临时禁用,不用改repo配置,通过repoid标识)
--enablerepo=repoidglob 临时启用此处指定的repo(如果某个repo在配置文件中为禁用的,可以在这里临时启用该repo配置,通过repoid标识)
--installroot=/path/to 指定软件的安装路径
--noplugins 禁用所有插件
演示:
显示库列表
[root@centos7 ~]# yum repolist all
已加载插件:fastestmirror, langpacks
loading mirror speeds from cached hostfile
源标识 源名称 状态
cdrom centos 7 release 7.2 启用: 9,007
bash base repo 启用: 9,363
epel fedora-epel/7/x86_64 启用: 11,263
查看程序包摘要信息
[root@centos7 ~]# yum info httpd
已加载插件:fastestmirror, langpacks
loading mirror speeds from cached hostfile
已安装的软件包
名称 :httpd
架构 :x86_64
版本 :2.4.6
发布 :40.el7.centos
大小 :9.4 m
源 :installed
来自源 :cdrom
简介 :apache http server
网址 :http://httpd.apache.org/
协议 :asl 2.0
描述 :the apache http server is a powerful, efficient, and extensible
: web server.
查看指定的特性(可以是某文件)是由哪个程序包所提供:
[root@centos7 ~]# yum provides httpd
已加载插件:fastestmirror, langpacks
loading mirror speeds from cached hostfile
httpd-2.4.6-40.el7.centos.x86_64 : apache http server
源 :cdrom
httpd-2.4.6-45.el7.centos.x86_64 : apache http server
源 :bash
httpd-2.4.6-40.el7.centos.x86_64 : apache http server
源 :@cdrom
查看指定包所依赖的capabilities(依赖关系分析):
[root@centos7 ~]# yum deplist httpd
已加载插件:fastestmirror, langpacks
loading mirror speeds from cached hostfile
软件包:httpd.x86_64 2.4.6-45.el7.centos
依赖:/bin/sh
provider: bash.x86_64 4.2.46-20.el7_2
依赖:/etc/mime.types
provider: mailcap.noarch 2.1.41-2.el7
依赖:/usr/sbin/groupadd
provider: shadow-utils.x86_64 2:4.1.5.1-24.el7
依赖:/usr/sbin/useradd
provider: shadow-utils.x86_64 2:4.1.5.1-24.el7
依赖:httpd-tools = 2.4.6-45.el7.centos
provider: httpd-tools.x86_64 2.4.6-45.el7.centos
依赖:libapr-1.so.0()(64bit)
provider: apr.x86_64 1.4.8-3.el7
依赖:libaprutil-1.so.0()(64bit)
provider: apr-util.x86_64 1.5.2-6.el7
依赖:libc.so.6(glibc_2.14)(64bit)
provider: glibc.x86_64 2.17-157.el7
依赖:libcrypt.so.1()(64bit)
provider: glibc.x86_64 2.17-157.el7
依赖:libdb-5.3.so()(64bit)
provider: libdb.x86_64 5.3.21-19.el7
依赖:libdl.so.2()(64bit)
provider: glibc.x86_64 2.17-157.el7
依赖:libexpat.so.1()(64bit)
provider: expat.x86_64 2.1.0-8.el7
依赖:liblua-5.1.so()(64bit)
provider: lua.x86_64 5.1.4-15.el7
依赖:libm.so.6()(64bit)
provider: glibc.x86_64 2.17-157.el7
依赖:libpcre.so.1()(64bit)
provider: pcre.x86_64 8.32-15.el7_2.1
依赖:libpthread.so.0()(64bit)
provider: glibc.x86_64 2.17-157.el7
依赖:systemd-units
provider: systemd.x86_64 219-30.el7
查看yum事务历史:
[root@localhost ~]# yum history
loaded plugins: product-id, security, subscription-manager
this system is not registered to red hat subscription management. you can use subscription-manager to register.
id | login user | date and time | action(s) | altered
-------------------------------------------------------------------------------
2 | root <root> | 2018-07-14 05:42 | install | 1
1 | system <unset> | 2018-07-12 23:14 | install | 636
history list
创建本地yum仓库:
如何使用光盘当作本地yum仓库:
1、挂载光盘至某目录,例如/media/cdrom
mount -r -t iso9660 /dev/cdrom /media/cdrom
2、创建配置文件
[centos7]
name=centos 7 source
baseurl=file:///media/cdrom
gpgcheck=0
enabled=1
创建yum仓库:
createrepo [options] <directory>
可以通过以下方式手工创建yum仓库
1、将所有rpm文件拷贝到一个文件夹中
2、通过rpm命令手工安装createrepo工具
3、运行命令creatrepo -v /rpm-dirctory(在第一步拷贝的文件夹rpm-dirctory下创建索引信息文件rapodata文件)
4、在/etc/ yum.repos.d/目录下面创建一个.repo结尾的yum仓库文件,文件示例如下:
[king]
name=this is my yumrepo
baseurl=file:///rpm-dirctory #rapodata目录所在的目录
enabled=1
gpgcheck=0
5、如果有分组信息则在运行命令的时候使用-g参数指定分组文件
creatrepo -g /tmp/*comps.xml /rpm-directory
centos/rhel的分组信息保存在光盘repodata目录下,文件名以comps.xml结尾的xml文件
创建好之后本机可以通过file方式直接使用,如果用作为对外的yum仓库服务器,可以通过http、ftp或nfs协议共享出去
程序包管理之编译安装:
无论是使用rpm命令还是yum命令安装的都是已编译好的程序包,在整个安装过程中用户只需执行一条命令即可完成安装。这样带来的好处是方便,但因为是安装的是已编译好的包,所以用户的系统平台环境必须与rpm包制作者的系统平台环境相同。此外,如果用户要安装使用某程序上的某个功能,而rpm包制作者在编译过程中默认没有编译该功能,这时候该怎么办呢?更何况如果某程序只是提供源码而没有现成的rpm包。这时就需要用户手动编译安装了,而编译安装就是将程序源代码编译成完全适合自己平台类型的程序包。
因此,用户首先得获得程序源码包(srpm, source rpm)。rpm包的命名格式为:name-version-release.arch.rpm,而程序源码包(srpm)的命名格式为:name-version-release.src.rpm。可以发现,srpm与rpm相比,将arch替换为src,说明srpm包去掉了arch这一平台类型限制,因此经过用户自己编译安装可以编译成适合自己平台的程序包。
我们知道,程序源代码一般为多文件组织格式,因此文件中的代码文件之间很有可能存在跨文件的依赖关系,这将给用户自行编译安装带来了极大麻烦,因为对先编译哪些文件、后编译哪些文件根本无从知晓,因此这就需要项目管理器(或者项目构建器)。
c/c++的项目管理器为make,make工具可以在编译过程中指定使用哪个预处理器进行预处理、使用哪个编译器进行编译以及先编译什么程序文件、后编译什么程序文件,甚至完成更为复杂的操作等,能帮助用户快速地编译安装。make工具的执行依赖于makefile配置文件,因此make执行的所有操作皆由makefile文件指定。而makefile文件是通过执行configure脚本生成,在执行configure脚本时,configure脚本会结合用户通过命令行指定的选项以及各个makefile.in模板文件来生成makefile文件。编译完成之后即可使用make install命令将编译好的程序包复制到用户指定的各个目录下。
源代码—> 预处理—> 编译(gcc)—> 汇编—> 链接—> 执行
c、c++: make(configure + makefile.in—>makefile)
java:maven
开发工具:autoconf生成configure脚本;automake生成makefile.in文件
开源程序源代码的获取:
官方自建站点:
apache.org (asf)
mariadb.org
代码托管站点:
sourceforge.net
github.com
code.google.com
c/c++程序源代码编译器为gcc (gnu c complier)
c源代码编译安装三步骤:
编译安装前:提供开发工具及开发环境
安装相关工具:make、gcc等
准备相关文件:开发库(glibc标准库)、头文件
通过安装"包组"提供开发组件
centos 6安装:"development tools", "server platform development"
centos 7安装:"development tools"
注意:各程序在编译安装过程中可能有所不同,安装前可以先查看install、readme文件
第一步:执行configure脚本
1、通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定选项以及makefile.in文件生成makefile;
2、检查依赖的外部环境(环境是否满足安装该程序,检查依赖的库文件、检查系统平台是否满足、检查头文件);
选项:指定安装位置、指定启用的特性
--help 获取其支持使用的选项
选项分类:
安装路径设定:
--prefix=/path/to/somewhere 指定程序默认安装位置,默认为/usr/local/
--sysconfdir=/path/to/somewhere 配置文件安装位置
system types 指定系统类型,可以进行交叉编译
optional features 可选特性
--disable-feature 关闭指定特性,默认关闭时无须指定
--enable-feature[=arg] 开启指定特性以及安装路径,默认开启时无须指定
optional packages 可选包
--with-package[=arg] 安装指定依赖包以及其安装路径
--without-package 不安装指定依赖包
第二步:make
make会执行真正的编译操作,但make本身并不是编译器,它只是一个项目构建工具,make程序会根据执行configure脚本所生成的makefile文件,并调用所需要用到的编译器来构建应用程序
第三步:make install
在前面的make程序执行之后,在当前目录下会创建出已编译完成的目标二进制格式的应用程序(包括二进制程序、库文件、配置文件及帮助文档等),而make install则会执行安装操作,实际上就是把当前目录下已编译好的程序包(二进制程序、库文件、配置文件及帮助文档等)复制到用户指定的各个目录当中去。
第四步:编译安装后的配置(如果在编译安装时指定了相关的安装路径)
1、导出二进制程序目录到path环境变量中
编辑文件/etc/profile.d/name.sh
export path=/path/to/bin:$path
2、导出库文件路径
编辑/etc/ld.so.conf.d/name.conf
添加新的库文件所在目录至此文件中;
让系统重新生成库缓存:执行ldconfig [-v]命令
3、导出头文件
有些程序安装后会生成对自己拥有库文件调用接口相关的头文件,系统查找头文件的路径为/usr/include,导出独立安装应用程序的头文件方法:创建链接至/usr/include下即可
例如:/usr/local/nginx/include
# ln -sv /usr/local/nginx/include/* /usr/include/
# ln -sv /usr/local/nginx/include /usr/include/nginx
4、导出帮助手册
在centos 6上:编辑/etc/man.config文件,添加一个manpath
# manpath /path/to/man
这里'/path/to/man'为目标程序的安装路径下的帮助手册目录
在centos 7上:编辑/etc/man_db.conf文件,添加一个manpath_map
# manpath_map /path/to/bin /path/to/man
这里/path/to/bin是目标二进制程序所在目录,/path/to/man则是该程序的帮助手册所在目录。
案例:编译安装apache 2.2源码包,并启动此服务
1、首先获取源代码,下载到当前主机,并展开归档压缩文件。
[root@centos6 downloads]# ls
httpd-2.2.29.tar.bz2
# 展开归档压缩文件,并进入展开的目录中,可以看到目录中的文件
[root@centos6 downloads]# tar xf httpd-2.2.29.tar.bz2
[root@centos6 downloads]# ls
httpd-2.2.29 httpd-2.2.29.tar.bz2
[root@centos6 downloads]# cd httpd-2.2.29
[root@centos6 httpd-2.2.29]# ls
about_apache buildall.dsp config.layout emacs-style httpd.spec layout license notice readme.platforms srclib
acinclude.m4 buildbin.dsp configure httpd.dep include libhttpd.dep makefile.in nwgnumakefile readme-win32.txt support
apache.dsw buildconf configure.in httpd.dsp install libhttpd.dsp makefile.win os roadmap test
build changes docs httpd.mak installbin.dsp libhttpd.mak modules readme server versioning
2、进到目录当中,可以看到有configure脚本,是可执行的,但不要着急执行,先看一下安装的说明,及步骤,install,readme和configure脚本帮助文档;
# 查看 install 文档
[root@centos6 httpd-2.2.29]# less install
apache installation overview
quick start - unix
------------------
for complete installation documentation, see [ht]docs/manual/install.html or
http://httpd.apache.org/docs/2.2/install.html
$ ./configure --prefix=prefix
$ make
$ make install
$ prefix/bin/apachectl start
# 查看 configure 的帮助文档
[root@centos6 httpd-2.2.29]# ./configure --help
`configure' configures this package to adapt to many kinds of systems.
usage: ./configure [option]... [var=value]...
to assign environment variables (e.g., cc, cflags...), specify them as
var=value. see below for descriptions of some of the useful variables.
defaults for the options are specified in brackets.
configuration:
-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-v, --version display version information and exit
-q, --quiet, --silent do not print `checking ...' messages
--cache-file=file cache test results in file [disabled]
-c, --config-cache alias for `--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=dir find the sources in dir [configure dir or `..']
installation directories:
--prefix=prefix install architecture-independent files in prefix
[/usr/local/apache2]
--exec-prefix=eprefix install architecture-dependent files in eprefix
[prefix]
3、安装
a、准备开发环境,执行configure脚本,并指定安装路径等;
# 准备开发环境,安装包组
[root@centos6 httpd-2.2.29]# yum groupinstall development tools -y
[root@centos6 httpd-2.2.29]# yum groupinstall server platform development -y
# 执行 configure 脚本,并指明安装路径,默认所有文件都安装到 /usr/local/apache2 目录下
[root@centos6 apache2]# ./configure --prefix=/usr/local/apache2
b、执行make
c、执行make install 生成目录,并查看,指定的安装路径下是否有目录生成;
# 进入指定安装的目录中
[root@centos6 httpd-2.2.29]# cd /usr/local/apache2/
# 可以看到生成的文件(二进制文件bin,配置文件conf,库文件lib,头文件include等...)
[root@centos6 apache2]# ls
bin build cgi-bin conf error htdocs icons include lib logs man manual modules
# 查看二进制文件,可以看到 httpd 和 apachectl 启动脚本文件
[root@centos6 apache2]# ls bin
ab apr-1-config apxs dbmmanage envvars-std htdbm htpasswd httxt2dbm rotatelogs
apachectl apu-1-config checkgid envvars htcacheclean htdigest httpd logresolve
# 查看配置文件
[root@centos6 apache2]# ls conf/
extra httpd.conf magic mime.types original
4、安装后的配置
a、二进制程序目录导入至path环境变量中,并为配置文件创建软连接
# 为配置文件创建软连接,注意要使用绝对路径
[root@centos6 apache2]# ln -s /usr/local/apache2/conf/ /etc/httpd2
[root@centos6 apache2]# ll /etc/httpd2
lrwxrwxrwx 1 root root 24 feb 26 10:39 /etc/httpd2 -> /usr/local/apache2/conf/
# 将二进制程序导入 path环境变量中
[root@centos6 apache2]# vim /etc/profile.d/httpd2.sh
path=/usr/local/apache2/bin:$path
# 重读配置文件,并查看环境变量是否导入成功
[root@centos6 apache2]# . /etc/profile.d/httpd2.sh
[root@centos6 apache2]# echo $path
/usr/local/apache2/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
b、导入帮助手册。编辑/etc/man.config|man_db.conf文件,添加一个manpath;
c、导入库文件路径,编辑/etc/ld.so.conf.d/name.conf,添加新的库文件所在目录至此文件中,让系统重新生成缓存
[root@centos6 apache2]# vim /etc/ld.so.conf.d/httpd2.conf
/usr/local/apache2/lib
# 让系统重新生成缓存
[root@centos6 apache2]# ldconfig -v
/usr/local/apache2/lib:
libapr-1.so.0 -> libapr-1.so.0.5.1
libaprutil-1.so.0 -> libaprutil-1.so.0.5.3
libexpat.so.0 -> libexpat.so.0.5.0
/usr/lib64/mysql:
libmysqlclient.so.16 -> libmysqlclient.so.16.0.0
libmysqlclient_r.so.16 -> libmysqlclient_r.so.16.0.0
/usr/lib64/qt-3.3/lib:
libqui.so.1 -> libqui.so.1.0.0
libqt-mt.so.3 -> libqt-mt.so.3.3.8
/usr/lib64/xulrunner:
libxpcom.so -> libxpcom.so
libmozalloc.so -> libmozalloc.so
libmozsqlite3.so -> libmozsqlite3.so
libxul.so -> libxul.so
/lib:
/lib64:
d、导入头文件,基于为目录创建符号链接的方式实现:
[root@centos6 apache2]# ls
bin build cgi-bin conf error htdocs icons include lib logs man manual modules
# 创建软链接
[root@centos6 apache2]# ln -sv /usr/local/apache2/include/ /usr/include/httpd2
`/usr/include/httpd2' -> `/usr/local/apache2/include/'
[root@centos6 apache2]# ll /usr/include/httpd2
lrwxrwxrwx 1 root root 27 feb 26 11:12 /usr/include/httpd2 -> /usr/local/apache2/include/
5、测试可否连接访问,查看80口是否监听
# 启动服务,查看 80 端口是否正常监听
[root@centos6 ~]# apachectl start
[root@centos6 ~]# netstat -tnl
active internet connections (only servers)
proto recv-q send-q local address foreign address state
tcp 0 0 0.0.0.0:111 0.0.0.0:* listen
tcp 0 0 0.0.0.0:60690 0.0.0.0:* listen
tcp 0 0 0.0.0.0:22 0.0.0.0:* listen
tcp 0 0 127.0.0.1:631 0.0.0.0:* listen
tcp 0 0 127.0.0.1:25 0.0.0.0:* listen
tcp 0 0 127.0.0.1:6010 0.0.0.0:* listen
tcp 0 0 :::111 :::* listen
tcp 0 0 :::80 :::* listen
tcp 0 0 :::43346 :::* listen
tcp 0 0 :::22 :::* listen
tcp 0 0 ::1:631 :::* listen
tcp 0 0 ::1:25 :::* listen
tcp 0 0 ::1:6010 :::* listen
6、访问王页如下: