一、kvm安装

注:如果是vmware,请在设置->处理器->选择"Intel-vt或AMD-v"选项

1、装载kvm模块

前提:
(1)确保CPU支持HVM;
grep -E --color=auto "(vmx|svm)" /proc/cpuinfo
(2)确保内核编译提供kvm模块
modinfo kvm
modprobe kvm ; lsmod |grep kvm
(3)验证
/dev/kvm

2、安装libvirt或者qemu //epel的yum已经配置好

关闭iptables和selinux
安装libvirt
yum install qemu-kvm libvirt virt-install bridge-utils net-tools -y
依赖到的包:
libvirt-daemon
libvirt-daemon-config-network
libvirt-daemon-driver-{network,lxc,qemu,secret,storage,nodedev}
systemctl enable libvirtd.service
systemctl start libvirtd.service
ifconfig //会显示一个virbr0,提供nat网路,桥接和仅主机需要单独配置

3、网络配置 //注意备份

[root@localhost network-scripts]# cat ifcfg-ens33
BOOTPROTO=none
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no  //这个一定要修改

[root@localhost network-scripts]# cat ifcfg-br0 //备注br0的地址尽量固定。cobbler安装的时候尽量指定为静态
TYPE=Bridge
BOOTPROTO=static
IPV4_FAILURE_FATAL=no
NAME=ens33
DEVICE=br0
ONBOOT=yes
NM_CONTROLLED=no
IPADDR=192.168.154.136
NETMASK=255.255.255.0
GATEWAY=192.168.154.2
DNS1=192.168.154.2

4、安装虚拟机

前提:上传iso镜像
[root@localhost vm]# qemu-img create -f qcow2 /vm/rh6.9/hda 20G //创建磁盘
[root@localhost vm]# qemu-img create -f qcow2 /vm/rh6.9/hdb 50G
[root@localhost iso]# virt-install -n rhel-6.9 --memory 512 --disk=/vm/rh6.9/1.img,format=qcow2,size=20 --network=bridge=br0 --os-type=linux --os-variant=rhel6.9 --cdrom /vm/iso/CentOS-6.9.iso --vnc --vncport=5910 --vnclisten=0.0.0.0
使用tigervnc:登录 vncserver: 192.168.154.135:5910 //使用virt-install不用提前创建磁盘,使用qemu-kvm的话需要事先创建磁盘文件。

安装完成后:virsh start 需要手动开启,然后使用vnc连接
其他安装方法:
(1)virt-manager实现
(2)virt-install命令

virt-install \
--name=guest1-rhel5-64 \
--file=/var/lib/libvirt/images/guest1-rhel5-64.dsk \
--file-size=8 \
--nonsparse --graphics spice \
--vcpus=2 --ram=2048 \
--location=http://example1.com/installation_tree/RHEL5.6-Serverx86_64/os \
--network bridge=br0 \
--os-type=linux \
--os-variant=rhel5.4    

(3)qemu-img 和 qemu-kvm 命令行方式安装
创建一个空的qcow2格式的镜像文件
qemu-img create -f qcow2 windows-master.qcow2 10G
启动一个虚机,将系统安装盘挂到 cdrom,安装操作系统
qemu-kvm -hda windows-master.qcow2 -m 512 -boot d -cdrom /home/user/isos/en_winxp_pro_with_sp2.iso
现在你就拥有了一个带操作系统的镜像文件。你可以以它为模板创建新的镜像文件。使用模板的好处是,它会被设置为只读所以可以免于破坏。
qemu-img create -b windows-master.qcow2 -f qcow2 windows-clone.qcow2
你可以在新的镜像文件上启动虚机了
qemu-kvm -hda windows-clone.qcow2 -m 400

5、简单配置KVM虚拟机(console)

CentOS7修改:
方法一:

编辑 /etc/default/grub 文件,对照如下:
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb"
GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0,115200"
GRUB_DISABLE_RECOVERY="true"
grub2-mkconfig -o /boot/grub2/grub.cfg  

重启虚拟机:
virsh console think8848-kvmbase
方法二:
或者:grubby --update-kernel=ALL --args="console=ttyS0"

CentOS6的修改:
[root@localhost ~]# echo "ttyS0" >> /etc/securetty
[root@localhost ~]# less /etc/grub.conf //kernel参数中最后追加参数“console=ttyS0”
[root@localhost ~]# less /etc/inittab //添加一行“S0:12345:respawn:/sbin/agetty ttyS0 115200”
重启然后:virsh console rhel-6.9 登录

6、迁移虚拟机

