Linux程序包管理

Linux程序包管理

  • API:Application Programming Interface

  • POSIX:Portable OS

    程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接

    静态编译:

    共享编译:.so

  • ABI:Application Binary Interface

    Windows与Linux不兼容

    • 库级别的虚拟化:
    • Linux: WINE
    • Windows: Cywin
  • 系统级开发
    + C
    + C++

  • 应用级开发
    + java
    + Python
    + php
    + perl
    + ruby

  • 二进制应用程序的组成部分:

    二进制文件、库文件、配置文件、帮助文件

    • 程序包管理器:
      • debian:deb, dpt
      • redhat: rpm, rpm
        • rpm: Redhat Package Manager
        • RPM is Package Manager
          + Gentoo
          + Archlinux
  • 源代码:name-VERSION.tar.gz

    VERSION: major.minor.release

  • rpm包命名方式:

    name-VERSION-release.arch.rpm

    • VERSION: major.minor.release

    • release.arch:

      • release:release.OS
    • zlib-1.2.7-13.el7.i686.rpm

    • 常见的arch:

      • x86: i386, i486, i586, i686
      • x86_64: x64, x86_64, amd64
      • powerpc: ppc
      • 跟平台无关:noarch
    • testapp: 拆包

    • testapp-VERSION-ARCH.rpm: 主包

    • testapp-devel-VERSION-ARCH.rpm:支包

    • testapp-testing-VERSION-ARHC.rpm

    • 包之间:存在依赖关系
      X, Y, Z

      yum:rpm包管理器的前端工具;

      apt-get:deb包管理器前端工具;

      zypper: suse上的rpm前端管理工具;

      dnf: Fedora 22+ rpm包管理器前端管理工具;

  • 查看二进制程序所依赖的库文件:

    ldd /PATH/TO/BINARY_FILE
    
  • 管理及查看本机装载的库文件:

    ldconfig
    	/sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路径映射关系;
    		配置文件为:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
    		缓存文件:/etc/ld.so.cache
    
  • 程序包管理:

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

    • 1.成组成清单 (每个包独有)
      • 文件清单
      • 安装或卸载时运行的脚本
    • 2.数据库(公共)
      • 程序包名称及版本
      • 依赖关系;
      • 功能说明;
      • 安装生成的各文件的文件路径及校验码信息;
  • 管理程序包的方式:

    • 使用包管理器:rpm
    • 使用前端工具:yum, dnf
  • 获取程序包的途径:

    • 系统发版的光盘或官方的服务器;
      • CentOS镜像:
        http://mirrors.aliyun.com
        http://mirrors.sohu.com
        http://mirrors.163.com
      
    • 项目官方站点
    • 第三方组织:
      • Fedora-EPEL
      • 搜索引擎:
      http://pkgs.org
      http://rpmfind.net
      http://rpm.pbone.net
      
    • 自己制作
    • 建议:
      • 检查其合法性
      • 来源合法性;
      • 程序包的完整性;

CentOS系统上rpm命令管理程序包:

安装、卸载、升级、查询、校验、数据库维护

  • 安装:

    • 语法:rpm {-i|--install} [install-options] PACKAGE_FILE ...
       -v: verbose
      	  	-vv: 
      	  	-h: 以#显示程序包管理执行进度;每个#表示2%的进度
      
    • 常见用法:rpm -ivh PACKAGE_FILE ...
    [install-options]
    --test: 测试安装,但不真正执行安装过程;dry run模式;
    --nodeps:忽略依赖关系;
    --replacepkgs: 重新安装;
    
    --nosignature: 不检查来源合法性;
    --nodigest:不检查包完整性;
    
    --noscipts:不执行程序包脚本片断;
        %pre: 安装前脚本; --nopre
        %post: 安装后脚本; --nopost
        %preun: 卸载前脚本; --nopreun
        %postun: 卸载后脚本;  --nopostun
    
  • 升级:

    • 语法:
    rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
    rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
    
    • 常见用法
      upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”;
      freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作;
      
      rpm -Uvh PACKAGE_FILE ...
      rpm -Fvh PACKAGE_FILE ...
      
      --oldpackage:降级;
      --force: 强行升级;
    

tips:

不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核;

