1. 程式人生 > >虛擬化進階(五)

虛擬化進階(五)

kvm 網絡虛擬化 qemu-kvm virsh

一、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:

技術分享圖片

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 //查
技術分享圖片

為虛擬機動態添加網卡:
技術分享圖片
[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

五、虛擬化網絡模型進階

虛擬化模型:
技術分享圖片
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軟件查看

虛擬化進階(五)