关机:virsh shutdown rhel-6.9 //假如无法关闭,在虚拟机中开启acpid服务
克隆:[root@localhost iso]# virt-clone -o rhel-6.9 -n rhel69-new1 -f /vm/rh6.9/rh69-new1.img
查看:virsh list -all
修改参数:开启新的虚拟机,修改hostname,ip,迁移镜像到其他位置。
/etc/libvirt/qemu/rhel69-new1.xml 和 /vm/rh6.9/rh69-new1.img //传输这两个文件即可
在新机上:
rh69-new1.img放到/home/kvm-img目录,将rhel69-new1.xml放到/etc/libvirt/qemu目录中
修改rhel69-new1.xml //匹配name字段的值,要替换所有的。UUID也要修改:https://www.guidgen.com/ 在线生成
virsh define /etc/libvirt/qemu/think8848-kvm02.xml
virsh start //virsh console ,
vnc端口也要在/etc/libvirt/qemu/rh69-new1.xml

7、安装图形管理工具

建议安装tigervnc-服务端和客户端(未实际测试) 或者安装X-manager打开virt-manager图形界面
[root@localhost ~]# yum install gnome-classic-session gnome-terminal nautilus-open-terminal control-center liberation-mono-fonts
[root@localhost ~]# yum install virt-manager virt-viewer -y
[root@localhost ~]# yum install tigervnc-server -y
[root@localhost ~]# cp /lib/systemd/system/[email protected] /etc/systemd/system/vncserver.service
如果以前安装过,需要通过以下几步删除tigervnc:

卸载原安装的服务器软件: yum remove  tigervnc-server;
删除/etc/systemd/system文件夹下的配置文件:vncserver@:1.service等
删除可远程VNC连接的账户home目录下的.vnc文件夹:remove -rf ~\.vnc
查看/tmp/.X11-unix目录,将X[1-9]的文件删掉,注意X0不能删除;
最后重启OS

systemctl restart libvirtd.service
virt-manager //此时就不会提示了,因为正确的安装了

虚拟机启动后,在host上看到的是一个kvm进程
yum groupinstall "Gnome Desktop" // 不需要执行startx,
Xshell也不需要执行ssh -X 192.168.4.105
直接:virt-manager即可。

二、virsh命令详解

1、libvirt:

虚拟化进阶(五)_第1张图片

libvirt是一个非常通用的虚拟化管理工具
支持的虚拟化技术:kvm,xen,vmware,qemu,lxc,openvz,...
术语:

        node(host):物理机
        Hypervisor:支持虚拟机运行的环境;
        domain:虚拟机
            domain 0:prilileged特权域
            domain U:

Hypervisor的访问路径:

    本地URL:
        dirver[+transport]:///[PATH][?extra-param]
        dirver:驱动名称,例如qemu,xen,lxc;//kvm使用的是qemu
        transport:传输方式; 
        注:kvm使用qemu驱动,格式qemu:///system
    远程URL
        dirver[+transport]:///[user@][host][:port]/[PATH][?extra-param]
    例如: 
        qemu://192.168.4.1/system
        qemu+ssh://[email protected]/system

2、virsh命令:

[root@localhost ~]# virsh --help
Domain Management (help keyword 'domain')  管理域
Domain Monitoring (help keyword 'monitor') 监控
Host and Hypervisor (help keyword 'host') hypervisor相关
Interface (help keyword 'interface')  接口
Network Filter (help keyword 'filter') 网络防火墙
Networking (help keyword 'network')  网络
Node Device (help keyword 'nodedev') 物理设备
Secret (help keyword 'secret')  
Snapshot (help keyword 'snapshot') 快照
Storage Pool (help keyword 'pool') 存储池
Storage Volume (help keyword 'volume')  使用lvm创建的卷,多个卷放在一次,成为一个存储池
Virsh itself (help keyword 'virsh')  virsh 自身的

Domain Management (help keyword 'domain') 管理域
create:创建并立即启动
define:创建但不立即启动
destory:销毁一个虚拟机
console:链接一个虚拟机

vcpuinfo rhel6.6 //或者generic
    vcpu:虚拟cpu
    CPU:物理cpu
list :列出域
dumpxml:导致指定域的xml格式的配置文件
    示例:virsh dumpxml rhel6.6 > /tmp/mytemplate.xml //可以进行修改后直接使用。
    虚拟机模板配置文件。
Create:创建并启动域
define:创建域
domainid:获取域id
domainname:根据id获取name
    virsh domid rhel6.6
    virsh domuuid rhel6.6
    virsh dominfo rhel6.6
    virsh console rhel6.6 //退出使用 ctrl+ 】
