软件包管理

Posted 张飘扬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件包管理相关的知识,希望对你有一定的参考价值。

软件包管理


API(Application Programming Interface):应用程序编程接口,API兼容,意味着开发库兼容,因此源代码可跨平台

ABI(Application Binary Interface):应用程序二进制接口,ABI兼容,意味着编译后的程序可跨平台

库为函数提供头文件,是可执行的二进制程序,不能作为程序执行的入口,但可为其他程序所调用,是编译好的二进制程序
  动态链接库:各个程序所共享
  静态链接库:将库包含在程序的自身中,仅供本程序自身所使用

编译:将源代码翻译成特定cpu指令集的过程,此时的ABI库已经整合到程序中

应用程序跨平台应考虑:
  1、os平台:编译好的应用程序必须为特定平台所支持的版本
  2、硬件平台:应用程序为特定的cpu所支持,这是由于cpu指令集不一定相同

软件包的组成部分:
  二进制程序:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
  库文件:/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64通常到特定路径(前四个)下寻找
  配置文件:/etc配置文件无法共享,仅为当前一个程序所使用,无需额外配置
  帮助文件:man文件,info文件,README,INSTALL,Changelog
    --help:在程序内部存放,不需额外配置
    man Command:都某特定路径下查找以.gz结尾的同名压缩文件,通常查找路径/usr/share/man
  例如:安装nginx至/usr/local/nginx路径
    二进制程序:/usr/local/nginx/bin或/usr/local/sbin
      需PATH提供路径或用绝对路径执行程序
    自身库文件:/usr/local/nginx/lib或/usr/local/nginx/lib64
      通过调整/etc/ld.so.conf(主配置文件),或添加至/etc/ld.so.conf.d/*.conf或添加软链接,推荐最后一种
    头文件:/usr/local/nginx/include
    帮助文件:/usr/local/nginx/man
      添加/etc/man.config中MANPATH=/usr/local/nginx/man,或执行man -M /user/local/nginx/man nginx查看命令帮助
    配置文件:/usr/local/nginx/etc/
    
ldd:显示共享库依赖关系,查看应用程序所依赖的共享库
  ldd [option] 二进制文件ldd [option] `which command`

[[email protected] ~]# ldd `which cat`
    linux-vdso.so.1 =>  (0x00007fff6a73f000)            ``所有以动态方式调用其他库的入口,每一个应用程序只要制作成动态调用其他库的格式后都应依赖的库,但他直接被做进应用程序里面,不是真正的调用库
    libc.so.6 => /lib64/libc.so.6 (0x00007f3d901c3000)  ``共享库位置=>可执行程序的位置(调用加载后内存中的地址)
    /lib64/ld-linux-x86-64.so.2 (0x000055f8c3c99000)    ``直接说明调用的哪个库

所有能够使用一个相对应的包管理器所对应的包一定是事先打包好的包

包管理器指定特定路径,把二进制程序、头文件、帮助文件、配置文件等文件打包成一个文件,按照某种格式存放、组织,或者把特定格式组织在一起的归档打包文件能够自动展开至系统相对应的路径下,并且将展开的各文件保存在数据库中
功能:
1、数据库:
  名称和版本;安装生成的各文件路径及校验码;管理依赖关系(循环依赖、版本依赖);提供功能性的说明
    例如nginx:记录二进制程序安装在哪些路径分别有哪些文件,配置文件位置分别有哪些文件,还保存每个文件的校验码
2、提供程序组成格式:
  文件清单;安装卸载时运行的脚本;等等

包管理器的基本功能
  打包、安装、查询、升级、卸载、校验、数据库管理

应用程序的安装方式总结
  使用包管理器:rpm,便捷、易用
  包管理器的前端管理:yum,可自动解决依赖关系,建立在rpm基础之上
  源代码编译:
  简单打包的二进制格式:展开至特定路径下,简单配置就好

rpm包命名格式
  源程序:name-version.tar.{gz|bz2|xz}
    version:major.minor.release
  rpm包:name-version-release.arch.rpm
    release:通常包含rpm包的制作发行号,还包含使用的OS
    bash-4.3.2-2.el6.x86_64.rpm:第二次制作的rpm包
    nginx-1.4.16-5.rpm:不限系统,有些32、64系统、架构都可用

分包
  主包:bash-4.3.2-2.el6.x86_64.rpm
  支包:bash-hello-4.3.2-2.el6.x86_64.rpm
     bash-word-4.3.2-2.el6.x86_64.rpm

来源合法性验证
  源程序:通过md5或sha1校验码验证;
  rpm包:发行商提供的是合法性是可信的
    验证包完整性:校验码
    验证来源合法:公钥加密算法

rpm包管理


安装rpm {-i|--install} /path/to/rpm_package ...安装成功没有提示消息
  -v显示安装信息
  -vv二级详细
  -vvv三级详细
  -h以#的个数显示安装进度,一个#表示2%的进度
  --test仅测试,不真正执行安装过程
  如果存在依赖
    解决依赖关系:手动一个一个查找,遇到循环依赖基本挂了
    忽略依赖关系:--nodeps,有些包制作者认为需要依赖关系,但实际不用

  重新安装rpm -ivh /path/to/rpm_package ... --replacepkgs
    原来的配置文件不会被覆盖,新安装的配置文件将会重命名为以.rpmnew为后缀的文件,有些没有这些功能,所以要测试一下

卸载rpm {-e|--erase} package_name卸载如果卸载的包被其他包所依赖,则报错不允许卸载
  如果卸载被其他程序所依赖的包解决办法
    1、把依赖者一同卸载
    2、忽略依赖关系:--nodeps
    3、不再卸载,有点废话

查询rpm -q package_name
  查询所有已安装的包:rpm –qa
    可使用文件名通配或rpm –qa | grep "^*"正则表达式
  查询包的描述信息rpm -qi package_name可不用跟版本号,q和i顺序不可调换

[[email protected] ~]# rpm -qi bash
Name        : bash
Version     : 4.2.46
Release     : 28.el7                            rpm包的发行号,不是源码包发行号
Architecture: x86_64
Install Date: Sat 17 Mar 2018 12:06:19 PM CST
Group       : System Environment/Shells         包组
Size        : 3663637
License     : GPLv3+                            许可证
Signature   : RSA/SHA256, Thu 10 Aug 2017 11:03:40 PM CST, Key ID 24c6a8a7f4a80eb5
数字签名验证包完整性来源合法性
Source RPM  : bash-4.2.46-28.el7.src.rpm        源码的rpm包
Build Date  : Thu 03 Aug 2017 05:13:21 AM CST   包制作时间
Build Host  : c1bm.rdu2.centos.org              在那个系统制作的
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>   包制作者
Vendor      : CentOS
URL         : http://www.gnu.org/software/bash
Summary     : The GNU Bourne Again shell
Description :
The GNU Bourne Again shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C shell
(csh). Most sh scripts can be run by bash without modification.

  rpm -q package_name查询某单个包是否安装
  rpm -ql package_name查询包安装之后在当前系统生成文件列表
  rpm -qf /path/to/somefile查询某文件是由哪个包安装生成的
  rpm -qd package_name查询包安装后生成的帮助文档
  rpm -qc package_name查询安装后生成的配置文件
  rpm -q --scripts package_name查询包相关的脚本
    脚本分四类
      preinstall 安装前脚本
      postinstall 安装后脚本,如安装后启动服务程序
      preuninstall 卸载前脚本,如卸载前停止程序
      postuninstall 卸载后脚本,如卸载后删除相关文件
  查询尚未安装的rpm包文件的相关信息:
    rpm -qpl /path/to/package_file查询安装后会生成的文件列表:
    rpm -qpi /path/to/package_file查询其简单描述信息 :

升级
  rpm -U升级或安装
  rpm -F只升级
  rpm {-Uvh|-Fvh} /path/to/package_file
    --nodeps忽略依赖关系,用于升级的时候其他包依赖于这个包
    --force强行安装,有冲突时强行安装
  注意:不要对内核执行升级操作
    多版本内核可以并存,因此,建议执行安装操作

校验,检查包安装后生成的文件是否被修改过
  rpm -V package_Name

[[email protected] zyb]# rpm -V zsh
[[email protected] zyb]# vi /usr/share/zsh/5.0.2/functions/zfcget
[[email protected] zyb]# rpm -V zsh
S.5....T.    /usr/share/zsh/5.0.2/functions/zfcget
        S file Size differs                         大小
        M Mode differs (includes permissions and file type) 头文件
        5 digest (formerly MD5 sum) differs MD5
        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                   能力改变了

校验来源合法性和软件完整性,这个是安装之前
  包完整行:通过单向加密机制(MD5|sha1)
  来源合法性:通过公钥加密机制(RSA)
  导入制作者的公钥,CentOS发行版的公钥在iso文件中
    导入命令rmp --import /path/to/gog-key-file
      [[email protected] mnt]# rpm --import RPM-GPG-KEY-CentOS-7
  命令:gpg,pgp,导入密钥后做检验
    rpm -K /path/to/somefile

[[email protected] ~]# rpm -K /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm 
/mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

  rpm --checksig /path/to/package_file
    --nosigeature不检查来源合法性
    --nodigest不检查包完整性

数据库重建
  默认位置:/var/lib/rpm
  非默认位置指令rpm -{initdb| rebuilddb} [--dbpath /path/dir]
  重建
    rpm --initdb初始化,如果事先不存在一个数据库,则新建之如果,已存在不会重复执行,也不会覆盖原有数据库
    rpm --rebuilddb重建,直接新建数据库,会覆盖原有库

rpm包前端管理器:yum


yum(Yellowdog Update Modifier):只是rpm的补充工作依然依赖于rpm包,不能取代rpm包管理器,自动解决依赖关系,自动过程依赖于某一层机制,意思是某个地方存放了许多的程序包
  文件服务器(共享rpm包)通过yum所支持的文件共享机制,将各rpm包通过文件服务共享
  repository:仓库,可以有多个
    1、需要的各rpm包
    2、依赖关系、程序包安装后所能够生成文件列表等元数据文件

yum客户端
  1、配置文件:指定各可用的yum仓库;
  2、缓存元数据:yum会到各可用yum仓库获取元数据,并缓存至本地
  3、分析元数据:根据具体的操作请求完成元数据分析,可能包括检查依赖关系、文件列表等信息
  4、根据元数据分校结果执行具体操作
  客户端配置文件指定对应服务器(ftp,http,nfs,file)访问方式:
  ftp ftp://server/path/to/repo
  http http://server/path/to/repo
  nfs nfs://servr/nfs_path
  file file:///path/to/path 用于客户端和服务器端是同一个主机

安装和卸载不用指定路径,自动到yum仓库中获取,因此可以直接指定package_name,要使用yum管理应用程序,首先得配置其可用的yum仓库,保存在配置文件中
  /etc/yum.conf:核心配置,[main]:主配置段
  /etc/yum.repo.d/*.repo:仓库,仓库配置段,每一个仓库都有一个独立的这个配置段,当前仓库的ID

[[email protected] ~]# cat /etc/yum.conf 
[main]
cachedir=/var/cache/yum/$basearch/$releasever   缓存文件夹,先对比本地缓存和远程仓库是否一样,一样不用下载,否则重新下载,对比md5码
keepcache=0                 是否保存缓存中曾已经被下载安装的rpm包
debuglevel=2                调试级别
logfile=/var/log/yum.log    日志文件
exactarch=1                 精确匹配主机版本
obsoletes=1                 废弃包
gpgcheck=1                  检验程序包来源合法性及数据包完整性
plugins=1                   是否支持yum插件
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release


#  This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
#  It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d   个人配置yum仓库路径

配置repo

[base_1]                        不能随便加空格,**不能和其他仓库重名**
name=Centos 7 x86_64 release    不需要加引号,用空格也无所谓
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/     有repodata目录所在路径
enabled=1                       1,表示启用。0表示不启用,默认启用
gpgcheck=1                      1,验证gpg。0表示不验证,若启用gpgkey必选
gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7           公钥地址可以是本地,也可以是服务器端路径
cost=2000                       默认为1000,开销越小越被优先使用

确定内核版本uname -a

[[email protected] ~]# uname -a
Linux ZYB 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

查看是否启用yum仓库
[[email protected] yum.repos.d]# grep "^enabled=.*" *.repo
yum仓库信息

[[email protected] yum.repos.d]# ls /var/cache/yum/x86_64/7/base
017a874b73d9668d5eee574fb94c91bb7718e2107cfa4bd6356ee84e45204f84-primary.sqlite.bz2
cachecookie
gen
mirrorlist.txt
packages
repomd.xml

yum的各命令
  repolist [all|enabled(默认)|disabled]:列出所有可用的yum repo
  clean [all|packeages(包)|metadata(元数据)|expire-cache(过期数据)|rpmdb(rpm数据)|plugins]:清理缓存
  list [all(默认)|installed(已安装过的)|available(可用)]:列出yum包,@符号代表已安装
  info package_name:显示包的详细信息
  grouplist:列出所有的包组
  groupinfo "package_group_name": 显示包组信息,必须安装的包组,可选包组,可能有空格,加引号
    三个跟开发相关的包组:
      Desktop Platform Development 有图形程序时需安装此组
      Server Platform Development
      Development Tools
      如果系统为Centos 5,开发包组为”Development Tools“和”DeveLopment Libraries“
      如何系统为centos 6,常用的开发包为”Development tools“和"Server Platform Development"
  install package_name …:安装指定的程序包
  reinstall package_name ...:重新安装指定的包
  yum check-update:检查可升级的包
    update packe_name ...:指定升级的程序包,默认升级到最高版本,要升级到指定版本要带版本号
  downgrade packe_name:降级
  erase|remove pack_name ...:会自动把依赖到这个包的包卸载,同rpm -e不同
  whatprovides|provides /path/to/somefile:查询某文件是由谁提供的
  groupinstall "group_name":安装指定包组
  groupremove "group_name":卸载指定组
  yum history:查看yum的命令历史
  安装本地包:若此前没导入公钥文件,yum检查依赖关系完整性来源合法性时可能失败,则安装不上
    yum install /path/to/package_file若检查公钥失败yum命令无法安装
  手动禁止检查来源及完整性:--nogpgcheck
    yum install /tmp/zsh-2.3.1-2.el6.x86_64.rpm --nogpcheck

yum配置文件中可用的四个宏
  $releasever:程序的版本,对Yum而言指是redhat-relrase版本。只替换为主版本号,如Redhat6.5 则替换为6
  $arch:系统架构,与pathon中os.uname()版本相同

[[email protected] ~]# python
Python 2.7.5 (default, Aug  4 2017, 00:39:18) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.uname()
('Linux', 'ZYB', '3.10.0-693.el7.x86_64', '#1 SMP Tue Aug 22 21:09:27 UTC 2017', 'x86_64')
>>> quit()

  $basharch:系统基本架构,如i686,i586等的基本架构为i386
  $YUM0-9:在系统定义的环境变量,可以在yum中使用,给用户自定义用
  获取当前系统相应宏替换的办法

[[email protected] ~]$ python
Python 2.7.5 (default, Aug  4 2017, 00:39:18) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yum,pprint
>>> yb = yum.YumBase()
>>> pprint.pprint(yb.conf.yumvar,width=1)
Loaded plugins: fastestmirror, langpacks
{'arch': 'ia32e',
 'basearch': 'x86_64',
 'infra': 'stock',
 'releasever': '7',
 'uuid': '2e295e02-51b3-438b-8804-e955af8290e5'}
>>> quit()

  利用宏替换配置yum仓库的访问路径

[base_1]
name=Centos 7 x86_64 release
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=0

以上是关于软件包管理的主要内容,如果未能解决你的问题,请参考以下文章

如何管理在每个 git 版本中添加私有代码片段?

如何使用Android片段管理器传递变量[重复]

Sphinx、reStructuredText 显示/隐藏代码片段

Android:使用支持片段管理器时复制片段

YASnippet - emacs 的代码片段管理工具

片段管理访问错误可见 return false