如果原程序包的配置文件安装后曾被修改,长级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;

  • 查询:rpm {-q|--query} [select-options] [query-options]

    • 常见用法
    [select-options]
    -a: 所有包
    -f: 查看指定的文件由哪个程序包安装生成
    -p /PATH/TO/PACKAGE_FILE:针对尚未安装的程序包文件做查询操作;
    
    --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;
    --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
    
    [query-options]
      --changelog:查询rpm包的changlog
      -c: 查询程序的配置文件
      -d: 查询程序的文档
      -i: information
      -l: 查看指定的程序包安装后生成的所有文件;
      --scripts:程序包自带的脚本片断
      -R: 查询指定的程序包所依赖的CAPABILITY;
      --provides: 列出指定程序包所提供的CAPABILITY;
    
    常见
      -qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
      -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...
      -qa
    
  • 卸载:语法:rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...

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

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
  • 包来源合法性验正及完整性验正:

    • 完整性验正:SHA256
    • 来源合法性验正:RSA
    • 公钥加密:
      • 对称加密:加密、解密使用同一密钥;
      • 非对称加密:密钥是成对儿的,
        • public key: 公钥,公开所有人
        • secret key: 私钥, 不能公开
    • 导入所需要公钥:
      rpm --import /PATH/FROM/GPG-PUBKEY-FILE
    

    CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7

  • 数据库重建:

    rpm {--initdb|--rebuilddb}
    
    • initdb: 初始化
      如果事先不存在数据库,则新建之;否则,不执行任何操作;
    • rebuilddb:重建
      无论当前存在与否,直接重新创建数据库;

Linux程序包管理(2)

  • CentOS: yum, dnf

  • URL: ftp://172.16.0.1/pub/

  • YUM: yellow dog, Yellowdog Update Modifier

  • yum repository: yum repo
    存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata);
    文件服务器:

    ftp://
    http://
    nfs://
    file:///
    
  • 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,意为随机挑选;
      Cost=
        默认为1000
      
  • yum命令的用法:yum [options] [command] [package ...]

    List of Commands:
      check          检查 RPM 数据库问题
      check-update   检查是否有可用的软件包更新
      clean          删除缓存数据
      deplist        列出软件包的依赖关系
      distribution-synchronization 已同步软件包到最新可用版本
      downgrade      降级软件包
      erase          从系统中移除一个或多个软件包
      fs             Acts on the filesystem data of the host, mainly for removing docs/lanuages for minimal hosts.
      fssnapshot     Creates filesystem snapshots, or lists/deletes current snapshots.
      groups         显示或使用、组信息
      history        显示或使用事务历史
      info           显示关于软件包或组的详细信息
      install        向系统中安装一个或多个软件包
      list           列出一个或一组软件包
      load-transaction 从文件名中加载一个已存事务
      makecache      创建元数据缓存
      provides       查找提供指定内容的软件包
      reinstall      覆盖安装软件包
      repo-pkgs      将一个源当作一个软件包组,这样我们就可以一次性安装/移除全部软件包。
      repolist       显示已配置的源
      search         在软件包详细信息中搜索指定字符串
      shell          运行交互式的 yum shell
      swap           Simple way to swap packages, instead of using shell
      update         更新系统中的一个或多个软件包
      update-minimal Works like upgrade, but goes to the 'newest' package match which fixes a problem that affects your system
      updateinfo     Acts on repository update information
      upgrade        更新软件包同时考虑软件包取代关系
      version        显示机器和/或可用的源版本。
      Options:
        -h, --help            显示此帮助消息并退出
        -t, --tolerant        忽略错误
        -C, --cacheonly       完全从系统缓存运行,不升级缓存
        -c [config file], --config=[config file]    
                              配置文件路径
        -R [minutes], --randomwait=[minutes]	      
                              命令最长等待时间
        -d [debug level], --debuglevel=[debug level]
      		                      调试输出级别
        --showduplicates      在 list/search 命令下,显示源里重复的条目
        -e [error level], --errorlevel=[error level]
                              错误输出级别
        --rpmverbosity=[debug level name]
                              RPM 调试输出级别
        -q, --quiet           静默执行
        -v, --verbose         详尽的操作过程
        -y, --assumeyes       回答全部问题为是
        --assumeno            回答全部问题为否
        --version             显示 Yum 版本然后退出
        --installroot=[path]  设置安装根目录
        --enablerepo=[repo]   启用一个或多个软件源(支持通配符)
        --disablerepo=[repo]  禁用一个或多个软件源(支持通配符)
        -x [package], --exclude=[package]
                              采用全名或通配符排除软件包
        --disableexcludes=[repo]
                              禁止从主配置,从源或者从任何位置排除
        --disableincludes=[repo]
                              disable includepkgs for a repo or for everything
        --obsoletes           更新时处理软件包取代关系
        --noplugins           禁用 Yum 插件
        --nogpgcheck          禁用 GPG 签名检查
        --disableplugin=[plugin]
                              禁用指定名称的插件
        --enableplugin=[plugin]
                              启用指定名称的插件
        --skip-broken         忽略存在依赖关系问题的软件包
        --color=COLOR         配置是否使用颜色
        --releasever=RELEASEVER
                              在 yum 配置和 repo 文件里设置 $releasever 的值
        --downloadonly        仅下载而不更新
        --downloaddir=DLDIR   指定一个其他文件夹用于保存软件包
        --setopt=SETOPTS      设置任意配置和源选项
        --bugfix              Include bugfix relevant packages, in updates
        --security            Include security relevant packages, in updates
        --advisory=ADVS, --advisories=ADVS
                              Include packages needed to fix the given advisory, in
                              updates
        --bzs=BZS             Include packages needed to fix the given BZ, in
                              updates
        --cves=CVES           Include packages needed to fix the given CVE, in
                              updates
        --sec-severity=SEVS, --secseverity=SEVS
                              Include security relevant packages matching the
                              severity, in updates
    
  • 显示仓库列表:

    repolist [all|enabled|disabled]
    
  • 显示程序包:

    list
    # yum list [all | glob_exp1] [glob_exp2] [...]
    # yum list {available|installed|updates} [glob_exp1] [...]
    
  • 安装程序包:

    install package1 [package2] [...]
    reinstall package1 [package2] [...]  (重新安装)
    
  • 升级程序包:

    update [package1] [package2] [...]
    downgrade package1 [package2] [...] (降级)
    
  • 检查可用升级:

    check-update
    
  • 卸载程序包:

    remove | erase package1 [package2] [...]
    
  • 查看程序包information:

    info [...]
    
  • 查看指定的特性(可以是某文件)是由哪个程序包所提供:

    provides | whatprovides feature1 [feature2] [...]
    
  • 清理本地缓存:

    clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
    
  • 构建缓存:

    makecache
    
  • 搜索:

    search string1 [string2] [...]
    

    以指定的关键字搜索程序包名及summary信息;

  • 查看指定包所依赖的capabilities:

    deplist package1 [package2] [...]
    
  • 查看yum事务历史:

    history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
    
  • 安装及升级本地程序包:

    * localinstall rpmfile1 [rpmfile2] [...]
        (maintained for legacy reasons only - use install)
    * localupdate rpmfile1 [rpmfile2] [...]
        (maintained for legacy reasons only - use update)
    
  • 包组管理的相关命令:

    * groupinstall group1 [group2] [...]
    * groupupdate group1 [group2] [...]
    * grouplist [hidden] [groupwildcard] [...]
    * groupremove group1 [group2] [...]
    * groupinfo group1 [...]
    
  • 如何使用光盘当作本地yum仓库:

    (1) 挂载光盘至某目录,例如/media/cdrom
    # mount -r -t iso9660 /dev/cdrom /media/cdrom
    (2) 创建配置文件
    [CentOS7]
    name=
    baseurl=
    gpgcheck=
    enabled=
    
  • yum的命令行选项:

    --nogpgcheck:禁止进行gpg check;
    -y: 自动回答为“yes”;
    -q:静默模式;
    --disablerepo=repoidglob:临时禁用此处指定的repo;
    --enablerepo=repoidglob:临时启用此处指定的repo;
    --noplugins:禁用所有插件;
    
  • yum的repo配置文件中可用的变量:

    $releasever: 当前OS的发行版的主版本号;
    $arch: 平台;
    $basearch:基础平台;
    $YUM0-$YUM9
    
    http://mirrors.magedu.com/centos/$releasever/$basearch/os
    
  • 创建yum仓库:

    createrepo [options] <directory>
    
  • 程序包编译安装:

