1. yum简介
2. yum组成结构
3. yum配置使用
4. yum命令详解
5. yum源变量
6. 
yum仓库创建
7.进阶源码编译安装
1. yum简介
YUM: Yellowdog Updater Modifed, 是由Duke University团队修改Yellow 
Dog Linux的Yellow Dog 
Updater开发而来的,是一个基于RPM包管理器的字符前端软件管理器(依赖于RPM包)。能够从指定的服务器自动下载RPM包并且安装,可以处理RPM包的依赖关系,并且一次安装所有依赖的软件包,无须繁琐的一次次下载、安装。被Fedora、Red 
Hat Enterprise Linux、CentOS所使用。
2. yum的组成结构
简单的说: YUM就是一个RPM包管理工具,而且YUM是C/S结构,服务端就是一个文件服务器,都是rpm包;而YUM客户端可以配置多个YUM服务端来使用。
2.1 YUM服务端
yum repository: 称之为yum仓库,存在于yum服务器端,分成两部分:
    a. 仓库数据:
        
各个数据包
    b. 元数据(meta data)
        
数据文件信息在centos5是xml格式,在centos6,7上用的是sqlite,基于文件来实现关系型数据库
        
元数据包括:
            包名,版本信息,各包所包含的文件列表,依赖关系,包分组信息
            
我们可以使用createrepo命令来给rpm包创建仓库
    yum仓库 主要有以下几类:
        base库   #基础库
        update库 
#更新版本库
        extra库  #格外库
        epel库   #fedora维护的库
        #如果某软件base库里有,update库里也有,则应该使用update库中的包,因为update库中是更新的版本
        
以上库的优先顺序应为: base > update > extra > epel
yum机制:
    要想确保YUM正常工作,要满足以下几点:
        2.1.1 确保有yum 
repo可用
            rpm包的文件服务器中, repodta目录所在的父目录,就是一个可用仓库
            例如:http://mirrors.sohu.com/centos/6/os/x86_64/ 目录下有repodate目录的就可认定为一个yum仓库
yum仓库可以通过以下三种方式共享:
            ftp: ftp://server/path/to/repository
            
http http://server/path/to/repository
            
nfs nfs://server/nfs_path
            file file:///path/to/repository  
#本地文件系统,挂载光盘后直接就可以用 file:///media/cdrom 即可
3. yum配置使用
        在客户端上必须要提供repo配置文件,指明仓库访问路径及各种属性信息
主配置文件(中心配置文件): /etc/yum.conf (此配置文件的参数作用可以通过 man yum.conf查看), 内容如下:
            [main]
            
cachedir=/var/cache/yum/$basearch/$releasever    #缓存目录
            
keepcache=0     #是否保存缓存数据? 0 不保存
            debuglevel=2     
#debug信息等级
            logfile=/var/log/yum.log    
#yum的日志信息保存地址
            exactarch=1    #exact arch match? 
是否要精确匹配平台?
            obsoletes=1    #是否要检查过期仓库?
            
gpgcheck=1
            plugins=1
            
installonly_limit=5
            bugtracker_url=http://bugs.centos.org/set_project.php?project_id=19&ref=http://bugs.centos.org/bug_report_page.php?category=yum
            
distroverpkg=centos-release
            #  This is the default, if you make this bigger yum won‘t see if 
the metadata
            # is newer on the remote and so you‘ll "gain" the 
bandwidth of not having to
            # download the new metadata and "pay" 
for it by yum not having correct
            # information.
            #  
It is esp. important, to have correct metadata, for distributions 
like
            # Fedora which don‘t keep old packages around. If you don‘t 
like this checking
            # interupting your command line usage, it‘s 
much better to have something
            # manually check the metadata once 
an hour (yum-updatesd will do this).
            # metadata_expire=90m
            # PUT YOUR REPOS HERE OR IN separate files named 
file.repo
            # in /etc/yum.repos.d
        一个或多个相关仓库的配置信息可保存在一个文件,文件名都以.repo结尾,存放在/etc/yum.repos.d 目录下
        在.repo文件定义一个yum repo指向的格式:
        [REPOID] #这个REPOID可以自己设定任意字符
        name=Some name for this 
