Skip to main content

Linux软件包管理(rpm、yum、dnf)

 https://zhuanlan.zhihu.com/p/363311141

 

 

1、软件包和包管理器
linux中很多软件都是以源代码方式进行发布的,但是源代码对普通用户来讲编译成一个可执行的文件过程是非常繁琐的。所以有些软件商帮我们把互联上的开源软件编译成了二进制并且把它打包成一个文件然后我们可以直接用包管理器将软件商打包好的文件直接进行安装。

2、包管理器
软件包管理器功能:
将编译好的应用程序组成文件打包成一个或几个程序包文件,利用包管理器可以方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
主流的软件包管理器
1、Redhat:rpm文件, rpm 包管理器,rpm:Redhat Package Manager
##后来改名成: RPM Package Manager
2、debian:deb文件, dpkg 包管理器

3、包命名

aic94xx-firmware-30-6.el7.noarch.rpm
aide-0.15.1-13.el7.x86_64.rpm
akonadi-1.9.2-4.el7.x86_64.rpm
akonadi-mysql-1.9.2-4.el7.x86_64.rpm
alacarte-3.11.91-1.el7.noarch.rpm
alsa-firmware-1.0.28-2.el7.noarch.rpm
alsa-lib-1.1.8-1.el7.x86_64.rpm

包命名方式:name-version-release.arch.rpm
每个RPM包的名称都由-和.分成若干份。比如上面akonadi-1.9.2-4.el7.x86_64.rpm包中
akonadi:为name包名
1.9.2:为version版本信息:主版本号.次版本号.修正号
4:二进制包发布的次数,表示此RPM包是第几次编译生成的
el7:软件发行商,el7表示此包是由Red Hat公司发布,适合在RHEL7.x和Centos7.x上使用
x86_64:为运行平台,此参数可以看到该软件包可用于什么平台上
3、常见运行平台
32位:i386, i486, i586, i686 x86_
64位:x64, x86_64, amd64
powerpc: ppc
跟平台无关:noarch

4、包的依赖
软件包之间可能存在依赖关系,甚至循环依赖,即:A包依赖B包,B包依赖C包,C包依赖A包 安装软件包时,会因为缺少依赖的包,而导致安装包失败。
解决依赖包管理工具:
yum:rpm包管理器的前端工具
dnf:Fedora 18+ rpm包管理器前端管理工具,CentOS 8 版dnf代替 yum
apt:deb包管理器前端工具
zypper:suse上的rpm前端管理工具

5、获取软件包的途径
软件包需要事先将源代码进行编译后打包形成,获取包的途径如下:
1、系统发版的光盘或官方网站
华为开源镜像:

阿里开镜镜像:

清华大学开源镜像:

网易开源镜像:

2、第三方组织
Fedora-EPEL:Extra Packages for Enterprise Linux,企业版Linux的额外软件包,是Fedora小组维护的一个软件仓库项目,为RHEL/CentOS提供他们默认不提供的软件包
####华为、阿里、清华、网易等网站都是提供EPEL源####

6、包管理器RPM
CentOS系统上使用rpm命令管理程序包
功能:安装、卸载、升级、查询、校验、数据库维护
rpm安装命令:

rpm {-i|--install} [install-options] PACKAGE_FILE…  ###RPM格式

-i:表示安装
-v:表示可视化(verbose)
-h:表示显示安装进度
--force:表示强制安装
--nodeps:表示忽略依赖包关系
--test:测试安装,但不真正执行安装


RPM安装tree包案例:
[root@localhost Packages] rpm -ivh tree-1.7.0-15.el8.x86_64.rpm   ##注意点是在放软件包目录执行该命令
warning: tree-1.7.0-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:tree-1.7.0-15.el8                ################################# [100%]

7、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)后保留

8、 包查询

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 表示查询 –a表示所有安装的包 ##模糊查找:rpm –qa “*http*”
-q PACKAGE 
-qi PACKAGE ##-q表示查询,-i表示information描述安装包的功能信息(前提该包已安装);
-qc PACKAGE ##-q表示查询,-c查询程序的配置文件
-ql PACKAGE ##跟包名查询包安装的时候生成的所有文件和存放的路径
-qd PACKAGE ##查询指定文件来自哪个包产生的
-q --scripts PACKAGE 
-qf FILE ##查询文件来自哪个包产生的
-qpi PACKAGE_FILE ## p表示包packit 查询这个包文件内容后面跟文件名(包未安装);
-qpl PACKAGE_FILE,## l表示包list 列出包安装之后生产什么文件放在什么文件夹; 

rpm 查询是依靠/var/lib/rpm 里面的公共RPM db数据库存放安装包的若干详细信息(索引数据库-元数据),如果这个目录损坏就无法靠rpm进行查询、卸载软件
rpm 主要功能用来查询,rpm -i install 安装 但是只是安装一个包,如包有依赖性就无法安装

9、包卸载

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

注意:当包卸载时,对应的配置文件不会删除, 以FILENAME.rpmsave形式保留
范例:强行删除rpm包,并恢复

