软件包管理

软件包管理

软件运行和编译

  • 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)
上一篇 2017-04-21 16:38
下一篇 2017-04-22 15:14

相关推荐

  • 优云云监控:先定一个运维小目标,比方监控它10000台主机

    “想做世界最好是对的,但是最好先定一个能达到的小目标,比方说我先挣它一个亿。”,王首富云淡风轻地给各行各业提供了一个很好的Roadmap,包括我们运维。的确,如今数据中心的规模增长速度也已像一匹脱缰的野马,各地都频频建设起超大型数据中心。按工信部的定义,超大型是指规模大于等于一万个标准机架的数据中心,考虑到虚拟化技术的使用,实际上需要运维的主机规模很容易超过…

    系统运维 2016-12-05
  • linux中bash的基础特性和基本文件管理命令

    linux的文件管理类命令 linux系统下的涉及到目录管理命令,主要有 mkdir,rmdir linux系统下也会用到许多文件查看类命令,包括cat,tac,head,tail,more,less等 linux系统下涉及的文件管理类命令主要有cp,mv,rm 本节我们主要说明文件管理类命令的使用方法。 cp命令的使用方法 首先,cp这个命令的作用是可以复…

    Linux干货 2016-09-26
  • 编译安装Apache

    实验环境:CentOS 6 安装包版本:httpd-2.2.29.tar.bz2 一、安装前准备     (1)、获取httpd-2.2.29.tar.bz2安装包     (2)、准备开发工具,安装相应的包组 yum groupinstall -y&nbsp…

    Linux干货 2016-08-24
  • Linux的SOCKET编程详解

    1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message)、共享存储区…

    Linux干货 2015-04-10
  • Linux风水学

    Linux风水学童 有的没的说一说 说一个,到一个。想起哪个说哪个,说起哪个都不错。 对于接触过一点点Linux的风水学童的我来说,还在苦背天地玄黄,宇宙洪荒。虽然不懂是干什么的,但是心里总有个声音告诉我,这些鬼画符肯定有用。总有一天我能成为一个合格的Linux风水师,去某个员外家里施展堪舆之术被奉为上宾。 Linux流派大概   相对于目前的流派…

    2017-07-18
  • NFS,samba,vsftpd的基本使用

    一.NFS介绍 NFS(Network File System),全名叫做网络文件系统,是由SUN公司研发的。顾名思义,简单理解就是通过网络互联,将本地的文件系统共享出去,从而实现资源的共享,NFS监听在TCP的2049端口上。当涉及到主机之间的通信时,就会存在安全问题,于是为了安全考虑,主动提出请求的一方(客户端)需要提供一些基本信息来认证,这些信息是需要…

    Linux干货 2017-01-04

评论列表(1条)

  • renjin
    renjin 2017-04-28 11:11

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