镜像的介绍与创建

镜像种类

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 终端发送关机命令无效