dominfo:域信息
reboot:重启域
destroy:关闭域
shutdown:关闭
undefine:删除域
save:保存状态到某文件中。
restore:恢复状态
pause:暂停域
resume:恢复暂停的域
setmem:改变域内存大小
    --config:下次启动生效,
    --live:运行域之后生效
    --current:影响当前域
    virsh setmem rhel6.6 768m --live //只能调小,可以设置max usage,将可以调大
    virsh dominfo rhel6.6 
setmaxmem:设定内存最大值
setvcpus:修改域的vcpu数量
    virsh vcpuinfo //查看
vcpupin //把vcpu绑定在cpu上
domblkstat //domain在运行后才可以显示
    virsh domiflist rhel6.6 //列出domain的所有接口
    virsh domstat rhel6.6
attach-device //添加磁盘设备
detach-device
attach-interface //添加网络接口
detach-interface

3、qemu-img命令

qemu-img //创建磁盘文件
支持的格式:
vmdk:vmware
qcow2:可以动态调整大小,建议使用的
等等
qemu-img create -f qcow2 -o ? //查看qcow2支持的选项
preallocation:预分配方式
full:立即分配所有空间
metadata:只占用元数据空间
[root@node1 test]# qemu-img create -f qcow2 -o preallocation=metadata /tmp/test.qcow2 120G

[root@node1 test]# ls -lh /tmp/test.qcow2 
    -rw-r--r-- 1 root root 121G May  4 18:28 /tmp/test.qcow2
[root@node1 test]# ls -sh /tmp/test.qcow2 
    23M /tmp/test.qcow2
qemu-img resize /tmp/test.qcow2 240G
    //只是支持扩大,不支持缩小

添加磁盘到已经存在的域
···
virsh help attach-disk
virsh attach-disk rhel6.6 /tmp/test.img vdd //vdd是一个设备名称,可以使用其他的
virsh domblklist generic //查看blk信息
fdisk -l //会看到已经挂载使用了
virsh detach-disk //卸载该disk,disk必须没有使用才可以
[root@localhost ~]# virsh domblklist rhel-6.9
Target Source
vda /vm/rh6.9/1.img //vm的磁盘为vda,物理磁盘路径为 /vm/rh6.9/1.img
hda -
···
virsh命令详解请参考:
https://libvirt.org/sources/virshcmdref/html-single/
https://linux.die.net/man/1/virsh
https://blog.csdn.net/xxoo00xx00/article/details/49802367

三、kvm虚拟化网络

要求关闭Network-Manager,使用network
桥接接口的创建方法:
1.virsh iface-bridge:创建桥接设备
2.手动编辑配置文件
3.brctl

1、虚拟化网络模型:

nat:
dhcp进程,
桥接:
guest A:-->虚拟接口->物理网卡--|| ---外部主机
物理网卡:成为交换机,虚拟网卡具有物理网卡的mac地址
物理网卡:混杂模式,目标mac不是本网卡的也会接受
仅主机:
虚拟网络:

每一个虚拟网卡:都像是一根网线,一端在guest上,一段在物理网卡上。
guest1 guest2
1\ /2
虚拟桥 //软件模拟
|3
主机虚拟网卡---4---物理网卡
4:控制是否能够与外网通信[ip_forward=1]//主机的虚拟地址
3:是否能够与物理机通信

iptables -t nat -vnL //会生成很多规则

2、修改配置文件方式

创建桥:
1.brctl
2.修改配置文件
3.virsh命令自己就可以创建桥
修改配置文件
cd /etc/sysconfig/network-scripts/
cp ifcfg-eno16777736{,.bak}
cp ifcfg-eno16777736 ifcfg-br0

systemctl disbale NetworkManager
systemctl stop NetworkManager

vim ifcfg-eno16777736
    ONBOOT=yes
    BOOTPROTO=none
    BRIDGE="br0"
    指定的静态ip地址删除
vim ifcfg-br0
    DEVICE=br0
    TYPE=Bridge

3、virsh创建桥接设备

systemctl stop NetworkManager //必须关闭,让网卡不受NM控制
virsh iface-list
virsh help iface-bridge
virsh iface-bridge eno16777736 br0 --no-stp
br0会抢占 eno16777736的地址
eno16777736 会没有地址
添加和卸载接口:

注:ip addr add name 这几个接口是不需要手动创建的
vnet1.0和vnet2.0是不需要手动 创建的

virsh attach-interface rhel6.6 bridge virbr0 //直接添加到桥上
virsh domiflist rhel6.6 //会看到所有的接口
virsh detach-interface  rhel6.6 --mac 99999999 //卸载该接口

4、ip命令

ip link add //添加虚拟网络设备 type: veth;虚拟以太网
ip link add name veth1.0 type veth peer name veth1.1
ip link add name veth2.0 type veth peer name veth2.1
//生成一对网卡,一般是1.0,一半是1.1
ip addr show //查
虚拟化进阶(五)_第2张图片

