软件包管理

【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

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中下载
  • 在一个系统中可以存在多个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

标签: none

添加新评论