记录我的成长吧~

 

学习过程:后端管理工具rpm --> 前端管理工具yum --> 源码包编译安装

 

必备知识:API,ABI,源代码,二进制文件,项目构建工具

API:Application Program Interface 程序员面对的编程接口
ABI:Application Binary Interface 程序应用面对程序的的接口
    uNIX-like
        ELF
    WINDOS:
        exe,msi
    库级别的虚拟化:
        Linux:WinE
        Windows:Cywin

C/C++程序格式:
    源代码:文本格式的程序代码
        源代码依赖于编译开发环境:编译器、头文件、开发库
    二进制格式:文本格式的程序代码-->编辑器-->二进制格式(二进制程序、库文件、配置文件、帮助文件)
        二进制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
        库文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
        配置文件:/etc,/etc/DIRECTORY, /usr/local/etc
        帮助文件:/usr/share/man,/usr/share/doc/APP-VERSION,/usr/local/share/man,/usr/local/share/doc其他

    2进制程序所依赖的库文件:
        查看命令:ldd ,ldconfig
            查看二进制程序所依赖的库文件:ldd 二进制文件路径
            [root@localhost Packages]# ldd /bin/ls
                linux-vdso.so.1 =>  (0x00007fff72187000)
                libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f3ff4e27000)
                libcap.so.2 => /lib64/libcap.so.2 (0x00007f3ff4c22000)
                libacl.so.1 => /lib64/libacl.so.1 (0x00007f3ff4a18000)
                libc.so.6 => /lib64/libc.so.6 (0x00007f3ff4657000)
                libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f3ff43f6000)
                liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f3ff41d0000)
                libdl.so.2 => /lib64/libdl.so.2 (0x00007f3ff3fcc000)
                /lib64/ld-linux-x86-64.so.2 (0x00007f3ff5061000)
                libattr.so.1 => /lib64/libattr.so.1 (0x00007f3ff3dc7000)
                libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f3ff3baa000)
            #       依赖的库名    => 依赖的库的路径(在内存中的位置)        

            查看本机装载的库文件:ldconfig -p
            [root@localhost Packages]# ldconfig -p
                libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
                libxtables.so.4 (libc6,x86-64) => /lib64/libxtables.so.4
                ........
                libxml2.so.2 (libc6,x86-64) => /usr/lib64/libxml2.so.2
项目构建工具:
    C/C++:make
    java:maven
必备知识简单阐述

 

后端管理工具rpm


  想程序得以运行,我们获得的源代码需要编译为目标二进制格式(python:字节码),而拿到的二进制文件,我们还需要手动分配至不同的位置,并且操作系统标准匹配才能运行程序;对于初次接触Linux的我们来说难度很大;那么,有什么工具可以帮助我们自动完成这些操作呢?嘿嘿,早有人帮你解决这个麻烦了,让我们一起来看看吧;

rpm简介:

  全名:redhat package manager;由redhat公司发展而来;后期为了表示通用性采用递归循环名称rpm is package manager;
  优点:

  •     1、源代码编译而成,不需要重新编译,安装方便;
  •     2、安装前,会检查系统硬盘容量、操作系统等信息,可避免被错误安装;
  •     3、提供文件清单、程序包的名称和版本、功能说明、校验信息等信息,方便了解RPM包;
  •     4、使用程序组成清单和数据库,方便后期升级、卸载等;

  缺点:

  •     1、不能自动解决依赖关系

  rpm分类: 有编译好的rpm包 和 未经编译的rpm包,当我们需要根据需要对源码程序做特定编译时就会用到未经编译的rpm包;

rpm管理工具将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作;

源代码包及rpm包命名格式对比:

why:源码包里有很多种功能,难到对于大多数用户来讲每一种功能都需要吗?比如任何一类服务类程序它都应该有两类组件:运行、开发库,大多数上规模的程序都有开发环境,对这个程序做二次研发或增强性研发,如果不是程序员开发环境这些对我们来说就没有太大的意义,因此就有拆包的意义,把一个包拆分成多个功能的包,按需安装;

主包:name-VERSION-release.arch.rpm
支包:name-function-VERSION-release.arch.rpm
    function:devel(开发组件),utils(工具程序),libs..
