たまにインターネットとは直接疎通のないマシンをデプロイしなきゃいけないことがあるんだけど、今回はそんなときどうすれば yum で RPM をインストールできるかというお話。
検証環境には CentOS7 を使った。 基本的には CentOS6 でも動作するはず。
$ cat /etc/redhat-release CentOS Linux release 7.1.1503 (Core) $ uname -r 3.10.0-229.11.1.el7.x86_64
基本的な流れは次の通り。
- RPM をダウンロードする
- ダウンロードしてきた RPM で yum のリポジトリを作る
- 作った yum のリポジトリから RPM をインストールする
通常は 1 と 2 をインターネットに疎通のある開発用のマシンでやって、インターネットと疎通のないサービス用のマシンで 3 をやることになる。 ただ、今回はめんどくさいので全部ひとつのマシンでやってしまおう。
RPM をダウンロードする
まずは必要な RPM をダウンロードするところから。
あらかじめ、この先 yum のリポジトリとなる、RPM のダウンロード先のディレクトリを作っておこう。
$ mkdir repo
今回は httpd の RPM を題材として選ぶことにする。 yum install サブコマンドに --downloadonly オプションを付けると RPM のダウンロードだけが行われる。 --downloaddir オプションにはダウンロード先のディレクトリのパスを指定する。
$ sudo yum install httpd --downloadonly --downloaddir=repo ...(省略)... 総ダウンロード容量: 3.0 M インストール容量: 10 M Background downloading packages, then exiting: (1/5): apr-util-1.5.2-6.el7.x86_64.rpm | 92 kB 00:00 (2/5): httpd-tools-2.4.6-31.el7.centos.1.x86_64.rpm | 79 kB 00:00 (3/5): mailcap-2.1.41-2.el7.noarch.rpm | 31 kB 00:00 (4/5): apr-1.4.8-3.el7.x86_64.rpm | 103 kB 00:00 (5/5): httpd-2.4.6-31.el7.centos.1.x86_64.rpm | 2.7 MB 00:02 -------------------------------------------------------------------------------- 合計 1.0 MB/s | 3.0 MB 00:03 exiting because "Download Only" specified $ ls repo/ apr-1.4.8-3.el7.x86_64.rpm apr-util-1.5.2-6.el7.x86_64.rpm httpd-2.4.6-31.el7.centos.1.x86_64.rpm httpd-tools-2.4.6-31.el7.centos.1.x86_64.rpm mailcap-2.1.41-2.el7.noarch.rpm
ちなみに CentOS6 の場合は --downloadonly オプションがデフォルトでは使えないので、必要なパッケージをインストールしよう。
$ sudo yum -y install yum-plugin-downloadonly
また、--downloadonly オプションでダウンロードされるのは、まだインストールされていない RPM だけだ。 試しに httpd をインストールした上でもう一度実行してみよう。
$ sudo yum -y install httpd ...(省略)... 依存性関連をインストールしました: apr.x86_64 0:1.4.8-3.el7 apr-util.x86_64 0:1.5.2-6.el7 httpd-tools.x86_64 0:2.4.6-31.el7.centos.1 mailcap.noarch 0:2.1.41-2.el7 完了しました! $ sudo yum install httpd --downloadonly --downloaddir=repo 読み込んだプラグイン:fastestmirror Loading mirror speeds from cached hostfile * base: ftp.nara.wide.ad.jp * extras: ftp.nara.wide.ad.jp * updates: ftp.nara.wide.ad.jp パッケージ httpd-2.4.6-31.el7.centos.1.x86_64 はインストール済みか最新バージョンです 何もしません
見ての通り今度は何も実施されなかった。 この理由は、おそらくインストール済みの RPM まで含めてダウンロードしようとすると、依存関係で芋づる式に膨大な数の RPM がダウンロードされることになるためだと思う。
インストール済みのパッケージなんだけどダウンロードしたい場合には別のやり方がある。 まずは yum-utils パッケージをインストールしておく。
$ sudo yum -y install yum-utils
そして、インストールされた yumdownloader コマンドを使って RPM をダウンロードできる。 ただし、このコマンドは依存関係については辿ってくれない。
$ yumdownloader httpd 読み込んだプラグイン:fastestmirror Determining fastest mirrors * base: ftp.iij.ad.jp * extras: ftp.iij.ad.jp * updates: ftp.iij.ad.jp httpd-2.4.6-31.el7.centos.1.x86_64.rpm | 2.7 MB 00:06 $ ls | grep httpd httpd-2.4.6-31.el7.centos.1.x86_64.rpm
yum リポジトリを作る
ここからはダウンロードした RPM を使って yum リポジトリを作る。
$ ls repo apr-1.4.8-3.el7.x86_64.rpm apr-util-1.5.2-6.el7.x86_64.rpm httpd-2.4.6-31.el7.centos.1.x86_64.rpm httpd-tools-2.4.6-31.el7.centos.1.x86_64.rpm mailcap-2.1.41-2.el7.noarch.rpm
まずはリポジトリの作成に必要なパッケージ createrepo をインストールしよう。
$ sudo yum -y install createrepo
すると createrepo コマンドが使えるようになるので、RPM をダウンロードしたディレクトリを指定して実行する。 --simple-md-filenames オプションはリポジトリのメタデータを格納したファイルの名前にハッシュ値を含めないようにする。 これはおそらくファイルの改ざんに対処するためのものだと思うけど、作成したリポジトリは信頼できるネットワークに置くはずなので今回は特に気にしない。
$ createrepo --simple-md-filenames repo Spawning worker 0 with 3 pkgs Spawning worker 1 with 2 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete
これで yum のリポジトリができた。
作成したリポジトリを登録する
ここからは本来インストール先であるインターネットと疎通のないマシンで実施する作業になる。 ただ、今回は同じマシンを使うので、さっきインストールした httpd をアンインストールした状態で動作を確認する。
$ sudo yum -y remove httpd
リポジトリを登録するために、まずはパスを確認しておく。
$ cd repo/ $ pwd /home/vagrant/repo
確認したパスを使ってマシンに yum リポジトリを登録する。
$ cat << EOF | sudo tee /etc/yum.repos.d/MyRepo.repo > /dev/null [local-myrepository] name=My repository baseurl=file:///home/vagrant/repo gpgcheck=0 enabled=1 EOF
このマシンは実際にはインターネットと疎通があるので、Base リポジトリを見てしまわないようにファイルの名前を変更しておく。
$ sudo mv /etc/yum.repos.d/CentOS-Base.repo{,.back}
上記の作業が終わったら一旦 yum のキャッシュをキレイにする。
$ yum clean all 読み込んだプラグイン:fastestmirror リポジトリーを清掃しています: local-myrepository Cleaning up everything Cleaning up list of fastest mirrors
yum info サブコマンドで確認すると httpd のインストール元リポジトリが、先ほど登録した local-myrepository になっている。
$ yum info httpd 読み込んだプラグイン:fastestmirror Loading mirror speeds from cached hostfile 利用可能なパッケージ 名前 : httpd アーキテクチャー : x86_64 バージョン : 2.4.6 リリース : 31.el7.centos.1 容量 : 2.7 M リポジトリー : local-myrepository 要約 : Apache HTTP Server URL : http://httpd.apache.org/ ライセンス : ASL 2.0 説明 : The Apache HTTP Server is a powerful, efficient, and : extensible web server.
もちろんこの状態でちゃんとインストールできる。
$ sudo yum -y install httpd 読み込んだプラグイン:fastestmirror Loading mirror speeds from cached hostfile 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ httpd.x86_64 0:2.4.6-31.el7.centos.1 を インストール --> 依存性解決を終了しました。 依存性を解決しました ================================================================================ Package アーキテクチャー バージョン リポジトリー 容量 ================================================================================ インストール中: httpd x86_64 2.4.6-31.el7.centos.1 local-myrepository 2.7 M トランザクションの要約 ================================================================================ インストール 1 パッケージ 総ダウンロード容量: 2.7 M インストール容量: 9.4 M Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction インストール中 : httpd-2.4.6-31.el7.centos.1.x86_64 1/1 検証中 : httpd-2.4.6-31.el7.centos.1.x86_64 1/1 インストール: httpd.x86_64 0:2.4.6-31.el7.centos.1 完了しました!
まとめ
今回は不幸にもインターネットと疎通がない CentOS のマシンをデプロイするハメになってしまった時、yum を使って RPM をインストールする方法について書いた。 具体的には、まず必要な RPM をダウンロードしておき、それを元に yum のリポジトリを作る。 そして、インターネットと疎通のないマシンにリポジトリを移動して、そのリポジトリ経由でインストール作業を行えば良い。
- 作者:もみじあめ
- 発売日: 2020/02/29
- メディア: Kindle版