前回に引き続き yum(dnf) 関連の小ネタです。


前回のおさらいも含めますが、yum を使って、例えば "wget" をインストールしようとする場合、以下のような "yum install" コマンドを実行することになります:
# yum install wget
Updating Subscription Management repositories.
Last metadata expiration check: 1:19:58 ago on Mon Jan  1 09:30:11 2024.
Dependencies resolved.
================================================================================
 Package Arch      Version            Repository                           Size
================================================================================
Installing:
 wget    x86_64    1.21.1-7.el9       rhel-9-for-x86_64-appstream-rpms    794 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 794 k
Installed size: 3.1 M
Is this ok [y/N]:

普通にインターネット環境が整っていれば、インターネット上のリポジトリを参照し、必要な依存ライブラリと現在の OS にインストール済みのライブラリとを比較し、足りない(追加でインストールが必要な)ライブラリとまとめてインストールしてくれます。一般的な利用であればこれだけ覚えておけば充分なケースも少なくありません。

ただ少し特殊なケース、例えば「インターネット接続環境がない」 CentOS/RHEL 環境の場合にどうやってインストールするか、というのは少し工夫が必要になります。今回のブログのテーマがこれです。

これはケース・バイ・ケースなんですが、おそらく以下(1)~(3)のいずれかの方法で解決できると思っています。実現が容易な順に(1)から(3)と記載しているので、数字が小さい方法で解決できるものかどうかを調べて、できない場合は次の数字へ、、という順に調べていただくのがおススめです。なおインストールするパッケージのライセンスに関わる問題は解決済みである(正式なライセンスを持っていて、インターネット接続できている場合はライセンス含めて問題なくインストールできるもの)と仮定します。

(1)DVD や ISO などのインストールメディアを持っている場合、

インターネット環境はないけれど、OS のインストール時に使った DVD メディアや、その ISO ファイルを持っているようなケースです(本来なら初期インストール時に一緒に入れておけばよかったのに入れ忘れたケースも含みます)。目的のファイルの rpm パッケージが含まれたメディアが手元にある場合は、そのメディアを使ってインストールすることが可能です。

具体的にはそのメディアをマウントした上で、ローカル環境に新しいリポジトリを1つ追加することで、インターネット上ではなく、ローカルファイルシステムに展開されたリポジトリが使えるようになり、そのローカルリポジトリを使ってインストールする、という方法です。少し古い環境で書かれていますが、以前に書いたこちらのブログエントリを参照するとより具体的な手順を説明しています:
ローカル環境内に yum リポジトリを作成する


(2)DVD や ISO などのインストールメディアを持っていない場合、

問題はこちらです。インターネット上に目的のパッケージファイルがあり、インストール用 DVD や他の DVD などでは提供されていないようなケースです(ansible などはこのパターンです)。インターネットに接続されている状況下であれば普通に "yum install" でインストールできるけど、接続がないとモジュールにアクセスできないのでインストールできない、ということになります。

これも考え方としては(1)と同様で「なんとかしてインストールに必要なファイルを入手して、ローカルファイルシステム上に用意」して、「ローカルリポジトリを作ってインストールする」ことになります。問題は「なんとかしてインストールに必要なファイルを入手」する部分です。

ここから先は実際にインターネットに接続されていない環境(目的のインストールを行う環境)とは別にインターネットに接続された環境を用意するか、その環境を一時的でいいのでインターネットに接続して実施する必要があります。インターネット接続のある環境で準備して、準備したファイルを目的の環境にコピー(転送)すれば、後は(1)と同様にできる、というやり方です。この前提が必要となる点に注意してください。

さて、インターネット接続のある環境で目的のファイルを(インストールではなく)ダウンロードだけ行うにはどのようにすればいいでしょうか? 例えば上述の "wget" の例で考えると、「"yum install wget" の結果としてダウンロードされてインストールされるファイルをダウンロードだけしたい」ことになります。

これは yum のオプション指定で可能でした。具体的には以下2つのオプションを指定します:
 ・"--downloadonly"
 ・"--destdir=(保存先ディレクトリ)"