repository #此行等号两侧不能有空格,右侧可以加空格,不写此字段使用yum会报warning
        
baseurl=file:///media/cdrom  #baseurl可以有多个,用来指定真正仓库的所在地
                ftp: 
ftp://server/path/to/repository
                
http http://server/path/to/repository
                
nfs nfs://server/nfs_path
        #多个baseurl 
必须按照上面格式书写,第二个baserul不能出现在行首
        enabled={0,1} #1为启用此repo
        
gpgcheck={0,1} #是否检查GPG(GNU Private Guard),一种密钥方式签名。
        gpgkey=URL 
#当配置gpgcheck选项时,要加上gpgkey来验证
            
例如:gpgkey=file:///media/cdrom/GPG-RPM-KEY-centos-6 
        mirrorlist=URL to 
a file #这个文件指向多个baseurl,不定义baseurl的时候可以用这个指定多个仓库
        cost={1..n} 
#默认值为1000, 指定访问此仓库的开销
        例如在yum客户端创建一个新的repo,首先定位到/etc/yum.repos.d下创建一个文件 163.repo
        
内容如下:
            [163]
            name=CentOS 6 from 163 mirror
            
baseurl=http://mirrors.163.com/centos/6.6/os/x86_64/ #记得检查该目录是否有 repodata目录
            enabled=1
            gpgcheck=0
然后可以使用命令 yum repolist 查看到此repo配置
4. yum命令详解
这里的yum命令都是指在客户端上使用的,包括列表,清理缓存,安装/重新安装/降级安装/卸载,查询等命令。
4.1 列出所有可用repo
    yum repolist {enabled|disabled|all} 
#列出{已经启用的|已禁用的|所有的}可用的repo
4.2 列出rpm包
    yum list {all|installed|available} # 
列出{所有|已安装|未安装但repo内有的}
4.3 查看包的描述信息
    yum info package_name
4.4 列出所有的包组信息
    yum grouplist
4.5 显示包组的信息, 指定某个包组的程序包列表和功能
    yum groupinfo "GROUP NAME"
        例如: 
yum groupinfo "Server Platform Development"
4.6 清理缓存
    yum clean {all|packages|metadata|expire-cache|rpmdb|plugins}  
#清理{所有|特定rpm包|元数据|过期缓存|repo数据库|插件}的缓存
只有yum clean all比较常用,其他用的到的在来翻看笔记吧
    #注,清理缓存并不会删除目录结构,只是结构内的数据被清除
        可以用 tree /var/cache/yum来对比 
清理缓存后的文件列表对比
4.7 安装程序包
    yum install package_name
    重新安装程序包
    yum reinstall package_name
4.8 升级程序
    检查可用的升级包
        yum check-update  #并不会执行安装
    
升级包
        yum update package_name
            例如: 我们要升级一个程序 
x-1.3.1
            当前repo中存在x-1.3.2, x-1.3.3, x-2.0.1 
三个版本,我们只想安装特定的x-1.3.2
            而直接运行 yum update x ,会直接将x升级到最新版本 
x-2.0.1
            这时候,我们可以加上rpm包的版本,指定升级版本
    升级到特定版本
        yum update package_name-version
    降级包
        yum downgrade package_name
4.9 卸载包
    yum remove|erase package_name
        #如果卸载一个软件被其他软件依赖, 
那会连同所用的依赖包一同卸载掉。
4.10 查询某配置文件是由哪个包生成的?
    yum whatprovides | provides 
/path/to/somefile
        #whatprovides和provides两个参数都可以
4.11 安装包组
    yum groupinstall "GROUP NAME" #可以用yum 
gourplist来查看都支持哪些包组
4.12 卸载包组
    yum groupremove "GROUP NAME"
4.1.3 安装仓库外rpm包
假设: 从其他处获得一个rpm包, 如果此包依赖于其他包(在仓库中), 如何安装?
    如果只是单次安装需要:
        