[root@centos7 ~]#rpm -e rpm --nodeps  ##强行卸载rpm软件
#重启进入rescue模式 (救援模式)
#mkdir /mnt/cdrom #mount /dev/sr0 /mnt/cdrom
#rpm -ivh /mnt/cdrom/Packages/rpm-4.11.3-40.el7.x86_64.rpm --root=/mnt/sysimage #reboot 

数据库
rpm包安装时生成的信息,都放在rpm数据库中

/var/lib/rpm

可以重建数据库

rpm {--initdb|--rebuilddb} 
initdb: 初始化,如果事先不存在数据库,则新建之,否则,不执行任何操作 
rebuilddb:重建已安装的包头的数据库索引目录

10、yum和dnf
CentOS 使用 yum, dnf 解决rpm的包依赖关系 YUM: Yellowdog Update Modifier,yum是rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具,CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的
rpm 安装rpm软件包的时候是无法解决包的依赖性问题的,在安装的时候能告知缺少什么软件包,但是它无法知道依赖包文件的位置路径,导致依赖包无法解决
yum仓库,是一个集中的大数据库,存放两块重要的内容
1、 存放所有的rpm软件包(安装包或依赖包)
2、 仓库包的元数据(包的描述信息-版本-制作者、存放包和包之间的依赖性等一些信息)

10.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仓库指向的路径一定必须是repodata目录所在目录(repodata其实存放仓库软件包的元数据的地方\记录了包之间的依赖性以及包的描述信息)

10.2 yum客户端配置

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

范例:CentOS 7的配置文件

[root@ansible ~]# cat /etc/yum.conf 
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1   #安装包前要做包的合法和完整性校验
plugins=1
installonly_limit=5  #同时可以安装5个包,最小值为2,如设为0或1,为不限制
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

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 

范例一:为CentOS7用系统安装光盘作的本地yum仓库

#挂载光盘至某目录,如/mnt/cdrom 
mount /dev/cdrom /mnt/cdrom 
#创建配置文件 [root@centos7 ~]#vim /etc/yum.repos.d/centos7.repo 
[CentOS7] name=CentOS 7 
baseurl=file:///mnt/cdrom 
gpgcheck=0 
enabled=1

范例二:为CentOS8用系统安装光盘作的本地yum仓库
注意:与之前的版本不同,CentOS 8 系统有两个yum 源:BaseOS和AppStream ,需要分别设置两个仓库 (Appstream存放额外的软件包,BaseOS存放操作系统核心包)

[root@localhost yum.repos.d]# mount /dev/sr0 /mnt
[root@localhost yum.repos.d]# cat chan.repo 
[App]
name=App
baseurl=file:///mnt/AppStream
gpgcheck=0
enabled=1

[Base]
name=Base
baseurl=file:///mnt/BaseOS
gpgcheck=0
enabled=1
[root@localhost yum.repos.d]# yum repolist 
Last metadata expiration check: 0:00:27 ago on Sat 17 Apr 2021 10:53:57 PM CST.
repo id                                                   repo name                                               status
App                                                       App                                                     4,681
Base                                                      Base                                                    1,655
## yum repolist 得出的status的数字表示该仓库包含多个软件包

范例二:为CentOS7制作的EPEL源仓库
Epel (extra packages for enterprise linux)源存放第三方红帽公司经过测试适合企业使用的仓库含有大量的包,它比我们光碟镜像自带的包多的多,增加许多非常丰富的工具

[root@ansible yum.repos.d]# cat epel.repo 
[Epel]
name=Epel
baseurl=https://repo.huaweicloud.com/epel/7/x86_64/ ##华为开源镜像网络路径,注意选择对的版本和平台
gpgcheck=0
enabled=1

下图案例是通过网络路径参夹变量$releasever(系统版本)$basearch(平台)配置的yum仓库

10.3 yum配置命令

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

yum的命令行选项:

-y #自动回答为“yes” 
-q #静默模式 
--nogpgcheck #禁止进行gpgcheck 
--enablerepo=repoidglob    #临时启用此处指定的repo,支持通配符,如:”*“ 
--disablerepo=repoidglob #临时禁用此处指定的repo,和上面语句同时使用,放在后面的生效 

yum-config-manager命令
可以生成yum仓库的配置文件及启用或禁用仓库,来自于yum-utils包
格式:

#增加仓库 
yum-config-manager --add-repo URL或file  
#禁用仓库 
yum-config-manager --disable “仓库名"  
#启用仓库 
yum-config-manager --enable “仓库名”

范例:创建创库配置

[root@centos8 ~]#rpm -qf `which yum-config-manager ` 
dnf-utils-4.0.2.2-3.el8.noarch  ## 该命令的软件包
[root@centos8 ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@centos8 ~]#ls /etc/yum.repos.d/
backup base.repo docker-ce.repo

范例:启用和禁用仓库

[root@centos8 ~]#yum-config-manager --disable epel 
[root@centos8 ~]#yum-config-manager --enable epel

