yumでパッケージをインストールせずにダウンロードする方法

# はじめに

今日はLinux（RHEL）についてやや小ネタ的な話。
知り合いから「あるRHELの環境に適用したrpmパッケージを（何らかの方法で抽出して）他の環境に適用することは可能か？」という質問を受け（例えば適用済みrpmが配置されているディレクトリからtarで抜き出すなどして）、興味深かったので調べた結果をまとめます。

## 経緯

- とある依存関係の多いrpmパッケージを適用しようとしている
- パッケージを適用しようとしている本番環境はAWS（EC2）環境だが、インターネットへの接続は無い
- 製品メディアは無し
- rpmを1つずつダウンロードして持ち込むのは（数が多過ぎて）心が折れる
- 何とかして検証環境（作業端末のVirtualbox環境）にてyumでまとめて適用したものを持っていけないか（←今ココ）

# 対処方法（結論）

結論としては、yumのdownloadonlyプラグインかyumdownloaderユーティリティーを利用することで、yumで依存関係を含め洗い出したパッケージを**インストールせずに**ダウンロードだけすることができます。
（yumdownloaderは「インストールされているrpmをダウンロードする」なので厳密には少し違いますが）

https://access.redhat.com/ja/solutions/395763

ちなみに、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としては保存しないため、そもそもできないようです。

（参考情報）
https://teratail.com/questions/5977