オフライン環境でのrpmインストール

CentOSアイキャッチ Linux
https://www.centos.org/

業務都合などで、インターネットにつながらないマシンにソフトウェアを導入したい場合。

特にLinuxであれば、yumやaptコマンドで入れればよいですが、なかなかできない場合もあります。

そのような場合にrpmをどのようにインストールするかをご紹介します。

方法は3種類

具体的には以下のような方法があります。

・rpmコマンドで依存関係を解決しながらインストール
・インターネットにつながるマシンからdownloadonlyでrpmをまるっとダウンロード
・インストールメディアをレポジトリにしてyumでインストール

インターネットにつながるマシンが別で用意できる場合はそこからdownloadonlyでダウンロードしてしまい、それを目的のマシンに持っていく方法が一番楽です。

しかし、そのような環境も用意できない場合、インターネット上でrpmを手動でダウンロードし、自分で依存関係を解決してインストールしていく方法をとります。

またはそのマシンにメディアをマウント可能であり、目的のソフトウェアがOSのインストーラーの中に含まれていれば、メディアをyumリポジトリに指定し、インストールしてしまう方法があります。

それぞれ解説していきます。今回は例としてbindをインストールします。

バージョンはbind-9.11.4-9.P2.el7.x86_64です。

rpmコマンドのよく使うオプションについてはこちらの記事を参照ください。

https://tokku-engineer.tech/useful-rpm-command-option/

よく使うrpmコマンドのオプション
rpmコマンドのオプションのうち、よく使うものをメモ rpm -qa インストールされているrpmの一覧を出力する。 [root@localhost ~]# rpm -qa nss-3.53.1-7.el7_9.x86_64 policyc...

rpmコマンドで依存関係を解決しながらインストール

rpmコマンドで、まずこのrpmをインストールしてみます。

使用コマンド

rpm -ivh –test bind-9.11.4-9.P2.el7.x86_64.rpm

オプションとして-iがインストール、-vが処理中のパッケージを表示するオプション、-hは進捗状況を表示するオプションです。

また実際にインストールする前に--testとオプションを指定すると、実際にはインストールやアップデートを行わず、コマンドのテストを行います。

実際bindだけrpmコマンドでインストールしようとすると、以下のようにエラーが出ます。

警告: bind-9.11.4-9.P2.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID f4a80eb5: NOKEY
エラー: 依存性の欠如:
	bind-libs(x86-64) = 32:9.11.4-9.P2.el7 は bind-32:9.11.4-9.P2.el7.x86_64 に必要とされています
	bind-libs-lite(x86-64) = 32:9.11.4-9.P2.el7 は bind-32:9.11.4-9.P2.el7.x86_64 に必要とされています
	libbind9.so.160()(64bit) は bind-32:9.11.4-9.P2.el7.x86_64 に必要とされています
	libdns.so.1102()(64bit) は bind-32:9.11.4-9.P2.el7.x86_64 に必要とされています
	libisc.so.169()(64bit) は bind-32:9.11.4-9.P2.el7.x86_64 に必要とされています
	libisccc.so.160()(64bit) は bind-32:9.11.4-9.P2.el7.x86_64 に必要とされています
	libisccfg.so.160()(64bit) は bind-32:9.11.4-9.P2.el7.x86_64 に必要とされています
	liblwres.so.160()(64bit) は bind-32:9.11.4-9.P2.el7.x86_64 に必要とされています
	policycoreutils-python は bind-32:9.11.4-9.P2.el7.x86_64 に必要とされています
	python-ply は bind-32:9.11.4-9.P2.el7.x86_64 に必要とされています

XXXYYYに必要とされています というのがパッケージの依存関係です。bindをインストールするためにbind-libs-litepolicycoreutils-pythonなどが必要だということです。

これらをインターネット上からダウンロードし、rpm -ivhコマンドで一緒に指定します。

まずは--testでインストールを試してみます。

使用コマンド

rpm -ivh –test <rpmパッケージファイル名>

実行結果はこちら↓

