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