Linux基础:软件包管理

Linux基础:软件包管理

此文章(十八、软件包管理)收录在RHCSA专栏:戏说 RHCSA 认证

另有RHCE专栏:戏说 RHCE 认证

亦有RHCA专栏:RHCA 回忆录

金鱼哥在问答区回答过一堆关于Yum设置的问题而导致仓库不可用,反馈出很多同学的基础不扎实。因为仓库没弄好,在安装软件包或者依赖包的时候,就会一筹莫展。

因此需要大家好好学习,了解linux系统的软件包管理的理论,可惜没录屏进行相关实操的话,日后有机会,上一个视频专辑,讲解得更详尽才行。

现在先来看看理论和笔记的学习。

Linux基础:软件包管理_第1张图片

文章目录

  • Linux基础:软件包管理
      • 18.1 软件包和包管理器介绍
        • 18.1.1 软件包介绍
        • 18.1.2 软件包管理器介绍
        • 18.1.3 分类和拆包
        • 18.1.4 包的依赖
        • 18.1.5 软件包管理器相关文件
      • 18.2 包管理器 rpm
        • 18.2.1 安装
        • 18.2.2 升级和降级
        • 18.2.3 包查询
        • 18.2.4 包卸载
        • 18.2.5 包校验
      • 18.3 dnf
        • 18.3.1 yum/dnf工作原理
        • 18.3.2 yum仓库配置
        • 18.3.3 yum/dnf命令
          • 18.3.3.1 显示仓库列表
          • 18.3.3.2 显示程序包
          • 18.3.3.3 安装程序包
          • 18.3.3.4 卸载程序包
          • 18.3.3.5 升级和降级
          • 18.3.3.6 仓库缓存
          • 18.3.3.7 启用模块流和安装模块(8的新特性)
          • 18.3.3.8 查看yum事务历史
    • 总结

18.1 软件包和包管理器介绍

18.1.1 软件包介绍

开源软件最初只提供了.tar.gz的打包的源码文件,用户必须自已编译每个想在GNU/Linux上运行的软
件。用户急需系统能提供一种更加便利的方法来管理这些软件,当Debian诞生时,这样一个管理工具
dpkg也就应运而生,可用来管理deb后缀的"包"文件。从而著名的“package”概念第一次出现在
GNU/Linux系统中,稍后Red Hat才开发自己的rpm包管理系统

范例:利用 cpio工具查看包文件列表

rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件

18.1.2 软件包管理器介绍

软件包管理器功能:

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

主流的软件包管理器:

redhat:rpm文件, rpm 包管理器,rpm:Redhat Package Manager,RPM Package Manager

rpm包命名方式:

name-VERSION-release.arch.rpm

常见的arch:

  • x86: i386, i486, i586, i686
  • x86_64: x64, x86_64, amd64
  • 跟平台无关:noarch

18.1.3 分类和拆包

软件包为了管理和使用的便利,会将一个大的软件分类,放在不同的子包中。

包的分类

  • Application-VERSION-ARCH.rpm: 主包
  • Application-devel-VERSION-ARCH.rpm 开发子包
  • Application-utils-VERSION-ARHC.rpm 其它子包
  • Application-libs-VERSION-ARHC.rpm 其它子包

18.1.4 包的依赖

软件包之间可能存在依赖关系,甚至循环依赖,即:A包依赖B包,B包依赖C包,C包依赖A包
安装软件包时,会因为缺少依赖的包,而导致安装包失败。

解决依赖包管理工具:

  • yum:rpm包管理器的前端工具
  • dnf:Fedora 18+ rpm包管理器前端管理工具,RHEL 8 版代替 yum

18.1.5 软件包管理器相关文件

  1. 包文件组成 (每个包独有)
  • 包内的文件
  • 元数据,如:包的名称,版本,依赖性,描述等
  • 可能会有包安装或卸载时运行的脚本
  1. 数据库(公共):/var/lib/rpm
  • 程序包名称及版本
  • 依赖关系
  • 包安装后生成的各文件路径及校验码信息

18.2 包管理器 rpm

