2019年7月3日水曜日

CentOSやRed Hat Enterprise Linuxにて、オフラインでRPMファイルからPerlをインストールする方法

CentOSやRHELなどを構築する際に、インターネットに接続できないためyumによるパッケージインストールができない場面は多い。このような場合は代替策として、OSイメージの中に保存されているRPMファイルから直接インストールするという手段を選ぶこともよくあるだろう。

依存関係の少ないパッケージなら、RPMからインストールする手順でも問題はないが、依存関係が多いパッケージは、一つ一つ依存関係を紐解きながらインストールする必要があり、非常に難儀する。

Perlがまさにそれである。

本記事では、今後、PerlをRPMからインストール際に悩まないように、コマンド一発でインストールできるよう調査した。

環境

今回確認した環境は以下の通りとなる。
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

依存関係の調査

OSイメージを/mntにマウントする。
# mount /dev/cdrom /mnt/
mount: /dev/sr0 is write-protected, mounting read-only
# cd /mnt/Packages/

とりあえず、Perlをインストールしようとすると、大量の依存関係ではじかれる。
# rpm -ivh perl-5.16.3-293.el7.x86_64.rpm
警告: perl-5.16.3-293.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID f4a80eb5: NOKEY
エラー: 依存性の欠如:
        libperl.so()(64bit) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Carp) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Cwd) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Exporter) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(File::Path) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(File::Spec) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(File::Spec::Functions) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(File::Spec::Unix) は perl-4:5.16.3-293.el7.x86_64 に必要とされてい ます
        perl(File::Temp) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Filter::Util::Call) は perl-4:5.16.3-293.el7.x86_64 に必要とされて います
        perl(Getopt::Long) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Pod::Simple::Search) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Pod::Simple::XHTML) は perl-4:5.16.3-293.el7.x86_64 に必要とされて います
        perl(Scalar::Util) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Scalar::Util) >= 1.10 は perl-4:5.16.3-293.el7.x86_64 に必要とされ ています
        perl(Socket) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Socket) >= 1.3 は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Storable) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Time::HiRes) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Time::Local) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(constant) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(threads) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(threads::shared) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl-libs は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl-libs = 4:5.16.3-293.el7 は perl-4:5.16.3-293.el7.x86_64 に必要とさ れています
        perl-macros は perl-4:5.16.3-293.el7.x86_64 に必要とされています

いったん、それっぽいRPMを羅列してインストールを試みる。多少は依存関係が減ったように見えるが、新たな依存関係も生まれている。
# rpm -ivh perl-5.16.3-293.el7.x86_64.rpm \
> perl-Carp-1.26-244.el7.noarch.rpm \
> perl-Exporter-5.68-3.el7.noarch.rpm \
> perl-File-Path-2.09-2.el7.noarch.rpm \
> perl-File-Temp-0.23.01-3.el7.noarch.rpm \
> perl-Filter-1.49-3.el7.x86_64.rpm \
> perl-Getopt-Long-2.40-3.el7.noarch.rpm \
> perl-Pod-Simple-3.28-4.el7.noarch.rpm \
> perl-Scalar-List-Utils-1.27-248.el7.x86_64.rpm \
> perl-Socket-2.010-4.el7.x86_64.rpm \
> perl-Storable-2.45-3.el7.x86_64.rpm \
> perl-Time-HiRes-1.9725-3.el7.x86_64.rpm \
> perl-Time-Local-1.2300-2.el7.noarch.rpm \
> perl-constant-1.27-2.el7.noarch.rpm \
> perl-threads-1.87-4.el7.x86_64.rpm perl-threads-shared-1.43-6.el7.x86_64.rpm \
> perl-libs-5.16.3-293.el7.x86_64.rpm \
> perl-macros-5.16.3-293.el7.x86_64.rpm
警告: perl-5.16.3-293.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID f4a80eb5: NOKEY
エラー: 依存性の欠如:
        perl(Cwd) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(File::Spec) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(File::Spec::Functions) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(File::Spec::Unix) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Cwd) は perl-File-Path-2.09-2.el7.noarch に必要とされています
        perl(File::Spec) は perl-File-Path-2.09-2.el7.noarch に必要とされています
        perl(Cwd) は perl-File-Temp-0.23.01-3.el7.noarch に必要とされています
        perl(File::Spec) >= 0.8 は perl-File-Temp-0.23.01-3.el7.noarch に必要とされています
        perl(Pod::Usage) >= 1.14 は perl-Getopt-Long-2.40-3.el7.noarch に必要とされています
        perl(Text::ParseWords) は perl-Getopt-Long-2.40-3.el7.noarch に必要とされています
        perl(Cwd) は perl-Pod-Simple-1:3.28-4.el7.noarch に必要とされています
        perl(Encode) は perl-Pod-Simple-1:3.28-4.el7.noarch に必要とされています
        perl(File::Spec) は perl-Pod-Simple-1:3.28-4.el7.noarch に必要とされています
        perl(Pod::Escapes) >= 1.04 は perl-Pod-Simple-1:3.28-4.el7.noarch に必要とされています

