【linux_笔记】Linux软件包管理


学习资源来自:www.magedu.com

学习记录过程中难免出现错误,示例仅供参考,大神请无视。。

软件包管理

=========== 前导 =============
应用程序:(程序的运行与底层的平台架构(Architecture)有着莫大的关系)

    不同方式编写的程序生产二进制可执行格式的方式不同:
        C语言(需要编译):源代码-->(编译)二进制格式
        脚本(不需要编译):解释器(二进制程序)
    
    高级语言与汇编语言开发程序的区别:
        汇编语言开发的程序在不同的cpu上运行需要进行移植方可运行
        高级语言开发的程序在不同的cpu上运行只需在对应cpu上进行编译后即可运行

    C程序生成过程:源代码-->编译(预编译、编译、汇编)-->链接-->运行
        程序 = 指令(不需要更改的内容)+数据(通常为初始化为零的变量)
            指令:需要芯片功能的支持(Powerpc中编译成二进制格式的C语言指令在x86上无法运行)
                CPU: 普通指令,特权指令
                指令集

        链接:(与调用的库建立关系)
            库的类别:静态,动态
            链接途径:
                静态链接:将程序与所使用的库一起封装打包成一个独立的可执行程序
                动态链接:链接共享库
        (指令和库通常都是只读的)

        

