随着小米私有云服务正式上线,虚拟机的创建会更加的标准化,因此本文介绍两种创建虚拟机的方法。
第一种方法:白手起家
其实这种方法在网上有很多类似的方法,也是我们最早使用的创建镜像的方法。系统环境:ubuntu 12.04
1)创建镜像文件
1 |
kvm-img create -f qcow2 <镜像名称>.img 40G |
首先创建一个大小为40G的镜像文件,文件格式为qcow2,qcow2为目前较为主流,性能较其他格式也有些许提升。
2)创建虚拟机
1 |
kvm -m 1024 -drive file=<镜像名称>.img,cache=writeback,if=virtio,boot=on -boot order=d,menu=on -net nic,model=virtio, -nographic -vnc :0 -usbdevice tablet -cdrom <安装镜像名称>.iso |
然后用VNC客户端进行登录,正常的安装虚拟机,注意分区的时候最好不要创建交换分区。为了避免重复工作,我们可以先在上面做好一些初始化工作。
3)上传镜像到glance
1 |
glance add name="<云镜像名称>" is_public=true container_format=ovf disk_format=qcow2 < ./<本地镜像名称> |
接下来将我们才做好的虚拟机镜像上传到glance当中即可。
第二种方法:亡羊补牢
由于种种原因,我们之前做的镜像已经不能满足我们的需求,我们又不想重新创建镜像,则可以采用以下方法。系统环境:centos6.3
1)首先在OpenStack使用原有镜像创建一台虚拟机。
接下来我们在这台虚拟机进行类似补栅栏(补牢)的工作,继续进行我们未完成的初始化工作。
2)制作镜像
我们首先要找到该虚拟机镜像所在的位置。最简单的方法就是在dashboard的管理员当中的云主机选项可以找到镜像所在那个物理机上。
在虚拟机概况中我们可以看到当前虚拟机的ID,以该虚拟机为例,ID为0e73b51e-0c0f-4e4f-a0e4-43c00b6fc230
我们在该物理机的/var/lib/nova/instances/0e73b51e-0c0f-4e4f-a0e4-43c00b6fc230目录下可以看到有关该虚拟机的镜像和配置文件,通常为disk文件。
这里要说明一下,该镜像文件我们不能直接上传到glance上作为虚拟机镜像,否则用该镜像创建虚拟机时会出现如下错误。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] File "/usr/lib/python2.6/site-packages/nova/compute/manager.py", line 1483, in _spawn 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] block_device_info) 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] File "/usr/lib/python2.6/site-packages/nova/virt/libvirt/driver.py", line 2063, in spawn 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] admin_pass=admin_password) 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] File "/usr/lib/python2.6/site-packages/nova/virt/libvirt/driver.py", line 2353, in _create_image 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] project_id=instance['project_id']) 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] File "/usr/lib/python2.6/site-packages/nova/virt/libvirt/imagebackend.py", line 174, in cache 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] *args, **kwargs) 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] File "/usr/lib/python2.6/site-packages/nova/virt/libvirt/imagebackend.py", line 276, in create_image 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] prepare_template(target=base, *args, **kwargs) 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] File "/usr/lib/python2.6/site-packages/nova/openstack/common/lockutils.py", line 246, in inner 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] return f(*args, **kwargs) 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] File "/usr/lib/python2.6/site-packages/nova/virt/libvirt/imagebackend.py", line 162, in call_if_not_exists 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] fetch_func(target=target, *args, **kwargs) 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] File "/usr/lib/python2.6/site-packages/nova/virt/libvirt/utils.py", line 644, in fetch_image 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] images.fetch_to_raw(context, image_id, target, user_id, project_id) 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] File "/usr/lib/python2.6/site-packages/nova/virt/images.py", line 210, in fetch_to_raw 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] {'fmt': fmt, 'backing_file': backing_file})) 2013-11-29 16:29:33.737 11912 TRACE nova.compute.manager [instance: 6c8729bf-a6b3-48f4-82f7-3ef0349f4547] ImageUnacceptable: Image ea03b934-b6b0-4faf-90cf-326f33ff1aee is unacceptable: fmt=qcow2 backed by: /var/lib/nova/instances/_base/6cf2576200fbef2c4e33f5ac01bbe7d5f9122769 |
使用qemu-info查看镜像信息可以看到如下内容。
1 2 3 4 5 6 |
image: disk file format: qcow2 virtual size: 40G (42949672960 bytes) disk size: 3.5G cluster_size: 65536 backing file: /var/lib/nova/instances/_base/6cf2576200fbef2c4e33f5ac01bbe7d5f9122769 |
相比一般的镜像文件多出来一个backing file字段。如何将其转换为一般的镜像格式,我这里使用的方法就是做一次格式转换。首先先备份一下镜像,然后做格式转换。
1 2 |
cp disk disk.bak qemu-img convert -O qcow2 disk.bak cent6.3-x86_64.img |
之后将转换好的镜像上传到glance上即可。