为虚拟机动态添加网卡:
虚拟化进阶(五)_第3张图片
[root@node1 ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.525400c0f235 yes virbr0-nic
[root@node1 test]# brctl addif virbr0 veth1.0
[root@node1 ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.525400c0f235 yes veth1.0
virbr0-nic
一般添加到桥上,另一半添加到虚拟机上
virsh help attach-interface
virsh attach-interface rhel6.6 bridge virbr0
//把virbr0添加到桥上

动态增删interface;
virsh attach-interface DOMAIN TYPE SOURCE //type多为bridge,source某桥的名称
//会自动创建一对网卡,一半在虚拟机上,一半在桥上
virsh detach-interface DOMAIN type --mac ......

virt-manager不能捕获键盘
details-->dispaly VNC:
Type: vnc server
Address: Hypervisor default
Port: Auto
keymap:en-us
install CentOS 7之后白屏幕
Address: Hypervisor default

四、使用qemu-kvm管理虚拟机(cirros)

guest安装:
virt-manager
virt-install //虚拟机创建
virt-installl --help //查看帮助信息
--input tablet //鼠标和guest一致,
--intpu keyboard,bus=ubs
之前创建的虚拟机,在host上是一个qemu-kvm进程而已。
cat /proc/qemu-kvm_PID/cmdline //qemu-kvm命令的完整名称,正在运行的guest

qemu-kvm手动使用
[root@node1 ~]# rpm -ql qemu-kvm |grep exec
/usr/libexec/qemu-kvm
//红帽,默认不打算让我们用,因此没有在PATH中
ln -sv /usr/libexec/qemu-kvm /bin
qemu-kvm
标准选项
块设备选项
i386选项
网络选项
nic: 创建并添加到vlan
user:使用用户空间的虚拟网络,
tap:使用tap设备,成对出现
设备URL语法
专家模式。。

使用cirros:基于原有的映像文件,启动一个虚拟机实例
cirros-no-cloud-0.3.0
    cirros启动会连接到cirros官网,下载脚本,完成初始化
    //这个是自己定制的

1、第一个:

[root@node1 test]# qemu-img info cirros-no_cloud-0.3.0-x86_64-disk.img
[root@node1 test]# cp cirros-no_cloud-0.3.0-x86_64-disk.img /test/test1/test.qcow2
qemu-kvm -name test -m 64 -smp 2 -drive file=/test/test1/test.qcow2,media=disk,if=virtio,format=qcow2 -net none -nographic
sudo su - //切换到管理员

ps aux //可以看到qemu-kvm的进程
//ctrl +a 不松手,h
C-a h print this help
C-a x exit emulator
C-a s save disk data back to file (if -snapshot)
C-a t toggle console timestamps
C-a b send break (magic sysrq)
C-a c switch between console and monitor
C-a C-a sends C-a //切换到监控界面,hypervisor界面
在监控界面和虚拟机界面切换:ctrl +a ,c
(qemu) help info
(qemu) system_powerdown //关闭

2、第二个:添加图形界面

rpm包安装的:
sdl:被禁用了
[root@node1 test]# qemu-kvm -name test -m 64 -smp 2 -drive file=/test/test1/test.qcow2,media=disk,if=virtio,format=qcow2 -net none -vnc :1
// :1监听在5901端口,:2监听在5902端口
ssh -X [email protected] //kubuntu执行,xshell可以不使用
yum -y install tigervnc
vncviewer :1 //链接到本地5901端口

3、第三个:网络

需要脚本 //这两个脚本,只适用于桥接模式,nat和仅主机需要修改

vim /etc/qemu-ifup //默认使用这个名字
#!/bin/bash
bridge=br0
if [ -n "$1" ]; then
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 1
fi
bash -n /etc/qemu-ifup aaa //测试
chmod +x /etc/qemu-ifup

vim /etc/qemu-ifdown
#!/bin/bash

bridge=br0

if [ -n "$1" ];then
brctl delif $bridge $1
ip link set $1 down
exit 0
else
echo "Error: no interface specified."
fi

qemu-kvm -name test -m 64 -smp 2 -drive file=/test/test1/test.qcow2,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:01 \
-net tap,ifname=veth1 vnc :1

name:在虚拟机上的名字
ifname: 在host上名字,在脚本中指定了桥接到br0上
brctl show可以查看
macaddr:52:54:00:#:#:# 是kvm固定的格式

出错:
qemu-kvm: -net tap,ifname=veth1: could not configure /dev/net/tun (veth1): Invalid argument
qemu-kvm: -net tap,ifname=veth1: Device 'tap' could not be initialized
检查过程:
[root@node1 test]# yum install bridge-utils tunctl
[root@node1 test]# lsmod |grep tun
1.注意:在NetworkManager服务启动的时候
br启动,ssh是不能连接的
2.ifconfig 看到的只能有
lo,ens33,br0,virbr0,virbr0-nic

备注:
让虚拟机后台运行 -daemonize

五、虚拟化网络模型进阶

虚拟化模型:
虚拟化进阶(五)_第4张图片
nat模型:

1、隔离模型实现:

1.
brctl addbr mybr0
ip link set mybr0 up //激活使用
2.
cp /etc/qemu-ifup{,-mybr0}
vim /etc/qemu-ifup-mybr0
bridge=mybr0}
cp /etc/qemu-ifdown{,-mybr0}
vim /etc/qemu-ifdown-mybr0
bridge=mybr0}
3.启动虚拟机
qemu-kvm -name test -m 64 -smp 2 -drive file=/test/test1/test.qcow2,media=disk,if=virtio,format=qcow2
-net nic,model=virtio,macaddr=52:54:00:00:00:01
-net tap,ifname=veth1,script=/etc/qemu-ifup-mybr0,downscript=/etc/qemu-ifdown-mybr0
-vnc :1 -daemonize

