参考URL
-
EC2のt1.microをt2.microへ移行する
手作業でPV -> HVMへの変換を行う方法 -
AWSで仮想化方式 PV(paravirtual) の既存 CentOS AMIを HVMにする
1の作業手順をベースに、少し改変を加えたもの
シンボリックリンク追加のところが一番のミソ -
PV->HVM変換ツール pv2hvm.rbを試してみた
・Rubyスクリプトに変換作業を代行してもらう方法
・2015-05現在では、sudo gem install aws-sdk --no-ri --no-rdoc
のところは、aws-sdkのv1を明示してインストールする必要があることに注意(参考:AWS SDK for Ruby V2)
・色々と問題が起きた(ルートデバイス名とブロックデバイス名を合わせないと動かない等)ため採用しなかった -
EC2編~PVインスタンスからHVMインスタンスに移行してみた~
1と3の概念の違いについて説明したページ
変換手順
- 旧インスタンスのAMIを作成する(バックアップ用)
- 旧インスタンスにgrubをインストールする
sudo yum install grub
- 旧インスタンスのルートデバイスEBSからスナップショットを作成する
- 3で作成したスナップショットからボリュームを作成する(PV vol)
- 新規ボリュームを作成する(HVM vol)
※HVM volは、PV volより1GB大きいサイズで作成する方がいい(同サイズだと、後に実行するddコマンドが容量不足で途中終了してしまう可能性がある) - 作業用インスタンスを用意し、 インスタンスを起動してから PV volとHVM volをアタッチする
※起動前にアタッチしてしまうとPV volからOSが立ち上がってしまう可能性があるので注意
※デバイス名は参考URLに合わせて、PV volを/dev/sdm、HVM volを/dev/sdoとする - 作業用インスタンスにSSHログインして、 AWSで仮想化方式 PV(paravirtual) の既存 CentOS AMIを HVMにする の「パーティションを作成してディスクをコピー」から「chrootを抜けてアンマウント」までの作業を実施
※chroot先でのyum install -y grub
は、こちらの環境では/dev配下に必要なファイルがない的なエラーが出て失敗した(そのため手順2で先にインストールしている)
※lnでシンボリックリンクを作る際、/etc/grub.confや/boot/grub/grub.confが既に存在していると怒られるので、その場合はそのファイルをrmしてからlnする
※menu.lstの編集の際、もしkernel行のroot=部分がLABEL=/以外になっていたらLABEL=/に直すこと
※fstabの編集は、1行目の1番目がLABEL=/以外になっていたらLABEL=/に直すだけでいいと思われる - PV volとHVM volをデタッチして、後者のスナップショットを作成する
- 8で作成したスナップショットからAMIを作成する
このとき「仮想化タイプ」は「ハードウェアアシストの仮想化」を選択する - 9で作成したAMIから新インスタンス立ち上げ
- 新インスタンスの動作確認
- 作業用インスタンス、PV vol、HVM volの削除
参考知識書き殴り
AWSは仮想化を実現する上でXenというソフトを使っていて、PVやHVMというのは、このXenにおける仮想化実装方式のこと
ざっくり言うと、PVはカーネルやらブートローダのことをあまり気にしなくていい(AWS側が用意したものを使える)が、HVMは物理サーバ同様すべてを自前で賄う必要がある(だからgrubのインストール作業等が必要になる)
詳しくは 仮想化方式(HVM と PV)についてまとめ を参照
Linuxの起動の流れ
電源入れる→BIOS起動→BIOSがブートローダを呼び出す→ブートローダがカーネルを呼び出す→カーネルが/sbin/initを実行することで色々サービスが起動する
ブートローダの代表格がgrubで、grubの設定ファイルは/etc/grub.confないし/boot/grub/grub.conf
/etc/grub.conf, /boot/grub/grub.conf, /boot/grub/menu.lstの内容は同一(シンボリックリンクにしておくことが多いっぽい)
同じ内容のファイルが複数あるのは歴史的経緯によるものらしい
OSが起動したとき、どのデバイスをどこにマウントするかについての設定ファイルが/etc/fstab
/etc/fstabにおけるデバイスの指定方法は以下の3種類
- /dev/xvda1のようにデバイスファイル名を直接書く
- LABEL=/のようにラベル名を指定する(ラベル名はe2labelコマンドで確認・設定可能)
- UUID=24f28fc6-717e-4bcd-a5f7-32b959024e26のようにUUIDを指定する