こんにちは、徹夜が大好きな? cloudpack の tsumura です。
最近、Beatsのイヤホンをお休みして、ヘッドホンを愛用するようになりました…。良い音が無いと仕事集中できないねん。。。
旧世代のインスタンスのカーネルを公式版に入れ替える
旧世代(t1とか)では、当初AKI(Amazon Kernel Image)と、ARI(Amazon RAM Image)を使ってカーネルを起動するシーケンスを使っていました。
しかし、当初のカーネルでは新しいアプリケーションに上手く対応できない場合があり、また運用上の都合によりイメージを作り直しするコストが洒落にならない場合があります。
今回は、当時のCentOSの謹製カーネルから、The CentOS Project公式カーネルに入れ替え、ブートローダを入れ替える事により、公式のカーネルで起動するよう修正します。
Overview
手順としては、以下の通りです。
yum
リポジトリを修正し、任意のカーネルをyum
よりインストールする。initrd
(RAM Disk Image)にxenblk
を追加する為、リビルドを行う。- GRUB定義ファイル(
menu.lst
)を構成する。 aws
コマンドを使い、インスタンスのKernelImageを該当するPV-GRUBのイメージに変更する
全体的に、細かな修正が多い作業になります。
また、1箇所でも間違えると、そのインスタンスは起動できなくなります。事前にバックアップを取る等する事をお勧めします。
前提条件
今回、対象のインスタンスはCentOS5.7ベースであり、以下のカーネルで起動している事と仮定します。
2.6.18-xenU-ec2-v1.5
今回は、このインスタンスにTREND MICRO Deep Security Agentをインストールする為の下準備となります。ゴールとして、DSAがサポートしているカーネルの1つである、以下のカーネルでブートする事をゴールとします。
2.6.18-398.el5xen
- Amazon EC2上のLinuxにDeep Security Agentをインストールする際の注意点
http://esupport.trendmicro.com/solution/ja-JP/1312848.aspx?print=true
このドキュメントは、一般的なオンプレミスにおけるLinuxのブートシーケンス、カーネルに関する一般的な知識、及びCentOSの yum
コマンドに関する知識を有する事を前提として記載します。
また、作業上awsコマンド及び対象アカウントへの環境設定が終わったインスタンスが存在する事とします。
1. yumリポジトリの修正
まず、yumのキャッシュをクリアします。
yum clean all
次に、 /etc/yum.repo.d
にて、 updates
リポジトリを無効化します。いくつかの方法がありますが、今回は「enabled=0
」を加筆する事で対象のリポジトリを無効化します。
cd /etc/yum.repos.d/
[root@ip-172-31-0-46 yum.repos.d]# ls -lah -rw-r--r-- 1 root root 1.9K 1月 11 2013 CentOS-Base.repocp -prv CentOS-Base.repo CentOS-Base.repo.orig
MARKDOWN_HASHf299f416e2df06f36f62ef6e3b8127b9MARKDOWN_HASH
CentOS-Base.repo.orig'vi CentOS-Base.repo
diff -p CentOS-Base.repo CentOS-Base.repo.orig
*** CentOS-Base.repo 2015-03-05 14:41:13.000000000 -0500 --- CentOS-Base.repo.orig 2013-01-11 10:31:24.000000000 -0500 *************** mirrorlist=http://mirrorlist.centos.org/ *** 24,30 **** #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 - enabled=0 #additional packages that may be useful [extras] --- 24,29 ----
2.1 標準カーネルのインストール
まず、目的のカーネルがインストール可能か確認します。一般的にCentOSのカーネルのパッケージ名は「kernel
」ですが、DomU対応のものは「kernel-xen
」となります。
※目的のカーネルが存在するか確認する※yum list kernel-xen
[中略] Available Packages kernel-xen.x86_64 2.6.18-398.el5 base ※目的のカーネルをインストールする※yum install kernel-xen.x86_64
[中略]
Package Arch Version Repository Size
Installing: kernel-xen x86_64 2.6.18-398.el5 base 23 M [中略] Installed: kernel-xen.x86_64 0:2.6.18-398.el5 Complete! ※インストールされたパッケージを確認する※rpm -qa | grep kernel-xen
kernel-xen-2.6.18-398.el5
これにより、 /boot
以下に以下のファイルが配置されました。
- vmlinuz-2.6.18-398.el5xen
- initrd-2.6.18-398.el5xen.img
以降、このカーネルで起動する為の準備となります。
2.2 initrdの再構築
リポジトリからインストールされた initrd
には、カーネルモジュールの1つである「xenblk
」(Xenの準仮想化ドライバ)が含まれていません。その為、再構築を行い手動で追加する必要があります。
また同時に、起動に不要である dmraid
も削除します。
2.2.1. 含まれるカーネルモジュールを確認する
今回は、「xenblk
」および「ext3
」が含まれている事が条件となります。事前に initrd
の中身を確認します。
zcat initrd-2.6.18-398.el5xen.img | cpio -ft | grep ext3
11905 blocks lib/ext3.kozcat initrd-2.6.18-398.el5xen.img | cpio -ft | grep xenblk
11905 blocks
上記の通り、 xenblk
は存在しません。
2.2.2. initrdの再構築
initrd
を再構築し、任意の構成のイメージを作成します。事前に mv
コマンドで、既存の initrd
を退避します。dmraid
を無効化し、 xenblk
を有効化します。
また、 dmraid
に依存している ext3
も消えてしまうので、別途明示的に有効化します。
mkinitrd --without-dmraid --preload ext3 --preload xenblk /boot/initrd-2.6.18-398.el5xen.img 2.6.18-398.el5xen
何も出力されず終了すれば、成功です。
2.2.3. 再び含まれるカーネルモジュールを確認する
再び、 initrd
の中身を確認します。
zcat initrd-2.6.18-398.el5xen.img | cpio -ft | grep ext3
7090 blocks lib/ext3.kozcat initrd-2.6.18-398.el5xen.img | cpio -ft | grep xenblk
7090 blocks lib/xenblk.ko
上記の通り、 xenblk
が含まれた initrd
が作成されました。
3. GRUB定義ファイルの作成
後述するPV-GRUB(Xenで言うPyGRUB)により読み取られる、 menu.lst
を作成します。
実際のパーティーション構成により記述内容は変わりますが、例として以下のような記述になります。
尚、パーティーション構成は後述するPV-GRUBの選択にも影響があります。
cat menu.lst
default=0 hiddenmenu title CentOS (2.6.18-398.el5xen.x86_64) root (hd0) kernel /boot/vmlinuz-2.6.18-398.el5xen ro root=/dev/sda1 console=hvc0 rhgb quiet initrd /boot/initrd-2.6.18-398.el5xen.img
4. PV-GRUBのAKIを定義
これまでAKIでKernel Imageを選択していましたが、代わりにPV-GRUBを起動する事により、EBS内のカーネルより起動できるようにします。
4.1. PV-GRUBのAKIを選択
PV-GRUBは幾つかバージョンが存在し、アーキテクチャおよびパーティーション構成により選択肢があります。
執筆時現在は、「1.04」が最新のようです。
aws ec2 describe-images --owners amazon --filters "Name=name,Values=pv-grub-*.gz" --region=ap-northeast-1
PV-GRUBは、1つのバージョンに4つのバリエーションがあります。
- pv-grub-hd0_1.04-i386.gz
- pv-grub-hd0_1.04-x86_64.gz
- pv-grub-hd00_1.04-i386.gz
- pv-grub-hd00_1.04-x86_64.gz
パーティーションを切らずEBSを直接フォーマットしている場合は「hd0
」を、
パーティーションを切り、先頭パーティーションを /boot
としてマウントしている等の場合は「hd00
」となります。
最後に、このAKIをインスタンスに適用します。
事前にインスタンスをSTOPしてから実行します。
aws ec2 modify-instance-attribute --instance-id i-12345678 --kernel aki-176bf516 --region=ap-northeast-1
おわりに
initrd
の再構築については、Xen徹底入門で一番ハマった所でした。
最後の最後までハマり、秋の翔泳社の会議室でひたすらリビルドとリブートを繰り返したのは、今となっては良い思い出です。(笑)
よかったらこれを機に、一冊いかがですか?(ぉ
- Xen徹底入門 第2版 (CD-ROM付)
宮本 久仁男, 平 初, 長谷川 猛, 津村 彰
http://www.amazon.co.jp/dp/4798120022/
追伸:すずらぼさんごめんなさい。(http://blog.suz-lab.com/2011/05/2618-xenu-ec2-v15.html)
元記事はこちらです。
「旧世代インスタンスのLinuxカーネルを入れ替えてみた。」