Linux软件包管理
软件包管理
【1】、Linux软件类型
开源软件
软件源代码开放,供用户免费学习,允许用户二次开发,用户使用放心,后期如果开发者不再进行维护,会有其他人进行维护
闭源软件
软件代码不公开发布,无法二次开发,后期开发者如果不进行维护损失很大
【2】、开源软件包类型
源码包
优点:
可以看到软件源代码,安装灵活,可以自定义安装路径和按照功能,卸载方便
缺点:
安装过程麻烦,需要用户手动编译,需要手动解决软件包的依赖关系
二进制包(RPM包)
优点
已经被编译好了,安装简单、安装速度快
缺点
所有功能、路径无法自定义
封包类型 | 说明 |
---|---|
rpm软件包 | 扩展名为.rpm,适用于RedHat系列 |
deb软件包 | 扩展名为.deb,适用于Debian系列 |
源代码软件包 | 通常以.tar.gz、.tar.bz2格式的压缩包提供包含程序的原始代码文件 |
其他 | 提供install.sh、setup、*bin、*.pl |
绿色免安装、提供已经编译好的程序及相关软件 |
【3】、RPM软件包
Redhat Package Manager
- 由红帽公司提出,Redhat、SUSE等系列采用
- 建立集中数据库,记录软件包安装/卸载等变化信息,分析软件包依赖关系
RPM包文件名特征
软件名-版本信息.操作系统.硬件架构.rpm
firefox-91.9.0-1.el8_5.x86_64.rpm
1、RPM包的安装位置
文件类别 | 默认安装位置 |
---|---|
普通执行程序(命令) | /usr/bin、/bin/ |
服务器程序、管理工具 | /usr/sbin/、/sbin/ |
配置文件 | /etc/、/etc/软件名/ |
日志文件 | /var/log/、/var/log/软件名 |
程序文档、man手册页 | /usr/share/doc/、/usr/share/man/ |
2、RPM查询软件
-q:查询某一软件是否安装
-qa:查询系统中安装的所有软件包
-ql:显示软件在系统中安装产生了哪些数据
-qi:显示软件的详细信息
-qf:查看某一个命令是由哪一个软件包产生的
# 查看软件在系统中安装产生了哪些数据
rpm -ql tree-1.7.0-15.el8.x86_64
/usr/bin/tree
/usr/lib/.build-id
/usr/lib/.build-id/47
/usr/lib/.build-id/47/6e749c56abc75d25e3bc5c29e83507a605fd53
/usr/share/doc/tree
/usr/share/doc/tree/LICENSE
/usr/share/doc/tree/README
/usr/share/man/man1/tree.1.gz
# 查询软件的详细信息
{24-05-29 16:28}locahost:/ root# rpm -qi tree-1.7.0-15.el8.x86_64
Name : tree
Version : 1.7.0
Release : 15.el8
Architecture: x86_64
Install Date: Tue 28 May 2024 07:45:59 PM CST
Group : Unspecified
Size : 108563
License : GPLv2+
Signature : RSA/SHA256, Mon 12 Apr 2021 05:23:54 PM CST, Key ID 15af5dac6d745a60
Source RPM : tree-1.7.0-15.el8.src.rpm
Build Date : Mon 12 Apr 2021 04:38:17 PM CST
Build Host : ord1-prod-x86build003.svc.aws.rockylinux.org
Relocations : (not relocatable)
Packager : infrastructure@rockylinux.org
Vendor : Rocky
URL : http://mama.indstate.edu/users/ice/tree/
Summary : File system tree viewer
Description :
The tree utility recursively displays the contents of directories in a
tree-like format. Tree is basically a UNIX port of the DOS tree
utility.
# 查看系统中安装了多少个软件包
{24-05-29 16:43}locahost:/ root# rpm -qa | wc -l
663
# 查看某一个命令是由哪一个软件包产生的
{24-05-29 16:51}locahost:/ root# rpm -qf /usr/bin/chsh
util-linux-user-2.32.1-43.el8.x86_64
{24-05-29 16:51}locahost:/ root# rpm -qf /usr/bin/ls
coreutils-8.30-15.el8.x86_64
3、rpm软件包管理
软件包依赖问题
- 树形依赖:a--->b--->c--->d
- 环形依赖:a--->b--->c--->d--->a
- 模块依赖:需要模块文件支持
如何使用光驱所提供的软件包
首先我们需要将光驱挂载到系统中
[root@bogon ~]# ll /dev/cdrom lrwxrwxrwx. 1 root root 3 Apr 9 08:35 /dev/cdrom -> sr0 #这是光驱所在的位置
进行挂载
创建磁盘分区
mkdir /mnt/cdrom
把光驱挂载到创建的磁盘分区下,这是临时挂载,重启或者关机后失效
mount /dev/sr0 /mnt/cdrom
永久挂载,修改配置文件,在path:/erc/fstab写入如下文件,保存并退出
/dev/sr0 /mnt/cdrom iso9660 defaults 0 0
对于RPM软件包的管理,我们使用rpm命令去进行管理
-ivh:i安装,v显示详细信息,h显示软件安装进度
{24-05-29 17:15}locahost:/opt root# rpm -i /mnt/sr0/AppStream/Packages/v/vsftpd-3.0.3-36.el8.x86_64.rpm
{24-05-29 17:20}locahost:/opt root# rpm -q /mnt/sr0/AppStream/Packages/v/vsftpd-3.0.3-36.el8.x86_64.rpm
vsftpd-3.0.3-36.el8.x86_64
-Uvh:升级安装包(升级前先做好备份)
-e:卸载软件包
-qpi:查询软件包的信息
--nodesps:卸载软件包时忽略依赖关系
(一般不要忽略)
--import:导入红帽签名文件,一般来源于光盘的包都存在签名
【4】、yum机制
软件仓库
- 本地仓库(也称本地yum源):自己搭建的,创建文件,在文件中配置仓库参数
- 特点:不需要连接外网,软件包存放本机
- 网络仓库:阿里、中科大、清华大学、163仓库等
- 特点:需要连接外网、无需任何配置,直接下载
yum可以帮助我们自动解决依赖
yum repolist:列出可用的软件仓库
[root@xu ~]# yum repolist Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. repo id repo name appstream local_redhat_appstream base local_redhat_base
yum list:列出软件包(包含为安装的),也可以查找包
[root@xu ~]# yum list nginx Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. Last metadata expiration check: 0:09:44 ago on Tue 09 Apr 2024 10:14:00 PM CST. Available Packages nginx.x86_64 1:1.14.1-9.module+el8.0.0+4108+af250afe appstream
yum provides 命令:搜索该命令是由哪个软件包提供的
yum update:升级软件包
yum list 软件包 --showduplicate:列出软件包所有的版本
[root@xu yum.repos.d]# yum list nginx --showduplicates Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. nginx stable repo 51 kB/s | 55 kB 00:01 Available Packages nginx.x86_64 1.16.0-1.el8.ngx nginx-stable nginx.x86_64 1:1.14.1-9.module+el8.0.0+4108+af250afe appstream nginx.x86_64 1:1.16.1-1.el8.ngx nginx-stable nginx.x86_64 1:1.18.0-1.el8.ngx nginx-stable nginx.x86_64 1:1.18.0-2.el8.ngx nginx-stable nginx.x86_64 1:1.20.0-1.el8.ngx nginx-stable nginx.x86_64 1:1.20.1-1.el8.ngx nginx-stable nginx.x86_64 1:1.20.2-1.el8.ngx nginx-stable nginx.x86_64 1:1.22.0-1.el8.ngx nginx-stable nginx.x86_64 1:1.22.1-1.el8.ngx nginx-stable nginx.x86_64 1:1.24.0-1.el8.ngx nginx-stabl
yum install --setopt=obsoletes=0 软件包:指定安装版本(使用yum安装软件,如果不指定软件版本,则默认安装软件仓库中的最新版)
[root@xu yum.repos.d]# yum install --setopt=obsoletes=0 nginx*1.20.0 -y
yum clean all :清楚缓存
yum makecache :生成缓存
在使用网络仓库时一般会生成缓存,提高下载速度,记录软件在网络仓库所在的位置
【5】、yum软件仓库配置
1、永久挂载光驱
创建磁盘分区
mkdir /mnt/cdrom
把光驱挂载到创建的磁盘分区下,这是临时挂载,重启或者关机后失效
mount /dev/sr0 /mnt/cdrom
永久挂载,修改配置文件,在path:/erc/fstab写入如下文件,保存并退出
/dev/sr0 /mnt/cdrom iso9660 defaults 0 0
2、yum的本地配置
修改yum的repo文件
在path:/etc/yum.repo.d/rhel8.repo中填入以下内容,保存退出
[basos] # 具有唯一性,不可重复 name=cdrom baseos packages #仓库描述,描述信息,自定义,不具备唯一性 baseurl=file:///mnt/cdrom/BaseOS #指定软件仓库地址,file://用于指定本地软件包存放位置 enabled=1 #软件仓库是否启动,1启动,0不启动 gpgcheck=0 #是否检测软件包签名,0不检测,1检测,一般自己创建的仓库都是0 [appstream] name=cdrom baseos packages baseurl=file:///mnt/cdrom/AppStream enabled=1 gpgcheck=0
清理yum的缓存文件
[root@localhost ~]# yum clean all Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. 20 files removed
重新加载cache
[root@localhost ~]# yum makecache Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. mplayer 5.6 MB/s | 23 kB 00:00 cdrom baseos packages 33 MB/s | 2.4 MB 00:00 cdrom appstream package 65 MB/s | 8.1 MB 00:00 Metadata cache created.
3、禁用yum源
修改yum源的名字
能够正常使用yum源的必要条件:
1、yum源的文件名必须以:.repo结尾
2、yum源的文件必须在path:/etc/yum.repo.d/目录下
因此我们可以采用移动文件夹或者修改yum源的文件路径
修改yum源的配置文件,将enabled=1,改为enabled=0
yum源的配置文件中enabled=1表示允许调用这个源
我们把想要禁用的源中的enabled改为0,则表示这会源被禁用。
4、系统升级 / kernel升级
把虚拟机的光驱更换为更新的版本(8.8--->8.9)
将新的光驱挂载到/mnt/cdrom下
yum list kernel 列出当前使用的kernel,和可用的kernel
yum update 更新yum源(更新所有的源-->系统升级)
yum install kernel -y,下载新的kernel(只更新kernel-->内核升级)
systemctl reboot,重启系统,升级完成
如果是系统升级,重启后会有两个选项(8.8 / 8.9)我们选择8.9,进入系统
查找系统中所有的kernel version
rpm -qa | grep kernel
447是旧的版本
513是新的版本
将旧的版本删除
rpm -qa | grep kernel | grep 477 | rpm -e
5、下载阿里云的yum的repo文件
使用wget下载
wget https://mirrors.aliyun.com/repo/Centos-8.repo
我们可以禁用其他的repo源,也可以保留,但是要保证每一个repo源的唯一性,即repo源文件中【name】的唯一性
【6】、源码包管理
现有源码包(tar包)-----> 编译安装
- 自定义性强,灵活度高
再有rpm软件包----->yum rpm
源码包安装步骤,以
nginx
为例
官网下载源码包
[root@xu ~]# wget https://nginx.org/download/nginx-1.24.0.tar.gz #我们通过官网下载的源码包一般都是tar包
系统安装源码包依赖
#我们可以去nginx官网查询下载nginx时所需要的依赖,通常我们对于依赖的下载是通过yum去下载,每一个软件的依赖都是不同的,需要去对应的官网进行查询
解压源码包&进入源码包安装路径
[root@xu ~]# tar -xf nginx-1.24.0.tar.gz [root@xu ~]# ls anaconda-ks.cfg nginx-1.24.0 nginx-1.24.0.tar.gz [root@xu ~]# cd nginx-1.24.0/ [root@xu nginx-1.24.0]# ls auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
configure检测系统环境&指定安装路径与功能
#通过config我们可以指定安装路径,指定安装的功能模块,这就是通过源码包安装的优势,方便我们的管理和自定义 #在我们完成指定之后,他就会帮我们去检测系统安装环境 [root@xu nginx-1.24.0]# ./configure --prefix=/usr/local/ngix checking for OS + Linux 4.18.0-513.5.1.el8_9.x86_64 x86_64 checking for C compiler ... found + using GNU C compiler + gcc version: 8.5.0 20210514 (Red Hat 8.5.0-20) (GCC) checking for gcc -pipe switch ... found checking for -Wl,-E switch ... found checking for gcc builtin atomic operations ... found ...
make编译,将原代码转换为二进制
#检测完成后,将源码,编译为二进制文件,所谓的源码都是一个一个的用编程语言写的源文件,因此需要通过编译成为计算机可以识别的二进制文件 [root@xu nginx-1.24.0]# make make -f objs/Makefile make[1]: Entering directory '/root/nginx-1.24.0' cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \ -o objs/src/core/nginx.o \ src/core/nginx.c ...
make install 安装软件包
#编译为二进制文件后,我们就可以直接去安装了 [root@xu nginx-1.24.0]# make install
补充
在我们通过源码包安装后,我想增加新的功能,我们还需要重新编译,但不安装
#由于我们是通过源码包安装的软件,因此对其功能的选择是很方便的,我们首先看一下nginx当前的信息 [root@xu sbin]# ./nginx -V nginx version: nginx/1.24.0 built by gcc 8.5.0 20210514 (Red Hat 8.5.0-20) (GCC) configure arguments: --prefix=/usr/local/nginx #我们想增加新的功能时,必须要带上之前使用config指定的内容,再重新通过config去检查安装环境,进行编译 [root@xu nginx-1.24.0]# ./configure --prefix=/usr/local/nginx/ --with-http_ssl_module checking for OS + Linux 4.18.0-513.5.1.el8_9.x86_64 x86_64 checking for C compiler ... found + using GNU C compiler + gcc version: 8.5.0 20210514 (Red Hat 8.5.0-20) (GCC) checking for gcc -pipe switch ... found checking for -Wl,-E switc[root@xu nginx-1.24.0]# make make -f objs/Makefile make[1]: Entering directory '/root/nginx-1.24.0' cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \ -o objs/src/core/nginx.o \ h ... found checking for gcc builtin atomic operations ... found checking for C99 variadic macros ... found #然后再重新编译 [root@xu nginx-1.24.0]# make make -f objs/Makefile make[1]: Entering directory '/root/nginx-1.24.0' cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \ -o objs/src/core/nginx.o \ ## !!!编译完成后不要安装!!!,如果安装会覆盖之前的内容 #在编译完成后,nginx源码包目录下会有一个objs目录,里面由nginx可执行文件,我们需要将nginx复制到安装路径下的/sbin/下,替换掉原来的nginx可执行文件 [root@xu nginx-1.24.0]# ls auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src [root@xu objs]# cp ./nginx /usr/local/nginx/sbin/ cp: overwrite '/usr/local/nginx/sbin/nginx'? y [root@xu objs]# cd /usr/local/nginx/sbin/ [root@xu sbin]# ls nginx #最后我们检查nginx的版本信息,至此增加完成 [root@xu sbin]# ./nginx -V nginx version: nginx/1.24.0 built by gcc 8.5.0 20210514 (Red Hat 8.5.0-20) (GCC) built with OpenSSL 1.1.1k FIPS 25 Mar 2021 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx/ --with-http_ssl_module
【7】、自定义软件仓库
yum运行思路:
运行yum命令程序---->仓库配置文件---->软件包仓库
软件包仓库:
1、众多的软件包
2、仓库数据文件(仓库清单)
模拟在Linux不能上网的情况下去按照软件
1、我们首先需要通过宿主机把软件下载好,在使用传输工具或者命令传到虚拟机中
2、然后就可以在虚拟机中进行安装了
解压传入的压缩包,里面是一个个的rpm软件包
在下载之前需要让yum去识别这个软件的安装方式
1、首先看下光盘中的安装方式是什么样的
BaseOS和AppStream目录下的repodata里面的repomd存储的是下载方式的索引,在使用yum去下载时都需要在repomd里找到对应的软件下载方式后再去packages目录下去下载
repodata也就仓库清单
[root@localhost ~]# ls /mnt/cdrom/BaseOS/repodata/
005f3daf06049c081565a4066404ce4ca5bb0275b8a9e5a04c725b09ac0bbb07-comps-BaseOS.x86_64.xml
6dcf6de7dd1089a452d5caa14fa1db8ce7cb79aad28a47a95f5aed14bd22f767-productid.gz
9b3a380a984ef4d552ce527b40f3415775e18955b6ca9a9c305f60cf6529f602-filelists.xml.gz
a28f983c96f2d691c966620431244d8c4a8415ec349e31b9cce280783ec323d3-primary.xml.gz
ab4ec8c050898edbe33646155dff8b15d16e3d29f3a13b029b2e2e6ca5c24a57-other.xml.gz
dd3fd62a2077ecf119b6f7971aa8882a546356fef66a874bf4860f8a6d45f416-comps-BaseOS.x86_64.xml.gz
productid
repomd.xml
TRANS.TBL
[root@localhost ~]# ls /mnt/cdrom/AppStream/repodata/
2adc257c8b938376e8d66f70b6dd601f46111b6f46e06d610d67f4e9daab434c-primary.xml.gz
2c384cc97bc979264430666010a3f52aeca381fd2137abba70ab6672429ac194-filelists.xml.gz
45295e7b00a783d7ef66a3d6f2f5890477a61c5c465f7190a910b50d7cf222e4-modules.yaml.gz
468fea75becd836ab1fc45fe77d820e37ab22b18cc2a4a992f65b81833f96854-comps-AppStream.x86_64.xml
6dcf6de7dd1089a452d5caa14fa1db8ce7cb79aad28a47a95f5aed14bd22f767-productid.gz
ad09469a33bac2649097cdf63bdc43d4415c6bfaffabdf6ce3da47b6fcb03596-comps-AppStream.x86_64.xml.gz
e0bb60aac5d524ef1cf945f2a934e27a63d77238bc2b25f13c7335286bf1869c-other.xml.gz
productid
repomd.xml
TRANS.TBL
2、生成repodata文件
因此我们也需要按照BaseOS和AppStream目录下的repodata生成新的repodata
使用createrepo命令去生成mplayer的repodata文件
createrepo默认是没有下载的
yum list createrepo # 查看下载createrepo所需要的包
createrepo_c # 需要createrepo_c
yum install createrepo_c -y
createrepo /opt/tools #生成了repodata文件
3、编写yum的repo源
[mytools]
name=mytools
baseurl=file:///opt/tools
enabled=1
gpgcheck=0
清理yum下载的包,重进加载缓存,下载mplayer
yum clean
yum makecache
yum install mplayer
4、repomd.xml、repodata、yum源的repo文件的作用、联系
repomd.xml文件的作用是存放软件的索引信息,通过yum去下载时,会根据repo文件中的【name】去找对应目录下的repomd.xml
repodata目录的作用是收集当前软件的各种信息(版本信息等),并且写入repomd.xml中
yum源的repo文件,在使用yum去下载时会去所有的repo文件中去找到对应路径,去看哪个路径下有有对应软件的repodata目录(如果找遍了所有的源都没有,则会报错)。因此在写repo源文件时,一定要保证路径的正确性
联系
首先使用createrepo命令
会发生两个步骤
- 在软件包所在的目录生成repodata目录
- repodata目录收集对应软件的各种信息,写入repomd.xml中
通过yum去下载软件
- 首先去/etc/yum.repos.d/目录下查找可用的repo源文件
- 可用的repo文件也就是在baseurl写的路径中可以找到repodata目录
- 进而可以找到repom.xml文件,索引到对应的软件,然后在packages中下载
- 首先去/etc/yum.repos.d/目录下查找可用的repo源文件
在一个系统中可以存在多个yum源,但是一般来说通常只保留一个,可用的repo源越多,当一个源出错时,可能会造成连带影响
【8】、网络yum仓库
构建网络服务,通过网络服务提供仓库内容
- 构建FTP服务
- 利用FTP服务共享目录,我们将自定义软件仓库,放到共享目录下即可
- 在客户端通过curl去访问ftp共享服务目录
# 服务端进行配置
cp -r /etc/yum.repos.d/mytools /var/ftp/rpms
# 客户端进行测试
curl ftp://192.168.121.180/rpms
在客户端需要写yum的repo文件,告诉yum你可以去ftp共享目录下获取软件
[ftp]
name=my_ftp
baseurl=ftp://192.168.121.180/rpms
gpgcheck=0
enable=1
利用这种架构,
在ftp服务器上可以为很多主机提供一个自定义的网路yum仓库
利用ftp服务提供光盘yum仓库的提供
我们只需将光驱设备挂载到/var/ftp目录下即可
mount /dev/cdrom /var/ftp/dvd/
# 修改/etc/fstab文件
# 在客户端进行测试
curl ftp://192.168.121.180/dvd/
dr-xr-xr-x 4 0 0 2048 Nov 21 2023 AppStream
dr-xr-xr-x 4 0 0 2048 Nov 21 2023 BaseOS
dr-xr-xr-x 3 0 0 2048 Nov 21 2023 EFI
-r--r--r-- 1 0 0 2204 Nov 03 2023 LICENSE
-r--r--r-- 1 0 0 883 Nov 21 2023 TRANS.TBL
dr-xr-xr-x 3 0 0 2048 Nov 21 2023 images
dr-xr-xr-x 2 0 0 2048 Nov 21 2023 isolinux
-r--r--r-- 1 0 0 88 Nov 21 2023 media.repo
# 修改客户端的配置文件
[basos]
name=local_basos
baseurl=ftp://192.168.121.180/dvd/BaseOS
gpgcheck=0
enable=1
[appstream]
name=local_appstream
baseurl=ftp://192.168.121.180/dvd/AppStream
gpgcheck=0
enable=1
【9】、yum仓库更新
yum仓库的更新分为两个方面
- 仓库数据文件的更新
- yum缓存的更新
# 服务端仓库数据文件的更新
mv /opt/tools/xxx.rpm /root
createrepo --update /var/ftp/rpms
# 客户端yum缓存的更新
yum makecache
yum repoinfo