openstack image guide
介绍
在你拥有虚拟机镜像(也有人叫”虚拟器件”)之前,你的 OpenStack 计算云不太有用,这个指南描述了如何获取,创建以及修改 OpenStack 兼容的虚拟机镜像。
为了简化,有时文档使用 “镜像” 代替 “虚拟机镜像” 。
虚拟机镜像是什么?
一个虚拟机镜像是一个文件,文件内包含了已经安装好可启动操作系统的虚拟磁盘。
虚拟机镜像有不同的格式,下面具体列出。
Raw
“raw” 镜像格式是最最简单的,并且是被 KVM 和 Xen 原生支持的格式,你可以想象裸格式镜像和块设备文件是二进制位相当的,就好像从块设备拷贝过来的,比方说,使用dd 命令将 /dev/sda 内容拷贝到一个文件。qcow2
qcow2 (QEMU 写时复制版本2)格式通常是KVM使用,相比裸格式,它有额外的特性,例如:
使用稀疏文件呈现方式,因此镜像尺寸更小。
支持快照。
因为qcow2 镜像是稀疏的,因此,qcow2镜像通常比裸格式镜像小,更小的文件意味着上传更快,因此通常转换裸格式镜像到qcow2格式上传比直接上传裸格式镜像文件更快。
注意:因为裸格式镜像不支持快照,OpenStack 计算节点在需要的时候将会自动转换裸格式镜像到qcow2格式。
by 原文:http://docs.openstack.org/zh_CN/image-guide/content/ch_introduction.html
安装kvm
1 | sudo rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm |
centos 镜像制作参考
- http://docs.openstack.org/zh_CN/image-guide/content/virt-install.html
- http://docs.openstack.org/zh_CN/image-guide/content/centos-image.html#d6e859
- http://docs.openstack.org/image-guide/content/virt-install.html
- http://docs.openstack.org/image-guide/content/centos-image.html#d6e859
检测kvm是否安装,并且处于可用状态
检查 libvirt 默认网络是否运行,vnc无法远程访问,请排查防火墙是否限制了访问。
在使用 libvirt 启动虚拟机前,检查它的 “default” 默认网络是否启动。虚拟机要连接到外网,它的默认网络必须激活。启动 libvirt 默认网络将创建 linux 网桥( 通常名称是virbr0 ),iptables 规则,以及dhcp服务器进程 dnsmasq 。
检查 “default” 默认网络是否激活,使用 virsh net-list 命令并查看 “default” 网络是否是启用状态。
1 | virsh net-list |
如果网络未激活,输入以下命令:1
virsh net-start default
开始制作centos镜像
1.创建一个50g大小容量的qcow2格式的镜像文件
1 | qemu-img create -f qcow2 /data/CentOS-6.7-x86_64-RedCloud-160723.qcow2 50G |
2.这里使用的是centos-6.7的版本,即操作系统未rhel6,其他版本请参考下一条命令查看支持的操作系统版本,如下创建一个kvm类型的虚拟机,指定ram为1024m,磁盘大小为第一步创建的镜像文件。
1 | virt-install --virt-type kvm --name CentOS-6.7-x86_64-RedCloud-160723 --ram 1024 \ |
3.查看kvm支持哪些操作系统版本
1 | virt-install --os-variant list |
4.启动kvm虚拟机,开始安装系统
1 | virsh vncdisplay CentOS-6.7-x86_64-RedCloud-160723 |
5.查看虚拟机状态
1 | virsh list --all |
6.使用 virsh 卸载磁盘,libvirt需要挂接一个空磁盘到之前挂接CDROM的地方,设备名应该是 hdc。可以使用 virsh dumpxml vm-image 命令来确认。
1 | virsh dumpxml CentOS-6.7-x86_64-RedCloud-160723 |
7.以root用户使用virsh命令,执行下面的步骤完成挂载空磁盘并重启。如果你使用virt-manager安装,下面的命令也起相同作用,你也可以使用图形界面卸载磁盘并手工停止然后启动虚拟机。
1 | virsh attach-disk --type cdrom --mode readonly CentOS-6.7-x86_64-RedCloud-160723 "" hdc |
8.登陆到新创建的镜像内,一般通过vnc客户端可以登录,或者宿主机ssd登录,新建的虚拟机内。
- 8.1 登陆虚拟机执行安装ACPI server,为了让虚拟化层能重启和关闭虚拟机,必须在虚拟机内安装并运行 acpid 服务。
1 | yum install http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm -y |
- 8.2 在虚拟机操作内容,配置获取metadata,需要使用 cloud-init 获取公钥
1 | yum install cloud-init -y |
修改虚拟机配置文件
1 | vi /boot/grub/menu.lst |
cloud-init默认阻止root远程登录并且禁止password认证,只能centos用户通过秘钥登录,通过修改cloud-init配置解决
参考:https://gist.github.com/11xor6/4737097
1 | vi /etc/cloud/cloud.cfg |
关闭虚拟机
1 | shutdown -h now |
9.为最后使用virt-sysprep命令,先安装这个包,清除虚拟机启动生成的一些信息,此命了做虚拟机清理。
清理(删除 MAC 地址相关信息)
操作系统会在/etc/sysconfig/network-scripts/ifcfg-eth0 和 /etc/udev/rules.d/70-persistent-net.rules 这类文件记录下网卡MAC地址,但是,虚拟机的网卡MAC地址在每次虚拟机创建的时候都会不同,因此这些信息必须从配置文件删除掉。
目前有 virt-sysprep 工具可以完成清理虚拟机镜像内的 MAC 地址相关的信息。
1 | yum install libguestfs-tools -y |
10.删除 libvirt 虚拟机域
现在你可以上传虚拟机镜像到镜像服务了,不再需要 libvirt 来管理虚拟机镜像,使用 virsh undefine vm-image 命令完成。
1 | virsh undefine CentOS-6.7-x86_64-RedCloud-160723 |
11.镜像准备完成
前面你使用 qemu-img create 命令创建的镜像已经准备好可以上传了,例如,你可以上传 CentOS-6.7-x86_64-RedCloud-160723.qcow2 文件到镜像服务。
12.qume import qcow2c1
2
3
4
5
6 virt-install --connect qemu:///system --ram 1024 -n rhel_64 -r 1024 --os-type=linux --os-variant=rhel6 --disk path=/data/CentOS-6-x86_64-GenericCloud-1604.qcow2c,device=disk,format=qcow2 --vcpus=1 --graphics vnc,listen=0.0.0.0 --noautoconsole --import
[root@bogon data]# virsh list --all
Id Name State
----------------------------------------------------
1 rhel_64 running
- command line by network install
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38# 创建虚拟机
qemu-img create -f qcow2 /data/centos-6.8.qcow2 10G
# 通过vnc登录,根据Linux向导完成系统安装,reboot
virt-install --virt-type kvm --name centos-6.8 --ram 2024 \
--cdrom=/data/CentOS-6.8-x86_64-minimal.iso \
--disk path=/data/centos-6.8.qcow2,format=qcow2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 --noautoconsole \
--os-type=linux --os-variant=rhel6
virsh attach-disk --type cdrom --mode readonly centos-6.8 "" hdc
# 启动虚拟机
virsh start centos-6.8
# kvm machine exec
echo "NOZEROCONF=yes" >> /etc/sysconfig/network
yum install http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm -y
yum install -y acpid && chkconfig acpid on
yum install -y qemu-guest-agent && chkconfig qemu-ga on
yum install -y cloud-init
yum install -y cloud-utils-growpart
/sbin/shutdown -h now
virt-sysprep -d centos-6.8
virt-sparsify --tmp /img/ --compress centos-6.8.qcow2 centos-6.8.qcow2c
virsh destroy centos-6.8
virsh undefine centos-6.8
13.guestfish changed image
1 | - install kvm tools |
FAQ
最后提醒一下,我安装官网怎么也无法正确让虚拟机获取公钥,可以通过秘钥登录,聪明的你发现博客中细微的差别了吗?哈哈。。。