はじめに
今日はLinux(RHEL)についてやや小ネタ的な話。
知り合いから「あるRHELの環境に適用したrpmパッケージを(何らかの方法で抽出して)他の環境に適用することは可能か?」という質問を受け(例えば適用済みrpmが配置されているディレクトリからtarで抜き出すなどして)、興味深かったので調べた結果をまとめます。
経緯
- とある依存関係の多いrpmパッケージを適用しようとしている
- パッケージを適用しようとしている本番環境はAWS(EC2)環境だが、インターネットへの接続は無い
- 製品メディアは無し
- rpmを1つずつダウンロードして持ち込むのは(数が多過ぎて)心が折れる
- 何とかして検証環境(作業端末のVirtualbox環境)にてyumでまとめて適用したものを持っていけないか(←今ココ)
対処方法(結論)
結論としては、yumのdownloadonlyプラグインかyumdownloaderユーティリティーを利用することで、yumで依存関係を含め洗い出したパッケージをインストールせずにダウンロードだけすることができます。
(yumdownloaderは「インストールされているrpmをダウンロードする」なので厳密には少し違いますが)
ちなみに、RHEL5、6では追加インストールが必要ですが、検証したRHEL8ではどちらもインストール済みでした。
検証結果
せっかくなので、簡単にできそうなdownloadonlyプラグインを検証してみようと思います。
今回は2台のRHEL環境を用意し、1台目(Host-a)でダウンロードしたrpmを2台目(Host-b)に転送して適用できるかを検証しました。
(パッケージはkshを使いました)
0.環境情報
※AWSのRHEL環境を2台用意しました。
(AMI:ami-09f31cc5d5eecca1a)
###Host-a###
[ec2-user@Host-a ~]$ date
Tue Feb 4 12:05:55 UTC 2020
[ec2-user@Host-a ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.0 (Ootpa)
[ec2-user@Host-a ~]$ rpm -qa | grep ksh
[ec2-user@Host-a ~]$
###Host-b###
[ec2-user@Host-b ~]$ date
Tue Feb 4 12:05:46 UTC 2020
[ec2-user@Host-b ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.0 (Ootpa)
[ec2-user@Host-b ~]$ rpm -qa | grep ksh
[ec2-user@Host-b ~]$
1.Host-aにてrpmダウンロード(downloadonly)
※--downloaddirでダウンロード先ディレクトリを指定
[ec2-user@Host-a ~]$ sudo yum install --downloadonly --downloaddir=./ ksh
Red Hat Update Infrastructure 3 Client Configuration Server 8 2.1 kB/s | 2.5 kB 00:01
Red Hat Enterprise Linux 8 for x86_64 - AppStream from RHUI (RPMs) 35 MB/s | 14 MB 00:00
Red Hat Enterprise Linux 8 for x86_64 - BaseOS from RHUI (RPMs) 38 MB/s | 13 MB 00:00
Last metadata expiration check: 0:00:01 ago on Tue 04 Feb 2020 12:07:17 PM UTC.
Dependencies resolved.
=============================================================================================================================================== Package Arch Version Repository Size ===============================================================================================================================================Installing:
ksh x86_64 20120801-252.el8 rhui-rhel-8-appstream-rhui-rpms 956 k
Transaction Summary
===============================================================================================================================================Install 1 Package
Total download size: 956 k
Installed size: 3.5 M
DNF will only download packages for the transaction.
Is this ok [y/N]: y
Downloading Packages:
ksh-20120801-252.el8.x86_64.rpm 8.4 MB/s | 956 kB 00:00
-----------------------------------------------------------------------------------------------------------------------------------------------Total 7.5 MB/s | 956 kB 00:00
Complete!
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing 'dnf clean packages'.
[ec2-user@Host-a ~]$ ls -l
total 956
-rw-r--r--. 1 root root 978572 Feb 4 12:07 ksh-20120801-252.el8.x86_64.rpm
[ec2-user@Host-a ~]$
2.rpmの転送
※Host-aでダウンロードしたrpmを作業端末を踏み台にしてHost-bにscpでコピー
3.Host-bでrpm適用
※転送したrpmを適用し、kshが実行できることを確認しました。
[ec2-user@Host-b ~]$ ls -l
total 956
-rw-rw-r--. 1 ec2-user ec2-user 978572 Feb 4 12:11 ksh-20120801-252.el8.x86_64.rpm
[ec2-user@Host-b ~]$
[ec2-user@Host-b ~]$
[ec2-user@Host-b ~]$ sudo rpm -ivh ksh-20120801-252.el8.x86_64.rpm
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:ksh-20120801-252.el8 ################################# [100%]
[ec2-user@Host-b ~]$ rpm -qa | grep ksh
ksh-20120801-252.el8.x86_64
[ec2-user@Host-b ~]$ ksh
$ exit
[ec2-user@Host-b ~]$ date
Tue Feb 4 12:11:43 UTC 2020
補足
最初に想定した「インストールしたパッケージを抽出する」ですが、どうもLinux上には適用したパッケージをrpmとしては保存しないため、そもそもできないようです。