AWS Linux (CentOS 6) で PV を HVM に変換

数年前に AWS の EC2 で構築した CentOS 6 システムの話。

その CentOS 6 は準仮想化(PV) AMI であり、t2 や m4 など、コストパフォーマンスの高い現行世代のインスタンスにインスタンスタイプを変更できない。

そこで PV から HVM に変換しようと思い調べてみると、AWS に公式のドキュメントがあった。

しかし、そのとおりにやってもうまくいかなかったので、別の方法を考えた。

概要

AWS に記載の方法は、PV マシンのディスクを別の EC2 にアタッチして、新規に作成したディスクに dd で msdos パーティション 1 にコピーし、そのディスクにブートローダーをインストールする、ということだ。

しかし、そもそも、元のイメージがマーケットプレースのイメージから起動したものの場合、別の EC2 インスタンスにマウントできない。インスタンスへの Amazon EBS ボリュームのアタッチにある、「ボリューム上に存在する AWS Marketplace コードをサブスクライブしている必要があります。」の条件を満たしていないためであろう。

代替手段として、起動させた PV イメージを、dump / restore を使って新しいディスクにコピーし、その新しいディスクを別の EC2 インスタンスにマウントしてブートローダをインストールする。

新しく作る HVM インスタンスは、CentOS 6 の場合は、t3 インスタンスだとブートローダのインストールに失敗するし、起動もしない。(centos.org 提供のものも起動しない)。t2 インスタンスであれば、ブートローダのインストールに成功し、起動も OK である。

(多少雑な)手順

1.PV インスタンスを起動する
2.新規にボリュームを生成し、PV インスタンスにアタッチする。
3.lsblk などでデバイスファイル名を確認する。(/dev/xvdg など)
4.以下を実行する。(デバイスファイル名は、読者の環境に合わせること)

parted /dev/xvdf --script 'mklabel msdos mkpart primary 1M -1s print quit'
partprobe /dev/xvdf
udevadm settle
mkfs -t ext4 /dev/xvdf1
e2label /dev/xvdf1 /
mount /dev/xvdf1 /mnt
cd /mnt
dump 0uf - | restore rf -
cd /
umount /mnt

dump / restore は一般には single user mode で実行するとは思うが、できないので、不要なプロセスを止めて実行する。
5.ボリュームを PV インスタンスからデタッチする。
6.新規に EC2 インスタンスを起動する。Amazon Linux で t2.micro など。(CentOS なら Amazon Linux 2 でないほうがよいか)
7.ボリュームをアタッチする。
8.lsblk などでデバイスファイル名を確認する。(/dev/xvdf など)
9.以下を実行する。別の VPC でコピーした場合などは、/etc/resolv.conf を調整しておくこと。パッケージの取得に失敗する。

mount /dev/xvdf1 /mnt/ && mount -o bind /dev/ /mnt/dev && mount -o bind /sys /mnt/sys && mount -o bind /proc /mnt/proc
chroot /mnt
yum install grub -y
rm -f /boot/grub/*stage* /boot/grub/device.map
grub-install /dev/xvdf
cat <<EOF | grub --batch
device (hd0) /dev/xvdf
root (hd0,0)
setup (hd0)
EOF

10.vi で /etc/grub.conf を開いて編集。
root (hd0) を root (hd0,0) に、kernel 〜 の root=〜 を root=LABEL=/ に変更。
11.umount してインスタンスを一度停止

umount /mnt/sys
umount /mnt/proc
umount /mnt/dev
umount /mnt
shutdown -h now

12.HVM インスタンスのボリュームを両方デタッチする。
13.コピー先ボリュームをアタッチ。この時、デバイス名には、xvda を入力する。(いかにも指定できなさそうだが。)
14.インスタンスタイプを t2.medium に設定して再起動 (t3 では起動しない。m4 ではカーネルバージョンを上げないと起動はするが ssh ログインできない)
15.起動したら、yum update してカーネルを最新にする。/boot/grub/grub.conf の kernel、initrd には、/boot 下にある最新のものをセットする。
16.再起動


kernel バージョンによるのか、インスタンスタイプによっては動作しない。centos.org 提供の HVM イメージで動作しない(選択できない)ものは、おそらく動作しない。

結構罠が多かった。

ネット上の情報を元にトライしてみたがうまくいかなかった、という方がいるかどうかわからないが、お試しを。