brctl show //确保veth1在mybr0上
//两个虚拟机配置同一个网络地址,都桥接到该mybr0即可

├── test1
│?? └── test.qcow2
└── test2
└── test2.qcow2
qemu-kvm -name test2 -m 64 -smp 2 -drive file=/test/test2/test2.qcow2,media=disk,if=virtio,format=qcow2
-net nic,model=virtio,macaddr=52:54:00:00:00:02
-net tap,ifname=veth2,script=/etc/qemu-ifup-mybr0,downscript=/etc/qemu-ifdown-mybr0
-vnc :2 -daemonize

brctl show //veth1和veth2都在mybr0上

vncviewer :1 &
ifconfig eth0 192.168.1.1/24 up
vncviewer :2 &
ifconfig eth0 192.168.1.2/24 up

ping 测试能够通信
    出错:不能通信

ifconfig -a //可以看到veth0和veth1是没有地址的

2、实验

实验:和物理机进行通信
方法一:向网桥加上地址
或者创建一对网卡,一般在guest上,一半在host上
ifconfig mybr0 10.0.0.254/24 up //要和guest在同一个网段中
host上
ping 10.0.0.1
ping 10.0.0.2 //都能够通信

实验:添加nat
guest1:route add default gw 10.0.0.254
guest2:route add default gw 10.0.0.254
host: ip_forward = 1
///此时只能出去,但是不能回来
添加iptables规则
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.5.107
guest1: ping 192.168.0.1 //外部网络能能够ping通

//可以在br0上添加一个地址,专门用于nat转换使用
自己能够ping到外围,但是外部的不能够直接ping内网

iptables -t nat -A PREROUTING -d 10.0.0.107 -j DNAT --to-destination 10.0.0.1
    //外部主机能够访问10.0.0.1

linux内核能够支持名称内核空间,实现复杂的网络
ip netns //名称空间

ip netns exec router1 ifconfig -a
ip link add name myeth1.1 type veth peer name myeth1.2
    //注意peer也要加 name,否则ifconfig只会有myeth1.1
ip link set myeth1.1 netns router1 //把该接口添加到名称空间
    ip link show //myeth1.2依然在,但是myeth1.1已经不见
ip netns exec router1 ifconfig -a //可以看到接口
ip netns exec router1 ip link set myeth1.1 name eth0 //修改名字

ip link set myeth1.2 netns router2 //把1.2送到名称空间1.2上
ip netns exec router2 ip link set myeth1.1 name eth0 //修改名字

//router1和router2中各有一个eth0

[root@node1 test]# ip netns exec route1 ifconfig eth0 10.1.0.1/24 up
[root@node1 test]# ip netns exec route2 ifconfig eth0 10.1.0.2/24 up
ip netns exec route2 ping 10.1.0.1 //可以ping

为mybr0提供给dhcp服务的名称空间
[root@node1 test]# ip netns add myrouter
[root@node1 test]# ip link add name myeth3.1 type veth peer name myeth3.2
[root@node1 test]# ip link set myeth3.1 up
[root@node1 test]# brctl addif mybr0 myeth3.1

[root@node1 test]# ip link set dev myeth3.2 netns myrouter
[root@node1 test]# ip netns exec myrouter ip link set myeth3.2 name eth0
[root@node1 test]# ip netns exec myrouter ifconfig eth0 10.0.0.253/24 up
[root@node1 test]# ip netns exec myrouter ifconfig