"wget" の例だと以下のように実行します(この例だと保存先に /tmp を指定し、また確認プロンプトで止めないように "-y" オプションも指定しています):
# yum install --downloadonly --destdir=/tmp -y wget
Updating Subscription Management repositories.
Last metadata expiration check: 0:59:59 ago on Tue Jan  2 05:56:23 2024.
Dependencies resolved.
================================================================================
 Package       Architecture    Version                  Repository         Size
================================================================================
Installing:
 wget          x86_64          1.21.1-7.el9             myrhel92          794 k

Transaction Summary
================================================================================
Install  1 Package

Total size: 794 k
Installed size: 3.1 M
YUM will only download packages for the transaction.
Downloading Packages:
Complete!

成功すると(私の環境だと) "/tmp/wget-1.21.1-7.el9.x86_64.rpm" というファイルがダウンロードできていました。具体的なファイル名は実行環境やタイミングによって(バージョンなどが)少し変わる可能性もありますが、目的のファイルがダウンロードできたことになります。 ちなみにこうしてダウンロードできた rpm ファイルをスタンドアロン環境でインストールするには、上述のようなローカルリポジトリを作って行う場合以外にも、
# yum install /tmp/wget-1.21.1-7.el9.x86_64.rpm

のようにフルパス指定することでも可能になります。

ちなみに、上の wget のケースでは rpm ファイル1つだけが必要で、ダウンロードファイルも1つだけでした。これが、
# yum install --downloadonly --destdir=/tmp jq
Updating Subscription Management repositories.
Last metadata expiration check: 1:06:58 ago on Tue Jan  2 05:56:23 2024.
Dependencies resolved.
================================================================================
 Package           Architecture   Version                Repository        Size
================================================================================
Installing:
 jq                x86_64         1.6-14.el9             myrhel92         190 k
Installing dependencies:
 oniguruma         x86_64         6.9.6-1.el9.5          myrhel92         221 k

Transaction Summary
================================================================================
Install  2 Packages

Total size: 411 k
Installed size: 1.1 M
Is this ok [y/N]:

のように依存ライブラリが存在しているような場合はどうなるのでしょうか? 答はシンプルで「依存ファイルもまとめてダウンロード」されることになります。上の例だと、
 ・/tmp/jq-1.6-14.el9.x86_64.rpm
 ・/tmp/oniguruma-6.9.6-1.el9.5.x86_64.rpm

という2つのファイルがダウンロードされます。ダウンロード後のインストールは2つのファイルをそれぞれフルパス指定してローカルインストールしてもいいですし、2つのファイルを含むローカルリポジトリを作ってから "yum install jq" を実行する、でもセットアップできます。


(3)既にインストール済みの場合、

最後はちょっとややこしいケースです。例えば "wget" のモジュールをダウンロードしようとして、以下のようなメッセージがでることがあります:
# yum install --downloadonly --destdir=/tmp -y wget
Updating Subscription Management repositories.
Last metadata expiration check: 1:14:12 ago on Tue Jan  2 05:56:23 2024.
Package wget-1.21.1-7.el9.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!

「(この環境には)既にインストール済みなので何もすることはない」というメッセージが表示されています。ある程度環境が整っているマシンで実行すると、このようなケースは珍しくないと思っています。が、元々このマシンでインストールしたくてダウンロードしているのではなく、別のインターネットにつながっていないマシンでローカルインストールできるようにするためのダウンロードをしているので、今のマシンにインストールされているかどうかは関係なくダウンロードしたい、という背景があります。

これは「1度アンインストールする」ことで話が単純になります。つまり、
 ・一度アンインストール
 ・ローカルにダウンロード(上の(2)の手順)
 ・再度インストール(環境を元に戻す)
を順に実施することで目的のファイルのダウンロードができます。


っていうか、インターネットのない環境でのセットアップ、って今はもうかなり面倒なことになってきているんですね。まあ確かに「内側からインターネットに出ていくだけ」すら許されない環境って、「そのせいでここまでセットアップにコストがかかる」デメリットを凌ぐだけの理由があるんだろうか?? という気がして・・・ あ、いえいえ、仕事の愚痴ではありませんよ。