镜像的介绍与创建
镜像种类
raw
原始的磁盘镜像格式,qemu-img 默认支持的格式,它的优势在于它非常简单而且非常容易移植到其他模拟器(emulator,QEMU 也是一个 emulator)上去使用。
如果客户机文件系统(如 Linux 上的 ext2/ext3/ext4、Windows 的 NTFS)支持“空洞” (hole),那么镜像文件只有在被写有数据的扇区才会真正占用磁盘空间,从而有节省磁盘空间的作用。qemu-img 默认的 raw格式的文件其实是稀疏文件(sparse file)。
稀疏文件就是在文件中留有很多空余空间,留备将来插入数据使用。如果这些空余空间被 ASCII 码的 NULL字符占据,并且这些空间相当大,那么,这个文件就被称为稀疏文件,而且,并不分配相应的磁盘块。
dd 命令创建的也是 raw 格式,不过 dd 一 开始就让镜像实际占用了分配的空间,而没有使用稀疏文件的方式对待空洞而节省磁盘空间。尽管一开始就实际占用磁盘空间的方式没有节省磁盘的效果,不过它在写入新的数据时不需要宿主机从现有磁盘空间中分配,从而在第一次写入数据时性能会比稀疏文件的方式更好一点。
简单来说,raw 有以下几个特点:
寻址简单,访问效率高
可以通过格式转换工具方便地转换为其它格式
格式实现简单,不支持压缩、快照和加密
能够直接被宿主机挂载,不用开虚拟机即可在宿主和虚拟机间进行数据传输
qcow2
qcow2 是 qcow 的一种改进,是 Qemu 实现的一种虚拟机镜像格式。更小的虚拟硬盘空 间(尤其是宿主分区不支持 hole 的情况下),支持压缩、加密、快照功能,磁盘读写性能较 raw 差。
虚拟机和支持镜像格式
镜像的制作
镜像制作命令
- qemu-img
- qemu-kvm (ubuntu下为kvm)
镜像的制作过程
# qemu-img create -f qcow2 ubuntu-14.04-amd64.qcow2 50G
# chown oneadmin.oneadmin ubuntu-14.04-amd64.qcow2
#/usr/libexec/qemu-kvm -m 4096 -cdrom /iso/ubuntu-14.04.3-server-amd64.iso \
-drive file=/iso/ubuntu-14.04-amd64.qcow2,if=virtio \
-net nic,model=virtio -net tap,script=no -boot d \
-nographic -vnc :0
参数解释:
-m 指定内存大小
-cdrom 指定系统 iso 镜像
-drive file=xx,if=xx 指定硬盘镜像,file=镜像文件名,if=镜像格式类型
-net nic,model=xx 表示网卡配置,model=模拟网卡类型,默认 rt18139
-net tap,script=no 虚拟设备,桥接网络,script 表启动虚拟机自动执行网络配置脚本,如果不需要启动,写no即可
-boot d 系统启动顺序,d表示表示cdrom
-nographic 关闭图形输出
-vnc:0 开启vnc监听
ubuntu系统下镜像的制作使用的是kvm命令
# kvm -m 4096 -cdrom /iso/ubuntu-14.04.3-server-amd64.iso -driver \
file=/iso/ubuntu14.04-50G.qcow2,if=virtio -net \
nic,model=virtio -net tap -boot d -nographic -vnc:0
镜像和模板的系统优化
对创建好的镜像进行系统优化
# /usr/libexec/qemu-kvm -m 4096 -drive \
file=/iso/ubuntu-14.04-amd64.qcow2,if=virtio -net \
nic,model=virtio -net tap,script=no -nographic -vnc :0
对已经应用的镜像进行系统优化
# oneimage show 0 | grep SOURCE //根据模板ID查看镜像文件的位置
SOURCE : /data1/100/8c81df77f36d764058c68987929db4e1
# /usr/libexec/qemu-kvm -m 4096 -drive \
file=/data1/100/8c81df77f36d764058c68987929db4e1,if=virtio -net \
nic,model=virtio -net tap,script=no -nographic -vnc :0
如果在进行系统优化的过程需要和外界通信,则需要创建桥接网络,之前介绍 qemu-kvm 安装时到-net tap,script=no选项,默认只是创建桥接虚拟网络,并没有启用,只有启用了才可以设置对应网络配置和外界通信。
可以通过手动桥接或是脚本的方式来实现。
如果不想每次都手动操作,则可以通过脚本自动化实现虚拟网卡的桥接。使用选项-net
tap,script=/etc/qemu-ifup.sh
把之前的no替换为需要执行的脚本
# cat /etc/qemu-ifup.sh
#!/bin/bash
switch=br0 //设置桥接网卡
if [ -n $1 ]; then ////$1为qemu-kvm传递值,这里是tap
ip link set $1 up
brctl addif ${switch} $1
exit 0
else
echo "no interface!"
exit 1
fi
//修改选项即可与外界通信
#qemu-kvm -m 4096 -drive file=8c81df77f36d764058c68987929db4e1,if=ide \
-net nic -net tap,ifname=tap0,script=/etc/qemu-ifup -nographic -vnc :0
系统优化主要是selinux、iptables、服务、软件包的安装和文件描述符的设置等。acpid 服务必须安装且在虚拟机系统中开启,否则 OpenNebula web 端和 shell 终端发送关机命令无效
。