使用dnf shell安装本地rpm包的遇到的问题

本文介绍了在Red Hat系统中使用DNF进行本地RPM包安装时遇到的问题及解决方案,包括`dnf localinstall`命令的使用和`dnf shell`的事务管理功能。在DNF Shell中,多行安装本地包会导致只有第一行被安装,需将所有包名放在同一行以确保正确安装。
摘要由CSDN通过智能技术生成

使用dnf shell安装本地rpm包的遇到的问题

最近项目中使用dnf安装本地安装包遇到了2个问题,调试了蛮久,记录下来,也供大家参考。

dnf是yum的升级版,在redhat8之后yum逐渐升级为dnf,基本的功能与yum差别不是很大

本人使用dnf 4.4.2来实验,可能版本升级后有所不同。

dnf local install

dnf不仅可以安装仓库提供的rpm包,也可以安装本地打包或者下载好的rpm包。如果本地缺少依赖包,dnf也依然会去默认的仓库去拉取。

为了测试方便,我们先从仓库下载几个包下来:

# --downloadonly:仅下载,不安装
$ dnf install gcc --downloadonly --destdir ./gcc/
Last metadata expiration check: 1 day, 2:29:19 ago on Thu 19 May 2022 08:25:23 PM EDT.
Dependencies resolved.
===========================================================================================================
 Package                        Architecture       Version                              Repository     Size
===========================================================================================================
Installing:
 gcc                            x86_64             8.4.1-1.el8                          el8             23 M
Installing dependencies:
 annobin                        x86_64             9.50-1.el8                           el8            106 k
 binutils                       x86_64             2.30-93.el8                          el8            5.8 M
 cpp                            x86_64             8.4.1-1.el8                          el8             10 M
 glibc-devel                    x86_64             2.28-151.el8                         el8            1.0 M
 glibc-headers                  x86_64             2.28-151.el8                         el8            477 k
 isl                            x86_64             0.16.1-6.el8                         el8            835 k
 kernel-headers                 x86_64             4.18.0-147.5.1.el8_24                el8            2.7 M
 libmpc                         x86_64             1.1.0-9.1.el8                        el8             60 k
 libpkgconf                     x86_64             1.4.2-1.el8                          el8             34 k
 libxcrypt-devel                x86_64             4.1.1-4.el8                          el8             24 k
 pkgconf                        x86_64             1.4.2-1.el8                          el8             37 k
 pkgconf-m4                     noarch             1.4.2-1.el8                          el8             16 k
 pkgconf-pkg-config             x86_64             1.4.2-1.el8                          el8             14 k

Transaction Summary
============================================================================================================
Install  14 Packages

Total download size: 45 M
Installed size: 122 M
DNF will only download packages for the transaction.
Is this ok [y/N]: y
Downloading Packages:
(1/14): annobin-9.50-1.el8.x86_64.rpm                                         270 kB/s | 106 kB     00:00
(2/14): binutils-2.30-93.el8.x86_64.rpm                                       755 kB/s | 5.8 MB     00:07   
(3/14): glibc-devel-2.28-151.el8.x86_64.rpm                                   486 kB/s | 1.0 MB     00:02   
(4/14): glibc-headers-2.28-151.el8.x86_64.rpm                                 407 kB/s | 477 kB     00:01   
(5/14): isl-0.16.1-6.el8.x86_64.rpm                                           355 kB/s | 835 kB     00:02   
(6/14): kernel-headers-4.18.0-147.5.1.el8_24.x86_64.rpm                       290 kB/s | 2.7 MB     00:09   
(7/14): libmpc-1.1.0-9.1.el8.x86_64.rpm                                       230 kB/s |  60 kB     00:00   
(8/14): libpkgconf-1.4.2-1.el8.x86_64.rpm                                      58 kB/s |  34 kB     00:00   
(9/14): libxcrypt-devel-4.1.1-4.el8.x86_64.rpm                                215 kB/s |  24 kB     00:00   
(10/14): pkgconf-1.4.2-1.el8.x86_64.rpm                                       225 kB/s |  37 kB     00:00   
(11/14): pkgconf-m4-1.4.2-1.el8.noarch.rpm                                    162 kB/s |  16 kB     00:00   
(12/14): pkgconf-pkg-config-1.4.2-1.el8.x86_64.rpm                            158 kB/s |  14 kB     00:00   
(13/14): cpp-8.4.1-1.el8.x86_64.rpm                                           365 kB/s |  10 MB     00:29   
(14/14): gcc-8.4.1-1.el8.x86_64.rpm                                           587 kB/s |  23 MB     00:40   
------------------------------------------------------------------------------------------------------------
Total                                                                         1.1 MB/s |  45 MB     00:41     
Complete!