RHEL系统上使用rpm命令管理程序包

功能:

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


18.2.1 安装

格式:

rpm {-i|--install} [install-options] PACKAGE_FILE…

选项:

-v: verbose
-h: 以#显示程序包管理执行进度
-i:安装

常用组合:

rpm -ivh PACKAGE_FILE ...

rpm包安装[install-options]

--test: 测试安装,但不真正执行安装,即dry run模式
--nodeps:忽略依赖关系
--replacepkgs | replacefiles
--nosignature: 不检查来源合法性
--nodigest:不检查包完整性
--noscripts:不执行程序包脚本
%pre: 安装前脚本 --nopre
%post: 安装后脚本 --nopost
%preun: 卸载前脚本 --nopreun
%postun: 卸载后脚本 --nopostun

18.2.2 升级和降级

rpm包升级

rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...

对应选项:

upgrade:安装有旧版程序包,则“升级”,如果不存在旧版程序包,则“安装”
freshen:安装有旧版程序包,则“升级”, 如果不存在旧版程序包,则不执行升级操作
--oldpackage:降级
--force: 强制安装

常用组合:

rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...

升级注意项:

(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件不会直接覆盖老
版本的配置文件,而把新版本文件重命名(FILENAME.rpmnew)后保留


18.2.3 包查询

rpm {-q|--query} [select-options] [query-options]
[select-options]
-a:所有包
-f:查看指定的文件由哪个程序包安装生成
-p rpmfile:针对尚未安装的程序包文件做查询操作
[query-options]
--changelog:查询rpm包的changelog
-c:查询程序的配置文件
-d:查询程序的文档
-i:information
-l:查看指定的程序包安装后生成的所有文件
--scripts:程序包自带的脚本
#和CAPABILITY相关
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
--provides:列出指定程序包所提供的CAPABILITY
-R:查询指定的程序包所依赖的CAPABILITY

常用查询用法:

-qa
-q PACKAGE
-qi PACKAGE
-qc PACKAGE
-ql PACKAGE
-qd PACKAGE
-q --scripts PACKAGE
-qf FILE
-qpi PACKAGE_FILE
-qpl PACKAGE_FILE, ...

18.2.4 包卸载

格式:

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test]
PACKAGE_NAME ...

注意:当包卸载时,对应的配置文件不会删除, 以FILENAME.rpmsave形式保留


18.2.5 包校验

在安装包时,系统也会检查包的来源是否是合法的

检查包的完整性和签名

rpm -K|--checksig rpmfile

在检查包的来源和完整性前,必须导入所需要公钥

rpm --import RPM-GPG-KEY-redhat-release
rpm --import RPM-GPG-KEY-redhat-beta

范例:校验包文件

[root@servera sr0]# rpm -K ./BaseOS/Packages/samba-4.11.2-13.el8.x86_64.rpm 
./BaseOS/Packages/samba-4.11.2-13.el8.x86_64.rpm: digests signatures OK

18.3 dnf

注意
8的系统已经不提供仓库支持,如果使用8的话,可参考阿里的设置方式。

阿里CentOS源:https://developer.aliyun.com/mirror/centos

阿里EPEL源:https://developer.aliyun.com/mirror/epel


RHEL8使用dnf解决rpm的包依赖关系

YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定
位软件包,up2date的替代工具,RHEL 8 用dnf 代替了yum ,不过保留了和 yum的兼容性,配置也是
通用的


18.3.1 yum/dnf工作原理

yum/dnf 是基于C/S 模式

  • yum 服务器存放rpm包和相关包的元数据库
  • yum 客户端访问yum服务器进行安装或查询等

yum 实现过程

先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的
元数据文件(放置于特定目录repodata下),当yum客户端利用yum/dnf工具进行安装包时,会自动
下载repodata中的元数据,查询元数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并
安装。

yum服务器的仓库可以多种形式存在:

  • file:// 本地路径
  • http://
  • https://
  • ftp://

注意:yum仓库指向的路径一定必须是reported目录所在目录


18.3.2 yum仓库配置

