linux笔记 第十一天

1、linux程序包的基础概念

2、RPM包管理详解

3、yum及yum使用方式

4、yum使用进阶及源代码编译安装


一、linux程序包的基础概念


    1、linux OS上的安装包都遵循GPL/BSD/Apache开源协定,并在互联网以源代码形式公开,这些源代码是由C\C++\Perl开发的。使用源代码安装过程需经(预处理--编译--汇编--链接)。程序员在开发某程序时很难基于硬件来实现,所以在程序员和硬件之间添加了操作系统(内核kernel)对硬件接口统一封装,而内核也是有程序员来开发的,故有一部分人开发内核,一分部人开发应用程序;程序员在开发内核时还需要调用库文件及相关的功能模块来实现。

硬件--内核--库(功能模块(函数名、参数类型))--程序员

库也是一个程序,无执行入口,不能独立运行,只能被能独立运行的程序调用时执行。库也是程序员开发出来的源代码,源代码是不能用来执行的,需要编译成二进制格式才能被调用。

应用程序员:开发环境API(依赖于头文件、库文件(开发库、运行库)),

终端用户:应用程序(编译完成)依赖于:静态编译、动态编译(dll、so(共享库))、库(运行库)

源代码:终端用户安装源程序需要编译(x86_64上编译不能再i386上运行反过来可以,编译环境不同)

   

     2、程序包的组成格式:

        二进制程序 :/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin

        库文件(开发库和运行库):/lib64 /usr/lib64 ,/usr/local/lib64

        配置文件:/etc,/usr/local/APP/etc或conf目录

        帮助文件:/usr/share/man,/usr/local/share/man,/usr/local/APP/man

        帮助文件:man,info,doc:README,INSTALL,Changelog

        ldd:(print shared library dependencies)显示共享库的依赖关系 如:ldd /bin/ls 查看ls             依赖那些库,

    

    3、程序包管理器包含:

        1、数据库 (程序名及版本号、依赖关系、功能性说明、安装生成的各文件路劲及校验码)

        2、程序的组成清单(文件清单、安装卸载时运行的脚本)

        功能:将编译好的程序打包成一个或几个文件,可用来实现安装、升级、卸载查询等功能。


    4、应用程序的命名格式:

        源代码:name-version.tar.{gz|bz2|xz}  ;version:major.minor,release

                name-maior.minjor.release.tar.gz  如:bash-4.2.3.tar.gz

    5、程序包管理器

        Debian:dpkg,后缀为.deb

        RedHat:rpm (redhat package manager),后缀.rpm

        包管理器的功能:打包,安装,卸载,升级,校验,数据库管理

        程序包间的依赖关系非常复杂:dpkg--->apt-get,rpm--->yum 基于RPM解决依赖关系。


