こんにちは、徹夜が大好きな? cloudpacktsumura です。

最近、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

このドキュメントは、一般的なオンプレミスにおける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.repo

cp -prv CentOS-Base.repo CentOS-Base.repo.orig

MARKDOWN_HASHf299f416e2df06f36f62ef6e3b8127b9MARKDOWN_HASHCentOS-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 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徹底入門で一番ハマった所でした。
最後の最後までハマり、秋の翔泳社の会議室でひたすらリビルドとリブートを繰り返したのは、今となっては良い思い出です。(笑)
よかったらこれを機に、一冊いかがですか?(ぉ

追伸:すずらぼさんごめんなさい。(http://blog.suz-lab.com/2011/05/2618-xenu-ec2-v15.html

元記事はこちらです。
旧世代インスタンスのLinuxカーネルを入れ替えてみた。