创世神域

Nothing is impossible.

@Puteulanus2年前

07/30
19:38
未分类

在Centos7上修改qcow2镜像

因为要在 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镜像