拆包:主包和支包

 那么程序包管理器里都有些什么呢?

  1、程序包的组成清单(每个程序包都单独实现):

  •  文件清单
  •  安装或卸载时运行的脚本

  2、数据库(公共)

  •  存储程序包的名称和版本
  •  依赖关系;
  •  功能说明;
  •  安装生成的各文件的文件路径及校验信息;
  •  等等
rpm包数据库存储路径:/var/lib/rpm

	[root@localhost rpm]# ls /var/lib/rpm | xargs -n1
	Basenames
	Conflictname
	Dirnames
	Group          #包组
	Installtid
	Name           #程序包名字
	Obsoletename
	Packages
	Providename
	Requirename
	Sha1header
	Sigmd5         #MD5校验码
	Triggername    #触发器

既然有了这么强大的工具,我怎么获取这些rpm包呢?

获取程序包的途径:
	(1)系统发行版的光盘或官方的文件服务器(或镜像站点);
		http://mirrors.aliyun.com/
		http://mirrors.sohu.com
		http://mirrors.163.com
	(2)项目的官方站点;
	(3)第三方组织
		(a)EPEL
		(b)搜索引擎
			http://pkgs.org
			http://rpmfind.net
			http://rpm.pbone.net
	(4)自己动手,丰衣足食

	建议:检查其合法性;来源合法性;程序包的完整性;

rpm命令管理程序包:

  当我们获得了这些制作好的rpm包,那就来让我们大显身手下吧;怎么用man下就知道了。

  话不多说先上图,看看rpm都有哪些功能;

安装:  

  rpm {-i|--install} [install-options] PACKAGE_FILE ...

  rpm -ivh PACKAGE_FILE ...

rpm {-i|--install} [install-options] PACKAGE_FILE ...

    rpm -ivh PACKAGE_FILE ...

    [install-options]
        -h:hash marks输出进度条;每个#标识2%的进度,共50个;
        --test:测试安装,检查并报告依赖关系及冲突消息等;
        --nodeps:忽略依赖关系;不建议;
        --replacepkgs:重新安装;注意它不能替换配置文件,如果包配置文件被修改建议删掉在使用该参数;
        --justdb:更新数据库,实际没有安装
        --noscripts:不运行脚本
        注意:每一个rpm包安装时有可能运行一些脚本做准备工作;rpm可以自带脚本;
            四类脚本分别在不同时刻触发:--noscripts
                preinstall:安装过程开始之前运行脚本,%pre, --nopre
                postinstall:安装完成之后运行的脚本,%post,  --nopost
                preuninstall:卸载过程真正开四核执行之前运行的脚本,%preun, --nopreun
                postuninstall:卸载过程完成之后运行的脚本,%postun, --nopostun

        --nosignature :不检查包签名信息,不检查来源合法性;
        --nodigest:不检查包完整性信息;不检查校验MD5信息;
        
演示:
    [root@localhost Packages]# rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm    #普通安装
    准备中...                          ################################# [100%]
        软件包 zsh-5.0.2-7.el7.x86_64 已经安装
    [root@localhost Packages]# rpm -ivh --replacepkgs zsh-5.0.2-7.el7.x86_64.rpm 
    准备中...                          ################################# [100%]
    正在升级/安装...
       1:zsh-5.0.2-7.el7                  ################################# [100%]
    [root@localhost Packages]# cat /etc/shells | grep zsh    #查看shell终端接口是否增加了zsh
    /bin/zsh
    [root@localhost Packages]# rpm -ql zsh    #程序安装生成的所有文件列表
安装:-i

升级:
  rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
  rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

 rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
 rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

     -U:升级或安装;
     -F:升级;只有拥有来版本才能升级

     rpm -Uvh PACKAGE_FILE ...
     rpm -Fvh PACKAGE_FILE ...

         --oldpackage:降级;
         --force:强制升级;

     注意:
         (1)不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;
         (2)如果某源程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;

演示:
[root@localhost Packages]# rpm -e zsh-html
[root@localhost Packages]# rpm -Fvh zsh-html-4.3.10-7.el6.x86_64.rpm 
[root@localhost Packages]# rpm -Uvh zsh-html-4.3.10-7.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:zsh-html               ########################################### [100%]
#这里我们卸载zsh-html。然后使用rpm -Fvh进行升级。因为不存在旧版程序包,所以不执行升级。
#而rpm -Uvh在不存在旧版程序包时,会对此程序包进行安装
升级:-{U|F}

 卸载:
   rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...

    --allmatches:卸载所有匹配的指定名称的程序包的各版本;
    --nodep:忽略依赖关系
    --test:测试卸载,dry run模式
