Start an Ubuntu / with my existing AMI / PVM linux, and install grub packages on them: apt-get install grub-pc grub-pc-bin grub-legacy-ec2 grub-gfxpayload-lists
Stop PVM linux
Detach root (/dev/sda1) partition at PVM linux
Attach PVM linux root partition to running HVM linux somewhere, e.g.: /dev/sdf
On HVM linux: mkdir -p /mnt/xvdf && mount /dev/xvdf /mnt/xvdf
rsync -avzXA /boot/ /mnt/xvdf/boot/
mount -o bind /dev /mnt/xvdf/dev && mount -o bind /dev/pts /mnt/xvdf/dev/pts && mount -o bind /proc /mnt/xvdf/proc && mount -o bind /sys /mnt/xvdf/sys
The answer from @divyenduz works but needs some cleanup and clarification for modern (circa 2019) AWS EC2. Importantly, modern instance classes translate the device name differently.
Here are my modified steps.
For clarity, nodes are:
Original PVM node that you want to upgrade to HVM is "PVM01"
New HVM node that you will migrate PVM01's root disk to is "HVM01"
create-instance: New Ubuntu HVM instance "HVM01". Any instance class should work; however, device name may be different, see notes, below
I used Bionic Ubuntu 18.04 HVM AMI ID ami-0a313d6098716f372 and instance class C5.XLARGE
Attach PVM01 root partition (new volume from previous step) to new HVM01 /dev/sdf
NOTE: Older instance classes such as C3 will translate the volume name to /dev/xvdf
NOTE: Newer instance classes such as C5 will translate the volume name to /dev/nvme1
On newer instance classes, the root vol will be /dev/nvme0 -- ZERO
On newer instance classes, the attached, secondary vol will be /dev/nvme1 -- ONE
Make a note of the attached volume device name
ssh PVM01
sudo fdisk -l
On HVM01:
# For xvdf, e.g. on C3.XLARGE
DEVNAME=xvdf1
# For nvme, e.g. on C5.XLARGE
DEVNAME=nvme1n1
mkdir -p /mnt/${DEVNAME} && mount /dev/${DEVNAME} /mnt/${DEVNAME}
rsync -avzXA /boot/ /mnt/${DEVNAME}/boot/
mount -o bind /dev /mnt/${DEVNAME}/dev && mount -o bind /dev/pts /mnt/${DEVNAME}/dev/pts && mount -o bind /proc /mnt/${DEVNAME}/proc && mount -o bind /sys /mnt/${DEVNAME}/sys
chroot /mnt/${DEVNAME}
grub-install --no-floppy --recheck --force /dev/${DEVNAME}
update-grub2
Exit chroot with CTRL+D
Stop HVM01
Detach both volumes
detach /dev/nvme0 PVM01 root
NOTE: This would be /dev/sda1 on a C3 instance class
detach /dev/${DEVNAME} (DEVNAME from above script)
attach PVM01 root Volume to HVM01 as /dev/sda1
Once again, the /dev/sda1 name is in the console; this name will get translated to /dev/nvme0 or /dev/xvda1 depending on how modern the instance class is
Start HVM01
OPTIONAL: Create a new AMI image from the the now-running HVM01, it will be HVM virtualized.