dnsmasq:同时提供dns和dhcp服务

myeth3.1==mybr0
myeth3.2==myrouter

ip netns exec myrouter /sbin/dnsmasq -F 10.0.0.100,10.0.0.120

重新启动一个虚拟机
或者关闭之前的,再次启动即可
vncviewer :2 //ifconfig 可以直接获取ip地址

错误:仍然不能获取ip地址

Openstack早期使用openvswitch来提供云网络
现在的Openstack不再使用。

六、qemu-kvm命令简介

1、管理KVM虚拟机

Qemu是一个广泛使用的开源计算机仿真器和虚拟机。当作为仿真器时,可以在一种架构(如PC机)下运行另一种架构(如ARM)下的操作系统和程序。而通过动态转化,其可以获得很高的运行效率。当作为一个虚拟机时,qemu可以通过直接使用真机的系统资源,让虚拟系统能够获得接近于物理机的性能表现。qemu支持xen或者kvm模式下的虚拟化。当用kvm时,qemu可以虚拟x86、服务器和嵌入式powerpc,以及s390的系统。
QEMU 当运行与主机架构相同的目标架构时可以使用 KVM。例如,当在一个x86兼容处理器上运行 qemu-system-x86 时,可以利用 KVM 加速——为宿主机和客户机提供更好的性能。
Qemu有如下几个部分组成:
处理器模拟器(x86、PowerPC和Sparc);
仿真设备(显卡、网卡、硬盘、鼠标等);
用于将仿真设备连接至主机设备(真实设备)的通用设备;
模拟机的描述信息;
调试器;
与模拟器交互的用户接口;

在RHEL6上,qemu-kvm位于/usr/libexec目录中。由于此目录不属于PATH环境变量,故无法直接使用,这样也阻止了可以直接使用qemu作为创建并管理虚拟机。如若想使用qemu虚拟机,可以通过将/usr/libexec/qemu-kvm链接为/usr/bin/qemu实现。
[root@node1 test]# ln -sv /usr/lib/exec/qemu-kvm /usr/bin/qemu-kvm
qemu-kvm命令使用格式为“qemu-kvm [options] [disk_image]”,其选项非常多,不过,大致可分为如下几类。
标准选项;
USB选项;
显示选项;
i386平台专用选项;
网络选项;
字符设备选项;
蓝牙相关选项;
Linux系统引导专用选项;
调试/专家模式选项;
PowerPC专用选项;
Sparc32专用选项;
考虑到篇幅及使用需要,这里介绍的选项主要涉及到标准选项、显示选项、i386平台专用选项及Linux系统引导专用选项等相关的选项。

2、qemu-kvm的标准选项

qemu-kvm的标准选项主要涉及指定主机类型、CPU模式、NUMA、软驱设备、光驱设备及硬件设备等。
-name name:设定虚拟机名称;
-M machine:指定要模拟的主机类型,如Standard PC、ISA-only PC或Intel-Mac等,可以使用“qemu-kvm -M ?”获取所支持的所有类型;
-m megs:设定虚拟机的RAM大小;
-cpu model:设定CPU模型,如coreduo、qemu64等,可以使用“qemu-kvm -cpu ?”获取所支持的所有模型;
建议使用host:和底层架构一致的cpu类型
-smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]:设定模拟的SMP架构中CPU的个数等、每个CPU的核心数及CPU的socket数目等;PC机上最多可以模拟255颗CPU;maxcpus用于指定热插入的CPU个数上限;
简单多处理器
-numa opts:指定模拟多节点的numa设备;
-fda file
-fdb file:使用指定文件(file)作为软盘镜像,file为/dev/fd0表示使用物理软驱;
-hda file
-hdb file
-hdc file
-hdd file:使用指定file作为硬盘镜像;
-cdrom file:使用指定file作为CD-ROM镜像,需要注意的是-cdrom和-hdc不能同时使用;将file指定为/dev/cdrom可以直接使用物理光驱;
-drive option[,option[,option[,...]]]:定义一个硬盘设备;可用子选项有很多。
file=/path/to/somefile:硬件映像文件路径;
if=interface:指定硬盘设备所连接的接口类型,即控制器类型,如ide、scsi、sd、mtd、floppy、pflash及virtio等;
建议使用virtio,半虚拟化,windows不要使用virtio因为需要专用驱动
index=index:设定同一种控制器类型中不同设备的索引号,即标识号;
media=media:定义介质类型为硬盘(disk)还是光盘(cdrom);
snapshot=snapshot:指定当前硬盘设备是否支持快照功能:on或off;
cache=cache:定义如何使用物理机缓存来访问块数据,其可用值有none、writeback、unsafe和writethrough四个;
format=format:指定映像文件的格式,具体格式可参见qemu-img命令;
-boot [order=drives][,once=drives][,menu=on|off]:定义启动设备的引导次序,每种设备使用一个字符表示;不同的架构所支持的设备及其表示字符不尽相同,在x86 PC架构上,a、b表示软驱、c表示第一块硬盘,d表示第一个光驱设备,n-p表示网络适配器;默认为硬盘设备;
-boot order=dc,once=d
//设定启动设备,once:第一次使用cdrom启动