再度それっぽいRPMを追加してインストールを試みる、という作業を何回か繰り返すと、最終的に以下状況となり、インストールするRPMがファイル名では特定できなくなり、詰んでしまった。
# rpm -ivh perl-5.16.3-293.el7.x86_64.rpm \
> perl-Carp-1.26-244.el7.noarch.rpm \
> perl-Exporter-5.68-3.el7.noarch.rpm \
> perl-File-Path-2.09-2.el7.noarch.rpm \
> perl-File-Temp-0.23.01-3.el7.noarch.rpm \
> perl-Filter-1.49-3.el7.x86_64.rpm \
> perl-Getopt-Long-2.40-3.el7.noarch.rpm \
> perl-Pod-Simple-3.28-4.el7.noarch.rpm \
> perl-Scalar-List-Utils-1.27-248.el7.x86_64.rpm \
> perl-Socket-2.010-4.el7.x86_64.rpm \
> perl-Storable-2.45-3.el7.x86_64.rpm \
> perl-Time-HiRes-1.9725-3.el7.x86_64.rpm \
> perl-Time-Local-1.2300-2.el7.noarch.rpm \
> perl-constant-1.27-2.el7.noarch.rpm \
> perl-threads-1.87-4.el7.x86_64.rpm perl-threads-shared-1.43-6.el7.x86_64.rpm \
> perl-libs-5.16.3-293.el7.x86_64.rpm \
> perl-macros-5.16.3-293.el7.x86_64.rpm \
> perl-Pod-Usage-1.63-3.el7.noarch.rpm \
> perl-Text-ParseWords-3.29-4.el7.noarch.rpm \
> perl-Encode-2.51-7.el7.x86_64.rpm \
> perl-Pod-Escapes-1.04-293.el7.noarch.rpm \
> perl-Pod-Perldoc-3.20-4.el7.noarch.rpm \
> perl-HTTP-Tiny-0.033-3.el7.noarch.rpm \
> perl-parent-0.225-244.el7.noarch.rpm
警告: perl-5.16.3-293.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID f4a80eb5: NOKEY
エラー: 依存性の欠如:
        perl(Cwd) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(File::Spec) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(File::Spec::Functions) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(File::Spec::Unix) は perl-4:5.16.3-293.el7.x86_64 に必要とされています
        perl(Cwd) は perl-File-Path-2.09-2.el7.noarch に必要とされています
        perl(File::Spec) は perl-File-Path-2.09-2.el7.noarch に必要とされています
        perl(Cwd) は perl-File-Temp-0.23.01-3.el7.noarch に必要とされています
        perl(File::Spec) >= 0.8 は perl-File-Temp-0.23.01-3.el7.noarch に必要とされています
        perl(Cwd) は perl-Pod-Simple-1:3.28-4.el7.noarch に必要とされています
        perl(File::Spec) は perl-Pod-Simple-1:3.28-4.el7.noarch に必要とされています
        perl(File::Spec) >= 0.82 は perl-Pod-Usage-1.63-3.el7.noarch に必要とされています
        perl(Pod::Text) >= 3.15 は perl-Pod-Usage-1.63-3.el7.noarch に必要とされています
        perl(File::Spec::Functions) は perl-Pod-Perldoc-3.20-4.el7.noarch に必要とされています
        perl(Pod::Man) >= 2.18 は perl-Pod-Perldoc-3.20-4.el7.noarch に必要とされています
        perl(Pod::Text) は perl-Pod-Perldoc-3.20-4.el7.noarch に必要とされています
        perl(Pod::Text::Color) は perl-Pod-Perldoc-3.20-4.el7.noarch に必要とされています
        perl(Pod::Text::Termcap) は perl-Pod-Perldoc-3.20-4.el7.noarch に必要とされています

