软件包管理

本文深入探讨了软件包管理的基础知识,包括rpm和yum工具的使用,软件编译过程,ABI与API概念,以及Linux环境下软件包的依赖关系解决。涵盖了包管理器的功能、包的组成与命名规范,以及如何利用包管理器进行软件的安装、升级、查询和卸载。

软件包管理

  • rpm,yum

软件运行和编译

  • ABI:Application Binary Interface(应用程序与OS之间的接口)
      Windows与Linux不兼容;可执行程序文件格式
        Windows:PE(Portable Executable)
        Linux:ELF(Executable and Linkable Format)
      库级别的虚拟化
        Windows:Cygwin
        Linux:WINE
  • API:Application Programming Interface(应用程序与库之间的接口)
  • 程序源代码–>预处理–>编译–>汇编–>链接
  • C程序编译过程:
    在这里插入图片描述
      ①预处理:主要包括将宏定义展开、导入头文件、处理条件预预编译指令等
      ②编译:进行语法语义分析等生成汇编代码
      ③汇编:汇编则是将汇编语言转化为机器语言,生成二进制文件
      ④链接:通过调用连接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的库文件,最后生成可执行文件
ldd - 查询程序所依赖的库(.so)
[root@centos7 test]# ldd `which --skip-alias ls`
	linux-vdso.so.1 =>  (0x00007ffef91c6000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb3a8316000)
	libcap.so.2 => /lib64/libcap.so.2 (0x00007fb3a8111000)
	libacl.so.1 => /lib64/libacl.so.1 (0x00007fb3a7f08000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fb3a7b3b000)
	libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fb3a78d9000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fb3a76d5000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fb3a853d000)
	libattr.so.1 => /lib64/libattr.so.1 (0x00007fb3a74d0000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb3a72b4000)
  • 静态和动态链接:链接主要的作用是把各个模块之间相互引用的各个部分处理好,使得各个模块之间能够正确地衔接,分为静态链接和动态链接。
    静态链接:
      ①把程序对应的依赖库复制一份到包
      ②libxxx.a
      ③嵌入程序包
      ④升级难,需重新编译
      ⑤占用较多空间,迁移容易
    动态链接:
      ①只把依赖加做一个动态链接
      ②libxxx.so
      ③连接指向
      ④占用较少空间,升级方便
  • Java程序运行
    在这里插入图片描述

Linux包和包管理器

  • 程序在互联网一般是以源代码的方式提供,.tar.gz的打包的源代码,用户使用软件必须将源码编译为Linux上能运行的二进制文件。因此Linux发行版商考虑用户对软件编译时可能存在的困难,将大多数可能用到的软件编译为可以在Linux直接运行的代码,开发出包和包管理器的概念,对Linux系统的包实现安装、卸载
    查询、升级等功能。最早由Debian提出,它的管理工具被称为dpkg,随后Red Hat也开发了自己的包管理器rpm。

  • 包的组成:
      二进制文件、库文件、配置文件、帮助文件

  • 程序包管理器:
      debian: deb包文件,dpkg包管理器
      redhat:rpm包文件,rpm包管理器
        rpm:RedHat Package Manager
        rpm:RPM Package Manager

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

  • rpm包命名方式:
      name-VERSION-release.arch.rpm
      eg:tree-1.6.0-10.el7.x86_64
      软件名-主版本号.次版本号.末版本号.Redhat编译次数.系统版本.CPU架构.rpm
      常见的arch
        x86: i386, i486, i586, i686
        x86_64: x64, x86_64, amd64
        跟平台无关:noarch

  • 大软件分包:
      Application-VERSION-ARCH.rpm: 主包
      Application-devel-VERSION-ARCH.rpm 开发子包
      Application-utils-VERSION-ARHC.rpm 其它子包
      Application-libs-VERSION-ARHC.rpm 其它子包
        eg:
        httpd-2.4.6-88.el7.centos.x86_64.rpm 主包
        httpd-manual-2.4.6-88.el7.centos.noarch.rpm 手册
        httpd-devel-2.4.6-88.el7.centos.x86_64.rpm 开发
        httpd-tools-2.4.6-88.el7.centos.x86_64.rpm 工具
        这样可以根据需要安装相应的包。

  • 包与包之间存在依赖关系,包管理器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

  • 包管理器
    1、程序包管理器:
      功能:将编译好的应用程序的各组成文件打包成一个或多个程序文件,从而方便快捷地实现程序包的安装、卸载、查询、升级等操作
    2、包文件的组成:(每个包独有)
      RPM包内的文件
      RPM的元数据,如名称,版本,依赖性,描述等
      安装或卸载时运行的脚本
    3、数据库(公共):/var/lib/rpm
      程序包名称及版本
      依赖关系
      功能说名
      包安装后生成的各文件路径及校验码信息
      注意:使用rpm均会使/var/lib/rpm目录中文件更新,使用rpm查询时也是查询此数据库中的数据,此数据库非常重要,破坏会系统不能安装、卸载、查询等各种包,建议备份。
      

  • 程序包的来源
    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包管理器

  • 安装:rpm -i
      -ivh:以#显示程序包的安装进度,v显示安装详细过程
      --test:测试安装,并未真正安装,即dry run 模式
      --nodeps:忽略依赖关系
      --replacepkgs|replacefile
      --nosignature:不检查包完整性
      --noscripts:不执行程序包安装脚本
      --nopre: %pre:安装前脚本
      --nopost %post:安装后脚本
      --nopreun %preun:卸载前脚本
      --nopostun %postun:卸载后脚本

  • 卸载:rpm -e

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

  • 查询:rpm -q
      -a:所有包
      -f:查看指定的文件由哪个程序包安装生成
      -p rpmfile:针对尚未安装的程序包文件做查询操作
      --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
      --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
      rpm2cpio 包文件|cpio –itv 预览包内文件
      rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件
      --changelog:查询rpm包的changelog
      -c:查询程序的配置文件
      -d:查询程序的文档
      -i:information
      -l:查看指定的程序包安装后生成的所有文件
      --scripts:程序包自带的脚本
      --provides:列出指定程序包所提供的CAPABILITY
      -R:查询指定的程序包所依赖的CAPABILITY

  • 校验:rpm -K | -V
     1、rpm -V
      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
     2、rpm -K
      导入所需要公钥
      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数据库(数据最重要)
    1、数据库重建:
      /var/lib/rpm
    2、rpm {–initdb|–rebuilddb}–>一般没什么用
      initdb: 初始化
        如果事先不存在数据库,则新建之
        否则,不执行任何操作
      rebuilddb:重建已安装的包头的数据库索引目录

