因为要在 OpenStack 的平台上批量部署服务,为了简化操作,需要自己先准备一个部署好了服务的 qcow2 镜像。比较简单的方法是使用模版镜像启动虚拟机,进行完修改之后再保存,不过本地上传速度相当悲剧,加上手上又没有独服能用,所以只好选在 vultr 使用 qemu 进行虚拟化。这里记录一下操作过程。
首先安装虚拟化工具:
yum install -y libvirt-client virt-manager virt-viewer guestfish libguestfs-tools virt-top virt-install
修改 qemu 启动用户,因为默认是 nobody 启动的,读 root 用户的文件的话会因为权限问题读不到。
编辑
/etc/libvirt/qemu.conf
找到:
#user="root"
和
#group="root"
去掉注释。
启动服务:
systemctl start libvirtd
然后创建子网配置:
cat << _EOF_ >default.xml
<network>
<name>default</name>
<bridge name="virbr0"/>
<forward/>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254"/>
</dhcp>
</ip>
</network>
_EOF_
用 libvirt 创建一个虚拟子网:
virsh net-define ./default.xml
virsh net-autostart default
virsh net-start default
打开转发:
sysctl -w net.ipv4.ip_forward=1
echo net.ipv4.ip_forward = 1 >> "/etc/sysctl.conf"
sysctl -p
systemctl daemon-reload
安装 pip 与所需的依赖:
yum install -y python-devel python-setuptools
yum groupinstall -y "Development tools"
easy_install pip
安装 OpenStack 客户端:
pip install python-openstackclient
导入 rcFile 初始化配置:
source rcFile
列出初始的 image 列表:
openstack image list
这里选择 Centos 6.5 的镜像下载:
openstack image save --file centos_6.5-20150122-x86_64.qcow2 aceefa6f-7914-49df-839b-61bf6cc97694
下载完成之后先修改一下 root 密码,否则启动之后会出现无法登陆的情况:
export LIBGUESTFS_BACKEND=direct
virt-sysprep --root-password password:mypassword -a centos_6.5-20150122-x86_64.qcow2
然后编辑一下引导文件:
virt-edit centos_6.5-20150122-x86_64.qcow2 /etc/grub.conf
在 kernel /boot/vmlinuz… 那一行的后边加上
no_timer_check
否则 qemu 启动时检查计时器会出现无法引导的情况。Centos 7 的话引导文件是在 /etc/grub2.cfg ,需要修改两行 linux16 开头的引导命令。
查看 CPU 支持的模式:
qemu-x86_64 -cpu ?
命令会列出所有支持的模式,这里使用 kvm64
启动虚拟机:
virt-install --virt-type qemu --cpu kvm64 --ram 2048 --name centos_6.5 --disk path=centos_6.5-20150122-x86_64.qcow2,format=qcow2,device=disk,bus=virtio --network network=default,model=virtio --os-type=linux --nographics --import --vcpus 8
等到引导 log 刷完,使用之前修改的 root 密码登陆即可。
如果使用过程中需要断开与虚拟机的连接,可以按下 ctrl + ] 。重新连接至虚拟机则使用
virsh console centos_6.5
命令。
如果需要从外部进行登陆的可以开一个 screen ,执行:
socat TCP4-LISTEN:10022,reuseaddr,fork,su=nobody TCP4:192.168.122.231:22
将子网中的虚拟机的 ssh 端口转发到 vultr 的服务器的公网。
完成虚拟机中的服务部署的修改之后,首先 poweroff 虚拟机,然后使用
virt-sysprep -d centos_6.5
删除虚拟机内无用的数据,使用
virsh undefine centos_6.5
取消掉虚拟机
这时候 centos_6.5-20150122-x86_64.qcow2 这个镜像的修改就完成了。
使用
openstack image create -f shell --container-format bare --disk-format qcow2 --file centos_6.5-20150122-x86_64.qcow2 --tag centos_6.5 centos_6.5-20150122-x86_64_changed
将镜像重新上传回 OpenStack 的镜像库中。
然后就可以使用修改完成的镜像进行批量部署了。
有时候在修改虚拟机时可能出现磁盘空间不足的提示,这是因为初始镜像在制作时留下的剩余空间通常比较小,这时候就需要将虚拟机的磁盘大小进行一下变更了。
首先关闭虚拟机,然后查看一下文件系统详情:
virt-filesystems --long -h --all -a centos_6.5-20150122-x86_64.qcow2
创建一个新的磁盘文件:
qemu-img create -f qcow2 -o preallocation=metadata newdisk.qcow2 15G
使用创建的磁盘文件扩展分区:
virt-resize --expand /dev/sda1 centos_6.5-20150122-x86_64.qcow2 newdisk.qcow2
最后将镜像转回 qcow2 格式:
qemu-img convert -f raw -O qcow2 tmp.raw centos_6.5-20150122-x86_64_resized.qcow2
在Centos7上修改qcow2镜像