仕方がないので、1つずつ調べてみる。

perl(File::Spec::Functions)でググると、以下URLよりperl-PathToolsをインストールすればよいことがわかる。

同様にperl(Pod::Man)でググると以下が見つかる。perl-podlatorsをインストールすればよいらしい。

三度目の正直で、再度インストールを試みると、ようやく成功!
# rpm -ivh perl-5.16.3-293.el7.x86_64.rpm \
> perl-Carp-1.26-244.el7.noarch.rpm \
> perl-Exporter-5.68-3.el7.noarch.rpm \
> perl-File-Path-2.09-2.el7.noarch.rpm \
> perl-File-Temp-0.23.01-3.el7.noarch.rpm \
> perl-Filter-1.49-3.el7.x86_64.rpm \
> perl-Getopt-Long-2.40-3.el7.noarch.rpm \
> perl-Pod-Simple-3.28-4.el7.noarch.rpm \
> perl-Scalar-List-Utils-1.27-248.el7.x86_64.rpm \
> perl-Socket-2.010-4.el7.x86_64.rpm \
> perl-Storable-2.45-3.el7.x86_64.rpm \
> perl-Time-HiRes-1.9725-3.el7.x86_64.rpm \
> perl-Time-Local-1.2300-2.el7.noarch.rpm \
> perl-constant-1.27-2.el7.noarch.rpm \
> perl-threads-1.87-4.el7.x86_64.rpm perl-threads-shared-1.43-6.el7.x86_64.rpm \
> perl-libs-5.16.3-293.el7.x86_64.rpm \
> perl-macros-5.16.3-293.el7.x86_64.rpm \
> perl-Pod-Usage-1.63-3.el7.noarch.rpm \
> perl-Text-ParseWords-3.29-4.el7.noarch.rpm \
> perl-Encode-2.51-7.el7.x86_64.rpm \
> perl-Pod-Escapes-1.04-293.el7.noarch.rpm \
> perl-Pod-Perldoc-3.20-4.el7.noarch.rpm \
> perl-HTTP-Tiny-0.033-3.el7.noarch.rpm \
> perl-parent-0.225-244.el7.noarch.rpm \
> perl-PathTools-3.40-5.el7.x86_64.rpm \
> perl-podlators-2.5.1-3.el7.noarch.rpm
警告: perl-5.16.3-293.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID f4a80eb5: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:perl-HTTP-Tiny-0.033-3.el7       ################################# [  4%]
   2:perl-parent-1:0.225-244.el7      ################################# [  7%]
   3:perl-Pod-Perldoc-3.20-4.el7      ################################# [ 11%]
   4:perl-podlators-2.5.1-3.el7       ################################# [ 15%]
   5:perl-Text-ParseWords-3.29-4.el7  ################################# [ 19%]
   6:perl-Pod-Escapes-1:1.04-293.el7  ################################# [ 22%]
   7:perl-Encode-2.51-7.el7           ################################# [ 26%]
   8:perl-Pod-Usage-1.63-3.el7        ################################# [ 30%]
   9:perl-Carp-1.26-244.el7           ################################# [ 33%]
  10:perl-Exporter-5.68-3.el7         ################################# [ 37%]
  11:perl-Filter-1.49-3.el7           ################################# [ 41%]
  12:perl-Scalar-List-Utils-1.27-248.e################################# [ 44%]
  13:perl-Socket-2.010-4.el7          ################################# [ 48%]
  14:perl-Storable-2.45-3.el7         ################################# [ 52%]
  15:perl-Time-HiRes-4:1.9725-3.el7   ################################# [ 56%]
  16:perl-Time-Local-1.2300-2.el7     ################################# [ 59%]
  17:perl-constant-1.27-2.el7         ################################# [ 63%]
  18:perl-threads-1.87-4.el7          ################################# [ 67%]
  19:perl-threads-shared-1.43-6.el7   ################################# [ 70%]
  20:perl-libs-4:5.16.3-293.el7       ################################# [ 74%]
  21:perl-macros-4:5.16.3-293.el7     ################################# [ 78%]
  22:perl-File-Path-2.09-2.el7        ################################# [ 81%]
  23:perl-File-Temp-0.23.01-3.el7     ################################# [ 85%]
  24:perl-PathTools-3.40-5.el7        ################################# [ 89%]
  25:perl-Pod-Simple-1:3.28-4.el7     ################################# [ 93%]
  26:perl-Getopt-Long-2.40-3.el7      ################################# [ 96%]
  27:perl-4:5.16.3-293.el7            ################################# [100%]