卸载:-e

查询:*****
  rpm {-q|--query} [select-options] [query-options]

rpm {-q|--query} [select-options] [query-options]

    [select-options]
        PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本;
        -a,--all:查询所有已经安装过的包
            rpm -qa PACKAGE_NAME | grep "xx"
        -f FILE:查询指定的文件由哪个程序包安装生成  ****
        -g,--group GROUP:查询包组中包含了哪些包

        -p, --package PACKAGE_FILE:对于未安装的程序包执行查询操作;结合[query-options]使用;

        --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;
            [root@localhost ~]# rpm -q --provides  bash
            /bin/bash
            /bin/sh
            bash = 4.2.46-12.el7
            bash(x86-64) = 4.2.46-12.el7
            config(bash) = 4.2.46-12.el7
            [root@localhost ~]# rpm -q --whatprovides  bash
            bash-4.2.46-12.el7.x86_64
            [root@localhost ~]# rpm -q --whatprovides  'config(bash)'
            bash-4.2.46-12.el7.x86_64

        --whatrequires CAPABILITY:查询指定的CAPABILITY由哪个包依赖;

    [query-options]

        --changelog :查询rpm包的changlog;
            ~]# rpm -q --changelog zsh
        -l,-list:程序安装生成的所有文件列表; ****
        -i,--info:程序包相关的信息,版本号、大小、所属的组;    ****
            ~]# rpm -qi bash
        -c, --configfiles:查看指定的程序包提供的配置文件;
        -d, --docfiles:查询指定的程序包提供的文档;
        --provides:列出指定的程序包提供的所有的CAPABILITY;
            ~]# rpm -q --provides  bash
        -R, --requires:查询指定的程序包的依赖关系;       ****
        --scripts:查看程序包自带的脚本片断有哪些;

    用法:

        已安装包查询
        -qi  PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
        未安装包查询
        -qpi  PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE, ...
查询:-q

校验:
  rpm {-V|--verify} [select-options] [verify-options]

校验:
    rpm {-V|--verify} [select-options] [verify-options]

        S file Size differs   # 文件的容量大小是否被改变
        M Mode differs (includes permissions and file type) # 文件的类型或文件的属性(rwx)是否被改变,
        5 digest (formerly MD5 sum) differs  # MD5 这种指纹码的内容已经不同
        D Device major/minor number mismatch  #主次设备号不匹配
        L readLink(2) path mismatch    # 路径不匹配
        U User ownership differs    # 属主不匹配
        G Group ownership differs  # 属组不匹配
        T mTime differs            #修改时间戳不匹配
        P caPabilities differ    #功能不匹配

演示:
~]# rpm -ql zsh
~]# vim /usr/share/zsh/5.0.2/functions/zrecompile
~]# rpm -V zsh
S.5....T.    /usr/share/zsh/5.0.2/functions/zrecompile
校验:-V

  那么校验是怎么校验的呢?

校验过程包括包来源合法性验证和完整性验证;来源合法性验证是通过制作者数字签名(RSA)来实现,而完整性验证是通过单向加密(MD5...)对比来实现;

    当我们进行校验时,一般会经历一下几个过程:
        制作者加密:
        1、特征码:制作者将rpm包使用单向加密(md5/sha1/sha512...)定长输出;
        2、用自己的私钥加密特征码(数字签名);
        3、将加密后的特征码附加到rpm后,发布公钥;
            注意: 可信任机构发布的公钥更安全些

        使用者解密:
        1、拿到公钥的人可以解密,得到特征码;
        2、使用者将rpm包使用同样的方法单向加密,得到特征码;
        3、比较两个特征码 

    获取并导入信任的包制作者的密钥:
    rpm --import /mydata/RPM-GPG-KEY-CentOS-7  # 挂载ISO文件的位置
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

    验证:
        (1)安装此组织签名的程序时,会自动执行验证;
        (2)手动验证:rpm -K PACKAGE_FILE

演示:
[root@localhost Packages]# rpm -K zsh-5.0.2-7.el7.x86_64.rpm 
zsh-5.0.2-7.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 确定
[root@localhost Packages]# 
手动验证:-K

数据库重建:

  CentOS 6 : man rpm

    rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]

  CentOS 7 : man rpmdb

