アップデートサーバにダイレクトアクセス出来ない環境下で、CentOS をアップデート

外部ネットワークへのアクセスが容易ではないネットワーク上に接続されたサーバに、最新状態の CentOS を入れてから、システム構築って話って意外とあるように思うのだけど、そういう環境で更新されたパッケージをどうやってアップデートする,というのは結構大変。
#逆に、そういう要求って少ない?

やらなくちゃいけなくなりそうだなぁ、って感じになってきたので調べてみると、「ローカルリポジトリを構築する」とか「カスタムインストールメディアを作る」というのは見つかるのだけど「アップデートされたパッケージだけを集めたメディアを作る」というのは見つからない。(探し方か?)

ちょっと考えてみたら、「ローカルリポジトリを構築する」のと「カスタムインストールメディアを作る」というのを組み合わせればいいんじゃね、と思いついて試してみたら上手く出来たので、メモ的エントリー。


前準備

まずは、前準備として、CentOS のミラーサーバのいずれから、Update リポジトリの元になるアップデートされたパッケージを手に入れるところから。

ディスク容量に余裕のある CentOS なマシン(勿論 VM でも OK )を用意。
そのマシン上に アップデートパッケージをダウンロードするための作業用のディレクトリ ”/mnt/data/centos/6.4/updates/” を準備。(ディレクトリは、適宜読み替えてください。)

CentOS のミラーサーバの updates ディレクトリの中身を 作業用ディレクトリにダウンロードします。
方法は幾つもありますが、今回は lftp というコマンドでやってみました。

[root@c6test ~]# cd /mnt/data/centos/6.4/updates/
[root@c6test updates]# /usr/bin/lftp -e 'open ftp://ftp.iij.ad.jp/pub/linux/centos/6.4/updates && mirror -c --delete i386 && exit'
cd 成功、cwd=/pub/linux/centos/6.4/updates
合計: 4 個のディレクトリ、6908 個のファイル、0 個のシンボリックリンク
新規: 7 個のファイル、0 個のシンボリックリンク
92393808 バイト転送済、37 秒経過 (2.35MB/s)
[root@c6test updates]# /usr/bin/lftp -e 'open ftp://ftp.iij.ad.jp/pub/linux/centos/6.4/updates && mirror -c --delete x86_64 && exit'
cd 成功、cwd=/pub/linux/centos/6.4/updates
合計: 4 個のディレクトリ、8986 個のファイル、0 個のシンボリックリンク
新規: 7 個のファイル、0 個のシンボリックリンク
96849044 バイト転送済、28 秒経過 (3.28MB/s)
削除: 0 個のディレクトリ、1 個のファイル、0 個のシンボリックリンク

上のコマンドは、一応シェルスクリプト化を考えてのものになっています。
初回実行時は、結構な量のパッケージを落としてくることになるので、時間かかります。実際に欲しいのは、i386 にしろ、x86_64 にしろ、Packages と repodata の中身なので、ダウンロードするときに細かく指定すればいいでしょう。(ディスク的にも帯域的にも時間的にも余裕が有るのなら、大雑把でもいいですけど。)

updates ディレクトリ中は、下のようになっています。

[root@c6test updates]# ls -l i386/ x86_64/
i386/:
合計 668
drwxr-xr-x. 2 root root  53248  7月  4 19:57 2013 Packages
drwxr-xr-x. 2 root root 618496  7月  4 19:59 2013 drpms
drwxr-xr-x. 2 root root   4096  7月  4 20:26 2013 repodata
x86_64/:
合計 884
drwxr-xr-x. 2 root root  69632  7月  4 19:57 2013 Packages
drwxr-xr-x. 2 root root 823296  7月  4 20:27 2013 drpms
drwxr-xr-x. 2 root root   4096  7月  4 20:57 2013 repodata

コレで、前準備完了。

Updates をISOファイル化

次に、ダウンロードしてきたパッケージのデータを使って、isoファイルを作ります。
イメージデータを作るためのディレクトリを準備して、そこに ミラーサイトからダウンロードしてきた Packages ディレクトリと repodata ディレクトリをコピーします。ここでは、 x86_64 用のものを作ってみます。

[root@c6test ~]# mkdir /mnt/data/img/C6-Update
[root@c6test ~]# cd /mnt/data/img/C6-Update/
[root@c6test C6-Update]# cp -pr /mnt/data/centos/6.4/updates/x86_64/Packages/ .
[root@c6test C6-Update]# cp -pr /mnt/data/centos/6.4/updates/x86_64/repodata/ .
[root@c6test C6-Update]# ls -l
合計 96
drwxr-xr-x. 2 root root 94208  7月  4 19:57 2013 Packages
drwxr-xr-x. 2 root root  4096  7月  4 20:57 2013 repodata

で、C6-Update ディレクトリにコピーしてきた内容を、yum コマンドで処理が出来るようにしていきます。
この処理は、 createrepo というコマンドで。

[root@c6test C6-Update]# createrepo .
Spawning worker 0 with 916 pkgs
Workers Finished
Gathering worker results
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

ここまで出来たら、C6-update ディレクトリの中身を、ISO ファイルに変換します。