コマンドまとめ

上記調査結果をもとに、汎用的に使えるようコマンドを綺麗にすると以下のようになる。
rpms=""
rpms="$rpms $(ls | grep -e '^perl-[0-9]\+.*')"
rpms="$rpms $(ls | grep -e 'perl-Carp-[0-9]\+.*')"
rpms="$rpms $(ls perl-Exporter-*)"
rpms="$rpms $(ls perl-File-Path-*)"
rpms="$rpms $(ls perl-File-Temp-*)"
rpms="$rpms $(ls perl-Filter-*)"
rpms="$rpms $(ls perl-Getopt-Long-*)"
rpms="$rpms $(ls perl-Pod-Simple-*)"
rpms="$rpms $(ls perl-Scalar-List-Utils-*)"
rpms="$rpms $(ls perl-Socket-*)"
rpms="$rpms $(ls perl-Storable-*)"
rpms="$rpms $(ls perl-Time-HiRes-*)"
rpms="$rpms $(ls perl-Time-Local-*)"
rpms="$rpms $(ls perl-constant-*)"
rpms="$rpms $(ls perl-threads-*)"
rpms="$rpms $(ls perl-libs-* | grep -v i686)"
rpms="$rpms $(ls perl-macros-*)"
rpms="$rpms $(ls perl-Pod-Usage-*)"
rpms="$rpms $(ls perl-Text-ParseWords-*)"
rpms="$rpms $(ls | grep -e 'perl-Encode-[0-9]\+.*')"
rpms="$rpms $(ls perl-Pod-Escapes-*)"
rpms="$rpms $(ls perl-Pod-Perldoc-*)"
rpms="$rpms $(ls perl-HTTP-Tiny-*)"
rpms="$rpms $(ls perl-parent-*)"
rpms="$rpms $(ls perl-PathTools*)"
rpms="$rpms $(ls perl-podlators-*)"
rpm -ivh $rpms