testapp-VERSION-release.src.rpm --> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装;

源代码 --> 预处理 --> 编译(gcc) --> 汇编 --> 链接 --> 执行

  • 源代码组织格式:
    • 多文件:文件中的代码之间,很可能存在跨文件依赖关系;

    • C、C++: make (configure --> Makefile.in --> makefile)

      java: maven

    • C代码编译安装三步骤:

      • ./configure:

      通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成makefile;

      检查依赖到的外部环境;

      • make:

      根据makefile文件,构建应用程序;

      • make install
    • 开发工具:

      autoconf: 生成configure脚本
      automake:生成Makefile.in
      

      建议:安装前查看INSTALL,README

  • 开源程序源代码的获取:
    • 官方自建站点:
      • apache.org (ASF)
      • mariadb.org
      • ...
  • 代码托管:
    • SourceForge
    • Github.com
    • code.google.com
  • 编译C源代码:c/c++: gcc (GNU C Complier)
    • 前提:提供开发工具及开发环境

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

      glibc:标准库

      • 通过“包组”提供开发组件

      CentOS 6: "Development Tools", "Server Platform Development",

    • 第一步:configure脚本

      选项:指定安装位置、指定启用的特性

      --help: 获取其支持使用的选项

      • 选项分类:
      安装路径设定:
      --prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置;默认为/usr/local/
      --sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;
      
      System types:
      
      Optional Features: 可选特性
      --disable-FEATURE
      --enable-FEATURE[=ARG]
      
      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文件

      添加一个MANPATH