3、qemu-kvm的显示选项

显示选项用于定义虚拟机启动后的显示接口相关类型及属性等。
-nographic:默认情况下,qemu使用SDL来显示VGA输出;而此选项用于禁止图形接口,此时,qemu类似一个简单的命令行程序,其仿真串口设备将被重定向到控制台;
-curses:禁止图形接口,并使用curses/ncurses作为交互接口;
//curses是一个强大的文本图形界面,但是不好使用
-alt-grab:使用Ctrl+Alt+Shift组合键释放鼠标;
-ctrl-grab:使用右Ctrl键释放鼠标;
//默认使用 ctrl ] 关闭
-sdl:启用SDL;
-spice option[,option[,...]]:启用spice远程桌面协议;其有许多子选项,具体请参照qemu-kvm的手册;
-vga type:指定要仿真的VGA接口类型,常见类型有:
cirrus:Cirrus Logic GD5446显示卡;
std:带有Bochs VBI扩展的标准VGA显示卡;
vmware:VMWare SVGA-II兼容的显示适配器;
qxl:QXL半虚拟化显示卡;与VGA兼容;在Guest中安装qxl驱动后能以很好的方式工作,在使用spice协议时推荐使用此类型;
none:禁用VGA卡;
-vnc display[,option[,option[,...]]]:默认情况下,qemu使用SDL显示VGA输出;使用-vnc选项,可以让qemu监听在VNC上,并将VGA输出重定向至VNC会话;使用此选项时,必须使用-k选项指定键盘布局类型;其有许多子选项,具体请参照qemu-kvm的手册;

display:
(1) host:N
172.16.100.7:1, 监听于172.16.100.7主的5900+N的端口上
(2) unix:/path/to/socket_file
(3) none

options:
password: 连接时需要验正密码;设定密码通过monitor接口使用change
reverse: “反向”连接至某处于监听状态的vncview上;

-monitor stdio:表示在标准输入输出上显示monitor界面
-nographic
Ctrl-a, c: 在console和monitor之间切换
Ctrl-a, h: 显示帮助信息

4、i386平台专用选项

-no-acpi:禁用ACPI功能,GuestOS与ACPI出现兼容问题时使用此选项;
-balloon none:禁用balloon设备;
-balloon virtio[,addr=addr]:启用virtio balloon设备;

5、磁盘

qemu-img是qemu用来实现磁盘映像管理的工具组件,其有许多子命令,分别用于实现不同的管理功能,而每一个子命令也都有一系列不同的选项。其使用语法格式为“qemu-img subcommand [options]”,支持的子命令如下。
create:创建一个新的磁盘映像文件;
check:检查磁盘映像文件中的错误;
convert:转换磁盘映像的格式;
info:显示指定磁盘映像的信息;
snapshot:管理磁盘映像的快照;
commit:提交磁盘映像的所有改变;
rbase:基于某磁盘映像创建新的映像文件;
resize:增大或缩减磁盘映像文件的大小;
使用create子命令创建磁盘映像的命令格式为“create [-f fmt] [-o options] filename [size]”,例如下面的命令创建了一个格式为qcow2的120G的稀疏磁盘映像文件。

[root@node1 test]# qemu-img create -f qcow2 /VM/images/rhel5.8/hda 120G
Formatting '/VM/images/rhel5.8/hda', fmt=qcow2 size=128849018880 encryption=off cluster_size=65536

6、网络属性相关选项

