分类目录归档:AMI

将PV类型的AMI转换成HVM类型

目前好多新类型,包括t2, r3都只支持hvm虚拟化类型的AMI,所以有必要做点hvm的AMI来用,但是从头重做又太麻烦,于是想把现有的pv转换成hvm。首先AMI目前没法直接转换,所以可以将pv的AMI应用的snapshot重新注册成新AMI。具体步骤如下:
(1)在Snapshot列表中选择pv的AMI所引用的根分区快照,点右键Create Image,其他地方保持默认,只需要将Virtualization type换成Hardware-assisted virtualization,然后起个名字,创建就行。
(2)这时只有根分区,然后基于该新AMI创建实例,创建过程中基于之前AMI剩下的磁盘的快照创建新磁盘挂载到相同位置,就攒好一套了,这时,将这个新EC2实例创建成AMI,就是内容跟之前一模一样的HVM的AMI了。

制作自己的AMI

亚马逊AMI market上提供的AMI有的含有Market Code(不允许将跟分区作为第二分区挂载到别的实例上进去修改根分区内容),有的AMI不支持特定实例类型(例如CentOS.org提供的AMI就不支持c3系列)。因此有必要自己做几个AMI。制作方法和步骤如下:
(1)自己在合适的位置安装一个精简版的CentOS,尽量最简化安装,因为一会要把系统文件内容全部同步到亚马逊上去。还可以直接将虚拟机import进AWS。安装的时候使用/dev/sda1 跟分区,/dev/sda1 swap分区,不要用LVM。例子里我们是创建1GB的vmware磁盘,不要使用动态扩展,尽量使用一次性分配。然后分区/dev/sda1 768M,剩下的MB全部给swap,此处大小要是2的n次方,否则会出现partition doesn’t end with disk boundry类似的警告提示。
(2)第二部将系统内容弄到AWS上去,此处提供两个方案:
首先在一台配置到aws tools的机器(推荐Amazon AMI创建的的EC2),创建一块25GB的EBS volume,并attach,然后格式化分区,17GB/, 8GB swap,精确到MB,然后

mkfs.ext4 /dev/xvdj1;
e2label /dev/xvdj1 /  (打上标签);
mkswap -L swap /dev/xvdj2(也打上标签),
#然后挂载
mount /dev/xvdj1 /ebs(自己创建一个挂载点)

使用rsync将刚才安装的虚拟机文件系统同步到上述挂载点中

rsync -avx -e "ssh -i xxxxx.pem" /* user@ip:/ebs/

使用ec2-import-volume命令将虚拟机磁盘导入到AWS的一块EBS磁盘中。命令如下:

ec2-import-volume centos6.5.disk -f raw -b <your_s3_bucket_name> \
 --region ap-southeast-1 -O <access_key_id> -W <secret_access_key> \
 -o <access_key_id> -w <secret_access_key>

-f是指定格式:kvm、xen的是raw, vmware的是vmdk,hyper-v的是vhd(vhdx格式好想目前还不支持,需要转成vhd格式),-b是指定与你导入地区一致的s3 bucket,因为此过程是通过S3中转的。然后你会得到一块磁盘,attach到上述Amazon AMI的EC2上,然后把内容复制出来。
(3)进入到/ebs中修改你刚才同步过来的文件系统
检查/etc/grub.conf,主要是默认会采用uuid来指定分区,但是复制的vm uuid是不一样的,因此要改成LABEL形式,如下:

default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-358.el6.x86_64)
root (hd0,0)
kernel /boot/vmlinuz-2.6.32-358.el6.x86_64 ro root=LABEL=/ console=ttyS0
initrd /boot/initramfs-2.6.32-358.el6.x86_64.img

修改/etc/sysconfig/network-scripts/ifcfg-eth0(注意安装虚拟机得时候只要一个网卡),修改成如下

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

修改/etc/fatab,改成用LABEL挂载,如下:(none开头的保持默认)

LABEL=/ / ext4 defaults 1 1
LABEL=swap swap swap defaults 0 0

( 4)将改好的EBS磁盘做成snapshot快照,并获取snapshot ID备用
(5)在上述工作机上用ec2-register命令注册AMI

ec2-register -n "CentOS6.4" -d "CentOS6.4" -a x86_64 -K pk-xxxxxx.pem \
 -C cert-mod.pem --root-device-name /dev/sda1 \
 -b /dev/sda=snap-a40edf49:25:true --kernel aki-503e7402 \
 --region ap-southeast-1

这一步骤需要你账号的X.509 Certificates密钥对(在security credential里面找),还需要kernel id,具体该使用哪个aki,详见这个官方文档链接
AmazonKernelImageIDs
(6)试着基于自己创建的AMI创建一个实例,然后进去自定义一下,再在实例上右键注册成自己个性化的AMI(我一般会装上CloudWatch然后写个README说这个AMI是我做的cloudwatch别删除)
至此完毕

如何将snapshot快照注册成AMI镜像

如果你有包含可启动的系统文件系统,并且做成了快照,可是使用ec2-register将其注册成AMI快照
#ec2-register -n “CentOS5.7x86_64with_AwsMonitor” -d “CentOS5.7x86_64with_AwsMonitor” -a x86_64 -K pk-xx.pem -C cert-xx.pem –root-device-name=/dev/sda1 -b /dev/sda=snap-e18570c8:25:ture –kernel  aki-41eec435 –region eu-west-1

 注:
a) ec2-register命令在Amazon AMI 中才有(/opt/aws/下),你也可以自己安装;
b) -n <name>, -d <description>, -a < architecture>(架构);
c) -K(大写K)指定pk-xx.pem,-C(大写C)指定cert-xx.pem;
d) –root-device-name=/dev/sda1  指定根设备名称,一般指定/sda1为所需的根分区;
e) -b /dev/sda=snap-e18570c8:25:ture 指定来源sanpshot编号,和分区大小;
f) –kernel  aki-41eec435  指定内核编号:更多详见附录;
g) –region eu-west-1 指定所在区域
更多AKI详见如下链接
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedKernels.html#AmazonKernelImageIDs