linux软件包管理

一、包的基本概念

  最初只有.tar.gz的打包的源码文件,用户必须编译每个他想在GNU/Linux

  上运行的软件。用户们急需系统提供一种方法来管理这些安装在机器上的
  软件,当Debian诞生时,这样一个管理工具也就应运而生,它被命名为
  dpkg。从而著名的“package”概念第一次出现在GNU/Linux系统中,
  稍后Red Hat才开发自己的“rpm”包管理系统
  包的组成:
  二进制文件、库文件、配置文件、帮助文件
  程序包管理器:
  debian: deb文件, dpkg包管理器
  redhat: rpm文件, rpm包管理器
  rpm:Redhat Package Manager
  RPM Package Manager
  包的命名  
  源代码:name-VERSION.tar.gz|bz2|xzVERSION: major.minor.release 
  name-VERSION-release.arch.rpm
  例:bash-4.2.46-19.el7.x86_64.rpm
  VERSION: major.minor.release
  release:release.OS
  常见的arch:
  x86: i386, i486, i586, i686
  x86_64: x64, x86_64, amd64
  powerpc: ppc
  跟平台无关:noarch
  包的命名和工具
  包:分类和拆包
  Application-VERSION-ARCH.rpm: 主包
  Application-devel-VERSION-ARCH.rpm 开发子包
  Application-utils-VERSION-ARHC.rpm 其它子包
  Application-libs-VERSION-ARHC.rpm 其它子包
  包之间:可能存在依赖关系,甚至循环依赖
  解决依赖包管理工具:
  yum:rpm包管理器的前端工具
  apt:deb包管理器前端工具
  zypper:suse上的rpm前端管理工具
  dnf:Fedora 18+ rpm包管理器前端管理工具
  库文件
  
  查看二进制程序所依赖的库文件
  ldd /PATH/TO/BINARY_FILE
  管理及查看本机装载的库文件
  ldconfig 加载配置文件中指定的库文件
  /sbin/ldconfig –p 显示本机已经缓存的所有可用库文件名及文件路径
  映射关系
  配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
  缓存文件:/etc/ld.so.cache
  包管理器
  程序包管理器:
  功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而
  方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
  包文件组成 (每个包独有)
  RPM包内的文件
  RPM的元数据,如名称,版本,依赖性,描述等
  安装或卸载时运行的脚本
  数据库(公共):/var/lib/rpm
  程序包名称及版本
  依赖关系
  功能说明
  包安装后生成的各文件路径及校验码信息
  程序包的来源
  管理程序包的方式:
  使用包管理器:rpm
  使用前端工具:yum, dnf
  获取程序包的途径:
  (1) 系统发版的光盘或官方的服务器
  CentOS镜像:
  https://www.centos.org/download/
  http://mirrors.aliyun.com
  http://mirrors.sohu.com
  http://mirrors.163.com
  (2) 项目官方站点
  (3) 第三方组织:
  Fedora-EPEL:
  Extra Packages for Enterprise Linux
  Rpmforge:RHEL推荐,包很全
  搜索引擎:
  http://pkgs.org
  http://rpmfind.net
  http://rpm.pbone.net
  https://sourceforge.net/
  (4) 自己制作
  注意:第三方包建议要检查其合法性
  来源合法性,程序包的完整性
  二、rpm
  包安装
  [install-options]
  --test: 测试安装,但不真正执行安装,即dry run模式
  --nodeps:忽略依赖关系
  --replacepkgs | replacefiles
  --nosignature: 不检查来源合法性
  --nodigest:不检查包完整性
  --noscripts:不执行程序包脚本
  %pre: 安装前脚本 --nopre
  %post: 安装后脚本 --nopost
  %preun: 卸载前脚本 --nopreun
  %postun: 卸载后脚本 --nopostun
  包升级
  升级:
  rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
  rpm {-F|--freshen} [install-options] PACKAGE_FILE...
  upgrade:安装有旧版程序包,则“升级”
  如果不存在旧版程序包,则“安装”
  freshen:安装有旧版程序包,则“升级”
  如果不存在旧版程序包,则不执行升级操作
  rpm -Uvh PACKAGE_FILE ...
  rpm -Fvh PACKAGE_FILE ...
  --oldpackage:降级
  --force: 强制安装
  (1) 不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
  (2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文
  件不会直接覆盖老版本的配置文件,而把新版本文件重命名(FILENAME.rpmnew)后保留
  包查询
  rpm {-q|--query} [select-options] [query-options]
  [select-options]
  -a:所有包
  -f:查看指定的文件由哪个程序包安装生成
  -p rpmfile:针对尚未安装的程序包文件做查询操作
  --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
  --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
  rpm2cpio 包文件|cpio –itv 预览包内文件
  rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件
  [query-options]
  --changelog:查询rpm包的changelog
  -c:查询程序的配置文件
  -d:查询程序的文档
  -i:information
  -l:查看指定的程序包安装后生成的所有文件
  --scripts:程序包自带的脚本
  --provides:列出指定程序包所提供的CAPABILITY
  -R:查询指定的程序包所依赖的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 ...
  当包卸载时,对应的配置文件不会删除, 以FILENAME.rpmsave形式保留
  包校验
  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 -K|checksig rpmfile 检查包的完整性和签名
  rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
  CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7
  rpm -qa “gpg-pubkey*”
  rpm数据库
  数据库重建: /var/lib/rpm   
  rpm {--initdb|--rebuilddb} initdb: 初始化 如果事先不存在数据库,则新建之 否则,不执行任何操作 rebuilddb:重建已安装的包头的数据库索引目录
三、yum
  
  CentOS: yum, dnf
  YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依
  赖性,可在多个库之间定位软件包,up2date的替代工具
  yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据
  文件(放置于特定目录repodata下)
  文件服务器:
  http://
  https://
  ftp://
  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:意为随机挑选,默认值
  priority:按顺序访问
  cost= 默认为1000
  yum的repo配置文件中可用的变量:
  $releasever: 当前OS的发行版的主版本号
  $arch: 平台,i386,i486,i586,x86_64等
  $basearch:基础平台;i386, x86_64
  $YUM0-$YUM9:自定义变量
  示例:
  http://server/centos/$releasever/$basearch/
  http://server/centos/7/x86_64
  http://server/centos/6/i386
  yum源
  阿里云repo文件
  http://mirrors.aliyun.com/repo/
  CentOS系统的yum源
  阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
  清华大学:https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/
  EPEL的yum源
  阿里云:https://mirrors.aliyun.com/epel/$releasever/x86_64
  阿里巴巴开源软件
  https://opsx.alibaba.com/
  yum命令用法
  
  yum命令的用法:
  yum [options] [command] [package ...]
  显示仓库列表:
  yum repolist [all|enabled|disabled]
  显示程序包:
  yum list
  yum list [all | glob_exp1] [glob_exp2] [...]
  yum list {available|installed|updates} [glob_exp1] [...]
  安装程序包:
  yum install package1 [package2] [...]
  yum reinstall package1 [package2] [...] (重新安装)
  升级程序包:
  yum update [package1] [package2] [...]
  yum downgrade package1 [package2] [...] (降级)
  检查可用升级:
  yum check-update
  卸载程序包:
  yum remove | erase package1 [package2] 
  查看程序包information:
  yum info [...]
  查看指定的特性(可以是某文件)是由哪个程序包所提供:
  yum provides | whatprovides feature1 [feature2] [...]
  清理本地缓存:
  清除/var/cache/yum/$basearch/$releasever缓存
  yum clean [ packages | metadata | expire-cache | rpmdb | plugins |
  all ]
  构建缓存:
  yum makecache
  搜索:yum search string1 [string2] [...]
  以指定的关键字搜索程序包名及summary信息
  查看指定包所依赖的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 6
  yum history undo 6
  日志 :/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 [...]
四、编译安装  
  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:标准库
  实现:通过“包组”提供开发组件
  Development Tools
  Server Platform Development
  生产实践:(基于最小化安装的系统)
  yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel
  openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree screen lsof
  tcpdump wget ntpdate net-tools iotop bc zip unzip nfs-utils
  第一步:configure脚本
  选项:指定安装位置、指定启用的特性
  --help: 获取其支持使用的选项
  选项分类:
  安装路径设定:
  --prefix=/PATH:指定默认安装位置,默认为/usr/local/
  --sysconfdir=/PATH:配置文件安装位置
  System types:支持交叉编译 
 
  Optional Features: 可选特性
  --disable-FEATURE
  --enable-FEATURE[=ARG]  Optional Packages: 可选包
  --with-PACKAGE[=ARG] 依赖包
  --without-PACKAGE 禁用依赖关系 注意:通常被编译操作依赖的程序包,需要安装此程序包的“开发”组件, 其包名一般类似于name-devel-VERSION 第二步:make 第三步:make install
  安装后的配置:
  (1) 二进制程序目录导入至PATH环境变量中 编辑文件/etc/profile.d/NAME.sh export PATH=/PATH/TO/BIN:$PATH
  (2) 导入帮助手册 编辑/etc/man.config|man_db.conf文件 添加一个MANPATH 
posted @ 2019-06-11 14:17  菠萝丁  阅读(493)  评论(1编辑  收藏  举报