[root@localhost rpm]# rpm -ivh --test bind-9.11.4-9.P2.el7.x86_64.rpm bind-libs-9.11.4-9.P2.el7.x86_64.rpm bind--libs-lite-9.11.4-9.P2.el7.x86_64.rpm bind-license-9.11.4-9.P2.el7.noarch.rpm policycoreutils-python-2.5-33.el7.x86_64.rpm python-ply-3.4-11.el7.noarch.rpm 
警告: bind-9.11.4-9.P2.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID f4a80eb5: NOKEY
エラー: 依存性の欠如:
	audit-libs-python >= 2.1.3-4 は policycoreutils-python-2.5-33.el7.x86_64 に必要とされています
	checkpolicy は policycoreutils-python-2.5-33.el7.x86_64 に必要とされています
	libapol.so.4()(64bit) は policycoreutils-python-2.5-33.el7.x86_64 に必要とされています
	libapol.so.4(VERS_4.0)(64bit) は policycoreutils-python-2.5-33.el7.x86_64 に必要とされています
	libcgroup は policycoreutils-python-2.5-33.el7.x86_64 に必要とされています
	libqpol.so.1()(64bit) は policycoreutils-python-2.5-33.el7.x86_64 に必要とされています
	libqpol.so.1(VERS_1.2)(64bit) は policycoreutils-python-2.5-33.el7.x86_64 に必要とされています
	libqpol.so.1(VERS_1.4)(64bit) は policycoreutils-python-2.5-33.el7.x86_64 に必要とされています
	libsemanage-python >= 2.5-14 は policycoreutils-python-2.5-33.el7.x86_64 に必要とされています
	policycoreutils = 2.5-33.el7 は policycoreutils-python-2.5-33.el7.x86_64 に必要とされています
	python-IPy は policycoreutils-python-2.5-33.el7.x86_64 に必要とされています
	setools-libs >= 3.3.8-4 は policycoreutils-python-2.5-33.el7.x86_64 に必要とされています

ふたたび依存関係が表示されるので、インターネット上からダウンロードして・・・と繰り返します。

依存関係に関するエラーを解決する方法

繰り返していく中で、以下のようなエラーが出ることがあります。

ファイル /usr/lib64/libsepol.so.1 (パッケージ libsepol-2.5-10.el7.x86_64 から) は、パッケージ libsepol-2.5-6.el7.x86_64 からのファイルと競合しています。

これはlibsepol-2.5-10.el7.x86_64というパッケージは、すでに別のバージョンがインストールされているということです。

なので、このようなパッケージは-Uvhオプションを使ってアップデートする必要があります。

今現在すでにインストールされているパッケージはrpm -qaで表示できます。

パッケージ名で検索すると例えば以下のように表示されます。

[root@localhost rpm]# rpm -qa | grep libmsemanage
libsemanage-2.5-14.el7.x86_64

インターネットにつながるマシンからdownloadonlyでrpmをまるっとダウンロード

1つ1つ依存関係が表示されるたびにパッケージを検索してダウンロードするのはなかなか骨が折れる作業です。

インターネットに接続できるマシンを本番用とは別に用意できるのであれば、オプションを指定することによって一発でダウンロードすることができます。

使用コマンド

yum install bind –downloadonly –downloaddir=$(pwd)

実行結果はこちら↓

[root@localhost work]# yum install bind --downloadonly --downloaddir=$(pwd)
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ bind.x86_64 32:9.11.4-9.P2.el7 を インストール
--> 依存性の処理をしています: bind-libs-lite(x86-64) = 32:9.11.4-9.P2.el7 のパッケージ: 32:bind-9.11.4-9.P2.el7.x86_64

~~~~~~~~~~中略~~~~~~~~~~

---------------------------------------------------------------------------------------------------------------
合計                                                                           4.6 MB/s | 9.3 MB  00:00:02     
exiting because "Download Only" specified