二、RPM包的安装和使用

    1、RPM包的命名格式:name-version-relase.arch.rpm (version:major.minor.release同源代码)release:指RPM包自身的发行号,与程序的修订号无关,仅指RPM包不同制作的修订,同时还包含适用的OS,比如:bash-4.2.3-3.centos5,arch:适用于的硬件平台,x86,i386,i486,,i586,i686;x86_64等,noarch于硬件平台无关,依赖于虚拟机运行,如:bash-4.2.3-3.centos5.x86_64.rpm.

    2、打包功能分包机制:

        核心包(主包):bash-4.2.3-3.centos7.x86_64.rpm

        子包:bash-a-4.2.3-3.centos7.x86_64.rpm,bash-devel-4.2.3-3.centos7.x86_64.rpm

    3、获取RPM包的途径

        (1、发行商(OS Vendor)的光盘或站点服务器

            镜像:http://mirrors.163.com ,http://mirrors.sohu.com

        (2、项目的官网:源代码、RPM包

        (3、第三方机构或个人 http//:rpmfind.net ,http://rpm.pbone.net

    4、RPM包的合法性验证:包制作者制作完成之后会在包上附加数字签名。

            来源合法性:

            包的完整性:        

            包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特性码,附加原始数据后面。

            验正过程:

                前提:必须有可靠机制获取到包制作者的公钥;

                1、使用制作者的公钥解密加密的特征码,能解密则意味着来源合法;

                2、使用与制作者同样的意向加密算法提取原始数据的特征码,并与解密出来的特征作比对,相同,则意味着完整性没问题;

    5、RPM包管理器的常用使用场景:

       (1) 安装程序包:rpm [option] /path/to/package_file(包名)

            -i安装,-v显示过程,-h显示安装进度,组合使用-ivh,--test:仅测试是否可以安装,-vv

            如果依赖其他包:1、解决依赖关系 2、忽略依赖关系--nodeps(能装上,但无法运行)

            重新安装:--replacepkgs,如果原有的配置文件作了修改,很有可能不执行替换,而是将应该安装生成的配置文件重命名为.rpmnew。

       (2)卸载程序包:rpm [option] package_name,-e:erase

            如果被其他包所依赖:1、将依赖于此包的所有包一并卸载,2、忽略依赖关系,能卸载但依赖此包的程序包会运行不正常。如果包的配置文件安装后被修改过,卸载时此文件不会被卸载,而是重命名并保留,如:warning: /etc/zprofile saved as /etc/zprofile.rpmsave

       (3)升级程序包:新版本替换老版本 rpm [option] /path/to/package_file (包名)

            1、升级或安装( -U 组合-Uvh) 2、纯升级( -F 组合 -Fvh),升级后版本冲突等,--force强制升级,注意:不应该对内核执行升级操作,而安装;系统允许多内核并存

    6、查询操作

       (1、查询某包是否安装: rpm -q package_name… ,如:rpm -q php sql

       (2、查询所有已经安装的包:rpm -qa ,按条件过滤 如:rpm -qa |grep "^php"

       (3、查询包的描述信息:rpm -qi package_name  如:rpm -qi zsh

       (4、查询包生成了哪些文件:rpm -ql package_name 如:rpm -ql zsh | less

            查询生成哪些配置文件 rpm -qc package_name

            查询生成哪些帮助文件 rpm -qd package_name

            查询生成哪些脚本文件 rpm -q --scripts package_name 

            (脚本有4类:安装前脚本preinstall,安装后脚本postinstall,

                        卸载前脚本preuninstall, 卸载后脚本postuninstall)

       (5、查询某文件是由哪个包安装生成的:rpm -qf /path/to/some_file(文件路劲)

       (6、对尚未安装的包执行查询 rpm [-qpl|-qpd|-qpi|-qpc] /path/to/package_file(包名)

       (7、rpm -V zsh 校验:用于检查包安装后生成的文件属性是否发生变化,某属性无变化显示.

            例如:rpm -V vim-common 结果为:S.5....T.  c /etc/vimrc,表示/etc/vimrc发生变化。变化说明:S表示文件大小变化、M权限或文件类型发生变化、5表示md5发生变化、D版本号发生变化、L路径变化、U用户发生变化、G组发生变化、T时间变化、P能力发生变化。

                       S file Size differs

                       M Mode differs (includes permissions and file type)

                       5 digest (formerly MD5 sum) differs

                       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

   7、rpm包来源合法性及完整性检验:前提:在当前系统上导入包的制作者的公钥

        导入:rpm --import /path/to/key_file

        # rpm -qa gpg-pubkey*   显示所有已经导入的gpg格式的公钥

        # rpm -qi gpg-pubkey-NAME  显示密钥的详细信息

                检查包:安装过程中会自动执行

        手动检查:rpm -K /path/to/package_file或rpm --checksig /path/to/package_file             不检查包完整性:rpm -K --nodigest 

                            不检查来源合法性:rpm -K --nosignature

    8、数据库重建:数据库目录:/var/lib/rpm

            重建:rpm --initdb:初始化,如果事先没有库,会新建一个;如果有,则不重建

                  rpm --rebuilddb:重建,直接重建,覆盖原有的数据库。

三、YUM (Yellowdog update Modifier)

    1、yum是C/S架构,yum repository(yum仓库)包含数据(rpm包)和元数据(包名、版本信息、各包所包含的文件列表、依赖关系、包分组信息),centos5:xml,centos6\7:sqlite

    2、createrepo:制作yum仓库元数据的工具,

    3、yum客户端安装过程:

        第一步:从服务器获取仓库元数据,缓存于本地:/var/cach/yum

        第二步:安装程序包,yum客户端程序在本地分析元数据文件,并结合本地系统环境(已安                    装文件)做出要安装程序包的决策。

        第三步:获取程序包:根据决策联系yum仓库,下载各程序包缓存于本地后,一并进行安装。

    4、yum仓库:

        base库:通常为系统发行版光盘所提供的程序包

        updates库:

        extra库:

        epel库:

    5、使用yum机制:

        (1)确保有yum repo可用,文件服务器,repodata目录所在的父目录就是一个可用的仓库

            ftp://server/path/to/repository

            http://server/path/to/repository

            nfs://server/nfs_path

            file:///path/to/repository 如:file:///media/cdrom

          (2)yum客户端 提供repo配置文件,指明仓库访问路径及各种属性信息,一个或几个相关的仓库配置信息可保存为一个文件,文件名都以.repo结尾:/etc/repos.d

            主配置文件(中心配置文件):/etc/yum.conf 

            在.repo定义一个yum repo格式:

                【repoID】

                name=some name for this repos

                baseurl=file:///media/cdrom (必须是一个路径,repodata所在的父目录)

                enabled={0|1}

                gpgcheck={0|1} 如果是1需要个gpgkey这项来验证

                gpgkey=URL(指向key文件 如:/dev/cdrom/gpg-key-centos-6)

                mirrorlist=URL to a file(可以取代baseurl,yum仓库列表)

                cost{1..n}访问某仓库的开销,默认1000,越小越优先。

          (3)yum客户端命令的使用:

                1、列出所有可用的repo:yum repolist {enabled|disabled|all}

                2、列出rpm包:yum list {all|installed|available} ,yum list 包名(支持通配)

                3、查看包的描述信息:yum info 包名。如:yum info php-zts

                4、列出所有包组信息:yum grouplist

                5、显示包组的信息:组中包含的程序包列表:yum groupinfo "包组名"如:yum groupinfo "backup server",

CentOS6 跟开发相关的包组: "ServerPlatformDevelopment"、"Development Tool"、"Desktop Platform Development"

                6、清除缓存:yum clean {all|packages|metadate|expire-cache|rpmdp|plugins}

                7、安装程序包:yum install packages_name

                   重新安装:yum reinstall packages_name

                8、升级程序包:yum check-update:检查可用的升级包;

                               yum update package_name,可以指定版本号升级为指定的版本

                9、降级程序包:yum downgrade package_name 如高版本的不稳定,可以降级

                10、卸载:yum remove|erase package_name

                11、查询某文件是由哪个包安装生成的:yum whatprovides|provides /path/to/some

                12、安装包组:yum groupinstall “group name”

                13、卸载包组:yum groupremove "group name"   

                假设:从其他处获得一个rpm包,如果此包依赖于其他包(在仓库中)如何安装?

                    yum install /path/to/package_file

        练习:development tool组中有gcc,安装开发环境包组,确保如下命令能执行 #gcc --version


四、yum配置文件进阶及编译安装

       1、 解析:mirrors.sohu.com/centos/6/os/x86_64(6是一个连接,指向最新版本的链接如:6.5;利用主版本号(单数字)是为了在定义yum客户端配置文件时,能实现更好的通用效果,指定一个路径,无论以后如何更新都获取最新的)

        baseurl=http://mirrors.sohu.com/centos/$releasever/os/$basearch


2、yum配置文件中可用的四个变量

        $releasever: 程序的版本,对Yum而言指的是redhat-release版本;只替换为主                     版本号,如RedHat 6.5,则替换为6; 

        $arch: 系统架构

        $basearch: 系统基本架构,如i686,i586等的基本架构为i386;

        $uuid: 

        $YUM0-9: 在系统中定义的环境变量,可以在yum中使用;

        

3、获取当前系统相应变量替换结果的办法:

        # python

        Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) 

        [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2

        Type "help", "copyright", "credits" or "license" for more information.

        >>> import yum,pprint

        >>> yb = yum.YumBase()

        >>> pprint.pprint(yb.conf.yumvar,width=1)

        Loaded plugins: fastestmirror, refresh-packagekit

        {'arch': 'ia32e',

         'basearch': 'x86_64',

         'releasever': '6',

        'uuid': 'ea249181-2f82-4c40-8c42-d51b3fce319a'}

        >>> quit()


yum支持插件


4、如何自建yum仓库:

        1、如何自建基于光盘镜像的yum repo

        2、自建提供yum仓库的中心服务器ftp, http, nfs

        以http为例,步骤:

                (1) 安装httpd程序,并启动服务

                # rpm -ivh httpd- 或者 # yum install httpd

                启动服务# service httpd start  # chkconfig httpd on

                (2) httpd的文档根目录为/var/www/html:创建子目录,存放某相关的所有rpm包

        (3) 为仓库生成元数据文件,以使能够作为仓库使用

    # rpm -ivh createrepo- 或者# yum install createrepo

    # createrepo /path/to/rpm_repo/(createrepo不能使用时需要先安装此命令)

                    #ss -tnl 或者 #netstat -tnl 确保80端口listen状态

                (4) 配置yum客户端使用此仓库即可,在html下创建不同的目录,就是不同的仓库。

                    如:[base]

                        name=server repo

                        baseurl=http://192.168.100.1/zbbix(默认网站路径/var/www/html)

                        enable=1,gpgcheck=0


5、编译安装源代码包:依赖于开发环境

    (1)程序源码:可能由c/c++、perl、python开发,他们的编译安装都一样,每个制作好的rpm包都是编译过的。假如一个程序有20个功能,编译的时候由分包机制分成不同的包,主包6个功能,分包A2个功能,分包B4个功能,那剩下的8个功能编译者认为没用就没有编程成二进制格式打包成rpm格式,如果我们恰好要用到,就不得不自己编译安装源代码。编译安装完了卸载的时候很繁琐,不知道生成了哪些配置文件,所有在编译安装的时候最好指定一个预先设置好的目录。

    开源应用程序:自建站点 apache, ASF、mysql、drbd

    代码托管:SourceForge、github.com、code.google.com

    编译工具:gcc、gnu c complier、gcc-c++


    (2)源代码的组织格式:通常是多文件形式方便管理源代码,但是编译的时候比较困难,因为文件中的代码有依赖关系很难确定先编译哪个,所以为了简化使用项目管理工具--make.(项目管理工具make(gcc))

        例如:项目有50个文件,项目的制作者利用make工具为项目梳理,为make提供一个配置文件,这个文件中保存了make如何去调用gcc,以什么顺序去编译这50个文件;而项目梳理也是一个很繁琐的过程,于是出现一个工具能帮助make动态生成一个配置文件(aotomake对代码分析后生成一个配置文件)


autoconf: 生成编译环境检查及编译功能配置脚本,生成configure

automake: Makefile.in --> makefile


    (3)编译源程序的步骤:

        # tar xf testapp-version.tar.{xz|bz2|gz}

        # cd testapp-version

        # ./configure 检查环境 (还需通过许多选项指定编译特性)

        # make 编译源程序      

        # make install 将编译好的源程序安装到指定的目录

        

编译示例:#yum grouplist 确保Development tools,Server Platform Developmen已经安装

          #yum install pcre-devel 

          #tar xf nginx-1.4.7.tar.gz 

          #cd /nginx-1.4.7(有configure脚本)

          #./configure

        

     (4) ./configure脚本的使用:

            1、获取帮助  ./configure --help

            2、较通用的一些选项

                安装路径相关:

                    --prefix=/path/to/somewhere: 指定安装路径

                    --sysconfdir=/path/to/somewhere: 指定配置文件安装路径

                指定启用/禁用的特性

                    --enable-FEATURE: 例如--enable-fpm

                    --disable-FEATURE: 例如--disable-socket

                指定所依赖的功能、程序或文件

                    --with-FUNCTION[=/path/to/somewhere]

                    --without-FUNCTION


     (5)安装后的配置:


        程序运行

            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


        程序开发:如果其它应用程序依赖此程序的开发环境,或针对此程序做二次开发

            1、导出库文件

            第一步:指定让系统搜索定制的路径

            编辑/etc/ld.so.conf.d/APPNAME.conf

            一行一个库文件路径


            第二步:触发系统重新搜索所有的库文件并生成缓存

            # ldconfig -v


            2、导出头文件

            /usr/local/nginx/include


            系统找头文件的路径是:/usr/include


            导出方式:创建链接进行

            ln -sv /usr/local/nginx/include /usr/include/nginx

            

你可能感兴趣的:(源代码,linux程序)