yum客户端配置文件

/etc/yum.conf #为所有仓库提供公共配置
/etc/yum.repos.d/*.repo: #为每个仓库的提供配置文件

帮助参考: man 5 yum.conf

相关变量:

yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号,如:8,7,6
$arch: CPU架构,如:aarch64, i586, i686,x86_64等
$basearch:系统基础平台;i386, x86_64
$contentdir:表示目录,比如:centos-8,centos-7
$YUM0-$YUM9:自定义变量

范例:

http://server/rhel/$releasever/$basearch/
http://server/rhel/7/x86_64
http://server/rhel/6/i386

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

baseurl指向的路径

阿里云提供了写好的CentOS和ubuntu的仓库文件下载链接

http://mirrors.aliyun.com/repo/

CentOS系统的yum源

#阿里云
https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
#华为云
https://mirrors.huaweicloud.com/
#清华大学
https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/AppStream/os/x86_64/

EPEL的yum源

#阿里云
https://mirrors.aliyun.com/epel/$releasever/x86_64

#Fedora-EPEL:Extra Packages for Enterprise Linux
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

范例:为RHEL 8 配置 yum 的系统和EPEL源仓库

[root@centos8 ~]#cat /etc/yum.repos.d/base.repo
[BaseOS]
name=BaseOS
baseurl=file:///mnt/cd/BaseOS
gpgcheck=1
gpgkey=/etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[AppStream]
name=AppStream
baseurl=file:///misc/cd/AppStream
gpgcheck=0
[epel]
name=EPEL
baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
gpgcheck=0
enabled=1
[httpAppstream]
name=aliyun Appstream
baseurl=https://mirrors.aliyun.com/centos/$releasever/AppStream/$basearch/os
gpgcheck=0

18.3.3 yum/dnf命令

yum命令的用法:

yum [options] [command] [package ...]

yum的命令行选项:

-y #自动回答为“yes”
-q #静默模式
--nogpgcheck #禁止进行gpg check
--enablerepo=repoidglob #临时启用此处指定的repo,支持通配符,如:”*“
--disablerepo=repoidglob #临时禁用此处指定的repo,和上面语句同时使用,放在后面的生效
18.3.3.1 显示仓库列表
yum repolist [all|enabled|disabled]
18.3.3.2 显示程序包
yum list
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1] [...]
yum group list
18.3.3.3 安装程序包
yum install package1 [package2] [...]
yum group install "package group"
yum reinstall package1 [package2] [...] #重新安装
18.3.3.4 卸载程序包
yum remove | erase package1 [package2] [...]
18.3.3.5 升级和降级
yum update [package1] [package2] [...]
yum downgrade package1 [package2] [...] (降级)
18.3.3.6 仓库缓存

清除目录/var/cache/yum/缓存

yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

构建缓存:

yum makecache
18.3.3.7 启用模块流和安装模块(8的新特性)

模块

模块是一组属于一个整体的、协调一致的RPM软件包。通常,这是围绕软件应用或编程语言的特定版本进行组织的。典型的模块可以包含应用的软件包、应用特定依赖库的软件包、应用文档的软件包,以及帮助器实用程序的软件包。

模块流

每个模块可以具有一个或多个模块流,其包含不同版本的内容。每个流独立接收更新。模块流可以视为应用流物理存储库中的虚拟存储库。对于每个模块,只能启用其中一个流并提供它的软件包。

查看模块流

yum module list

安装模块流

yum module install 
18.3.3.8 查看yum事务历史

yum 执行安装卸载命令会记录到相关日志中

日志文件:

#RHEL 8 版本日志
/var/log/dnf.rpm.log
/var/log/dnf.log

日志命令

yum history [info|list|packages-list|packages-info|summary|addoninfo|
redo|undo|rollback|new|sync|stats]

总结

好好学,好好找工作,运维10K+只是起步,找不到10K+都别说是金鱼哥带出来的学生。

以上就是【金鱼哥】对软件包管理的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】!

你可能感兴趣的:(戏说,RHCSA,认证,运维基本功,运维,linux,服务器)