このコマンドでカレントディレクトリに依存関係解決済みのrpmがまるっとダウンロードできるので、あとはダウンロードしたファイルを本番用のサーバーに移動して、 rpmコマンドで依存関係を解決しながらインストール と同様にrpmコマンドでインストールすればOK。

インストールメディアをリポジトリにしてyumでインストール

OSのメディアがある場合はこの方法が一番楽です。

OSにメディアをセットし、マウントします。(ISOマウントでも可能)/mntにCDをマウントするときは以下のコマンドで行います。

[root@localhost work]# mount /dev/cdrom /mnt/
mount: /dev/sr0 is write-protected, mounting read-only

マウント出来たら、メディアのリポジトリを有効にします。CentOSの場合は/etc/yum.repo.d/CentOS-Media.repo でした。Red Hat Enterprise Linuxの場合は、/etc/yum.repos.d/rhel-dvd.repo です。

下から2行目のenable=0をenable=1にします。

[root@localhost work]# cat /etc/yum.repos.d/CentOS-Media.repo 
# CentOS-Media.repo
#
#  This repo can be used with mounted DVD media, verify the mount point for
#  CentOS-7.  You can use this repo and yum to install items directly off the
#  DVD ISO that we release.
#
# To use this repo, put in your DVD and use it with the other repos too:
#  yum --enablerepo=c7-media [command]
#  
# or for ONLY the media repo, do this:
#
#  yum --disablerepo=\* --enablerepo=c7-media [command]

[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
        file:///media/cdrom/
        file:///media/cdrecorder/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

↓変更後

[root@localhost work]# cat /etc/yum.repos.d/CentOS-Media.repo
# CentOS-Media.repo
#
#  This repo can be used with mounted DVD media, verify the mount point for
#  CentOS-7.  You can use this repo and yum to install items directly off the
#  DVD ISO that we release.
#
# To use this repo, put in your DVD and use it with the other repos too:
#  yum --enablerepo=c7-media [command]
#  
# or for ONLY the media repo, do this:
#
#  yum --disablerepo=\* --enablerepo=c7-media [command]

[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
        file:///media/cdrom/
        file:///media/cdrecorder/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

後はそのままyumコマンドを使うだけです。※リポジトリ情報をクリーンにするために、一度yum clean allしておきましょう。

使用コマンド

yum clean all

yum -y install bind

実行結果はこちら↓

[root@localhost work]# yum clean all
読み込んだプラグイン:fastestmirror
リポジトリーを清掃しています: local-myrepository
Cleaning up everything
Cleaning up list of fastest mirrors
[root@localhost work]# yum -y install bind

この方法が一番簡単です。

メディアからのインストールが終わったらレポジトリの設定をenable=0に戻しておきましょう。(メディアがマウントされていないときにyumを使うとエラーとなります)

まとめ

今回は3つの方法でrpmパッケージをオフライン環境でインストールする方法をご紹介しました。

  • rpmパッケージを一つずつ依存解決しながらインストールする方法
  • インターネットに繋がる環境で一度–downloadonlyでパッケージをダウンロードしておく方法
  • OSのインストールメディアをリポジトリとして指定し、yumコマンドでインストールする方法

個人的にはOSメディアがあるならまずそれをリポジトリとして指定してインストールする方法を選択し、メディアが準備できそうにないなら、インターネットに繋がる環境でダウンロードします。yumコマンドを使わずにrpmコマンドで一つ一つ依存関係を解決するのはかなり骨が折れるので、最終手段です。。。

この記事を書いた人

渋谷で働くよわよわエンジニア。TypeScript(Next.js/Node.js)/Golang/AWS/Flutterなど
LINE API Expert(2023/1~)

tokkuをフォローする
オススメ記事
在宅ワークが多くなって、デスクの配線周りに困っている方は、拡張デスクの導入がおすすめです。Windows/MacOS/Linuxの複数の機器をスッキリとデスク周りに収める事ができました!リモートからサーバーメンテを行うインフラエンジニアは必見です!
Linux
tokkuをフォローする
インフラエンジニアがもがくブログ

コメント

タイトルとURLをコピーしました