1. 程式人生 > 其它 >使用dnf shell安裝本地rpm包的遇到的問題

使用dnf shell安裝本地rpm包的遇到的問題

使用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