CentOS 5:
            yum install /path/to/package_file
        CentOS 6,7:
            yum localinstall /path/to/package_fiel
5. yum源变量
在使用在线的repo源的时候, 客户端yum配置文件中中可以使用4个变量
$releasever: 程序的版本 
#可以根据系统来替换成相应的主版本号,5,6,7,而主版本号下的连接是当前发行版的最新版本5.6,6.5,7.1等
$arch: 
系统架构
$basearch: 系统基本架构,如i686, i586等的基本架构为i386
$uuid:
$YUM0-9: 
在系统中定义的环境变量, 可以在yum中使用:
ps: 实际环境中,baseurl中常用$releasever和$basearch来替换本地架构和linux版本来让仓库的配置文件更具有通用性,让不同的平台版本可以使用同一个配置文件。
5.1 获取yum源变量值
获取当前系统相应变量替换结果的办法:
-bash-4.1# python
Python 2.6.6 (r266:84292, Jan 22 
2014, 09:42:36) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on 
linux2
>>> import yum,pprint
>>> yb = 
yum.YumBase()
>>> pprint.pprint(yb.conf.yumvar,width=1)
Loaded 
plugins: fastestmirror, refresh-packagekit
{‘arch‘: ‘ia32e‘,
 ‘basearch‘: 
‘x86_64‘,
 ‘infra‘: ‘stock‘,
 ‘releasever‘: ‘6‘,
 ‘uuid‘: 
‘54298ec4-d059-4bfe-a967-cce66eb95513‘}
>>> quit()
6. yum仓库创建
yum仓库可以分为本地仓库和在线仓库两种:
6.1 自建本地yum仓库:
    1. 如何自建基于光盘镜像的yum repo
        挂载光盘
        mount 
/dev/cdrom /media/cdrom
        在/etc/yum.repo.d/下创建一个.repo文件
        
内容为:
        [base]
        name=Local Media
        
baseurl=file:///media/cdrom
        pgpcheck=0
        enabled=1
    2. 自简提供yum仓库的中心服务器
        ftp, http, nfs 三种常用的文件服务器
        以http为例:,步骤:
            1. 安装httpd程序
            #rpm -ivh 
http-x-x-x-x.rpm
            1.2 启动httpd服务
            #service httpd 
start
            #chkconfig httpd on   #centos7 不适用
            2. httpd的文档根目录为/var/www/html
                
创建子目录,存放某相关的所有rpm包
            3. 为仓库生成元数据文件,以使其能够作为仓库使用
                3.1 安装 
craeterepo
                    rpm -ivh 
createrepo-xxx.xxx.xxx.rpm
                    或者
                    #yum 
install createrepo
                3.2 对rpm包目录createrepo:
                #createrepo 
/var/www/html/zabbix
                # createrepo 
/var/www/html/zabbix
                Spawning worker 0 with 16 
pkgs
                Workers Finished
                Gathering worker 
results
                Saving Primary metadata
                Saving file lists 
metadata
                Saving other metadata
                Generating 
sqlite DBs
                Sqlite DBs complete
                
                则该目录下会自动生成一个repodata目录,该目录/var/www/html/zabbix就可以当repo用了
            4. 配置yum客户端
                [zabbix]
                
name=zabbix repo
                baseurl=http://192.168.229.141
                
gpgcheck=0
                enabled=1
            然后就可以使用这个repo了
7.进阶源码编译安装
7.1 编译安装,依赖于开发环境
        程序源码:
            c/c++ 
底层,无跨平台能力
            perl 
            python
    别人制作好的rpm包,都是编译过的,而当源码包的功能有20个,
            主包:6个功能
            
分包1: 2个功能
            分包2: 4个功能
        也就是说别人会根据需求订制功能,编译后rpm包功能会比源码功能少,并且也会比源码包慢几个版本
        
可能出现你需要的功能,在别人编译好的rpm上没办法使用,这时候就需要我们自己来根据源代码来自己编译安装
开源的源代码有如下两个方式来提供:
        1.开源应用程序:
            自建站点:  
