PVインスタンスをHVMインスタンスへ変換する手順

2022/10/07に公開

PVインスタンスをHVMインスタンスへ変換する手順

書いたと思っていたけど、書いていなかったので念のためちゃんと書いておく。

流石にPVインスタンスは少ない状態になっているので殆ど不要な情報だとは思うし、今から更新するなら新規にAmazon Linux2やAmazon Linux 2022で再構築する方が良いとは思うけど絶対に更新しないって案件も中にはあると思うので。。。

なお、当該記事は元インスタンスのOSがCentOS6の状態の物としている為、各種コマンドやバージョンに応じて調整する必要があるかも。

1. grubがインストールされているかを確認

grubがインストールされている場合とされていない場合で作業の順序が変わるため、変換対象インスタンスにgrubがインストールされているかを確認する。

インストールが行われている場合

$ rpm -q grub
grub-0.97-75.el6.x86_64

インストールが行われていない場合

$ rpm -q grub
package grub is not installed

grubがインストールされている場合、「2.AMIの取得〜4.grubのインストール」までの作業をスキップする。

2. AMIの取得

※元インスタンスにgrubがインストールされていない場合のみ作業を行う。

作業対象のAMIを取得する。
この際、作業用のAMIとわかるように、イメージ名を仮に conv-1-<インスタンス名> とする。

3. 作業インスタンスの作成

※元インスタンスにgrubがインストールされていない場合のみ作業を行う。

先ほど作成した conv-1-<インスタンス名> のAMIから新しく作業用のインスタンスを作成する。

インスタンス作成時、タグにて作業用インスタンスとわかるように、インスタンス名を 仮に conv-1-<インスタンス名> とする。

確認と作成ボタンをクリックした際にブートボリュームがマグネティックのブートボリュームの種類をSSDに変更するかどうかを確認されるが、マグネティックのままで作業を進める。

4. grubのインストール

※元インスタンスにgrubがインストールされていない場合のみ作業を行う。

作成したインスタンスへSSHログインを行い、grubをインストールする。
その後、シャットダウンを行う。

シャットダウンはコマンドでなく、AWSコンソールの インスタンスを停止 で行っても問題無い。

# yum install -y grub
# shutdown -h now

5. ルートデバイスからスナップショットを作成

grubが入っているインスタンスのルートデバイスからスナップショットを取得する。
この際、スナップショットの名前を仮に conv-1-<インスタンス名> とする。

その後、スナップショットが完了するまで待機。

6. スナップショットからボリュームを作成

先ほど作成したスナップショット conv-1-<インスタンス名> からボリュームを作成する。
この際、ボリュームの名前を仮に conv-pv-<インスタンス名> とする。
AZは変換後に配置するAZを指定する。

7. 新規ボリュームを作成

変換先で使用するボリュームを作成する。先ほど作成したボリュームと同様の設定で、ボリュームの名前を仮に conv-hvm-<インスタンス名> とする。

8. 変換用インスタンスを作成

※複数回作業を行う場合、毎回作成せずに使い回しても良い。

PVのボリュームからHVMのボリュームに変換するために利用する作業用インスタンスを作成する。OSはLinux系では自由だが、念のため変換対象のOSとメジャーバージョンを合わせる事を推奨する。
また以降の処理でIOの使用率が高くなるため、インスタンスタイプはt系以外を選択する事を推奨する。(処理能力的にはt2.microでも可能)

名称は自由だが、ここでは conv-controller とする。

インスタンス作成後、変換に利用するソフトウェアをインストールする。

# yum install -y parted

9. 変換作業用インスタンスにボリュームをアタッチ

作成した変換作業用インスタンス( conv-controller )にボリューム conv-pv-<インスタンス名> とボリューム conv-hvm-<インスタンス名> をアタッチする。

conv-pv-<インスタンス名> を/dev/sdfに、conv-hvm-<インスタンス名> を/dev/sdgにアタッチする。


10. ディスクのアタッチ確認

変換作業用インスタンスにディスクがアタッチされているかを確認する。

# fdisk -l

Disk /dev/xvda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00050d75

    Device Boot      Start         End      Blocks   Id  System
/dev/xvda1   *           1        1045     8387584   83  Linux

Disk /dev/xvdf: 6442 MB, 6442450944 bytes
255 heads, 63 sectors/track, 783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/xvdg: 6442 MB, 6442450944 bytes
255 heads, 63 sectors/track, 783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

xvdf/xvdgが認識されていることを確認。

11. HVM用ボリュームにパーティション作成

HVM用ボリュームにパーティションを作成する。

# parted /dev/xvdg --script 'mklabel msdos mkpart primary 1M -1s print quit'	
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdg: 6442MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  6442MB  6441MB  primary

# partprobe /dev/xvdg
# udevadm settle
# fdisk -l /dev/xvdg

Disk /dev/xvdg: 6442 MB, 6442450944 bytes
64 heads, 48 sectors/track, 4096 cylinders
Units = cylinders of 3072 * 512 = 1572864 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00072016

    Device Boot      Start         End      Blocks   Id  System
/dev/xvdg1               1        4096     6290432   83  Linux

12. PVボリュームの調整

ファイルシステムの確認と、ボリュームの縮小を行う。

