ちょっと話題の記事

PV->HVM変換ツール pv2hvm.rbを試してみた

2014.07.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんばんは、たけかわです。 最近話題のt2.microインスタンスですが、仮想化方式がHVM(Xen Full virtualization)のものしか使えないため、既存のPV(Xen Para-virtulaization)のイメージがつかえません。そこで変換をしたいという要望をお客様より幾つか受けたので調べてみました。

PVとHVMについて

PVとHVMはもともと歴史のあるXenから来ている話ですので多くのよい説明があります。というわけでリンクを示して少し話を端折らせてもらいます。

メモ: AMIの仮想化方式 hvm、paravirtualについて

仮想化方式(HVM と PV)についてまとめ

AWS Virtualization : HVM vs Paravirtualization

自分の理解では、当初は性能的な利点のあるPVがよい選択肢ではあったが、ホストする側のマシンの性能があがることで、仮想化方式自体の性能の利点はそれほど問題ではなくなり、個々のVMが独立しているHVMがセキュリティ、安定性という点で有利になってきていると理解しております。

今後はHVMが主流になるわけですね

変換方法について

PVをHVM化するにはブートに必要な情報を全てroot volumeに乗せる必要があります。 どう説明しようかとおもったところ素晴しいリンクを見つけたので紹介します。
EC2のt1.microをt2.microへ移行する
こちらはCentOSをHVM化する手順となります。 おおまかな手順としては以下となります。

  • 既存のPVのインスタンスにgrubをインストールする
  • そのディスクのスナップショットを取得する
  • スナップショットをボリューム化して、変換用のEC2にマウント
  • マウントしたボリュームをコピーし、HVM化のための各種設定をほどこす
  • このボリュームからAMIを作成する

ちなみにAmazon Linuxでもほぼ同様の手順となります。手作業で行なうのは大変なので、もっと簡単な方法を紹介します。

pv2hvm.rb

j3tm0t0 さんが作られた pv2hvm.rb です。

最新(2014.03.2)のAmazon Linuxの変換が可能です。以下の前提条件があります。

  • 変換用マシンにはEC2上で動作させること
  • 変換用マシンにAWS SDK for Rubyをインストールすること
  • Admin 権限(PowerUser?)を持つEC2プロファイルであること
  • ソースAMIは自身のもの、もしくは、create volume、root volumeのスナップショットが取れること
  • ソースAMIはgrubをインストールしていること

ですが、手作業でやるよりはるかに簡単にpv2hvmできますので実際に試してみます。

PVのインスタンスにgrubをインストールする

まずはソースとなるPVのインスタンスを探します。PVかどうかはAMIによって決まります。 コンソール画面でこんな感じで確認できます。

paravirtual

で、変換対象のサーバーにログインします。 変換できたイメージであることを確認するためにプロンプト表示をかえておきます。

 echo 'export PS1=TESTHOST$' >> ~/.bash_profile ; source ~/.bash_profile 
TESTHOST$

grubをインストールします。

 sudo yum install -y grub
...出力はがっつり省略....
 インストール: grub.x86_64 1:0.97-83.23.amzn1
依存性関連をインストールしました: generic-logos.noarch 0:17.0.0-2.5.amzn1
完了しました! 
TESTHOST$

変換元AMIをつくる

ここは通常の手順ですね。コンソールでEC2を停止後、イメージを作成します。 ここでamiのイメージIDをかならずメモしておいてください。ここではami-XXXXXXXとします。

変換処理実行用のEC2を準備する

別のEC2を起動します。Amazon Linuxであればどのインスタンスタイプでもよいです。 「Power User」のIAM roleをつけ忘れないようにしましょう。

PowerUser

起動後、ログインしてAWS SDK for Ruby をインストールします。
こんな感じのコマンドでインストールできました。

sudo yum install -y gcc make libxml2 libxml2-devel libxslt libxslt-devel rubygems ruby-devel patch

sudo gem install nokogiri -- --with-xml2-lib=/usr/local/lib --with-xml2-include=/usr/local/include/libxml2 --with-xslt-lib=/usr/local/lib --with-xslt-include=/usr/local/include

## 2016/12/07 aws-sdkの2系が入ってしまってうまく動作しないためバージョン固定の必要アリ
# sudo gem install aws-sdk --no-ri --no-rdoc 
sudo gem install aws-sdk --no-ri --no-rdoc -v '~>1'