网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息。这里只介绍nic、tap和user三种类型网络接口的属性,其它类型请参照qemu-kvm手册。
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]:创建一个新的网卡设备并连接至vlan n中;PC架构上默认的NIC为e1000,macaddr用于为其指定MAC地址,name用于指定一个在监控时显示的网上设备名称;emu可以模拟多个类型的网卡设备,如virtio、i82551、i82557b、i82559er、ne2k_isa、pcnet、rtl8139、e1000、smc91c111、lance及mcf_fec等;不过,不同平台架构上,其支持的类型可能只包含前述列表的一部分,可以使用“qemu-kvm -net nic,model=?”来获取当前平台支持的类型;
-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]:通过物理机的TAP网络接口连接至vlan n中,使用script=file指定的脚本(默认为/etc/qemu-ifup)来配置当前网络接口,并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)来撤消接口配置;使用script=no和downscript=no可分别用来禁止执行脚本;
//启用脚本和开启脚本
-net user[,option][,option][,...]:在用户模式配置网络栈,其不依赖于管理权限;有效选项有:
vlan=n:连接至vlan n,默认n=0;
name=name:指定接口的显示名称,常用于监控模式中;
net=addr[/mask]:设定GuestOS可见的IP网络,掩码可选,默认为10.0.2.0/8;
host=addr:指定GuestOS中看到的物理机的IP地址,默认为指定网络中的第二个,即x.x.x.2;
dhcpstart=addr:指定DHCP服务地址池中16个地址的起始IP,默认为第16个至第31个,即x.x.x.16-x.x.x.31;
dns=addr:指定GuestOS可见的dns服务器地址;默认为GuestOS网络中的第三个地址,即x.x.x.3;
tftp=dir:激活内置的tftp服务器,并使用指定的dir作为tftp服务器的默认根目录;
bootfile=file:BOOTP文件名称,用于实现网络引导GuestOS;如:qemu -hda linux.img -boot n -net user,tftp=/tftpserver/pub,bootfile=/pxelinux.0
//主要是为了避免用户启动虚拟机时,依赖管理员权限的

[root@node1 test]# cat /etc/qemu-ifup 
#!/bin/bash
bridge=br0

if [ -n "$1" ]; then
    ip link set $1 up
    sleep 1
    brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
    else
    echo "Error: no interface specified."
exit 1
fi

[root@node1 test]# cat /etc/qemu-ifdown 
#!/bin/bash
bridge=br0

if [ -n "$1" ];then
    brctl delif $bridge $1
    ip link set $1 down
    exit 0
else
    echo "Error: no interface specified."
    exit 1
fi

七、虚拟机进程示例

示例1:
下面的命令创建了一个名为rhel5.8的虚拟机,其RAM大小为512MB,有两颗CPU的SMP架构,默认引导设备为硬盘,有一个硬盘设备和一个光驱设备,网络接口类型为virtio,VGA模式为cirrus,并启用了balloon功能。
[root@localhost ~]# qemu-kvm -name "rhel5.8" -m 512 \
-smp 2 -boot d \
-drive file=/VM/images/rhel5.8/hda,if=virtio,index=0,media=disk,format=qcow2 \
-drive file=/isos/rhel-5.8.iso,index=1,media=cdrom \
-net nic,model=virtio,macaddr=52:54:00:A5:41:1E \
-vga cirrus -balloon virtio
//-vga cirrus模拟cirrus的vga显示,-ballon启用内存的动态调整。
需要注意的是,上述命令中使用的硬盘映像文件/VM/images/rhel5.8/hda需要事先使用qemu-img命令创建。

在虚拟机创建并安装GuestOS完成之后,可以免去光驱设备直接启动之。命令如下所示。

[root@localhost ~]# qemu-kvm -name "rhel5.8" -m 512 \
-smp 2 -boot d \
-drive file=/VM/images/rhel5.8/hda,if=virtio,index=0,media=disk,format=qcow2 \
-net nic,model=virtio,macaddr=52:54:00:A5:41:1E \
-vga cirrus -balloon virtio

八、KVM资源限制

请参考:
https://libvirt.org/cgroups.html#resourceAPIs

遇到的小插曲:
执行yum命令的时候报错:“Failed to initialize NSS library"
注意:避免安装相关的glibc.i686包,否则会导致yum、rpm损坏
1、下载nspr(nspr-4.13.1-1.0.el7_3.x86_64.rpm)包,链接:http://mirror.centos.org/centos/7/os/x86_64/Packages/nspr-4.13.1-1.0.el7_3.x86_64.rpm
2、执行命令:rpm2cpio nspr-4.13.1-1.0.el7_3.x86_64.rpm | cpio -idmv
3、执行命令:LD_PRELOAD=./usr/lib64/libnspr4.so yum update nspr
如果还报错,可以将export LD_PRELOAD=/usr/lib64/libnspr4.so写入/etc/profile,然后再source /etc/profile

参考:
https://qemu.weilnetz.de/doc/qemu-doc.html //qemu-kvm 命令指南
http://www.cnblogs.com/sammyliu/p/4543597.html
https://www.linux-kvm.org/page/Management_Tools
https://libvirt.org/format.html //XML格式

tigervnc可以实现vnc,qemu-kvm当进程监听在一个端口后也可以使用vnc软件查看