# e2fsck -f /dev/xvdf
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/xvdf: 43024/393216 files (1.8% non-contiguous), 1076856/1572864 blocks

# resize2fs -M /dev/xvdf
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/xvdf to 1083490 (4k) blocks.
The filesystem on /dev/xvdf is now 1083490 blocks long.

リサイズ後のブロック数は継続作業で行うため、確認しておくこと。

13. PVボリューム→HVM用ボリュームのコピー

PVボリュームからHVMボリュームへブロックレベルでコピーを行う。

Countの値はresize2fsの実行結果にあるブロック数を指定する

# dd if=/dev/xvdf of=/dev/xvdg1 bs=4K count=1083490
1083490+0 records in
1083490+0 records out
4437975040 bytes (4.4 GB) copied, 201.857 s, 22.0 MB/s

14. HVM用ボリュームのリサイズ

ファイルシステムのサイズをボリュームのサイズと合わせる。

# resize2fs /dev/xvdg1
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/xvdg1 to 1572608 (4k) blocks.
The filesystem on /dev/xvdg1 is now 1572608 blocks long.

15. HVM用ボリュームをマウントし、chroot

# mount /dev/xvdg1 /mnt
# cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/
# chroot /mnt

16. grubの設定

# ls /boot/grub/grub.conf
ls: cannot access /boot/grub/grub.conf: No such file or directory

※ファイルが存在しない場合はシンボリックリンクを作成する
# ln -s /boot/grub/menu.lst /boot/grub/grub.conf
# ls /etc/grub.conf
ls: cannot access /etc/grub.conf: No such file or directory

※ファイルが存在しない場合はシンボリックリンクを作成する
# ln -s /boot/grub/grub.conf /etc/grub.conf
# rm -f /boot/grub/*stage*
# cp /usr/*/grub/*/*stage* /boot/grub/
# rm -f /boot/grub/device.map
# cat <<EOF | grub --batch
device (hd0) /dev/xvdg
root (hd0,0)
setup (hd0)
EOF
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/xvdg
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)"...  27 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded
Done.

17. menu.listの修正

# sed -i -e 's/root (hd0)/root (hd0,0)/' /boot/grub/menu.lst
# sed -i -e 's#\(kernel.*root=\)/.*#\1LABEL=/ console=ttyS0 xen_pv_hvm=enable#' /boot/grub/menu.lst

# vi /etc/fstab
LABEL=/         /        ext4   defaults       1 1
none            /proc    proc   defaults       0 0
none            /sys     sysfs  defaults       0 0
none            /dev/pts devpts gid=5,mode=620 0 0
none            /dev/shm tmpfs  defaults       0 0
/mnt/swap/0.img swap     swap   defaults       0 0
/dev/xvdf       /mnt/ebs/0 ext4 defaults       0 0

18. ラベルの変更

# e2label /dev/xvdg1 /	
# tune2fs -l /dev/xvdg1 |grep name
Filesystem volume name:   /

19. HVM用ボリュームのアンマウント

# rm -f /mnt/dev/xvdg /mnt/dev/xvdg1
# sync
# umount /mnt

20. PVボリューム、HVM用ボリュームのアンマウント

コンソールから conv-pv-<インスタンス名>conv-hvm-<インスタンス名> をデタッチする。

デタッチ後、正常に外れているかを「conv-controller」上で確認する。

# fdisk -l
Disk /dev/xvda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00050d75

    Device Boot      Start         End      Blocks   Id  System
/dev/xvda1   *           1        1045     8387584   83  Linux

21. HVM用ボリュームのスナップショットを作成

ボリューム conv-hvm-<インスタンス名> のスナップショットを作成する。
この際、名前を仮に <新インスタンス名> とする。

22. データブロックの複製

データボリュームが存在する場合
元のインスタンスのデータ用ボリュームのスナップショットを作成する。
スナップショットの名前は仮に <新インスタンス名>-data とする。

23. スナップショットからAMIの作成

<新インスタンス名><新インスタンス名>-data のスナップショットが準備出来たら、<新インスタンス名 スナップショットからイメージの作成を行う。
この際、名前を <新インスタンス名>_YYYYMMDD とする。

仮想化タイプを「ハードウェアアシストの仮想化」に設定すること。また、ボリュームタイプがgp2になっているので、他のタイプを使う場合は変更する。
また、「新しいボリュームの追加」にてdata-2-<インスタンス名> を元にEBSボリュームをアタッチするようにする。この際、デバイスのパスを「/dev/sdf」に、容量を元のサイズに設定する。

24. AMIから最終インスタンスの作成

最終的なインスタンスを AMI <新インスタンス名>_YYYYMMDD から起動する。

25. チェック

各種システム情報を新旧インスタンスで比較する

# curl http://169.254.169.254/latest/meta-data/instance-type
インスタンスタイプが新タイプに変更されている。

# df
ファイルシステムが同等のマウント状況となっている。

# rpm -qa | sort
すべてのパッケージが同一

# service --status-all | sort
同一のサービスが起動している(pidは異なる)
chkconfig
すべてのサービス設定が同一

ps axh | sort -k5
同一のプロセスが実行されている。
一部、HVM化によって起動するプロセスが微変しているため注意。

26. 不要リソースの削除

変換用に作成したインスタンス・AMI・スナップショットを削除する。

Discussion