软件包管理

软件包管理

软件运行和编译

  • ABI:应用程序二进制接口;直接给编译好的二进制使用;

    • windows与linux不兼容,
      windows: ELF
      linux: PE
    • 库级别的虚拟化:
      linux:WINE
      windows:Cywin
  • API:定义了和库之间的接口;编写应用程序时调用的函数之类的;

  • 编译
    程序源代码(.c) –> 预编译(.i) –> 编译(.a) –> 汇编(.o) –> 链接(.out)

    • 链接主要作用是把各模块之间相互作用的部分处理好使得各模块之间正确的衔接,分为静态链接和动态链接

      • 静态链接: .a
      • 动态链接: .so

包管理器

  • 二进制应用程序的组成部分:
    二进制文件、库文件、配置文件、帮助文件
  • 程序包管理器:
    debian:deb文件,dpkg包管理器
    redhat:rpm文件,rpm包管理器

包命名

  • 源代码
    name-VERSION.tar.gz|bz2|xz
    VERSION :major.minor.release

  • rpm包命名方式:
    name-VERSION-release.arch.rpm
    示例:bash-4.2.46-19.e17.x86_64.rpm

    • VERSION (软件的版本号):major.minor.release
    • release (编译者的版本号):release.OS
    • 常见的arch :
      x86 :i386,i486,i586,i686
      x8664 :x64,x8664,amd64
      powerpc:ppc
      跟平台无关:noarch

包分类

Application-VERSION-ARCH.rpm:主包
    Application-devel-VERSION-ARCH.rpm:开发子包
    Application-utils-VERSION-ARCH.rpm:其他子包
    Application-libs-VERSION-ARCH.rpm:其他子包

包之间

  • 包之间:可能存在依赖关系,甚至循环依赖
  • 解决依赖包管理工具:

    • yum:rpm包管理器的前端工具
      apt-get:deb包管理器前端工具
      zypper:suse上的rpm前端管理工具
      dnf:Fedora 18+ rpm包管理器前端管理工具

库文件

  • 查看二进制程序所依赖的库文件
    ldd /PATH/TO/BINARY_FILE
  • 管理及查看本机装载的库文件:ldconfig
    /sbin/ldconfig -g :显示本机已经缓存的所有可用库文件名及文件路径映射关系
    配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
    缓存文件:/etc/ld.so.cache

rpm包管理

