操作系统:CentOS 6.7 内核版本:2.6.32-573.el6.x86_64



程序编译概念


程序要在机器上运行,就需要编译,编译针对特定的OS平台和硬件平台,编译后的程序只能运行在特定的软硬平台上

    交叉编译:
        在测试机上针对其他平台进行程序编译

    编译过程:
        预编译 -> 编译 -> 汇编 -> 链接
            链接:生成库调用的头文件
            静态链接:程序文件本身集成所需调用的库文件
            动态链接:调用标准C库glibc,.so(share object)
                
            头文件:主要是记录程序调用库文件名,调用库参数特性...

    库:函数
            
        库调用:
        开发时的库调用:头文件         
        运行时的库调用:可执行二进制程序

        动态库调用默认查找路径配置文件:
            /etc/ld.so.conf
            /etc/ld.so.conf.d /*.conf
            一般建议在*.conf目录中配置链接库路径

            查看二进制程序所依赖的库文件:
                    如:ldd /bin/cat

            程序编译的本质:源代码 -> cpu指令集调用(汇编层面)     

    编译后的程序运行基础:
        os平台兼容
        硬件平台兼容
        同平台的情况下,在跨机器运行程序必须提供所依赖的库文件,否则无法运行
        

    程序的兼容性:       
        POSIX:可移植操作系统
        API兼容:则表示程序可跨平台编译
        ABI兼容:则表示编译后的程序可以跨平台运行


            
    程序组成:
        二进制程序:/bin,/sbin
        头文件:include,默认/usr/inlcude

        自身库:lib,默认存放在/lib,/lib64

        配置文件:conf,默认存放在/etc

        帮助文档:man文档,README,INFO等
    

        编译安装可以指定路径安装,若指定路径安装,则安装后需要配置好二进制和帮助文档的PATH环境变量,这样可以解决shell默认的的环境变量无法识别程序和文档路径
          


 包管理工具基础知识:


 

    包管理工具:rpm

        rpm(RedHat package manager)

        后更名为rmp(RPM is package manager)递归缩写

    包管理工具的基本功能
        打包
        安装
        查询
        卸载
        升级
        校验
        数据库管理

    前端管理器:yum/apt-get
        能够自动化处理程序安装的依赖关系

    依赖关系:
        循环依赖、版本依赖
        某些程序的运行依赖于其他程序,需要先安装所依赖的程序才能使用
    
    应用程序的命名方式:
        源代码:name-major.minor.release.tar.{gz|bz2|xz}

                    程序名-主版本号-次版本号-发行版本号

        rpm包:name-version-release.arch.rpm
            release:通常包含发行号、OS
            arch:架构
    
    程序安装方式:
        以源代码编译安装
        使用包管理器:rpm
        使用前端管理器:yum
        简单打包的二进制格式(相当于windows绿色软件)

    分包安装机制:
        将一个大程序按照功能使用分成几个不同的包,在程序安装时供用户选择安装

    包来源合法性校验:
        源程序:通过MD5码或sha1校验码验证
        rpm包:
            可靠的发行商
            完整性校验
            验证来源合法:公钥加密算法

    rpm包获取途径:
        1、发行商的光盘或站点服务器
               http://mirrors.163.com
               http://mirrors.sohu.com
               http://mirrors.aliyun.com
         2、rpmfind
               http://rpmfind.net
         3、rpmpbone
               http://rpm.pbone.net




rpm包管理器命令使用:


    安装:-i,--install
        rpm -ivh /path/to/rpm_package
            -v:显示安装信息
            -vv:显示更详细的安装信息
            -h:以井号显示安装进度
            --nodeps:忽略依赖关系(适用于卸载)
            --force:强行安装(适用于卸载)

[root@johnson's linux ~]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]


    重装:--replacepkgs
        rpm -ivh --replacepkgs /path/to/rpm_name

[root@johnson's linux ~]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]

   

    卸载:-e,--erase
        rmp -e package_name

[root@johnson's linux ~]# rpm -e zsh
[root@johnson's linux ~]#

        卸载成功不会返回信息,对linux而言,没有消息就是最好的消息
    

    升级:-U -F
        升级或安装:
        rpm -U /path/to/rpm_package
            只升级:(若不存在旧版本则不会执行)
            rpm -F /path/to/rpm_package
            通常搭配vh使用:
            rpm -Uvh|-Fvh /path/to/package

            注意:不要对内核执行升级操作
            不同内核版本可以共存,因此可执行安装操作,但不建议升级

查询:-q
    查询包是否已安装:
        rpm -q package_name

[root@johnson's linux ~]# rpm -q zsh
package zsh is not installed

    查询所有已安装的包:
        rpm -qa

[root@johnson's linux ~]# rpm -qa
gnome-packagekit-2.28.3-9.el6.x86_64
redhat-logos-60.0.14-12.el6.centos.noarch
gnome-python2-applet-2.28.0-5.el6.x86_64
dejavu-fonts-common-2.33-1.el6.noarch
gvfs-gphoto2-1.4.3-22.el6.x86_64
pciutils-3.1.10-4.el6.x86_64
plymouth-plugin-label-0.8.3-27.el6.centos.1.x86_64

......

            
    查询已安装包的简要说明:
        rpm -qi package_name

[root@johnson's linux ~]# rpm -qi zsh
Name        : zsh                          Relocations: (not relocatable)
Version     : 4.3.10                            Vendor: CentOS
Release     : 7.el6                         Build Date: Sun 24 Nov 2013 09:40:59 AM PST
Install Date: Sat 19 Mar 2016 07:06:37 AM PDT      Build Host: c6b9.bsys.dev.centos.org
Group       : System Environment/Shells     Source RPM: zsh-4.3.10-7.el6.src.rpm
Size        : 5009102                          License: BSD
Signature   : RSA/SHA1, Sun 24 Nov 2013 11:33:46 AM PST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
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@johnson's linux ~]#

          
    查询包安装后生成的文件:
          rpm -ql package_name

[root@johnson's linux ~]# rpm -ql zsh
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
/usr/lib64/zsh
/usr/lib64/zsh/4.3.10

......

        

    查询某文件是由那个包生成的:
        rpm -qf /path/to/file

[root@johnson's linux ~]# rpm -qf /bin/bash
bash-4.1.2-33.el6.x86_64

        

    查询包安装后生成的帮助文档:
        rpm -qd package_name

[root@johnson's linux ~]# rpm -qd zsh
/usr/share/doc/zsh-4.3.10/BUGS
/usr/share/doc/zsh-4.3.10/CONTRIBUTORS
/usr/share/doc/zsh-4.3.10/FAQ
/usr/share/doc/zsh-4.3.10/FEATURES
/usr/share/doc/zsh-4.3.10/LICENCE
/usr/share/doc/zsh-4.3.10/MACHINES
/usr/share/doc/zsh-4.3.10/NEWS

......

            
    查询包安装后生成的配置文件:
        rpm -qc package_name

    查询包相关的脚本:
        rpm -q --scripts
                    
        脚本分四类
            preinstall 安装前脚本
            postinstall 安装后脚本
            preuninstall 卸载前脚本
            postuninstall 卸载后脚本

查询未安装包的相关信息:-qp
    查询安装后会生成的的文件
        rpm -qpl package_name

[root@johnson's linux ~]# rpm -q zsh
package zsh is not installed  
[root@johnson's linux ~]# rpm -qpl zsh-4.3.10-7.el6.x86_64.rpm 
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
/usr/lib64/zsh

    查询包的简单描述信息:
        rpm -qpi package_name

        可搭配其选项使用,如-qp --scripts

    校验:检查安装后的文件是否被修改过
        rpm -V package_name
        同样的 。没有消息就是最好的消息,若返回,看注释       
        返回的注释信息:
            S file Size differs  大小
            M Mode differs (includes permissions and file type) 头文件
            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 能力改变了

    校验来源合法性和软件的完整性
        包完整性:单项加密机制(MD5|sha1..)
        来源合法性:公钥加密机制(RSA)
            rpm -K /path/to/packagefile
            rpm --checksig /path/to/package_file
                    --nosigeature:不检查来源合法性
                    --nodigest:不检查包完整性

[root@johnson's linux ~]# rpm -K zsh-4.3.10-7.el6.x86_64.rpm 
zsh-4.3.10-7.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

    导入密钥:
        rpm --import /path/to/gpg-key-file
        导入以后再做验证
        公钥文件文件路径/etc/pki/rpm-gpg

[root@johnson's linux ~]# ls /etc/pki/rpm-gpg
RPM-GPG-KEY-CentOS-6        RPM-GPG-KEY-CentOS-Security-6
RPM-GPG-KEY-CentOS-Debug-6  RPM-GPG-KEY-CentOS-Testing-6

       
    数据库
        位置:/var/lib/rpm       
        重建:
            rpm --initdb:初始化
                如果事先不存在一个数据库,则新建之
            rpm --rebuilddb 重建
                直接新建数据库,会覆盖原有库


包前端管理器:yum


    yum:
    程序包管理器前端工具,自动解决依赖关系

    yum仓库:repository
        通过文件服务提供rmp包,程序包安装后生成文件列表、依赖关系等元数据文件

    yum客户端:
        工作机制:
        1.读取yum配置文件,指定到可用的yum仓库        
        2.下载并缓存yum仓库中的元数据文件
        3.分析元数据,文件列表信息和依赖关系等
        3.根据分析结果执行具体操作

    yum的使用:配置yum仓库
        配置文件:配置可用的yum仓库和yum仓库的使用优先级别等
        配置文件路径:/etc/yum.conf /etc/yum.repos.d
        配置文件格式:两段组成
            [main]:主配置段
            [repo]:仓库配置段
        配置repo
            [repo_ID]仓库ID
            name=仓库命令
            baseurl=仓库访问路径
            enabled={1|0}仓库是否可用,1以代表可用
            gpgcheck={1|0}验证包来源的可靠性与完整性
            gpgkey=公钥地址(可以是本地,也可以是服务器路径)
            cost=定义仓库开销,默认为1000(数字越小优先级越高)

    yum的管理命令:
        列出所有可用的yum repo:
            yum repolist [all|enabled(默认)|disabled]    

[root@johnson's linux yum.repos.d]# yum repolist
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: mirrors.btte.net
 * extras: mirrors.btte.net
 * updates: mirrors.btte.net
local_base                                  | 4.0 kB     00:00 ... 
repo id                   repo name                          status
base                      CentOS-6 - Base                    6,575
extras                    CentOS-6 - Extras                     50
local_base                centos_DVD1                        6,518
updates                   CentOS-6 - Updates                 1,306
web_repo                  johnson's_web_repo                     3
repolist: 14,452

       
    清理缓存信息:
        yum clean [all|packeages|metadata|expire-cache(过期数据)
                
    显示yum仓库包列表:
        yum list [all|installed|available]
                
    查看yum命令历史:
        yum history

    显示包的详细信息:
        yum info package_nmae

[root@johnson's linux ~]# yum info zsh
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: mirrors.btte.net
 * extras: mirrors.btte.net
 * updates: mirrors.btte.net
Installed Packages
Name        : zsh
Arch        : x86_64
Version     : 4.3.10
Release     : 7.el6
Size        : 4.8 M
Repo        : installed
Summary     : A powerful interactive shell
URL         : http://zsh.sunsite.dk/
License     : BSD
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.

Available Packages
Name        : zsh
Arch        : x86_64
Version     : 4.3.11
Release     : 4.el6.centos.1
Size        : 2.2 M
Repo        : updates
Summary     : A powerful interactive shell
URL         : http://zsh.sunsite.dk/
License     : BSD
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.

          

     安装指定程序包:
        yum install package_nmae ...
        在包名中指定详细的的版本号可指定版本安装
            
    本地包安装:
        yum install [--nogpgcheck] /path/to/package
        注意:若不指定路径安装,开启了gpg检验,则可能无法安装

    重新安装指定程序包:
        yum reinstall package_nmae ...

    检测可更新包:
        yum check-update
            
    升级指定程序包:
        yum update package_nmae ...
            
    降级程序:
        yum downgrade package_nmae

    卸载包:(依赖包也会被卸载)
        yum erase package_nmae ...
        A依赖B,卸载B会把A也卸载

    列出所有包组:
        yum grouplist

    显示包组信息:
        yum groupinfo "group_name":
        包组名可能会有空格,所以要加引号
            
    安装包组:
        yum groupinstall "group_name"

    卸载包组:
        yum groupremove "group_name"

    搜索:
        yum search package_name
            
    查看指定包的依赖关系:
        yum deplist package_name
            
    构建缓存:(缓存仓库中最新可用的元数据)
        yum makecache

        
构建本地yum仓库:
    (1)利用本地系统镜像构建
        1.系统读取光盘,物理光驱或虚拟光驱读取都行,若是使用虚拟机,则直接指定镜像的路径即可
        2.挂载镜像:
            创建挂载目录:
                mkdir /media/dvd1          

            挂载:
                mount /dev/cdrom /media/dvd1
            配置yum repository:
                vim /etc/yum.repos.d/local_mirror.repo                  

[local_base]
name=centos_DVD1
baseurl=file:///media/dvd1
gpgcheck=0

        配置完成


    (2)若是利用网上收集的rpm包来构建,需用createrepo命令来构建元数据
        1.创建yum仓库文件夹并存放rpm包
        2.构建原仓库元数据:
            createrepo [options] directory
        3.配置yum repository

    (3)配置yum服务器,基于http/ftp....
        1.装好httpd服务器,启动http服务
        2.将rpm包放在/var/www/html目录下
        3.创建yum仓库元数据
        4.web测试

[root@johnson's linux ~]# ls /var/www/html/packages/
vim-minimal-7.2.411-1.8.el6.x86_64.rpm
zlib-1.2.3-29.el6.x86_64.rpm
zsh-4.3.10-7.el6.x86_64.rpm
[root@johnson's linux ~]# createrepo /var/www/html/packages/
Spawning worker 0 with 3 pkgs
Workers Finished
Gathering worker results

Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
[root@johnson's linux ~]# ls /var/www/html/packages/
repodata
vim-minimal-7.2.411-1.8.el6.x86_64.rpm
zlib-1.2.3-29.el6.x86_64.rpm
zsh-4.3.10-7.el6.x86_64.rpm
[root@johnson's linux ~]#

wKiom1btcOjhhR6ZAABYlwS9NlA999.png




源码程序包编译安装:



    源码类型:
        c,c++
        perl
        Python

    源码编译步骤:以nginx为例
        事先准备好编译环境,安装必要的开发环境,如开发包组:development tools,否则将会报错

        1.源码解压
            tar -xf /path/to/source_package

        2.cd到源码目录,当前目录执行./configure脚本
            注意:执行前请看相关文档或使用./configure --help来获得帮助
        option:
            --prefix安装路径
            --sysconfdir配置文件路径

[root@johnson's linux ~]# cd nginx-1.4.7
[root@johnson's linux nginx-1.4.7]# ls
auto     CHANGES.ru  configure  html     Makefile  objs    src
CHANGES  conf        contrib    LICENSE  man       README

        注意:不同程序所使用的命令选项可能不同,所以再次提醒,安装前务必要阅读相关文档

        3.执行make命令进行编译
        4.执行make install进行安装
    
    到此安装完成,下一步操作,配置环境变量
      

     在shell环境下,默认会有特定的一些环境变量,这些环境变量定义了:执行二进制程序时的查找路径,库调用的路径,帮助文档的默认查找路径...
     所以,不想每次执行程序、查看文档都要指定一次路径的话,那就需要手动配置了

        二进制程序路径配置:
            到profile.d目录下新建一个脚本
            脚本内容:
                #!/bin/bash
                PATH=/usr/local/nginx/sbin:$PATH
                export PATH

        头文件输出
            在/usr/include创建符号链接

                ln -sv /path/to/app_include /usr/include/ln_name      


        库文件输出
            到/etc/ld.so.conf.d目录下配置路径文件
            vim /etc/ld.so.conf.d/nginx.conf
            内容:lib的路径

        man文档
            配置/etc/man.config文档
            添加路径:MANPATH    /usr/local/man


若执行脚本报错,需要安装某个程序时,注意是要安装该程序的devel包(包名-devel)