详细参考:http://qemu.weilnetz.de/qemu-doc.html
1.设置huge页
(1)查看默认页大小:getconf PAGESIZE
(2)挂载hugetlbfs文件系统:mount -t hugetlbfs hugetlbfs /dev/hugepages
(3)设置huge页大小:sysctl vm.nr_hugepages=512
(4)查看是否成功:cat /proc/meminfo|grep HugePages
2.qemu-kvm命令
-hda file:将file镜像作为客户机第一个IDE设备,客户机表现为/dev/hda设备或/dev/sda
-hdb file:同上,第二个IDE设备
-fda file:第一个软盘设备,表现为/dev/fd0
-cdrom file:cdrom设备,客户机表现为/dev/cdrom设备,不能与-hdc同时使用,因为-cdrom就是客户机中第三个IDE设备
-mtdblock file:使用file文件作为客户机自带的一个flash存储器
-sd file:file作为客户机sD卡
-pflash file:file作为客户机并行flash存储器
-boot [order=drivers][,once=drivers][,menu=on|off][,splash=splashfile][,splash-time=sp-time]
order表示设置启动顺序,drivers的值可以是a、b、c、n
a:第一个软驱
b:第二个软驱
c:第一个硬盘
d:第一个cdrom驱动器
n:网络设备
once表示设置第一次启动的启动顺序,在系统重启后该设置无效
menu=on|off:设置交互启动菜单选项,前提是使用的客户机支持bios
splash和splash-time都是在menu=on才有效,将splash的图片作为logo传递给bios来显示,sp-time是显示splash图片的时间单位是ms
-drive option[,option[,option[,...]]]:为客户机定义一个新的驱动器,选项如下:
file=FILE:使用file文件作为镜像文件加载到客户机的驱动器中
if=INTERFACE:指定驱动器接口类型,可用的有:ide,scsi,sd,mtd,floopy,pflash,virtio等
bus=BUS NUM,unit=UNIT NUM:设置驱动器在客户机中的总线编号和单元编号
index=INDEX NUM:设置在同一种接口的驱动器中的索引编号
media=disk|cdrom:设置驱动器中媒介的类型,其值为“disk”或“cdrom”
snapshot=on|off:是否启用镜像功能,启用时,qemu不会将磁盘数据的更改写回镜像文件中,而是写到临时文件,也可以在qemu monitor中使用commit命令强制将磁盘数据的更改保存回镜像文件中
cache=writethrough|writeback|(none|off)
writethrough:默认值,即直写模式,它是在调用write写入数据的同时将数据写入磁盘缓存和后端块设备中,优点:操作简单,缺点:写入数据速度较慢
writeback:回写模式,将数据写入到磁盘缓存中即返回,只有数据被换出缓存的时候才写入到后端块设备中,优点:写入速度快,缺点:可能造成数据丢失
(none|off):设置none或者off表示不写入缓存,直接写入到块设备中,优点是数据安全,缺点:速度太慢
aio=threads|native:默认threads,即让一个线程池去处理异步io;而native只适用于cache=none的情况,就是使用linux原生的aio
format=FORMAT:使用的磁盘格式,默认qemu是自动检测磁盘格式的
serial=SERIAL NUM:分配给设备的序列号
add=ADDR:分配给驱动器控制器的pci地址,该选项只有在使用virtio接口才适用
id=NAME:设置该驱动器的id,这个id可以在qemu monitor中用info block命令查看
3.qemu-img命令
qemu-img command [command option]
-h:查看qemu支持的文件格式
check [-f fmt]filename: 对磁盘镜像进行一致性检查,目前仅支持qcow2、qed、vdi格式文件的检查
-f fmt:指定格式,不指定qemu-img会自己检测
create [-f fmt][-o options]filename [size]: 创建一个格式为fmt,大小为size,文件名为filename的镜像文件
-o
backing_file=FILENAME:如果这个选项被指定,那么这个选项创建的镜像文件仅记录与后端镜像文件(即backing_file指定的文件)的差异部分,而后端镜像文件不会被修改,除非在qemu monitor中使用commit 或者使用qemu-img commit 命令手动提交
?:查询某种格式文件支持哪些选项
size:指定镜像文件的大小,默认单位bytes,也可以支持K、M、G、T即KB、MB、GB、TB大小
commit [-f fmt] filename:提交filename文件中的更改到后端支持镜像文件(即backing_file指定的文件)中
convert [-c] [-p] [-n] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt] [-o options] [-s snapshot_id_or_name] [-l snapshot_param] [-S sparse_size] filename [filename2 [...]] output_filename: 将fmt格式的filename镜像文件根据option选项转化为格式为output_fmt的名为output_filename的镜像文件,默认转为raw文件格式
-c:对输出的镜像文件进行压缩
info [-f fmt] [--output=ofmt] [--backing-chain] filename: 显示磁盘镜像文件filename的信息
snapshot [--object objectdef] [--p_w_picpath-opts] [-q] [-l | -a snapshot | -c snapshot | -d snapshot] filename :为镜像文件创建、应用或者删除一个快照
-a:applies 让某个镜像文件使用某个快照
-c:create 创建快照
-d:delete 删除快照
-l:list 显示所有快照
rebase [--object objectdef] [--p_w_picpath-opts] [-q] [-f fmt] [-t cache] [-T src_cache] [-p] [-u] -b backing_file [-F backing_fmt] filename: 改变镜像文件的后端镜像文件(即backing_file),只有qcow2和qed格式支持rebase命令,后端镜像文件的格式也被转化为“-F backing_fmt”指定的格式,有两种模式:
安全模式:默认模式,qemu-img会根据比较后来的后端镜像与现在的后端镜像文件的不同进行合理的处理
非安全模式:通过-u来指定,这种模式主要应用于将后端镜像重命令或移动位置后对前端镜像文件的修复处理,由用户去保证后端镜像的一致性
resize filename [+ | -]size:改变镜像文件大小,+-表示增量,使用这个命令时注意压缩不能小于现有的,否则数据丢失
4.qemu支持的镜像文件格式(qemu-img -h)可以查看:
Supported formats: blkdebug blkreplay blkverify bochs cloop dmg file ftp ftps host_cdrom host_device http https luks nbd null-aio null-co parallels qcow qcow2 qed quorum raw replication sheepdog vdi vhdx vmdk vpc vvfat
常见的如下:
raw:原始的磁盘镜像格式,易移植,功能简单
稀疏文件(sparse file):只分配大小,并不实际占用空间,所以磁盘满的时候会出错
dd命令创建的镜像文件:预分配空间,给每个空间都填0,写入较快
host_device:在需要将镜像转化到不支持空洞的磁盘设备时需要使用这种格式来代替raw
qcow2:qemu目前推荐的镜像格式,也是功能最多的格式,在qemu-img支持的选项如下:
backing_file:指定后端镜像文件
backing_fmt:指定后端镜像文件格式
cluster_size:设置簇的大小,取值在[512B,2MB]之间,默认为64kB,小簇节约空间,大簇性能好,按需取舍
preallocation off|metadata:预分配空间,off表示不分配,metadata表示只分配元数据部分,有的版本还支持full,全分配
encrytion:当它等于on时,镜像被加密。加密后再使用镜像启动客户机时需要在qemu monitor中输入cont或c来唤醒客户机输入密码后继续执行
例子:
qemu-img convert -o encryption -O qcow2 rhel6u5.img rhel6u5.qcow2
qcow:比较旧的镜像格式,,目前很少用,支持backing_file和encryption两个选项
cow:用户模式的Copy-On-Write的镜像文件格式
vdi:兼容virtualBox的镜像文件格式
vmdk:兼容vmware
vpc:兼容Virtual PC
5.客户机存储方式
本地镜像文件
物理磁盘或磁盘分区
lvm逻辑分区
nfs
iscsi
本地或光纤链接的lun
gfs2
各种存储方式各有千秋,其中nfs是使用非常广泛的分布式文件系统,如果nfs服务器向客户机开放了读写权限,那么可以直接挂载nfs,对镜像文件进行读写,如果nfs服务器没有开放权限,那么,我们可以把nfs的镜像文件作为后端镜像文件,本地再为这个后端镜像文件创建镜像文件,这样涉及到写操作直接写入到本地镜像文件,而nfs里面的文件不会被修改,这样有个好处是,nfs上面的镜像可以同时供许多客户端进行使用,每个客户端保存自己修改的那份本地镜像,这样效率大大提高而且更安全。命令如下:
mount 192.168.2.11:/kvm /kvm_host
qemu-img create -f qcow2 -o backing_file=/kvm_host/rhel6u5.img,size=4G local.img #size一般要大于等于镜像本身,否则会报错
6.qemu支持的网络模式
基于桥接的虚拟网卡
基于nat
qemu内置的用户模式网络
直接分配网络设备的网络
qemu-system-x86_64 -net nic,model=?这条命令可以查看qemu支持模拟的网卡类型,默认为rtl8139,结果如下:
qemu: Supported NIC models: ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio
配置命令:
qemu-system-x86_64 -net nic[,vlan=n][,macaddr=mac][,model=type] [,name=name][,addr=addr][,vectors=v]
-net nic:这是必须的参数,表明这是一个网卡的配置
vlan=n:将网卡放到编号为n的vlan,默认0
macaddr=MAC:设置网卡的MAC地址,默认根据宿主机中网卡的地址来分配
model=type :模拟网卡类型
name=nic name:设置网卡别名
addr=addr:设置网卡在客户机中的pci设备地址为addr
vectors=v:设置该网卡设备的MSI-X向量的数量为n,该选项仅对使用virtio驱动的网卡有效
如果需要向客户机提供多网卡,可以多次使用-net nic参数
桥接模式命令:
qemu-system-x86_64 -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile][,br=bridge][,helper=helper]
该配置表示链接宿主机的tap网络接口道n好vlan中,并且使用file和dfile两个脚本在启动客户机时配置网络和在关闭客户机时取消网络配置
tap:表明使用tap设备,类似tun,不过tap是对数据链路层的模拟,而tun是网络层的模拟
vlan=n:设置该设备的vlan号,默认0
name=name:设置别名
fd=h:链接到已经打开的tap接口的文件描述符,一般不设置,因为设置后ifname,script,downscript helper 等都不可以用了
ifname=name:设置在宿主机中添加tap虚拟设备的名称
script=file:宿主机在启动客户机时自动执行的脚本,默认为/etc/qemu-ifup
downscript=dfile:宿主机在客户机关闭时自动执行的脚本,默认为/etc/qemu-downscript
helper=helper:辅助程序,包括建立一个tap虚拟设备,默认为/usr/local/libexec/qemu-bridge-helper
例子:
(1)安装提供brctl和tunctl命令的rpm包
yum install brige-utils tunctl -y
(2)查看tun模块是否加载,没有则modprobe tun
lsmod|grep tun
modprobe tun
(3)查看/dev/net/tun的权限,需要让当前用户拥有可读写的权限
ls -l /dev/net/tun
(4)建立一个bridge,并将其绑定到一个可以正常工作的网络接口上,同时让bridge成为连接本机与外部网络的接口
/etc/init.d/NetworkManager stop;chkconfig NetworkManager off#关闭NetworkManager,避免它的干扰
brctl addbr br0 #添加bridge 名为br0
brctl addif br0 em1 #将br0与em1绑定起来
brctl stp br0 on #将br0设置为启用stp协议
ifconfig em1 0#将em1的ip设置为0
dhclient br0#将br0的网络配置好,也可以使用ifconfig br0 192.168.2.188 netmask 255.255.255.0 up ;route add default gw 192.168.2.1 br0
(5)准备qemu-ifup和qemu-ifdown脚本,默认都放在/etc下
qemu-ifup脚本内容如下:
#!/bin/bash # switch=br0 if [ -n "$1" ];then ip link set $1 up #启动$1,$1是qemu-kvm传递过来的虚拟设备名(ifname),由qemu-bridge-helper创建 sleep 1 #有些版本没有的话,可以使用tunctl -u $(whoami) -t $1 创建,-u指明属主,-t 是设备名 brctl addif ${switch} $1 #将$1加入虚拟网桥br0中 exit 0 else echo "Error,need nic" exit 1 fi
qemu-ifdown脚本这个脚本不是必须的,因为qemu-kvm自带的工具会解除tap设备的bridge绑定,也会自动删除tap设备,这里提供脚本供查看过程
#!/bin/bash # switch=br0 if [ -n "$1" ];then tunctl -d $1 brctl delif ${switch} $1 ip link set $1 down exit 0 else echo "error,need nic" exit 1 fi
(6)启动客户机
记得先给予脚本执行权限:chmod +x /etc/qemu*
qemu-system-x86_64 -m 4096 -smp 6 -net nic -net tap,ifname=tap1,script=/etc/qemu-ifup redhat6.qcow2 -daemonize
(7)查看是否桥接成功
在客户机:
可以利用ip a ;ifconfig;ping;route等命令查看是否能自动获取ip并正常上网
在宿主机:
利用brctl show 命令可以查看tap1接口的生成和删除
或ls /sys/devices/virtual/net 查看相关信息