実行結果は以下の通り。
# rpms=""
# rpms="$rpms $(ls | grep -e '^perl-[0-9]\+.*')"
# rpms="$rpms $(ls | grep -e 'perl-Carp-[0-9]\+.*')"
# rpms="$rpms $(ls perl-Exporter-*)"
# rpms="$rpms $(ls perl-File-Path-*)"
# rpms="$rpms $(ls perl-File-Temp-*)"
# rpms="$rpms $(ls perl-Filter-*)"
# rpms="$rpms $(ls perl-Getopt-Long-*)"
# rpms="$rpms $(ls perl-Pod-Simple-*)"
# rpms="$rpms $(ls perl-Scalar-List-Utils-*)"
# rpms="$rpms $(ls perl-Socket-*)"
# rpms="$rpms $(ls perl-Storable-*)"
# rpms="$rpms $(ls perl-Time-HiRes-*)"
# rpms="$rpms $(ls perl-Time-Local-*)"
# rpms="$rpms $(ls perl-constant-*)"
# rpms="$rpms $(ls perl-threads-*)"
# rpms="$rpms $(ls perl-libs-* | grep -v i686)"
# rpms="$rpms $(ls perl-macros-*)"
# rpms="$rpms $(ls perl-Pod-Usage-*)"
# rpms="$rpms $(ls perl-Text-ParseWords-*)"
# rpms="$rpms $(ls | grep -e 'perl-Encode-[0-9]\+.*')"
# rpms="$rpms $(ls perl-Pod-Escapes-*)"
# rpms="$rpms $(ls perl-Pod-Perldoc-*)"
# rpms="$rpms $(ls perl-HTTP-Tiny-*)"
# rpms="$rpms $(ls perl-parent-*)"
# rpms="$rpms $(ls perl-PathTools*)"
# rpms="$rpms $(ls perl-podlators-*)"
# rpm -ivh $rpms
警告: perl-5.16.3-293.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID f4a80eb5: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:perl-HTTP-Tiny-0.033-3.el7       ################################# [  4%]
   2:perl-parent-1:0.225-244.el7      ################################# [  7%]
   3:perl-Pod-Perldoc-3.20-4.el7      ################################# [ 11%]
   4:perl-podlators-2.5.1-3.el7       ################################# [ 15%]
   5:perl-Text-ParseWords-3.29-4.el7  ################################# [ 19%]
   6:perl-Pod-Escapes-1:1.04-293.el7  ################################# [ 22%]
   7:perl-Encode-2.51-7.el7           ################################# [ 26%]
   8:perl-Pod-Usage-1.63-3.el7        ################################# [ 30%]
   9:perl-Carp-1.26-244.el7           ################################# [ 33%]
  10:perl-Exporter-5.68-3.el7         ################################# [ 37%]
  11:perl-Filter-1.49-3.el7           ################################# [ 41%]
  12:perl-Scalar-List-Utils-1.27-248.e################################# [ 44%]
  13:perl-Socket-2.010-4.el7          ################################# [ 48%]
  14:perl-Storable-2.45-3.el7         ################################# [ 52%]
  15:perl-Time-HiRes-4:1.9725-3.el7   ################################# [ 56%]
  16:perl-Time-Local-1.2300-2.el7     ################################# [ 59%]
  17:perl-constant-1.27-2.el7         ################################# [ 63%]
  18:perl-threads-1.87-4.el7          ################################# [ 67%]
  19:perl-threads-shared-1.43-6.el7   ################################# [ 70%]
  20:perl-libs-4:5.16.3-293.el7       ################################# [ 74%]
  21:perl-macros-4:5.16.3-293.el7     ################################# [ 78%]
  22:perl-File-Path-2.09-2.el7        ################################# [ 81%]
  23:perl-File-Temp-0.23.01-3.el7     ################################# [ 85%]
  24:perl-PathTools-3.40-5.el7        ################################# [ 89%]
  25:perl-Pod-Simple-1:3.28-4.el7     ################################# [ 93%]
  26:perl-Getopt-Long-2.40-3.el7      ################################# [ 96%]
  27:perl-4:5.16.3-293.el7            ################################# [100%]

0 件のコメント:

コメントを投稿

人気の投稿