下图可看到epel已经给disable

显示仓库列表

yum repolist [all|enabled|disabled]

yum repolist all 可以到本机上配置了两个仓库(Epel和chan),状态是enabled及包个数
yum repolist
1、用来查看本地有哪些yum源仓库
2、会自动下载网络仓库得元数据

查看某个命令来自哪个软件包

yum info+包名 info=information产看软件包的信息版本名字大小等

10.4安装程序包

yum install package1 [package2] [...] 
yum reinstall package1 [package2] [...] #重新安装 

10.5卸载程序包

yum remove | erase package1 [package2] [...] 

10.6卸载程序包
升级和降级:

yum update [package1] [package2] [...] 
yum downgrade package1 [package2] [...] (降级) 

10.7仓库缓存
清除目录/var/cache/yum/缓存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
yum仓库得缓存-------其缓存就是缓存仓库得元数据
下面是centos7得yum仓库得缓存空间路径,及每个仓库产生得缓存文件夹
元数据 ##软件包的描述信息-版本-制作者,存放着软件包和包之间的依赖性等一些信息

如果删除yum.repos.d里某个仓库配置,但缓存是没有清空得就变成垃圾信息了
Yum clean all ------ ##这个命令可以把缓存里面数据进行清空防止占用空间
du –sh file 或文件夹 可以看到文件大小

10.8包组管理的相关命令(例:office软件包含ex、word、ppt等软件office就是一个组)

yum grouplist [hidden] [groupwildcard] [...] 
yum groupinstall group1 [group2] [...] 
yum groupupdate group1 [group2] [...] 
yum groupremove group1 [group2] [...] 
yum groupinfo group1 [...]

10.9 yum Troubleshooting yum 和 dnf 失败最主要原因:

1、yum的配置文件格式或路径错误
解决方法:检查/etc/yum.repos.d/*.repo文件格式
2、yum cache 解决方法:yum clean all (服务器端更新了元数据)client端还是有缓存
3、网络不通: 解决方法:网卡配置

11、重点实验:实现私用 yum仓库--本地光碟及epel镜像仓库

搭建内网私网仓库源
光盘做局域网网络仓库
1、 首先安装httd进行网络协议共享

yum install -y httpd

2、在httpd的/var/www/htm/目录下创建centos和7目录把镜像挂载

mkdir -p /var/www/html/{centos}  
mkdir -p /var/www/html/centos/{7}
mount /dev/sr0 /var/www/html/centos/7  ##把光碟挂载上并通过http服务共享出去
Systemctl enable –now httpd        ##开启http服务
注意:把本机防火墙关闭,不然防火墙默认拦截httpd服务

## x.x.x.x/centos/7 进行访问
成功搭建内网私网仓库源,当内网主机使用仓库时,baseurl地址可以指向这个私网地址

12、下载阿里云或华为云得Epel仓库到包本地做局域网仓库

#CentOS 8 dnf 工具集成 
dnf reposync --help #查看帮助 
#默认只下载rpm包,不下载meta数据,需要指定--download-metadata 才能下载meta 
dnf reposync  --repoid=REPOID --download-metadata -p /path ##指定源repoid进行仓库源同步 -p指定同步路径
#CentOS 7 以前版本,reposync工具来自于yum-utils包 
reposync --repoid=REPOID --download-metadata -p /path   

1、首先本地主机配置好Epel源仓库,我以华为Epel为例子

[root@chenys /]# cat /etc/yum.repos.d/epel.repo 
[Epel]
name=Epel
baseurl=https://repo.huaweicloud.com/epel/7/x86_64/
gpgcheck=0
enabled=1

2、通过yum repolist all 可以到有两个源,分别的repo id {Epel、chan}

[root@chenys /]# yum repolist all
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id                                               repo name                                          status
Epel                                                  Epel                                               enabled: 13,580
chan                                                  chan                                               enabled: 10,072
repolist: 23,652

3、创建存放rpm包路径/var/www/html/centos/epel
下载华为epel源的所有rpm包并且下载meta

yum install -y  yum-utils
mkdir -p /var/www/html/centos/epel
[root@chenys centos]# reposync --repoid=Epel --download-metadata -p /var/www/html/centos/epel   
(1/13580): 0ad-0.0.22-1.el7.x86_64.rpm                                                           | 3.7 MB  00:00:03     
(2/13580): 0install-2.11-1.el7.x86_64.rpm                                                        | 2.2 MB  00:00:16     
(3/13580): 2048-cli-0.9.1-1.el7.x86_64.rpm                                                       |  17 kB  00:00:00     
(4/13580): 2048-cli-nocurses-0.9.1-1.el7.x86_64.rpm                                              |  16 kB  00:00:00     
(5/13580): 2ping-3.2.1-2.el7.noarch.rpm                                                          |  62 kB  00:00:00 

## x.x.x.x/centos/epel进行访问
成功下载华为epel源的rpm包和meta搭建内网私网仓库源,当内网主机使用仓库时,baseurl地址可以指向这个私网地址

Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...