最後にpv2hvm.rbをダウンロードしておきましょう。

wget https://raw.githubusercontent.com/j3tm0t0/pv2hvm/master/pv2hvm.rb 
chmod 0755 pv2hvm.rb

変換してみる

それでは変換してみましょう。sudoを忘れないでくださいね。実行するのは最初の一行だけです。折角なので出力は端折らずのせております。

sudo ruby pv2hvm.rb ami-XXXXXXX

source ami=ami-XXXXXXX
-- prepare volume
creating target volume with size : 9
 vol-9b46fb91 created and attached to /dev/sdo
creating source volume from snapshot : snap-97aeea77
 vol-5446fb5e created and attached to /dev/sdm

-- copy disk
# parted /dev/xvdo --script 'mklabel msdos mkpart primary 1M -1s print quit'
モデル: Xen Virtual Block Device (xvd)
ディスク /dev/xvdo: 9664MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  9664MB  9663MB  primary


# partprobe /dev/xvdo

# udevadm settle

# dd if=/dev/xvdm of=/dev/xvdo1
date;
16777216+0 レコード入力
16777216+0 レコード出力
8589934592 バイト (8.6 GB) コピーされました、 867.338 秒、 9.9 MB/秒

-- install grub
# mount /dev/xvdo1 /mnt

# cp -a /dev/xvdo /dev/xvdo1 /mnt/dev/

# rm -f /mnt/boot/grub/*stage*

# cp /mnt/usr/*/grub/*/*stage* /mnt/boot/grub/

# rm -f /mnt/boot/grub/device.map

# printf "device (hd0) /dev/xvdo\nroot (hd0,0)\nsetup (hd0)\n" | chroot /mnt grub --batch
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> device (hd0) /dev/xvdo
grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  31 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+31 p (hd0,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded
Done.
grub> 
# cat /mnt/boot/grub/menu.lst | tee /dev/stderr > /mnt/boot/grub/menu.lst.bak
# created by imagebuilder
default=0
fallback=1
timeout=1
hiddenmenu

title Amazon Linux 2014.03 (3.10.35-43.137.amzn1.x86_64)
root (hd0)
kernel /boot/vmlinuz-3.10.35-43.137.amzn1.x86_64 root=LABEL=/ console=hvc0 
initrd /boot/initramfs-3.10.35-43.137.amzn1.x86_64.img


# cat /mnt/boot/grub/menu.lst.bak | perl -pe "s/\(hd0\)/\(hd0,0\)/;s/console=\S+/console=ttyS0/" | tee /dev/stderr > /mnt/boot/grub/menu.lst
# created by imagebuilder
default=0
fallback=1
timeout=1
hiddenmenu

title Amazon Linux 2014.03 (3.10.35-43.137.amzn1.x86_64)
root (hd0,0)
kernel /boot/vmlinuz-3.10.35-43.137.amzn1.x86_64 root=LABEL=/ console=ttyS0 
initrd /boot/initramfs-3.10.35-43.137.amzn1.x86_64.img


# rm -f /mnt/dev/xvdo /mnt/dev/xvdo1

# umount /mnt

-- create snapshot of target volume
snapshot ID = snap-30c480d0
image Id = ami-YYYYYYYY
-- cleanup
deleting volumes
 vol-5446fb5e deleted
 vol-9b46fb91 deleted

ami-YYYYYYYというのが変換されたイメージとなります。
8GBのイメージの変換に20分ほどかかりました。rootボリュームが大きい場合、時間がかかります。
また、sudoをつけずに実行するとEBSがマウントした後にディスク操作で失敗します。この場合root以外のVolumeを一度デタッチしてからsudoをつけてpv2hvm.rbを再度実行してください。

変換したイメージで起動してみる

AMIのタブをみるとHVMのイメージが増えています。
このAMIのIDを覚えてEC2を起動します。
t2.microで起動後ログインして

 TESTHOST$

が見えれば変換成功です。

まとめ

PVとHVMの違い、変換方法、pv2hvm.rbの使い方を説明しました。一つ注意点としては このような変換を行なったOSはコミュニティAMIと同等の扱いとなるということで、 問題が発生した場合、変換元のAMIで同じ問題が発生しないとサポートが受けられない 可能性があるとのことでした。実際に障害あったわけではないので駄目と言われたわけではないのですが、注意する必要があります。

ではでは