wKioL1ZpZxSDWvCFAABZ_IjNbS8958.png

    程序组成部分:
        二进制程序
        库(共享库 + 自身提供的库)
        配置文件(dir=/path/to/somewhere)
        帮助文件(man)

    linux目录结构:    
        /boot, /etc, /usr, /var, /dev, /lib, /tmp, /bin, /sbin, /proc, /sys, /mnt
        /media, /home, /root, /misc, /opt, /srv

        程序的安装路径:

            /usr(shared read only)/share/man   ――  (帮助文件)共享路径
            
            /etc, /bin, /sbin, /lib,
                存放系统启动就需要用到的程序,这些目录不能挂载额外的分区,且必须在根文件系统的分区上
                

            /usr/
                bin
                sbin
                lib        
                操作系统核心功能区(服务...),可以单独分区(建议独立分区)
                
            /usr/local
                bin
                sbin
                lib
                etc
                man
                独立于操作系统,第三方软件默认安装路径,可以独立分区(建议独立分区)

            /opt
                早先第三方软件安装目录
            
        /proc
        /sys
            伪文件系统,不能单独分区,默认为空;
        
        /dev: 设备,不能单独分区;
        (linux2.6内核之前,为保证不时之需,所有的设备文件都是预先提供的,根据文件识别设备无法实现。
         linux2.6内核以后引入udev机制)
            udev:能够利用内核所识别到的硬件信息,动态创建设备文件(按需创建)
        
        /home:家目录,可以独立分区
        
        /root: 管理员家目录,不能单独分区

        /var:存放日志、... (建议单独分区)

        /boot:存放内核,initrd(initramfs)...
            建议单独分区(可实现LVM――动态增减)

    操作系统启动过程:
        POST(加电自检-->BIOS(启动次序)-->bootloader(识别文件系统结构:ext2,ext3,xfs)-->内核

软件包管理器(本身是软件,不同的组织开发的格式不同)
    功能:将一个软件编译好的功能打包成一个文件(二进制程序,库文件,配置文件,帮助文件),
          生成数据库,追踪所安装的每一个文件
    
    软件包管理器的核心功能:
        1、制作软件包;
        2、安装、卸载、升级、查询、校验、数据库的重建、验正数据包等;

    主流发行版的软件包管理器:
        Redhat, SUSE: RPM (名称相同,实现方式有所不同)
            早期含义:Redhat Package Manager
            现在:RPM is Package Manager
        Debian: dpt

    软件包管理器常见问题:软件依赖关系
        
        依赖关系:X-->Y-->Z:安装X需先安装Y,安装Y需先安装Z,即安装X需先安装Z和Y
            
        解决方法:使用前端工具自行解决依赖关系
            前端工具:yum, apt-get(debian)
            后端工具:RPM, dpt
            (前端依赖于后端)

============ 实现 =============
软件包管理器:RPM
            
    rpm:
        rpm数据库:/var/lib/rpm(实现追踪、查询等功能)
        rpmbuild:创建rpm软件包

    rpm包:
        组成部分:主包 + 子包
            主包:bind-9.7.1-1.el5.i586.rpm
            子包:bind-libs-9.7.1-1.el5.i586.rpm
        命名格式:
            源码格式:bind-9.7.1.tar.gz    
            二进制格式:name-version-release.arch.rpm
            (rpm包制作者下载源程序,编译配置完成后,制作成rpm包)

                bind-major.minor.release(软件开发者)-release(rpm包制作者).arch.rpm
                主版本号(major):表示重大改进
                次版本号(minor):表示某个子功能发生重大变化
                发行号(release):表示修正了部分bug
                
                例如:    bind-9.7.1-1.noarch(与平台无关).rpm
                        bind-9.7.1-1.ppc(powerpc平台).rpm

    查看当前操作系统内核版本:uname -r
    查看平台版本:uname -a
        
    管理rpm包:

        1、安装
            rpm -i /PATH/TO/PACKAGE_FILE           /安装软件包
                -h: 以#显示安装进度;每个#表示2%;
                -v: 显示详细过程
                -vv: 显示更详细的安装过程
                --nodeps: 忽略依赖关系;
                --replacepkgs: 重新安装,替换原有安装;
                --force: 强行安装,可以实现重装或降级;
                --test:测试软件能否安装以及软件是否存在依赖关系(不安装软件)
                
            rpm -ivh /PATH/TO/PACKAGE_FILE      /常用命令
            rpm -ivh --replacekgs /PATH/TO/PACKAGE_FILE        /重装

        2、查询
            rpm -q PACKAGE_NAME: 查询指定的包是否已经安装
            rpm -qa : 查询已经安装的所有包

            rpm -qi PACKAGE_NAME: 查询指定包的说明信息;
            rpm -ql PACKAGE_NAME: 查询指定包安装后生成的文件列表;
            rpm -qc PACEAGE_NEME:查询指定包安装的配置文件;
            rpm -qd PACKAGE_NAME: 查询指定包安装的帮助文件;

            rpm -q --scripts PACKAGE_NAME: 查询指定包中包含的脚本
                (四类脚本:安装前、安装后、卸载前、卸载后)
                
            rpm -qf /path/to/somefile: 查询指定的文件是由哪个rpm包安装生成的;
                
            在rpm包尚未安装的情况下查询其说明信息以及安装后生成哪些文件的信息,可在选项中添加p
            常用操作:
                rpm -qpi /PATH/TO/PACKAGE_FILE        
                rpm -qpl
                    l: List
                    i: 软件包的信息;

        3、升级
            rpm -Uvh /PATH/TO/NEW_PACKAGE_FILE: 如果装有老版本的,则升级;否则,安装;
            rpm -Fvh /PATH/TO/NEW_PACKAGE_FILE:如果装有老版本的,则升级;否则,退出;
                --oldpackage: 降级
            
        4、卸载
            rpm -e PACKAGE_NAME        /有依赖关系的不允许卸载
                --nodeps            /强行卸载
            
        5、校验
            rpm -V PACKAGE_NAME
            
        6、重建数据库
            rpm
                --rebuilddb: 重建数据库(一定会重新建立);
                --initdb:初始化数据库,没有时建立,存在则不再建立;


        7、检验软件包来源合法性及软件包完整性;
            加密类型:对称,公钥,单向。
            rpm包加密方式:使用单向加密提取rpm包特征码,并通过私钥对特征码进行加密。
            检验方式:使用者以同样的加密方法获取rpm包特征码并与解密后的特征码进行比较检验。
            
            ls /etc/pki/rpm-gpg/
                RPM-GPG-KEY-redhat-release        //redhat公开的公钥

            rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release: 导入密钥文件
                
            rpm -K /PATH/TO/PACKAGE_FILE
                dsa, gpg: 验正来源合法性,也即验正签名;可以使用--nosignature,略过此项
                sha1, md5: 验正软件包完整性;可以使用--nodigest,略过此项
                
前端管理工具:yum

    半结构化的数据: XML(eXtended Mark Language), JSON

    yum仓库中的元数据文件包含的信息:
        primary.xml.gz
            当前仓库所有RPM包的列表;
            依赖关系;
            每个RPM安装生成的文件列表;
        filelists.xml.gz
            当前仓库中所有RPM包的所有文件列表;(实现快速查询)
        other.xml.gz
            额外信息,RPM包的修改日志等;
        repomd.xml
            记录primary,filelists,other文件的时间戳和校验和;
        comps*.xml: RPM包分组信息
        
    yum配置文件:/etc/yum.conf

    如何为yum定义repo文件:
        [Repo_ID]
        name=Description
        baseurl=            (repo的具体访问路径)
            ftp://
            http://
            file:///
        enabled={1|0}        (该仓库是否允许使用)
        gpgcheck={1|0}        (是否使用gpg机制验证软件包的合法性及完整性)
        gpgkey=                (gpgcheck=1时,用于指定gpg文件的具体位置)
    
    yum命令:yum [options] [command] [package ...]
    
        options:
            -y: 遇到安装提示信息,默认回答yes
            --nogpgcheck:不使用gpg机制
            
        command:
            list: 列表 ―― 支持glob(yum list all zsh*)
                all(默认)
                available:显示可用的,仓库中有但尚未安装的rpm包
                installed: 现实已经安装的rpm包
                updates: 显示可用的升级rpm包
            clean: 清理缓存
                [ packages | headers | metadata | dbcache | all ]
            repolist: 显示repo列表及其简要信息
                [ all | enabled | disabled ](默认enabled)
            install: 安装
                yum install PACKAGE_NAME
                yum list all php53*
                yum install php53-mysql
            localinstall:本地安装
                yum localinstall PACKAGE_NAME
            update: 升级
            update_to: 升级为指定版本
            remove|erase:卸载
            info: 显示指定包的简要说明信息;
            provides| whatprovides: 查看指定的文件或特性是由哪个包安装生成的;         
                yum provides /etc/inittab
            groupinfo
            grouplist
            groupinstall
            groupremove
            groupupdate

    光盘中的yum源文件:
        /media/cdrom/{Server,VT,Cluster,ClusterStorage}(redhat5)

        使用光盘创建yum仓库:示例:
        (/etc/yum.repos.d)
            cdrom.repo
                [Base]
                name=RHEL5 CDROM Server
                baseurl=file:///media/cdrom/Server
                enable=1
                gpgcheck=0
    
    如何自行创建yum仓库:
    (createrepo)
        yum install createrepo
        mkdir -pv /yum/VT
        cp /media/cdrom/VT/*.rpm /yum/VT/
        cd /yum/VT/
        ls
        cd /etc/yum.repos.d/
        vim cdrom.repo
            [VT]
            baseurl=file:///yum/VT
            ...
        yum repolist                /报错
        createrepo /yum/VT/            /自动创建repodata
        ls /yum/VT/
        yum clean all
        yum repolist
        //添加组信息
        cd /media/cdrom/VT/repodata/    
        ls
        cp comps-rhe15-vt.xml /root
        cd
        createrepo -g /root/comps-rhel15-vt.xml /yum/VT/

如何自行编译安装源程序

    自行编译安装源程序的原因:
        RPM包的制作过程:源程序-->编译-->二进制格式
            RPM包中的有些特性是在编译时选定的,如果编译时未选定此特性,将无法使用。此外,
            rpm包的版本常常落后于源码包,甚至落后很多,因此有时需要自行对软件包进行编译(定制)
        
    定制:手动编译安装源程序

    前提条件:需要有编译环境(开发环境),开发库,开发工具
        以c程序为例:
            c语言编译环境:gcc( GNU C Complier )

            make:项目管理工具,
                makefile:定义make按特定次序编译源程序文件中的源程序
        
            automake, --> makefile.in(判定如何编译)--> makefile
            autoconf, --> configure(配置当前程序如何编译)

            make install  (安装)

    编译安装的三步骤:(不同的源程序脚本使用格式略有不同)
        前提:准备开发环境(编译环境)-- redhat5需安装"Development Tools"和"Development Libralies"
        # tar                                            /解压源程序
        # cd                                            /进入解压目录
        # ./configure                                    /生成makefile
            --help                                        /获取脚本使用格式
            --prefix=/path/to/somewhere                    /指定软件安装路径
            --sysconfdir=/PATH/TO/CONFFILE_PATH            /指定配置文件路径
            --without                                    /禁用功能
            功能:
                1、让用户选定编译特性
                2、检查编译环境
                
        # make                                            /执行makefile

        # make install
        
        以tengine为例:
            # tar xf tengine-1.4.2.tar.gz
            # cd tengine-1.4.2
            # ./configure --prefix=/usr/local/tengine --conf-path=/etc/tengine/tengine.conf
            # make
            # make install
            # nginx                                        /系统查询不到
            # cd /usr/local/tengine/sbin/nginx
            # vim /etc/profile                            /修改环境变量
                    PATH=$PATH:/usr/local/...
            重开一个端口
            # echo $PATH
            # nginx                                        /执行成功
            # netstat -tnlp

    如果软件安装在非默认路径上,编译安装完软件包后,需要修改的配置信息:
        1、修改PATH环境变量,以便能够识别此程序的二进制文件路径
            1、修改/etc/profile文件
            2、在/etc/prifile.d/目录建立一个以.sh为名称后缀的文件,在里面定义export
                PATH=$PATH:/path/to/somewhere
        2、默认情况下,系统搜索库文件的路径为/lib, /usr/lib,因此,要增添额外搜寻路径
            在/etc/ld.so.conf.d/中创建以.conf为后缀名的文件,而后把要增添的路径写入文件中
            # ldconfig 重新搜寻库文件
                -v:显示重新搜寻库文件的过程
        3、头文件:输出给系统
            默认路径:/usr/include
            使用链接增添头文件搜寻路径:
                /usr/local/tengine/include/ /usr/include/
                两种方式:
                ln -s /usr/local/tengine/include/* /usr/include/ 或
                ln -s /usr/local/tengine/include /usr/include/tengine
        4、man文件路径:默认安装在--prefix指定的目录下的man目录
            解决方式:
            1、man -M /PATH/TO/MAN_DIR COMMAND
            2、在/etc/man.config中添加一条MANPATH
        

    netstat命令:
        -r:显示路由表
        -n:以数字方式显示
        
        -t:显示建立的tcp连接
        -u:显示utp连接
        -l:显示监听状态的连接
        -p:显示监听指定的套接字的进程的进程号及进程名
        -tnlp

        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
       

你可能感兴趣的:(yum,rpm,软件包管理,自行编译安装源程序)