数据库重建:
    rpm管理器数据库路径:/var/lib/rpm;    查询操作:通过此处的数据库进行;

    我们什么时候要重建数据库呢?
        当我们不小心误删除或文件有损坏的,就需要对数据库进行重建(读取每一个包的信息,然后进行重建)
    
    注意:CentOS 7已经把重建数据库的命令独立出来;使用还是没有太大区别的;
    
    CentOS 6 : man rpm

    rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]
        --initdb:初始化数据库,如果事先不存在数据库,则新建之;否则,不执行任何操作;
        --rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;

    CentOS 7 : man rpmdb

    rpmdb [-v?] [--initdb] [--rebuilddb] [-D|--define “MACRO EXPR”] [--undefine=MACRO]
    [-E|--eval “EXPR”] [--macros=<FILE:…>] [--nodigest] [--nosignature] [--rcfile=<FILE:…>]
    [-r|--root ROOT] [--dbpath=DIRECTORY] [--querytags] [--showrc] [--quiet] [-v|--verbose]
    [--version] [-?|--help] [--usage]

演示:
[root@localhost ~]# man rpmdb
[root@localhost ~]# mkdir /tmp/rpm
[root@localhost ~]# rpmdb --initdb --dbpath=/tmp/rpm
[root@localhost ~]# ls /tmp/rpm/
Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5
Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername
[root@localhost ~]# rpmdb --initdb --dbpath=/tmp/rpm
[root@localhost ~]# rpmdb --rebuilddb --dbpath=/tmp/rpm
[root@localhost ~]# ls /tmp/rpm/
Basenames     Dirnames  Installtid  Obsoletename  Providename  Sha1header  Triggername
Conflictname  Group     Name        Packages      Requirename  Sigmd5
数据库重建:--{initdb|rebuilddb}

 前端管理工具yum


  有rpm这么好的工具,为什么还要yum呢?哈哈,往下看就知道了;

  rpm包和包之间存在依赖关系,解决依赖关系会花费很长时间来解决,虽然我们可以忽略程序包的依赖关系,但是程序包的使用可能就会出现问题;这时候就需要在前端解决依赖关系的程序;

yum简介:

  yum是一款C/S架构的工具。在本地可达的网络服务器上有提供文件存储服务的服务,在其所提供的存储空间中放置了我们所需要rpm包,并且提供了文件共享服务可输出给它主机进行访问;在本地的主机支持rpm管理功能、yum工具使用。我们通过yum的配置文件就能获得所要的资源了。

YUM,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器。起初是由yellow dog 这一发行版的开发者Terra Soft 研发,用python 写成,那时还叫做yup(yellow dog updater),后经杜克大学的Linux@Duke 开发团队进行改进,遂有此名。yum 的宗旨是自动化地升级,安装/移除rpm 包,收集rpm 包的相关信息,检查依赖性并自动提示用户解决。yum 的关键之处是要有可靠的repository,顾名思义,这是软件的仓库,它可以是http 或ftp 站点,也可以是本地软件池,但必须包含rpm 的header,header 包括了rpm 包的各种信息,包括描述,功能,提供的文件,依赖性等。正是收集了这些header 并加以分析,才能自动化地完成余下的任务;
较为全面的介绍

yum获取rpm包过程

1、客户端远程连接到提供资源的服务端求情数据
2、服务端将保持有包的相关元数据信息文件发送给客户端,不过在这之前有一次发送校验码的过程(repodata目录下repomd.xml文件);通常元数据文件放在特定的目录下,而每个元数据文件都有与之对应的校验码以方便查询其完整性;
3、客户端将元数据文件放置于本地缓存区域中,并根据元数据文件分析是否有所需的rpm包名及依赖关系等;
4、客户端检查本地是否有rpm包相关依赖关系的文件
5、客户端远程连接至服务端下载所需rpm包,并缓存到本地执行安装;
6、客户端默认会删除下载的rpm包,但元数据文件不会删除;
缺点:
	如果获取程序包中途终止,只能会重新获取;
解决办法:dnf工具;在Fedora 22中替代了YUM工具集,用法一样就是换了命令而已;

    27 个 Linux 下软件包管理工具 DNF 命令例子 :
	https://linux.cn/article-5718-1.html

对于服务器端来讲只要能提供文件资源服务和资源数据就行:

  这些资源包括众多rpm包,以及包的相关的元数据文件,而元数据放置于特定目录下(repodata目录)

  服务器所有提供的服务有多种:   ftp://   http://   nfs://   file:///