$ ls gcc/
annobin-9.50-1.el8.x86_64.rpm          kernel-headers-4.18.0-147.5.1.el8_24.x86_64.rpm
binutils-2.30-93.el8.x86_64.rpm        libmpc-1.1.0-9.1.el8.x86_64.rpm
cpp-8.4.1-1.el8.x86_64.rpm             libpkgconf-1.4.2-1.el8.x86_64.rpm
gcc-8.4.1-1.el8.x86_64.rpm             libxcrypt-devel-4.1.1-4.el8.x86_64.rpm
glibc-devel-2.28-151.el8.x86_64.rpm    pkgconf-1.4.2-1.el8.x86_64.rpm
glibc-headers-2.28-151.el8.x86_64.rpm  pkgconf-m4-1.4.2-1.el8.noarch.rpm
isl-0.16.1-6.el8.x86_64.rpm            pkgconf-pkg-config-1.4.2-1.el8.x86_64.rpm

我们准备了关于gcc的这些包。然后安装就可以使用dnf local install(install):

$ dnf install ./gcc/*.rpm
Last metadata expiration check: 1 day, 2:35:00 ago on Thu 19 May 2022 08:25:23 PM EDT.
Dependencies resolved.
===========================================================================================================
 Package                      Architecture     Version                           Repository            Size
===========================================================================================================
Installing:
 annobin                      x86_64           9.50-1.el8                        @commandline          106 k
 binutils                     x86_64           2.30-93.el8                       @commandline          5.8 M
 cpp                          x86_64           8.4.1-1.el8                       @commandline           10 M
 gcc                          x86_64           8.4.1-1.el8                       @commandline           23 M
 glibc-devel                  x86_64           2.28-151.el8                      @commandline          1.0 M
 glibc-headers                x86_64           2.28-151.el8                      @commandline          477 k
 isl                          x86_64           0.16.1-6.el8                      @commandline          835 k
 kernel-headers               x86_64           4.18.0-147.5.1.el8_24             @commandline          2.7 M
 libmpc                       x86_64           1.1.0-9.1.el8                     @commandline           60 k
 libpkgconf                   x86_64           1.4.2-1.el8                       @commandline           34 k
 libxcrypt-devel              x86_64           4.1.1-4.el8                       @commandline           24 k
 pkgconf                      x86_64           1.4.2-1.el8                       @commandline           37 k
 pkgconf-m4                   noarch           1.4.2-1.el8                       @commandline           16 k
 pkgconf-pkg-config           x86_64           1.4.2-1.el8                       @commandline           14 k

Transaction Summary
============================================================================================================
Install  14 Packages
# ...(略)

然后就可以安装了。

dnf shell

dnf/yum提供了shell的功能,即在一个shell,可以同时执行各种操作,但是是在一个事务中完成,我们来看下例子:

$ dnf shell
Last metadata expiration check: 1 day, 2:53:04 ago on Thu 19 May 2022 08:25:23 PM EDT.
> install gcc
> install libmpc
> install nginx
> remove wget
> run
============================================================================================================
 Package                               Architecture     Version                          Repository     Size
============================================================================================================
Installing:
 gcc                                   x86_64           8.4.1-1.el8                      el8            23 M
 libmpc                                x86_64           1.1.0-9.1.el8                    el8            60 k
 nginx                                 x86_64           1:1.14.1-9.el8                   el8           566 k
Installing dependencies:
 annobin                               x86_64           9.50-1.el8                       el8           106 k
 binutils                              x86_64           2.30-93.el8                      el8           5.8 M
 cpp                                   x86_64           8.4.1-1.el8                      el8            10 M
 gd                                    x86_64           2.2.5-7.el8                      el8           143 k
 glibc-devel                           x86_64           2.28-151.el8                     el8           1.0 M
 glibc-headers                         x86_64           2.28-151.el8                     el8           477 k
 isl                                   x86_64           0.16.1-6.el8                     el8           835 k
 jbigkit-libs                          x86_64           2.1-14.el8                       el8            54 k
 kernel-headers                        x86_64           4.18.0-147.5.1.el8_24            el8           2.7 M
 libXpm                                x86_64           3.5.12-8.el8                     el8            57 k
 libjpeg-turbo                         x86_64           1.5.3-10.el8                     el8           154 k
 libpkgconf                            x86_64           1.4.2-1.el8                      el8            34 k
 libtiff                               x86_64           4.0.9-18.el8                     el8           187 k
 libwebp                               x86_64           1.0.0-1.el8                      el8           271 k
 libxcrypt-devel                       x86_64           4.1.1-4.el8                      el8            24 k
 libxslt                               x86_64           1.1.32-6.el8                     el8           249 k
 nginx-all-modules                     noarch           1:1.14.1-9.el8                   el8            22 k
 nginx-filesystem                      noarch           1:1.14.1-9.el8                   el8            23 k
 nginx-mod-http-image-filter           x86_64           1:1.14.1-9.el8                   el8            34 k
 nginx-mod-http-perl                   x86_64           1:1.14.1-9.el8                   el8            44 k
 nginx-mod-http-xslt-filter            x86_64           1:1.14.1-9.el8                   el8            32 k
 nginx-mod-mail                        x86_64           1:1.14.1-9.el8                   el8            63 k
 nginx-mod-stream                      x86_64           1:1.14.1-9.el8                   el8            84 k
 pkgconf                               x86_64           1.4.2-1.el8                      el8            37 k
 pkgconf-m4                            noarch           1.4.2-1.el8                      el8            16 k
 pkgconf-pkg-config                    x86_64           1.4.2-1.el8                      el8            14 k
Removing:
 wget                                  x86_64           1.19.5-10.el8                    @el8          2.8 M
Removing unused dependencies:
 libmetalink                           x86_64           0.1.3-7.el8                      @el8           70 k

Transaction Summary
===========================================================================================================
Install  29 Packages
Remove    2 Packages

Total download size: 47 M
Is this ok [y/N]: 

我们看到在一个事务中,同时执行了install gcc,install libmpc,install nginx,remove wget命令,然后通过run来触发执行事务,我们便可以在这个事务同时做多个安装或者删除的操作,对于比较大型项目中,dnf shell还是比较实用的。

注意

上边说了dnf的local install及shell, 当前local install也可以在dnf shell中执行。不过也注意几个事情,我们先来看第一个要注意的点,看下例子,我们想要安装刚刚本地下来的一些gcc rpm包

$ dnf shell
Last metadata expiration check: 1 day, 3:03:23 ago on Thu 19 May 2022 08:25:23 PM EDT.
> install /root/gcc/annobin-9.50-1.el8.x86_64.rpm
> install /root/gcc/binutils-2.30-93.el8.x86_64.rpm
Error: Cannot add local packages, because transaction job already exists

哈,当我们添加第二个的时候,就报了一个不能添加local package了错误,我们执行run试试:

> run
============================================================================================================
 Package                      Architecture     Version                           Repository             Size
===========================================================================================================
Installing:
 annobin                      x86_64           9.50-1.el8                        @commandline          106 k
Installing dependencies:
 binutils                     x86_64           2.30-93.el8                       el8                   5.8 M
 cpp                          x86_64           8.4.1-1.el8                       el8                    10 M
 gcc                          x86_64           8.4.1-1.el8                       el8                    23 M
 glibc-devel                  x86_64           2.28-151.el8                      el8                   1.0 M
 glibc-headers                x86_64           2.28-151.el8                      el8                   477 k
 isl                          x86_64           0.16.1-6.el8                      el8                   835 k
 kernel-headers               x86_64           4.18.0-147.5.1.el8_24             el8                   2.7 M
 libmpc                       x86_64           1.1.0-9.1.el8                     el8                    60 k
 libpkgconf                   x86_64           1.4.2-1.el8                       el8                    34 k
 libxcrypt-devel              x86_64           4.1.1-4.el8                       el8                    24 k
 pkgconf                      x86_64           1.4.2-1.el8                       el8                    37 k
 pkgconf-m4                   noarch           1.4.2-1.el8                       el8                    16 k
 pkgconf-pkg-config           x86_64           1.4.2-1.el8                       el8                    14 k

可以看到Installing中只会包含第一个annobin(仓库那一栏显示@commandline),我们添加进来的binutils不会安装,只是会从repo拉取annobin的依赖包(Installing dependencies)时刚好拉取到。

那我们放置在一行(空格分开)会出现什么情况呢:

dnf shell
Last metadata expiration check: 1 day, 3:10:09 ago on Thu 19 May 2022 08:25:23 PM EDT.
> install /root/gcc/annobin-9.50-1.el8.x86_64.rpm /root/gcc/binutils-2.30-93.el8.x86_64.rpm
> run
============================================================================================================
 Package                      Architecture     Version                           Repository             Size
============================================================================================================
Installing:
 annobin                      x86_64           9.50-1.el8                        @commandline          106 k
 binutils                     x86_64           2.30-93.el8                       @commandline          5.8 M
Installing dependencies:
 cpp                          x86_64           8.4.1-1.el8                       el8                    10 M
 gcc                          x86_64           8.4.1-1.el8                       el8                    23 M
 glibc-devel                  x86_64           2.28-151.el8                      el8                   1.0 M
 glibc-headers                x86_64           2.28-151.el8                      el8                   477 k
 isl                          x86_64           0.16.1-6.el8                      el8                   835 k
 kernel-headers               x86_64           4.18.0-147.5.1.el8_24             el8                   2.7 M
 libmpc                       x86_64           1.1.0-9.1.el8                     el8                    60 k
 libpkgconf                   x86_64           1.4.2-1.el8                       el8                    34 k
 libxcrypt-devel              x86_64           4.1.1-4.el8                       el8                    24 k
 pkgconf                      x86_64           1.4.2-1.el8                       el8                    37 k
 pkgconf-m4                   noarch           1.4.2-1.el8                       el8                    16 k
 pkgconf-pkg-config           x86_64           1.4.2-1.el8                       el8                    14 k

Transaction Summary
============================================================================================================
Install  14 Packages

可以看到会安装annobin及binutils两个包,也就是可以执行成功。

那么我们也就可以得到结论,使用dnf shell 安装本地包时,需要将要安装的包都写在同一行,否则只会安装第一行包。

我们也可以在dnf文档这里找到相关的记录,和我们得出的结论也是一致的:

Note that all local packages must be used in the first shell transaction subcommand (e.g. install /tmp/nodejs-1-1.x86_64.rpm /tmp/acpi-1-1.noarch.rpm) otherwise an error will occur.

总结

这里列出来本人使用dnf shell遇到的一个问题,以此共勉。主要是在dnf shell中不能多行install本地rpm包,否则只有第一行奏效。

ref

https://dnf.readthedocs.io/en/latest/command_ref.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值