#一般都是比较大型的项目会有自己的站点
                apache, ASF
                
mysql
                drbd
        2. 代码托管:  
#一些中小型项目的源代码一般都使用代码托管的方式,寄存在以下的代码托管网站
                
Sourceforge
                github.com
                code.google.com
tips: 编译安装的缺点是: 无法自动卸载安装的文件,所以习惯把编译安装的软件放在一个目录下,便于日后升级卸载
7.2 编译工具:gcc
        gnu c complier 只能用来编译c程序
        gcc-c++ 用来编译c++程序 
        使用 rpm -qa| grep gcc 可以看到本机有很多种针对不同语言的编译工具,编译是很耗时的
7.3 源代码的组织格式:
        多文件:
            文件中的代码有依赖关系
        
项目管理工具: 
            GNU make(gcc) 定义好多文件之间的编译关系,处理多文件内源码的依赖关系
            项目: 50文件
                项目的制作者: 
利用make工具,为make提供一个配置文件
            make不是编译工具,是编译的管理工具
            autoconf: 
生成编译环境检查(检查开发环境是否满足编译需求)及编译功能配置(选择源码内的功能)脚本
                
生成configure
                
当configure脚本执行的时候,会结合automake工具生成的Makefile.in来生成makefile
automake: 生成一个Makefile.in --> makefile
7.4 编译源程序的步骤:
        # tar xf testapp-version.tar.{xz|bz|gz}
        # 
cd testapp-version
        # ./configure
            还需要通过许多选项指定编译特性,选取功能 
        # make 
        # make install
        ./configure 脚本的使用:
            1. 获取帮助
                
./configure --help    #基于每个项目内的配置选项是不同的,需要查看
            2. 通用一些选项
                安装路径相关:
                
--prefix=/path/to/somewhere: 指定安装路径
                
--sysconfdir=/path/to/somewhere: 指定配置文件安装路径的, 路径应该为/etc/下某个目录
            指定启用/禁用的特性
                --enable-FEATURE   例如 --enable-fpm 
,但是启用一个功能,就会依赖另外的开发环境包
                --disable-FEATURE  例如 
--disable-socket
            指定所依赖的功能、程序或文件
                
--with-FUNCTION[=/path/to/somewhere]
                --without-FUNCTION
            
7.5 安装后的配置:
7.5.1 程序运行及维护:
        1. 让二进制程序直接运行,而无需输入路径
        #vim 
/etc/profile.d/APPNAME.sh
        export PATH=$PATH:/path/to/somewhere
        2. 导出手册页:
            编辑/etc/man.config 
配置文件,添加一项MANPATH,路径为新安装的程序的man目录
            或者
            #man -M 
/path/to/somewhere KEYWORD 就可以找KEYWORD的帮助手册了
3. 自己编写/etc/init.d/的启动脚本
ps: 如果只是为了编译安装,并运行软件,则到此就可以结束了。 
    
下面的步骤是为了解决其他应用程序依赖开发环境,和针对编译安装程序的二次开发准备环境使用的。
==========================================================================================
    7.5.2 程序开发: 如果其他应用程序依赖此程序的开发环境,或针对此程序做二次开发
        1. 
导出库文件
            第一步: 指定让系统搜索定制的路径
                
编辑/etc/ld.so.conf.d/APPNAME.conf
                    一行一个库文件路径
            例如: vim /etc/ld.so.conf.d/nginx.conf
                    
#/usr/local/ngxin/lib
                        
            
第二步:触发系统重新搜索所有的库文件并生成缓存
                    
#ldconfig
                        -v 显示过程
        2. 导出头文件
            /usr/local/ngxin/include
系统找头文件的路径是 /usr/include
            导出方式: 创建链接进行
                ln -sv 
/usr/local/ngxin/include /usr/include/nginx
启动程序得自己写,在/etc/init.d/,不是不能启动,自己写好,就可以和其他软件用同一种风格来运行了。
原文地址:http://richier.blog.51cto.com/1447532/1661544