※※※※※
rpm -ivh | -e | -qi | -ql | -q --scripts | -qa | -qf /path/file | -q package | --force| -qc

yum

  • yum:Yellowdog Update Modifier,rpm的前端程序,可以解决依赖关系,可以在多个库之间定位软件包。

  • yum的工作原理:
    在这里插入图片描述

  • yum客户端的配置文件
      /etc/yum.conf:为所有仓库的指向提供配置
      /etc/yum.repos.d/*.repo:为仓库指向提供配置
    2、仓库指向的定义
    [repo id]
    name=repo name
    baseurl=url:///path/to/repodata(此处为repodata目录所在路径)
    enabled={1|0} (1 enable 0 disable)
    gpgcheck={1|0}
    gpgkey=URL
    enablegroups={1|0}
    failovermethod={roundrobin|priority}
      roundrobin:意为随机挑选,默认值
      priority:按顺序访问
    cost= 默认为1000

  • yum 仓库
    1、yum的repo中可以使用的变量
      $releasever:当前OS发行版的主版本号
      $arch:平台,x86_64,i386,i686
      $basearch:基础平台
      $YUM0—$YUM9:自定义变量

  • yum源
    1、阿里云repo文件
      http://mirrors.aliyun.com/repo/
    2、CentOS系统的yum源
      阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
      清华大学:https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/
    3、EPEL的yum源
      阿里云:https://mirrors.aliyun.com/epel/$releasever/x86_64
    4、阿里巴巴开源软件
      https://opsx.alibaba.com/

  • yum-config-manager
    生成172.16.0.1_cobbler_ks_mirror_CentOS-X-x86_64_.repo
      yum-config-manager --add-repo= http://172.16.0.1/cobbler/ks_mirror/7/
    yum-config-manager --disable “仓库名" 禁用仓库
    yum-config-manager --enable “仓库名” 启用仓库

  • yum命令
    1、yum命令的用法:
      yum [options] [command] [package …]
    2、显示仓库列表:
      yum repolist [all|enabled|disabled] 显示程序包:
      yum list
      yum list [all | glob_exp1] [glob_exp2] […]
      yum list {available|installed|updates} [glob_exp1] […]
    3、安装程序包:
      yum install package1 [package2] […]
      yum reinstall package1 [package2] […] (重新安装)
    4、升级程序包:
      yum update [package1] [package2] […]
      yum downgrade package1 [package2] […] (降级) 检查可用升级:
      yum check-update
    5、卸载程序包:
      yum remove | erase package1 [package2] […]
    6、查看程序包information:
      yum info […]
    7、查看指定的特性(可以是某文件)是由哪个程序包所提供:
      yum provides | whatprovides feature1 [feature2] […]
    8、清理本地缓存:
      清除/var/cache/yum/ b a s e a r c h / basearch/ basearch/releasever缓存
      yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
    9、构建缓存:
      yum makecache

10、搜索:yum search string1 [string2] […]
  以指定的关键字搜索程序包名及summary信息
11、查看指定包所依赖的capabilities:
  yum deplist package1 [package2] […]
12、查看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
13、日志 :/var/log/yum.log

14、安装及升级本地程序包:
  yum localinstall rpmfile1 [rpmfile2]
  yum localupdate rpmfile1 [rpmfile2]
15、包组管理的相关命令:
  yum groupinstall group1 [group2] […]
  yum groupupdate group1 [group2] […]
  yum grouplist [hidden] [groupwildcard] […]
  yum groupremove group1 [group2] […]
  yum groupinfo group1 […]
15、yum的命令行选项:
  --nogpgcheck:禁止进行gpg check
  -y: 自动回答为“yes”
  -q:静默模式
  --disablerepo=repoidglob:临时禁用此处指定的repo
  --enablerepo=repoidglob:临时启用此处指定的repo
  --noplugins:禁用所有插件

※※※※※
yum install | remove
yum list | repolist
yum clean all
yum history 观察yum安装日志,可以将此前yum安装的依赖的软件一起卸载
yum history undo # | redo # | info #

个人总结

  • 使用yum remove 卸载包时,只卸载单个包,并不会卸载其依赖的安装包
  • 系统默认配置的/etc/yum.repos.d/*.sh 文件服务器均比较远,一般不使用,企业内部一般局域网,应配置一台专门的yum server,供所有主机直接从yum server安装软件。
    搭建yum server
    ①rpm 软件包
    ②repodata/目录中的数据(rpm包的元数据)
      repodata(仓库元数据的创建)
        createrepo [option] <dirctory>
        没有仓库元数据,就无法使用yum安装
  • 生产环境yum地址发生改变时,需要清理缓存,yum clean all
  • 配置yum时出现问题查找源:
    ①yum client的配置文件格式写错,/etc/yum.repos.d/*.sh
    ②缓存问题
  • yum 配置文件中baseurl的路径为repodata目录所在的路径即为yum源路径
  • 生产环境需注意:生产环境一般都是rpm包单个安装,需要使用才会安装,因此生产环境中不会以包组的形式安装软件,单个安装rpm包可以使系统最精简,优化性能,提高安全性。
  • 生产环境一般情况下也不会做升级操作,也不建议升级系统和软件包,升级会导致许多问题,除非软件包有重大漏洞,或者需要使用某些新功能,这样万不得已的情况下才会对软件进行升级,。系统一般不做升级处理,若要使用新功能,直接重装新系统。
yum实验:
1、启用/misc目录,/misc目录本不存在,/misc目录依赖于这个程序,启用此
程序,可启用/misc目录,此目录一访问/misc/cd目录,就会自动挂载光盘
	 ~]#rpm -q autofs
	autofs-5.0.5-139.el6.x86_64  
	~]# rpm -ql autofs | grep -E 'service'
	/usr/lib/systemd/system/autofs.service 
centos7软件存在/usr/lib/systemd/system/*.service时,可用system启动为一个服务
	~]# systemctl start autofs 启动服务
	~]# systemctl disable autofs 关闭开机自启动
	~]# systemctl enable autofs 开启开机自启动

2、centos7关闭防火墙
 	systemctl stop firewalld
	systemctl disable firewalld

3、配置epel源,仓库路径为阿里云的epel源
	[root@centos6 yum.repos.d]#cat epel.repo
	[epel]
	name=aliyun epel
	baseurl=https://mirrors.aliyun.com/epel/$releasever/$basearch/
	gpgcheck=0
	enabled=1
	[root@centos6 yum.repos.d]#yum clean all
	[root@centos6 yum.repos.d]#yum repolist

4、仓库路径的多种表示方法  
	①baseurl=url
	②baseurl=url1
			 url2
	③mirrorlist=file 
		file中直接写url1,url2,url3...
	其中URL支持:http,https,ftp,file(本地)

5、yum group list 与 yum group list后跟一个空格
	显示的包组不一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值