徹夜が大好きな?atsumuraです。
最近、Beatsのイヤホンをお休みして、ヘッドホンを愛用するようになりました…。
良い音が無いと仕事集中できないねん。。。

旧世代のインスタンスのカーネルを公式版に入れ替える

旧世代(t1とか)では、当初AKI(Amazon Kernel Image)と、ARI(Amazon RAM Image)を使ってカーネルを起動するシーケンスを使っていました。
しかし、当初のカーネルでは新しいアプリケーションに上手く対応できない場合があり、また運用上の都合によりイメージを作り直しするコストが洒落にならない場合があります。

今回は、当時のCentOSの謹製カーネルから、The CentOS Project公式カーネルに入れ替え、ブートローダを入れ替える事により、公式のカーネルで起動するよう修正します。


Overview

手順としては、以下の通りです。
1. yumリポジトリを修正し、任意のカーネルをyumよりインストールする。
2. initrd(RAM Disk Image)にxenblkを追加する為、リビルドを行う。
3. GRUB定義ファイル(menu.lst)を構成する。
4. 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リポジトリ等、base以外のリポジトリを無効化します。
いくつかの方法がありますが、今回は「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.repo
# cp -prv CentOS-Base.repo CentOS-Base.repo.orig
`CentOS-Base.repo' -> `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.ko
# zcat 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.ko
# zcat 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
timeout=5
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版
宮本 久仁男, 平 初, 長谷川 猛, 津村 彰