外部ネットワークへのアクセスが容易ではないネットワーク上に接続されたサーバに、最新状態の 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 から不足しているパッケージをインストールしてあげれば良いかと。
このエントリーの流れで作ったアップデート用 ISO ファイルで、実際にアップデートしてみたログは、Evernoteで公開しておきます。
とりあえず、これでできることが判ったので〜、ミラーサーバからのパッケージダウンロードから先の手順をスクリプト化しておいて、1日1回実行しておけば、手軽に最新のアップデート用 ISO ファイルを準備する、ってことも出来るわけです。
《参考》
トラックバック(2)
前回のエントリーでは、自動生成のところまでは行けなかったのだけど、自動生成するところまでやってみたよ。 とりあえず、これでできることが判ったので〜、ミラー... 続きを読む
以前、書いたエントリーなんだけど、割りと頻繁にアクセスされているよなので、ちょっと落ち穂拾いをしておこうと思う。 外部ネットワークへのアクセスが容易ではな... 続きを読む
コメントする