20170802 软件包管理

作者: 哈喽别样 | 来源:发表于2017-08-06 15:42 被阅读61次

    目录

    • 软件运行环境介绍
    • 包管理器
    • rpm 包管理器的使用
    • yum rpm包管理器前端工具的使用
    • 编译安装

    一、软件运行环境

    • ABI(Application Binary Interface) 导致不同系统的文件不兼容,linux遵循ELF标准,Windows遵循PE标准

    • API(Application Programming Interface)是编程使用的统一接口,linux遵循POSIX标准

    • 程序从源代码转变为二进制可执行文件经历的一般过程:
      程序源代码--->预处理--->编译--->汇编--->链接

    • 链接将各个模块之间相互引用部分处理好,使各个模块之间能够正确衔接,分为静态链接动态链接

      • 静态链接 libxxx.a

        • 把程序对应的依赖库复制一份到包
        • 嵌入程序包
        • 升级难,需重新编译
        • 占用较多空间,迁移容易
      • 动态链接 libxxx.so

        • 只把依赖加做一个动态链接
        • 连接指向
        • 占用较少空间,升级方便
    • 系统开发语言:C,C++
      应用开发语言:Java,Python,Go

    二、包管理器

    (一)包的分类、命名、管理

    • 二进制应用程序组成:
      二进制文件、库文件、配置文件、帮助文件

    • 程序包管理器:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作

      • dpkg包管理器:Debian,文件格式.deb
      • rpm包管理器:Redhat,文件格式.rpm
    • 源代码包命令格式:name-VERSION.tar.gz|bz2|xz

    • rpm包命名格式:name-VERSION-release.arch.rpm

    • 将软件包拆分成几个包,便于管理、按需安装

      • Application-VERSION-ARCH.rpm 主包
      • Application-devel-VERSION-ARCH.rpm 开发子包
      • Application-utils-VERSION-ARHC.rpm 工具子包
      • Application-libs-VERSION-ARHC.rpm 库子包

    (二)包依赖

    • 包之间可能存在依赖关系,解决包依赖的管理工具

      • yum: rpm包管理前端工具
      • apt-get: deb包管理前端工具
    • ldd 查看二进制程序依赖的库文件,如ldd /bin/cat

    • ldconfig 加载库文件
      /sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路径映射关系

    • 配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
      缓存文件:/etc/ld.so.cache

    (三)rpm包基本知识

    • rpm包文件组成:

      • rpm包内的应用程序
      • rpm包元数据:名称、版本、依赖性、描述等
      • 安装、卸载时运行的脚本
    • 数据库/var/lib/rpm包含:

      • 程序包名称及版本
      • 依赖关系
      • 功能说明
      • 包安装后生成的各文件路径及校验码信息
    • 获取程序包的途径

    三、rpm 包管理器

    (一)rpm 包安装

    • 语法:rpm {-i|--install} [install-options] PACKAGE_FILE…

    • 选项:

    -i                              //安装
    -v                              //显示安装过程
    -vv                             //显示详细过程
    -h                              //以#符号显示执行进度
    --test                          //测试安装,但不真正执行安装
    --nodeps                        //忽略依赖关系
    --replacepkgs| replacefiles     //覆盖安装
    --nosignature                   //不检查来源合法性
    --nodigest                      //不检查包完整性
    --noscripts                     //不执行程序包脚本
    
    • 实验:安装tree软件包,显示安装过程

    (二)rpm 包升级

    • 语法:
    rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
    rpm {-F|--freshen} [install-options] PACKAGE_FILE...
    //U和F的区别:当存在旧程序,都执行升级;当不存在旧程序,U选项执行安装,F选项跳过
    
    • 选项
    --oldpackage        //降级
    --force             //强制安装
    
    • 注意:
      1、内核可以多版本并存,故不推荐对内核进行升级操作,直接安装新版本即可
      2、若原程序的配置文件有修改,升级后将不覆盖旧配置文件,新配置文件以增加后缀.rpmnew方式存在

    • 实验:升级tree程序

    (三)rpm 包查询

    • 语法:rpm {-q|--query} [select-options] [query-options]

    • 选项:

    // select-options
    -a                           //所有包
    -f                           //查看指定的文件由哪个程序包安装生成
    -p rpmfile                   //针对尚未安装的程序包文件做查询操作
    --whatprovides CAPABILITY    //查询指定的CAPABILITY由哪个包所提供
    --whatrequires CAPABILITY    //查询指定的CAPABILITY被哪个包所依赖
    
    // query-options
    --changelog                  //查询rpm包的changelog
    -c                           //查询程序的配置文件
    -d                           //查询程序的文档
    -i                           //information
    -l                           //查看指定的程序包安装后生成的所有文件
    --scripts                    //程序包自带的脚本
    --provides                   //列出指定程序包所提供的CAPABILITY
    -R                           //查询指定的程序包所依赖的CAPABILITY
    
    • 实验:
      1.查看/bin/grep文件由哪个包生成
      2.查看光盘下zlib文件的详细信息

    3.查询grep程序的配置文件、文档


    (四)rpm 包删除

    • 语法:rpm {-e|--erase} [options] PACKAGE_NAME ...

    • 选项:

    --allmatches     //删除匹配包名的所有版本程序包
    --nodeps         //忽略依赖关系
    --noscripts      //不执行程序包脚本
    --notriggers     //不执行触发器脚本
    --test           //测试删除,不实际删除
    
    • 实验:卸载tree程序

    (五)rpm 包校验

    • 包校验:将本地文件信息与rpm数据库中包文件的元数据相比较

    • 语法:rpm {-V|--verify} [select-options] [verify-options]

    • 选项:

    // select-options
    select-options 选项同rpm查询中的相应选项
    
    // verify-options
    --nodeps       //不校验包依赖
    --nodigest     //不校验包完整性
    --nofiles      //不校验包文件属性
    --noscripts    //不执行校验脚本
    --nosignature  //不校验来源合法性
    
    • 包完整性验证加密算法:SHA256;来源合法性验证:RSA
      验证包文件完整性和签名:rpm -K|checksig rpmfile

    • 加密方式:

      • 对称加密:加密、解密使用同一秘钥
      • 非对称加密:秘钥成对,公钥对外公开,私钥不能公开
    • 导入公钥:rpm --import PathToGPGKeys

    • 光盘根目录有公钥:以RPM-GPG-KEY开头的文件,如CentOS 7光盘根目录的RPM-GPG-KEY-CentOS-7文件

    • 查看当前导入的公钥:rpm -qa "gpg-pubkey*"

    • 实验:校验vim-common包,有报警提示,导入公钥后再次校验成功进行

    四、yum rpm 包管理器前端工具

    • yum (yellowdog update modifier)可以解决包之间的依赖性问题,可在多个库之间定位软件包

    • yum设计为C/S架构,服务器端储存包文件和包文件的元数据信息,客户端执行rpm包管理操作时通过缓存包文件元数据信息解决包依赖性问题,并进行相关操作

    • 服务器通信协议:http://,https://,ftp://,file://

    (一)yum客户端配置

    • 配置文件路径:
      /etc/yum.conf 所有仓库的通用配置
      /etc/yum.repos.d/*.repo 仓库指向配置

    • *.repo仓库指向配置文件格式

    [repositoryID]     //每个仓库唯一的标识符,一个单词
    name=the description of the repository       //简要介绍
    baseurl=url://the path to the repository     //仓库内repodata目录所在的父目录
    enabled={1|0}       //是否使用此仓库
    gpgcheck={1|0}     //是否检查签名
    gpgkey=url         //公钥的地址
    
    • 配置文件可以使用的变量名

      • $releasever: 当前OS的发行版的主版本号
      • $arch: 平台,i386,i486,i586,x86_64等
      • $basearch:基础平台,i386, x86_64
    • yum-config-manager yum配置管理工具

    yum-config-manager --enable repo_name      //启用仓库
    yum-config-manager --disable repo_name     //禁用仓库
    
    • 实验:建立一个阿里云的yum配置文件,文件名aliyun.repo,仓库ID命名为aliyun,检查签名
      实现:建立配置文件/etc/yum.repos.d/aliyun.repo,文件内容如下:
    [aliyun]
    name=the repository of aliyun
    baseurl=https://mirrors.aliyun.com/centos/$releasever/os/x86_64
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/centos/$releasever/os/x86_64/RPM-GPG-KEY-CentOS-7
    

    (二)yum 命令使用

    • 语法: yum [options] [command] [package ...]

    • 显示yum仓库列表 yum repolist

    yum repolist all          //列出所有仓库列表
    yum repolist enalbed      //列出所有启用的仓库列表,默认
    yum repolist disabled     //列出所有未启用的仓库列表
    

    实验:列出所有启用的仓库

    • 显示程序包 yum list
    yum list all           //列出所有可获得和已安装的包
    yum list glob_expr     //列出所有符合通配符的包
    yum list available     //列出所有可以安装的包
    yum list installed     //列出所有已安装的包
    yum list updates       //列出所有有更新的包
    
    • 实验:列出所有以gp开头的包


    最右侧一列可以看到,前三个包以@开头表明已安装,anaconda表明为安装系统时安装,之后的包未有安装,安装包仓库为aliyun。

    • 安装 yum install
    yum install package1 [package2]...       //安装包
    yum reinstall package1 [package2]...     //重新安装包
    
    • 升级 yum update [package1]...
    yum update             //升级所有已安装的包
    yum update package     //升级package包
    
    • 检查可用升级 yum check-update

    • 卸载 yum remove|erase package1 [package2]...

    • 查看程序包详细信息 yum info package1

    • 查看指定特性由哪个程序包提供 yum provides|whatprovides feature

    • 清除本地缓存 yum clean all

    • 构建本地缓存 yum makecache

    • 以指定字符串搜索程序包和概要描述yum search string

    • 列出package包的依赖和提供这些依赖的程序包,yum deplist package

    • 实验:yum安装、卸载、查询软件包:

    1.查看screen包的详细信息

    2.安装screen包

    3.列出screen包的依赖信息

    4.卸载screen

    • 列出yum历史yum history
    yum history info 6    //查看第6条历史的信息
    yum history undo 6    //撤销第6条历史的操作
    yum history redo 6    //重做第6条历史的操作
    
    • 实验:yum history的使用:

    1.查询yum历史

    2.查询第6条历史的详细信息,发现是安装telnet

    3.撤销第6条历史的操作,使用undo命令,结果为卸载Telnet

    • 包组管理
    yum groupinstall group1 [group2] [...]    //包组安装
    yum groupupdate group1 [group2] [...]     //包组升级
    yum grouplist [groupwildcard] [...]       //按照通配符列出匹配包组
    yum groupremove group1 [group2] [...]     //包组卸载
    yum groupinfo group1 [...]                //显示包组信息
    
    • yum 选项
    --nogpgcheck                 //禁止进行gpgcheck
    -y                           //自动回答为"yes",适于脚本
    -q                           //静默模式,往往和y选项配合使用
    --disablerepo=repoidglob     //临时禁用此处指定的repo
    --enablerepo=repoidglob      //临时启用此处指定的repo
    --noplugins                  //禁用所有插件
    
    • 实验:静默安装telnet.x86_64包

    注意:-y和-q选项必须分开才能同时发挥作用

    五、编译安装

    (一)C语言源代码编译安装步骤

    1. configure
      configure脚本通过参数选项指定安装路径、启用功能等,以用户指定、以makefile.in文件为模板并检查依赖的外部环境,最终生成Makefile文件
    2. make
      make命令依据Makefile文件将源代码文件转换成为应用程序
    3. make install
      make install命令将文件复制到指定目录
    • 注意:安装前查询源代码目录的README和INSTALL文件

    (二)编译安装前准备

    • 源代码获取:官方网站、代码托管网站

    • 配置开发工具和开发环境
      开发工具:make, gcc等
      开发环境:开发库,头文件等

    • 实现:安装开发组件包组
      yum groupinstall "Development tools"

    (三)编译安装过程

    第一步,configure脚本选项配置
    • 选项:
    --prefix=/PATH             //指定安装位置,默认为/usr/local
    --sysconfdir=/PATH         //指定配置文件安装位置
    --disable-feature          //指定启用特性
    --enable-feature[=arg]     //指定禁用特性
    
    • 注意:执行configure脚本报错信息中的程序包依赖问题,往往是缺少该程序的开发组件,程序包名一般格式为name-devel-VERSION
    第二步,make命令
    第三步,make install命令
    • 可以将第二步和第三步合并,命令为make && make install
    第四步,安装后配置
    • 二进制程序目录导入环境变量
    echo 'export PATH=/path/to/bin:$PATH' > /etc/profile.d/httpd22.sh
    //将二进制程序添加到PATH变量头部
    . /etc/profile.d/httpd22.sh
    //设置生效
    
    • 导入帮助手册
      编辑/etc/man.config(CentOS 6)或者man_db.conf(CentOS 7)配置文件,添加一条MANPATH(CentOS 6)或MANDATORY_MANPATH(CentOS 7)条目指向帮助手册路径

    (四)实验:在CentOS 7上源代码编译安装apache 2.4

    1.系统默认安装了“apache 2.4”的旧版本,先卸载旧版本

    rpm -qa "httpd*"
    yum remove httpd
    

    2.安装开发工具包组

    yum grouplist
    yum groupinstall "Development tools"
    

    3.将源代码压缩包解压缩至目录/usr/local/src,并且进入解压缩的目录内

    tar xvf httpd-2.4.27.tar.bz2 -C /usr/local/src/
    cd /usr/local/src/httpd-2.4.27/
    

    4.解压缩的源代码目录下有README和INSTALL说明文件可在安装时查询,此时目录下尚未存在Makefile文件,运行带用户指定参数的configure脚本,会以用户指定设置以Makefile.in为模板文件生成Makefile,同时检查用户环境的依赖问题

    ls
    ./configure --prefix=/app/httpd24 --enable-so --enable-ssl
    

    5.执行configure脚本后往往会报错,根据错误提示安装相应包,一般为带devel后缀的开发包,再执行configure脚本。通常执行configure脚本时会多次报错,根据提示安装各类开发包后,最终会成功执行。如本实验一共出现四次错误提示,分别为APR not found,APR-util not found,pcre-config for libpcre not found,mod_ssl configure:error,yum分别安装apr-devel,apr-util-devel,pcre-devel,openssl-devel包。

    yum install apr-devel          //报错APR not found,安装apr-devel
    ./configure --prefix=/app/httpd24 --enable-so --enable-ssl     //再次执行configure脚本
    
    yum install apr-util-devel     //报错APR-util not found,安装apr-util-devel
    ./configure --prefix=/app/httpd24 --enable-so --enable-ssll    //再次执行configure脚本
    
    yum install pcre-devel         //报错pcre-config for libpcre not found,安装pcre-devel
    ./configure --prefix=/app/httpd24 --enable-so --enable-ssll    //再次执行configure脚本
    
    yum install openssl-devel      //报错mod_ssl configure:error,安装openssl-devel
    ./configure --prefix=/app/httpd24 --enable-so --enable-ssll    //再次执行configure脚本
    

    6.最终成功执行configure脚本

    7.执行make命令和make install命令,成功结果如下

    make & make install
    

    8.安装完成后,进行相关配置,将二进制目录添加到PATH变量中

    echo 'export PATH="/app/httpd24/bin:$PATH"'>/etc/profile.d/httpd24.sh
    . /etc/profile.d/httpd24.sh
    

    9.导入帮助手册,在/etc/man_db.conf文件,添加新行MANDATORY_MANPATH /app/httpd24/man,并更新mandb数据库

    vim /etc/man_db.conf
    mandb
    

    10.开启httpd服务,查看80端口是否已经开启,如下图成功开启80端口,至此安装完毕。

    相关文章

      网友评论

        本文标题:20170802 软件包管理

        本文链接:https://www.haomeiwen.com/subject/xcgylxtx.html