对于yum客户端来讲只要有yum工具和相关仓库配置文件就行:  

  yum工具的配置文件:/etc/yum.conf;/etc/yum.repos.d/*.repo

  •   /etc/yum.conf:为所有仓库提供公共配置 ;其main 部分定义了全局配置选项,全局仅一个main;
  •   /etc/yum.repos.d/*.repo:为仓库的指向提供配置

仓库指向的定义:

[repositoryID]
name=Some name for this repository #仓库名
baseurl=url://path/to/repository/  #仓库访问路径

或者baseurl=url://server1/path/to/repository/
      url://server2/path/to/repository/
      url://server3/path/to/repository/

keepcache={1|0}                      #本地缓存是否保存(rpm包)
enabled={1|0}                        #是否启用此仓库,默认启动
gpgcheck={1|0}                       #是否检查来源合法性和完整性
gpgkey=URL                           #指明密钥文件
enablegroups={1|0}                   #是否支持组批量管理程序包,默认支持
failovermethod={roundrobin|priority} #指明baseurl有多个时优先级;默认为:roundrobin,意为随机挑选;
cost=                                #开销;默认为1000;多个仓库里都有同一个rpm包可定义开销,越小越先访问;
演示:
[base]
name=Base Repo on 172.16.0.1
baseurl=http://172.16.0.1/cobbler/ks_mirror/CentOS-6.7-x86_64/
gpgcheck=0

[epel]
name=Fedora EPEL for EL6 x86_64
baseurl=http://172.16.0.1/fedora-epel/6/x86_64/
gpgcheck=0

[root@CentOS7 yum.repos.d]# yum repolist 
已加载插件:fastestmirror, langpacks
Repository epel is listed more than once in the configuration
base                                                      | 4.0 kB  00:00:00     
epel                                                      | 4.3 kB  00:00:00     
(1/5): base/                                              | 219 kB  00:00:00     
(2/5): epel/                                              | 149 kB  00:00:00     
(3/5): epel/                                              | 702 kB  00:00:00     
(4/5): base/                                              | 4.6 MB  00:00:00     
(5/5): epel/                                              | 5.7 MB  00:00:00     
Loading mirror speeds from cached hostfile
源标识                                  源名称                              状态
base                            Base Repo on 172.16.0.1                     6,575
epel                           Fedora EPEL for EL6 x86_64                   11,768
repolist: 18,343
演示:配置自定义yum仓库

yum的repo配置文件中可用的变量:

$releasever: 当前OS的发行版的主版本号;
$arch: 平台;
$basearch:基础平台;
$YUM0-$YUM9

http://mirrors.magedu.com/centos/$releasever/$basearch/os
(1) 挂载光盘至某目录,例如/media/cdrom
    # mount -r -t iso9660 /dev/cdrom /media/cdrom
(2) 创建配置文件
    [locate_cdrom]
    name=Locate Repo on cdrom
    baseurl=file:///media/cdrom
    gpgcheck=0
    enabled=1
配置光盘本地yum仓库

yum命令的用法:

yum的命令行选项:

    --nogpgcheck:禁止进行gpg check;
    -y: 自动回答为“yes”;
    -q:静默模式;
    --disablerepo=repoidglob:临时禁用此处指定的repo;
    --enablerepo=repoidglob:临时启用此处指定的repo;
    --noplugins:禁用所有插件;

安装程序包:   
  install package1 [package2] [...]         后接报名;默认安装最新版本的,只有安装较老版本才指定版本号
  reinstall package1 [package2] [...]  (重新安装)

升级程序包:
  update [package1] [package2] [...]
  downgrade package1 [package2] [...] (降级)         类似于:rpm -Fvh  --oldpackage PACKAGE_FILE ...

卸载程序包:
    remove | erase package1 [package2] [...]
    注意:其相关依赖包也会被卸载,谨慎使用;

清理本地缓存:
  clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

 构建缓存:   
   makecache     到各仓库去下载;但我们每次yum操作都会构建缓存,一般这个选项是没有必要的;

 显示程序包:
    list
        # yum list [all | glob_exp1] [glob_exp2] [...]
        # yum list {available|installed|updates|extras} [glob_exp1] [...]

显示程序包:list
# yum list [all | glob_exp1] [glob_exp2] [...]
# yum list {available|installed|updates|extras} [glob_exp1] [...]

all:显示所有
glob_exp:显示glob风格的通配符
    ~]# yum list  php*
available:仓库中有,但尚未安装的包
installed:已安装的包
updates:可以用于升级的包
extras:额外的包
obsoletes:过时的包
显示程序包:yum list

检查可用升级:
    check-update
    查询yum配置文件提供的repo信息

查看程序包information:
    info [...]  类似于rpm -qi 的结果

查看指定的特性(可以是某文件)是由哪个程序包所提供:
    provides | whatprovides feature1 [feature2] [...]  类似于:rpm -q --provides  , rpm -qf

演示:
[root@localhost ~]# rpm -q --provides tar
/bin/gtar
/bin/tar
bundled(gnulib)
tar = 2:1.26-29.el7
tar(x86-64) = 2:1.26-29.el7

[root@localhost ~]# yum provides tar
已加载插件:fastestmirror, langpacks
Repository epel is listed more than once in the configuration
Loading mirror speeds from cached hostfile
2:tar-1.23-13.el6.x86_64 : A GNU file archiving program
源    :base

2:tar-1.26-29.el7.x86_64 : A GNU file archiving program
源    :@anaconda

[root@localhost ~]# yum provides /usr/bin/tar
已加载插件:fastestmirror, langpacks
Repository epel is listed more than once in the configuration
Loading mirror speeds from cached hostfile
2:tar-1.26-29.el7.x86_64 : A GNU file archiving program
源    :@anaconda
匹配来源:
文件名    :/usr/bin/tar

[root@localhost ~]# rpm -qf /usr/bin/tar
tar-1.26-29.el7.x86_64
演示:yum provides

查看指定包所依赖的capabilities:
    deplist package1 [package2] [...]
    查询yum配置文件提供的repo信息

查看yum事务历史:
    history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
    list
    stats:统计数据
    summary:摘要信息
每一次yum命令执行都是启动一次yum的事务;
安装、升级、卸载都会启动一个事务

注意:不能并行安装rpm包

演示:
[root@localhost yum.repos.d]# yum history 
已加载插件:fastestmirror, langpacks
ID     | 登录用户                 | 日期和时间       | 操作           | 变更数 
-------------------------------------------------------------------------------
     1 | 系统 <空>                | 2015-12-10 16:44 | Install        | 1137   
警告:RPM 数据库已被非 yum 程序修改。
history list

[root@localhost yum.repos.d]# yum history stats
已加载插件:fastestmirror, langpacks
File        : //var/lib/yum/history/history-2015-12-10.sqlite
Size        : 1,353,728
事务: 1
开始于  : Thu Dec 10 16:44:14 2015
结束于    : Thu Dec 10 17:19:26 2015
计数      :
  NEVRAC :  1,137
  NEVRA  :  1,137
  NA     :  1,137
  NEVR   :  1,137
  RPM 数据库:  1,137
  yum 数据库:  1,137
history stats
查看yum事务历史:yum history

包组管理的相关命令:
    * groupinstall group1 [group2] [...]                #指定包组安装
    * groupupdate group1 [group2] [...]              #指定包组升级
    * grouplist [hidden] [groupwildcard] [...]      #显示包组列表
    * groupremove group1 [group2] [...]             #删除指定包组
    * groupinfo group1 [...]                                #显示指定包组信息

 创建yum仓库:

确保有createrepo程序
    [root@localhost yum.repos.d]# rpm -qa createrepo
    createrepo-0.9.9-23.el7.noarch

createrepo命令:
    createrepo [options] <directory>
        -g --groupfile <groupfile> # 指明那些包是一个包组
        --basedir #指明当前basedir的目录,默认当前目录;可以指明到父目录里;
    根据每个rpm包信息罗列堆积生成元数据文件及特征码文件;
        repomd.xml  所有repodata目录下文件的指纹信息
创建yum仓库:createrepo命令

源码包编译安装


什么时候会用到源码包编译安装呢?

  • 1、当找不到合适的rpm包时
  • 2、rpm包中的功能不符合需要时

开源程序源代码的获取:
 官方自建站点:
  apache.org (ASF)
  mariadb.org
  ...
 代码托管:
  SourceForge
  Github.com
  code.google.com

其实编译安装很难的:

  我们知道把源代码变成可执行的二进制文件需要以下过程:源代码 --> 预处理(预处理器) --> 编译(gcc) --> 汇编(汇编器) --> 链接 ;如果这些过程你都很熟练,那么相信LFS更难不到你;但我们绝大部分人都只能望而生畏。而且因为程序在开发中一般是使用模块开发的,所以文件中的代码之间,很可能存在跨文件依赖关系。所以为了方便用户能够自主编译源代码。所以有了项目管理器make;

  make项目管理器会自动调用预处理器对源代码进行预处理,后调用编译器进行编译,调用汇编器进行汇编,调用链接器进行链接。make针对每一个源代码都有一个配置文件(makefile),它会定义先安装那个包,调用什么编译器,程序安装路径,库文件安装路径等配置。由于每个用户的服务器环境和平台各不相同,所以make项目管理器利用configure脚本,具体流程是客户运行make提供的configure脚本传递程序安装路径,启动的特性等信息,configure能结合Makefile.in模版文件生产满足客户平台需求的makefile配置文件。

C、C++: make (configure --> Makefile.in(模板) --> makefile)

C代码编译安装三步骤:

./configure -> make -> make install

0、前提:提供开发工具及开发环境

  开发工具:make, gcc等

  开发环境:开发库,头文件

  通过“包组”提供开发组件     CentOS 6: "Development Tools", "Server Platform Development"

1、./configure

  (1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成makefile;

  (2) 检查依赖到的外部环境;如果此时依赖的外部环境没有配置,会导致报错;

  --help: 获取其支持使用的选项

--help: 获取其支持使用的选项
  选项分类:

Installation directories:                     
  --prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置;默认为/usr/local/
  --sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置

安装路径设定:Fine tuning of the installation directories
  --bindir=DIR            user executables [EPREFIX/bin]   #所有用户运行的命令安装的位置
  --sbindir=DIR           system admin executables [EPREFIX/sbin] #只有管理员运行的命令安装的位置
  --libexecdir=DIR        program executables [EPREFIX/libexec]  #不允许用户直接执行的命令安装位置
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]  #配置文件安装位置
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]  #共享数据目录位置
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var] #本地状态目录安装位置
  --libdir=DIR            object code libraries [EPREFIX/lib]   #库文件安装位置
  --includedir=DIR        C header files [PREFIX/include]       #头文件安装位置
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]

System types: 指明系统的类型;编译操作可以交叉编译的;
--build=BUILD     configure for building on BUILD [guessed]  
--host=HOST       cross-compile to build programs to run on HOST [BUILD]
--target=TARGET   configure for building compilers for TARGET [HOST]

Optional Features: 可选特性
  --disable-FEATURE    #禁用特性
  --enable-FEATURE[=ARG] #启动某特性
  注意:编译安装时有默认启动的特性,我们可以根据需要去选择;

  --enable-deflate   #压缩。压缩成一个包发过去,浏览器再解压再变大。快、带宽小,消耗cpu;对文本压缩效率高。
  --enable-expires   #到期。
  --enable-headers   #激活http的头
  --enable-modules=most    #激活大部分模块。激活apache大多数常用功能。
  --enable-so 
  --with-mpm=worker  #    apache两种模式之一。主进程,由线程对外服务。进程稳定安全,线程不稳定。并发可能大一些。
  --enable-rewrite   #伪静态

Optional Packages: 可选包
  --with-PACKAGE[=ARG]
  --without-PACKAGE

Some influential environment variables:  #环境变量
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  CPP         C preprocessor     #C的预处理器
apache:configure帮助列表

2、make

  根据makefile文件,构建应用程序;

3、make install

  相当于使用了mkdir,install命令, 把二进制文件、库文件、配置文件、帮助文件复制到对应的目录中;

configure和Makefile.in是程序员通过两个工具生成并提供给我们使用的
开发工具:
  autoconf: 生成configure脚本;
    autoconf和别的配置文件结合生产configure脚本
  automake:生成Makefile.in
    automake和别的配置文件结合生产Makefile.in文件
其他:configure和Makefile.in

 建议:安装前查看INSTALL,README

安装后的配置:

(1) 导出二进制程序目录至PATH环境变量中;
  编辑文件/etc/profile.d/NAME.sh
    export PATH=/PATH/TO/BIN:$PATH

(2) 导出库文件路径
  编辑/etc/ld.so.conf.d/NAME.conf
    添加新的库文件所在目录至此文件中;

  让系统重新生成缓存:ldconfig [-v]

(3) 导出头文件
  基于链接的方式实现:ln -sv 

(4) 导出帮助手册
  编辑/etc/man.config文件
    添加一个MANPATH
演示:编译安装apache2.2
1、更新yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

2、安装gcc
检查是否安装gcc:rpm -qa gcc
~]# yum install -y gcc

3、下载httpd服务,版本号2.4.18
wget http://olex.openlogic.com/package_versions/28219/download?package_version_id=105155&path=https%3A%2F%2Folex-secure.openlogic.com%2Fcontent%2Fopenlogic%2Fapache%2F2.4.18%2Fhttpd-2.4.18.tar.bz2

4、解压http源码包
[root@localhost tools]# tar xf httpd-2.4.18.tar.bz2 
[root@localhost tools]# cd  httpd-2.4.18/
[root@localhost httpd-2.4.18]# more INSTALL 

  APACHE INSTALLATION OVERVIEW

  Quick Start - Unix
  ------------------

  For complete installation documentation, see [ht]docs/manual/install.html or
  http://httpd.apache.org/docs/2.4/install.html

     $ ./configure --prefix=PREFIX
     $ make
     $ make install
     $ PREFIX/bin/apachectl start

5、通过./configure 跟特定需要的选择通过Makefile.in开始构建生产makefile文件
解决依赖问题:当然也可以直接安装开发包组来解决
yum install  -y pcre-devel apr*
[root@localhost httpd-2.4.18]# ./configure --prefix=/usr/local/apache2 --sysconfdir=/etc/httpd2

缺少依赖包报错:
configure: error: APR not found.
configure: error: pcre-config for libpcre not found

6、make通过生成的makefile文件调用预处理器,编译器等开始编译安装程序包
[root@localhost httpd-2.4.18]# make

7make install:把二进制文件、库文件、配置文件、帮助文件复制到对应的目录中
[root@localhost httpd-2.4.18]# make install

8、安装后的配置

    (1) 导出二进制程序目录至PATH环境变量中;
        编辑文件/etc/profile.d/NAME.sh
        [root@localhost httpd2]# cat /etc/profile.d/path_httpd.sh 
        export PATH=/usr/local/apache2/bin:$PATH
        [root@localhost httpd2]# . /etc/profile

    (2) 导出库文件路径
        编辑/etc/ld.so.conf.d/NAME.conf
            添加新的库文件所在目录至此文件中;
            
        让系统重新生成缓存:
            ldconfig [-v]  #要显示过程就加-v选项

        [root@localhost httpd-2.4.18]# cat /etc/ld.so.conf.d/apache2.conf 
        /usr/local/apache2/lib
        [root@localhost httpd-2.4.18]# ldconfig  

    (3) 导出头文件
        基于链接的方式实现,导出整个目录为一个连接文件;ln -s

        [root@localhost apache2]# ln -sv /usr/local/apache2/include/  /usr/include/http2
        ‘/usr/include/http2’ -> ‘/usr/local/apache2/include/’
        [root@localhost apache2]# ls -l /usr/include/http2
        lrwxrwxrwx. 1 root root 27 Dec 26 18:01 /usr/include/http2 -> /usr/local/apache2/include/


    (4) 导出帮助手册
        编辑/etc/man.config文件
            添加一个MANPATH

        [root@localhost apache2]# grep -B5 apache  /etc/man_db.conf 
        #MANDATORY_MANPATH             /usr/src/pvm3/man
        #
        MANDATORY_MANPATH            /usr/man
        MANDATORY_MANPATH            /usr/share/man
        MANDATORY_MANPATH            /usr/local/share/man
        MANDATORY_MANPATH            /usr/local/apache2/man
        [root@localhost man]# man httpd

9、启动服务

    [root@localhost man]# apachectl start
    AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
     
    [root@localhost man]# ss -lntp | grep 80
    LISTEN     0      128                      :::80                      :::*      users:(("httpd",23704,4),("httpd",23697,4),("httpd",23696,4),("httpd",23695,4))
演示:编译安装apache2.2

 收工~~~~~

 

转载请注明出处:http://www.cnblogs.com/jasperhsu/p/5078693.html

posted on 2015-12-26 19:19  徐长伟  阅读(291)  评论(0编辑  收藏  举报