[root@c6test C6-Update]# mkisofs -r -R -J -T -v -V "test iso" -x "lost+found" -o /mnt/data/img/C6-update.iso /mnt/data/img/C6-Update/
I: -input-charset not specified, using utf-8 (detected in locale settings)
genisoimage 1.1.9 (Linux)
Scanning /mnt/data/img/C6-Update/
Scanning /mnt/data/img/C6-Update/Packages
Scanning /mnt/data/img/C6-Update/repodata
Using LIBVI000.RPM;1 for  /mnt/data/img/C6-Update/Packages/libvirt-devel-0.10.2-18.el6_4.5.x86_64.rpm (libvirt-client-0.10.2-18.el6_4.2.i686.rpm)
Using LIBIP000.RPM;1 for  /mnt/data/img/C6-Update/Packages/libipa_hbac-devel-1.9.2-82.7.el6_4.x86_64.rpm (libipa_hbac-devel-1.9.2-82.4.el6_4.x86_64.rpm)
Using NET_S000.RPM;1 for  /mnt/data/img/C6-Update/Packages/net-snmp-libs-5.5-44.el6_4.1.x86_64.rpm (net-snmp-libs-5.5-44.el6_4.2.i686.rpm)
〜〜 中略 〜〜
 99.49% done, estimate finish Sat Jul  6 21:47:27 2013
 99.87% done, estimate finish Sat Jul  6 21:47:26 2013
Total translation table size: 235094
Total rockridge attributes bytes: 106162
Total directory bytes: 160352
Path table size(bytes): 42
Done with: The File(s)                             Block(s)    1346506
Writing:   Ending Padblock                         Start Block 1346672
Done with: Ending Padblock                         Block(s)    150
Max brk space used e7000
1346822 extents written (2630 MB)
[root@c6test C6-Update]# ls -l ../
合計 2693652
drwxr-xr-x. 4 root root       4096  7月  6 21:28 2013 C6-Update
-rw-r--r--. 1 root root 2758291456  7月  6 21:47 2013 C6-update.iso

で、出来上がりっと。
この ISO ファイルが使えるのかチェックするために、一度 loopback device としてマウント。

[root@c6test C6-Update]# mount -o loop /mnt/data/img/C6-update.iso /media
[root@c6test C6-Update]# df -k
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/VolGroup-lv_root
                       6748936   1627252   4778852  26% /
tmpfs                   768212         0    768212   0% /dev/shm
/dev/sda1               495844     97323    372921  21% /boot
/dev/sdb1            103210940  79618492  18349640  82% /mnt/data
/mnt/data/img/C6-update.iso
                       2693644   2693644         0 100% /media
[root@c6test C6-Update]# ls -l /media/
合計 157
dr-xr-xr-x. 2 root root 157696  7月  4 19:57 2013 Packages
-r--r--r--. 1 root root    440  7月  6 21:40 2013 TRANS.TBL
dr-xr-xr-x. 2 root root   2048  7月  6 21:28 2013 repodata

マウントできるし、中身も見えるので、 OK のようです。

実際に、ISOファイルでアップデート

最終目的は、コレなわけですが、yum コマンドでアップデート出来るのか、というのが問題ですね。

yum コマンド自体は、ちょっと設定をすれば、インストール CD/DVD にあるパッケージをインストールすることが出来るので、ちょっとだけその設定をします。
と言っても、既に設定ファイルはあるのでちょっとだけ、手を加えます。

[root@c6test ~]# diff -u ~/CentOS-Media.repo /etc/yum.repos.d/CentOS-Media.repo
--- /root/CentOS-Media.repo	2013-02-25 17:57:43.000000000 +0900
+++ /etc/yum.repos.d/CentOS-Media.repo	2013-07-06 22:00:48.417968845 +0900
@@ -16,6 +16,7 @@
 baseurl=file:///media/CentOS/
         file:///media/cdrom/
         file:///media/cdrecorder/
+	file:///media/
 gpgcheck=1
 enabled=0
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

”/media/” にダイレクトに DVD や ISO をマウントしてしまった時のために、1行書き加え。
で、/etc/yum.repos.d/CentOS-Media.repo のコメント部の最後に書いてあるとおり、 "yum --disablerepo=\* --enablerepo=c6-media update" として yum コマンドを実行すると。

[root@c6test ~]# yum --disablerepo=\* --enablerepo=c6-media update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * c6-media:
c6-media                                                                                            | 2.9 kB     00:00 ...
c6-media/primary_db                                                                                 | 3.2 MB     00:00 ...
Setting up Update Process
No Packages marked for Update

という形で、"c6-media" (イコール マウントしたままの ISO ファイルの中身)というレポジトリにアクセスして、アップデートの有無を確認しました。
実行したマシンは、既にアップデート済みなのでな〜んもアップデートインストールはありませんでしたけど。
実際に使う場合には、この ISO ファイルを DVD に焼いたものを使うか、実際にアップデートしたいサーバのローカルにおいて loopback device としてマウントして上がれば良い、というわけです。

試しに、VirtualBox に新規インストールした CentOS 6.4 x86_64 に c6-update.iso 使ってアップデートしてみましたが、問題なし。一部アップデートされたパッケージが別のパッケージを要求する場合があったりするようですが、その場合はインストール DVD から不足しているパッケージをインストールしてあげれば良いかと。

C6-Update.iso をマウントするために

このエントリーの流れで作ったアップデート用 ISO ファイルで、実際にアップデートしてみたログは、Evernoteで公開しておきます。

とりあえず、これでできることが判ったので〜、ミラーサーバからのパッケージダウンロードから先の手順をスクリプト化しておいて、1日1回実行しておけば、手軽に最新のアップデート用 ISO ファイルを準備する、ってことも出来るわけです。

《参考》

トラックバック(2)

前回のエントリーでは、自動生成のところまでは行けなかったのだけど、自動生成するところまでやってみたよ。 とりあえず、これでできることが判ったので〜、ミラー... 続きを読む

以前、書いたエントリーなんだけど、割りと頻繁にアクセスされているよなので、ちょっと落ち穂拾いをしておこうと思う。 外部ネットワークへのアクセスが容易ではな... 続きを読む

コメントする