CUBE SUGAR CONTAINER

技術系のこと書きます。

インターネットと疎通がないマシンに yum で RPM をインストールする

たまにインターネットとは直接疎通のないマシンをデプロイしなきゃいけないことがあるんだけど、今回はそんなときどうすれば 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

基本的な流れは次の通り。

  1. RPM をダウンロードする
  2. ダウンロードしてきた RPM で yum のリポジトリを作る
  3. 作った 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 のリポジトリを作る。 そして、インターネットと疎通のないマシンにリポジトリを移動して、そのリポジトリ経由でインストール作業を行えば良い。