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

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 

发表评论

评论已关闭。

相关文章