CentOS系统上使用rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护、

  • 安装 (路径写全
    rpm {-i|–install} [install-options] PACKAGE_FILE …

    • -v:verblse显示指令执行过程
      -vv:详细显示指令执行过程,便于排错
      -h:hash,以#来表示安装进度
      rpm -ivh PACKAGE_FILE…

    • [install-options]
      –test:测试安装,但不真正执行安装,即dry run模式
      –nodeps:忽略依赖关系
      –replacepkgs(覆盖安装) | repalacefiles
      –nosignature:不检查来源合法性
      –noscripts:不执行程序包脚本

      • %pre:安装前脚本; –nopre
        %post:安装后脚本; –nopost
        %preun:卸载前脚本; –nopreun
        %postun:卸载后脚本; –nopostun
  • 升级

    rpm {-U|–upgrade} [install-options] PACKAGEFILE …
    rpm {-F|–freshen} [install-options] PACKAGE
    FILE …

    • upgrade:安装有旧版程序包,则“升级”
      如果不存在旧版程序包,则“安装”
    • freshen:安装有旧版程序包,则“升级”
      如果不存在旧版程序包,则不执行升级操作
    • rpm -Uvh PACKAGEFILE…
      rpm -Fvh PACKAGE
      FILE…
      –oldpackage:降级(降级安装)
      –force:强制安装
      注:1、不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核
      2、如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;
      3、启动时默认启动内核文件;/boot/grub/groub.conf
  • 查询

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

    • [select-options]
      -a:所有包
      -f:查看指定的文件由哪个程序包安装生成;当删除某文件时也是可以查询(在/usr/bin/rpm中记录)
      -p rpmfile:针对尚未安装的程序包文件做查询操作;p后面是文件名,且是完整的文件名包括路径

    • rpm2cpio 包文件|cpio -itv 预览包内文件

    • rpm2cpio 包文件 |cpio -id “.conf” ; 释放包内的“.conf”文件

    • [query-options]
      -q PACKAGE_NAME…查询某包或某些包是否安装 (准确写包名
      –changelog:查询rpm包的cahngelog(改变的日志)
      -c: 查询程序的配置文件
      -d:查询程序的文档
      -i:information(信息)
      -l:查看指定的程序包安装后生成的所有文件
      –scripts:程序包自带的脚本

      CAPABILITY:跟包相关的关键字;
      –provides:列出指定程序包所提供的的CAPABILITY
      -R:查询指定的程序包所依赖的CAPABILITY
      –whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
      –whatrequires CAPABILITY:查询指定的CAPABILITY由哪个包所依赖

    • 常用的查询方法:
      -qf FILE; :查询某文件是由哪个包安装产生“/path/文件名”
      -ql PACKAGE;查询某包安装生成的文件列表包名
      -qc PACKAGE;查询某包安装完成后生成的所有配置文件 
      -qd PACKAGE;查询某包安装完成后生成的所有帮助文件
      -qi PACKAGE;查询某包的简要说明信息输入包名(只能针对于已安装的查询)
      -qpi PACKAGEFILE;查询尚未安装的包文件的相关信息,使用-p选项虚假;输入的是全路径,对于已安装的程序包也是显示not installed
      -qpl PACKAGE
      FILE,…可以查看未安装前的包中的文件;后跟文件路径
      -qa :列出所有的包

  • 包卸载包名

    rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts] [–notriggers] [–test] PACKAGE_NAME …

    • 简单使用:rpm -e PACKAGE_NAME…
      -nodeps :忽略依赖关系
      –test:测试卸载;dry-run模式;
      –allmatches:如果一个程序同时安装多个版本,则此选项一次全部卸载
      注:
      1.如果程序包的配置文件安装后曾被修改,卸载时,此文件通常不会被删除,而是被重命名(加后缀.rpmsave)后留存
      2.卸载时,如果就单个版本则写包名;如果有多个版本需要指定版本号
  • 包校验

    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 这一种指纹码的内容已经不同
      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

    • 程序包的合法性验证:

      • 来源性验证:RSA: 由我们信任的制作者提供;依赖于制作者的数字签名,签名是作者使用自己的私钥加密程序包的特性码进行的;
      • 完整性验证:SHA256:包未被二次修改;完整性校验成功,依赖于制作者提供的程序特征码;
    • 验证其光盘中程序包的来源及完整性(没有安装公钥的情况下任何检查都是NOT OK)
      先导入合法的KEY文件:rpm –import /path/to/RPM-GPG-KEY-FILE;示例:rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6;
      验证:rpm -K|–checksing rpmfile ;检查的包的完整性和签名(文件名
      -nosignature:不检查来源合法性
      -nodigest:不检查完整性
  • rpm数据库

    • /var/lib/rpm
      rpm {–initdb|–rebuilddb}
      initdb :初始化;如果事先不存在数据库,则新建;否则,不执行任何操作
      rebuilddb:无论当前数据存在与否,都会直接重建此库;构建的数据库存放在/var/lib/rpm当中;

yum

  • yum:rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具;
    yum的工作原理:在客户端上先存在yum源(repodata的父目录),在客户端上执行yum命令;首先在客户端上的缓存yum元数据(/var/cache/yum/$basearch/$releasever),然后yum仓库(yum包和元数据)中下载相应的yum包进行安装,安装完成后删除yum包;

    • 文件服务器:
      ftp:// 
      http://
      file://
      yum仓库:yum包和元数据
  • yum客户端配置文件
    /etc/yum.conf:为所有仓库提供公共配置
    /etc/yum.repos.d/*.repo:为仓库的指向提供配置

    • 仓库指向的定义:
      [repositoryID] 仓库的名称
      name=Some name for this repository
      baseurl=url://path/to/repository
      enabled={1|0}
      gpgcheck={1|0}
      gpgkey=URL (本地公钥路径、磁盘公钥路径)
      enablegroups={1|0};包组
      failovermethod={roundrobin | priority} ; roundrobin:意为随机挑选,默认值;priority:按顺序访问
      cost= 默认为1000越小优先级越高

    • yum的repo配置文件中可用的变量:
      $releasever:当前OS的发行版的主版本号
      $arch :平台,i386、i486、i586、x8664等
      $basearch :基础平台;i386,x86
      64
      $YUMO-$YUM9:自定义变量

    • yum-config-manager
      yum-config-manager –disable “仓库名” ;禁用仓库
      yum-config-manager –disable “仓库名” ;禁用仓库

    生成172.16.0.1cobblerksmirrorCentOS-X-x8664.repo
    yum-config-manager –add-rego=http://172.16.0.1/cobbler/ks_mirror/7/

  • yum命令

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

    • yum命令的用法:
      yum [options] [command] [package …]

    • 显示仓库列表:
      yum repolist [all | enabled | disabled]
    • 显示程序包
      yum list
      yum list [all | globexp1] [globexp2] […]
      yum list {available | installed | updates} [glob_exp1] […]
    • yum install 全部安装
      yum install package1 安装指定的安装包package1
      yum groupinstall group1 安装程序组group1

    • 升级
      yum update 全部更新
      yum update package1 更新指定程序包package1
      yum upgrade package1 升级指定程序包package1
      yum groupupdate group1 升级程序组group1
      yum downgrade package1 更新指定程序包package1;(降级)

    • 检查可用升级:
      yum check-update 检查可更新的程序

    • 删除程序
      yum remove | erase package1 删除程序包package1
      yum groupremove group1 删除程序组group1

    • 查看程序包information
      yum info […]

    • 查看指定的特性(可以是某文件)是由哪个程序包所提供:
      yum provides | whatprovides feature1 [feature2] […]

    • 清除本地缓存(清除/var/cache/yum/$basearch/$releasever缓存)
      yum clean [ packages | metadata | expire-cacherpmdb | plugins | all ]
      当配置文件路径发生变化时,需要清除缓存

    • 构建缓存:
      yum makecache

    • 搜索:
      以指定的关键字搜索程序包名及summary信息
      yum search string1 [ string2 ] […]

    • 查看指定包所依赖的capabilities:
      yum deplist package1 [package2] […]

    • 查看yum事务历史
      yum history [info | list | packages-list | packages-info | summary | addon-info | redo | undo| rollback | new | sync | stats ]
      yum history
      yum history info #;查询历史中编号为#的操作
      yum history unfo #;撤销编号为#的操作

    • 日志:/var/log/yum.log

    • 安装及升级本地程序包:
      yum localinstall rpmfile1 [rpmfile2] […]
      (用install替代)
      yum localupdate rpmfile1 [rpmfile2] […]
      (用update替代)

    • 包组管理的相关命令:
      yum groupinstall group1 [group2] […]
      yum groupupdate group1 [group2] […]
      yum grouplist [hidden] [groupwildcard] […]
      yum groupremove group1 [group2] […]
      yum groupinfo group1 […]

    • 系统盘yum仓库

      • 系统安装光盘作为本地yum仓库

        1. 挂载光盘至某目录, 

          例如:/media/cdrom

          #mount /dev/cdrom /media/cdrom

        2. 创建配置文件

          [CentOS7]

          name=

          baseurl=

          gpgcheck=

          enabled=

    • 创建yum仓库:
      createrepo [options] <directory>

程序包编译安装

  • 程序包编译安装:
    Application-VERSION-release.src.rpm –>安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装
  • 源代码–>预处理–>编译–>汇编–>链接–>执行
  • 源代码组织格式:

    • 多文件:文件中的代码之间,很可能存在跨文件依赖关系
    • C、C++:make项目管理器
      configure –> Makefile.in –> makefile
    • java:maven
  • C语言源代码编译安装三步骤:

    1. ./configure
      (1)通过选项传递参数,指定启用特性、安装路径等;执
      行时会参考用户的指定以及makefile.in文件生成makefile
      (2)检查依赖到的外部环境,如依赖的软件包
    2. make 
      根据makefile文件,构建应用程序
    3. make install
      复制文件到相应路径
  • 开发工具:

    • autoconf:生成configure脚本
      automake:生成Makefile.in
      注意:安装前查看INSTALL,README
  • 开源程序源代码的获取:

    • 官方自建站点:
      apache.org (ASF:Apache Software Foundation)
      mariadb.org
    • 代码托管:
      SourceForge.net
      Github.com
      code.google.com
      c/c++编译器: gcc (GNU C Complier)
  • 编译C源代码:

    • 准备:提供开发工具及开发环境

      • 开发工具:make, gcc等
        开发环境:开发库,头文件
        glibc:标准库
    • 实现:通过“包组”提供开发组件

      • CentOS 6:Development Tools 、 Server Platform Development
        CentOS 7:Development Tools 、 Development and Creative Workstation
    • 第一步:configure脚本

      • 选项:指定安装位置、指定启用的特性
        –help:获取其支持使用的选项
      • 选项分类:

        1. 安装路径设定:
          –prefix=/PATH:指定默认安装位置,默认为/usr/local/
          –sysconfdir=/PATH:配置文件安装位置
        2. System types:支持交叉编译
        3. Optional Features:可选特性
          –disable-FEATURE
          –enable-FEATURE[=ARG]
        4. Optional Packages:可选包
          –with-PACKAGE[=ARG],依赖包
          –without-PACKAGE,禁用依赖关系
    • 第二步:make

    • 第三步:make install
  • 安装后的配置:

    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|man_db.conf文件
      添加一个MANPATH

原创文章,作者:s,如若转载,请注明出处:http://www.178linux.com/73841

(0)
ss
上一篇 2017-04-21 16:38
下一篇 2017-04-22

相关推荐

  • 逻辑卷

    一、作业 1、创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/test目录,且默认有acl挂载选项 2、写一个脚本,完成如下功能: (1) 列出当前系统识别到的所有磁盘设备 (2) 如磁盘数量为1,则显示其空间使用信息 否则,则显示最后一个磁盘上的空间使用信息 3、创建一个可用…

    Linux干货 2016-08-30
  • N25第七周RAID LV 概述及示例,swap创建,read 特殊用法以及bash脚本示例

    1、创建一个10G分区,并格式为ext4文件系统; (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl; (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; mke2fs -t ext4 -b 2048 …

    Linux干货 2017-01-04
  • 压缩及归档工具

    常用的有这些: compress/uncompress: .Z gzip/gunzip: .gz bzip2/bunzip2: .bz2 xz/unxz: .xz zip/unzip tar, cpio 现在分别介绍他们的用法: 1、gzip/gunzip/zcat  .gz           &…

    系统运维 2016-09-19
  • linux分区管理工具—fdisk

    一、关于为什么要分区       (1)为了数据的安全:当文件系统只有一个分区时,如果遇到分区需要格式化的情况,则硬盘里的数据无法保留,而如果提前对硬盘做了分区那么就可以很好地额解决这个问题;       (2)为了提升效率:硬盘(这里单指机械硬盘)分为外圈和…

    Linux干货 2016-03-12
  • 设计模式(七)组合模式Composite(结构型)

    1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面。 例子1:就是多级树形菜单。 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象。我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象。客户端代码必须区别对象简单对象和容器对象,而实际上大多数情况下用…

    Linux干货 2015-07-01
  • 网络理论基础

    一、网络概述   1、什么是网络     网络就是通过有线或无线技术将各种硬件设备连接起来进行数据传输的一种方式。   2、网络的分类     根据距离范围可以将网络划分为局域网和广域网。       局域网:传输距离较近,传输速率快。     &n…

    Linux干货 2016-01-11

评论列表(1条)

  • renjin
    renjin 2017-04-28 11:11

    对rpm包管理与yum的配置和使用展开的详细的介绍,内容写的很不错,排版也很好,加油,加油