1. 程式人生 > >KVM虛擬化-qemu-kvm雜記

KVM虛擬化-qemu-kvm雜記

虛擬化 KVM linux CentOS

一、安裝KVM

1、VMware Workstation開啟虛擬化功能

技術分享圖片

1.1 查看自己的物理CPU是否支持硬件輔助虛擬化

只要標記有vmx或svm,就說明支持硬件虛擬化
[root@node2 ~]# grep -E --color=auto "(vmx|svm)" /proc/cpuinfo 
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt xsave hypervisor lahf_lm arat epb pln pts dts tpr_shadow vnmi ept vpid fsgsbase smep
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt xsave hypervisor lahf_lm arat epb pln pts dts tpr_shadow vnmi ept vpid fsgsbase smep

2、安裝kvm

2.1 裝載kvm模塊

裝載kvm核心模塊:
[root@node2 ~]# modprobe kvm

因為我是Intel的CPU,所以裝載intel的kvm模塊:
[root@node2 ~]# modprobe kvm-intel

2.2 查看裝載模塊

此時內核已經成為kvm-hypervisor
[root@node2 ~]# lsmod | grep kvm
kvm_intel              55496  0 
kvm                   337772  1 kvm_intel
[root@node2 ~]# 

驗證是否有KVM文件,存在說明內核已經被kvm寄宿了
[root@node2 ~]# ll /dev/kvm 
crw-rw---- 1 root root 10, 232 Sep 15 23:14 /dev/kvm

2.3 查看虛擬化管理包組

查看包組:
[root@node2 ~]# yum grouplist | grep -i "virtualization"
   Virtualization
   Virtualization Client
   Virtualization Platform
   Virtualization Tools

2.4 由於我們暫時先學習qemu管理虛擬機,只安裝 Virtualization包組裏的qemu組件即可

[root@node2 ~]# yum install qemu-kvm

2.5 查看qemu的文件

[root@node2 ~]# rpm -ql qemu-kvm | grep qemu-kvm | head -2

2.6 執行程序位置不在環境變量下,需要創建鏈接

[root@node2 ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/
`/usr/bin/qemu-kvm‘ -> `/usr/libexec/qemu-kvm‘

3、CentOS7的虛擬化包組

只要安裝Virtualization包組即可
[root@master1 ~]# yum grouplist | grep -i "virtualization"
   Virtualization Host
   Virtualization

3.1 CentOS7安裝KVM

裝載kvm
# modprobe kvm
# modprobe kvm-intel

查看kvm模塊:
modinfo kvm
[root@master1 ~]# modinfo kvm-intel

二、qemu-kvm虛擬機管理(CentOS7)

1、安裝qemu

[root@master1 ~]# yum install qemu-kvm

1.1 創建軟鏈接

[root@master1 ~]# rpm -ql qemu-kvm | grep /libexec/
/usr/libexec/qemu-kvm

[root@master1 ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/
‘/usr/bin/qemu-kvm’ -> ‘/usr/libexec/qemu-kvm’

1.2 查看使用幫助

[root@master1 ~]# qemu-kvm -h

2、創建一個簡單的虛擬機

2.1 去互聯網搜索開源的鏡像文件

訪問:https://launchpad.net/cirros

查看該網站發現只更新到0.33,獲取源碼已經移交到github托管。這邊下載0.30做實驗

[root@master1 ~]# ls
cirros-no_cloud-0.3.0-x86_64-disk.img

2.1.1 查看磁盤映像文件格式

[root@master1 ~]# qemu-img info /root/cirros-no_cloud-0.3.0-x86_64-disk.img 
image: /root/cirros-no_cloud-0.3.0-x86_64-disk.img
file format: qcow2
virtual size: 39M (41126400 bytes)
disk size: 11M
cluster_size: 65536
Format specific information:
    compat: 0.10

2.2 啟動微縮版虛擬機

內存128M,CPU 1個
[root@master1 ~]# qemu-kvm -m 128 -smp 1 -name "test" -hda cirros-no_cloud-0.3.0-i386-disk.img 
VNC server running on `::1:5900‘

2.2.2 默認用VNC打開,需要在宿主機安裝一個VNC客戶端進行查看

Centos7需要先安裝圖形界面,並切換到圖形界面
yum groupinstall "GNOME Desktop" "Graphical Administration Tools"

查看運行級別:
[root@master1 ~]# systemctl get-default
multi-user.target

修改運行級別為圖形化界面:
systemctl set-default graphical.target
或者
ln -s /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target

運行圖形界面:
startx &

還是需要重啟宿主機,才能轉發X11圖形調用到xmanager
# reboot

安裝vnc客戶端:
[root@master1 ~]# yum install tigervnc

連接虛擬機:
[root@master1 ~]# vncviewer :5900

技術分享圖片

技術分享圖片

切換為管理員
技術分享圖片

切換qemu監控接口:Ctrl+Alt+2
技術分享圖片

顯示當前虛擬機的名字

技術分享圖片

顯示當前虛擬機的狀態

技術分享圖片

虛擬機切換回命令行:Ctrl+Alt+1

技術分享圖片

關閉虛擬機,不是斷電,而是向裏面發送關機信號:

[root@master1 ~]# ps aux | grep qemu-kvm
root      2504 36.5  1.6 561512 65812 pts/0    Sl+  19:03   0:24 qemu-kvm -m 128 -smp 1 -name test -hda cirros-no_cloud-0.3.0-i386-disk.img
root      2539  0.0  0.0 112660   976 pts/1    S+   19:04   0:00 grep --color=auto qemu-kvm
[root@master1 ~]# 
[root@master1 ~]# kill -9 2504

2.2.3 雜項

查看可以模擬的主機類型:
[root@master1 ~]# qemu-kvm -M ?

查看可以模擬的CPU類型:
[root@master1 ~]# qemu-kvm -cpu ?

默認模擬的是QEMU的虛擬CPU,不是底層硬件CPU
技術分享圖片

想要啟動虛擬機時,模擬底層硬件CPU需要加-cpu參數:

[root@master1 ~]# qemu-kvm -m 128 -cpu host -smp 1 -name "test" -hda cirros-no_cloud-0.3.0-i386-disk.img 

技術分享圖片

3、選項

3.1 device

磁盤映像高級選項:
[root@master1 ~]# qemu-kvm -m 128 -cpu host -smp 1 -name "test" -drive file=cirros-no_cloud-0.3.0-i386-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback

硬盤格式已經顯示為VDA
技術分享圖片

技術分享圖片

3.1.1 安裝window-xp

[root@master1 ~]# ls -lht xp.iso 
-rw-r--r-- 1 root root 499M Mar 17 20:17 xp.iso

創建目錄:
[root@master1 ~]# mkdir -pv /images/windows/

創建磁盤映像文件(20G大小,磁盤類型為元數據類型【稀疏格式】):
[root@master1 ~]# qemu-img create -o size=20G,preallocation=metadata -f qcow2 /images/windows/winxp.qcow2
[root@master1 ~]# ll -lht /images/windows/winxp.qcow2 
-rw-r--r-- 1 root root 21G Mar 17 21:01 /images/windows/winxp.qcow2
[root@master1 ~]# du -sh /images/windows/winxp.qcow2 
4.1M    /images/windows/winxp.qcow2

啟動安裝window-xp(512內存,1核CPU,CPU使用底層硬件模擬,使用XP鏡像安裝,啟動順序為光盤-硬盤,第一次重啟剔除光盤啟動)
[root@master1 ~]# qemu-kvm -m 512 -smp 1 -cpu host -drive file=/images/windows/winxp.qcow2,media=disk -drive file=/root/xp.iso,media=cdrom -boot order=dc,once=d

登陸VNC查看:

[root@master1 ~]# vncviewer :5900

技術分享圖片

技術分享圖片

安裝系統中
技術分享圖片

4、KVM-顯示

4.1 SDL功能

[root@master1 ~]# yum install -y SDL SDL-devel SDL-static

[root@master1 ~]# qemu-kvm -m 128 -smp 1 -name "test" -hda cirros-no_cloud-0.3.0-i386-disk.img -sdl
SDL support is disabled

由於qemu-kvm編譯默認沒有加入SDL功能,所以該實驗跳過

4.2 vnc更改監聽端口5901

默認0號面板端口為5900,以此類推
[root@master1 ~]# qemu-kvm -m 128 -cpu host -smp 1 -name "test" -drive file=cirros-no_cloud-0.3.0-i386-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -vnc 10.201.106.131:1

[root@master1 ~]# vncviewer 10.201.106.131:5901

技術分享圖片

4.3 啟動虛擬機直接顯示monitor控制臺設置VNC密碼

[root@master1 ~]# qemu-kvm -m 128 -cpu host -smp 1 -name "test" -drive file=cirros-no_cloud-0.3.0-i386-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -vnc 10.201.106.131:1,password -monitor stdio
QEMU 1.5.3 monitor - type ‘help‘ for more information
(qemu) 

設置VNC密碼
(qemu) change vnc password
Password: ******

4.4 通過VNC密碼登陸

[root@master1 ~]# qemu-kvm -m 128 -cpu host -smp 1 -name "test" -drive file=cirros-no_cloud-0.3.0-i386-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -vnc 10.201.106.131:1,password

技術分享圖片

技術分享圖片

4.4.1 控制臺切換

技術分享圖片

切換控制臺或系統界面
Ctrl+a,c

技術分享圖片

顯示控制臺幫助: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

4.4.2 指定顯卡接口類型

[root@master1 ~]# qemu-kvm -m 128 -cpu host -smp 1 -name "test" -drive file=cirros-no_cloud-0.3.0-i386-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -vga cirrus

5、網絡

5.1 創建管理橋

查看橋模塊,橋是在內核中實現的:
[root@master1 ~]# modinfo bridge

安裝橋管理命令:
# yum install -y bridge-utils

查看其文件路徑:
[root@master1 ~]# rpm -ql bridge-utils

創建橋:
[root@master1 ~]# brctl addbr br0

關閉橋:
[root@master1 ~]# brctl stp br0 off
[root@master1 ~]# brctl show

啟動橋:
[root@master1 ~]# ip link set br0 up

其他:可以用nmtui圖形界面添加橋
# nmtui

5.2 網卡

5.2.1 查看當前支持的網卡類型

[root@master1 ~]# qemu-kvm -net nic,model=?
qemu: Supported NIC models: ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio

5.2.2 啟動虛擬機指定網卡類型

[root@master1 ~]# qemu-kvm -m 128 -cpu host -smp 1 -name "test" -drive file=cirros-no_cloud-0.3.0-i386-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,ifname=vif0.0,script=no

內部的系統網卡類型默認是e1000
# lsmod | grep e1000
e1000                 101773  0 

設置宿主機的後端網卡
首先配置啟動和關閉腳本:
[root@master1 ~]# vim /etc/qemu-ifup 

#!/bin/bash
#
bridge=br0

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

[root@master1 ~]# chmod +x /etc/qemu-ifup

啟動測試:
[root@master1 ~]# qemu-kvm -m 128 -cpu host -smp 1 -name "test" -drive file=cirros-no_cloud-0.3.0-i386-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,ifname=vif0.0,script=/etc/qemu-ifup

[root@master1 ~]# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.66fc76ef2ced   no      vif0.0

5.3 開啟第二臺虛擬機

[root@master1 ~]# qemu-kvm -m 128 -cpu host -smp 1 -name "test1" -drive file=cirros-no_cloud-0.3.0-i386-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,ifname=vif1.0,script=/etc/qemu-ifup

[root@master1 ~]# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.66fc76ef2ced   no      vif0.0
                            vif1.0

5.4 配置兩臺虛擬機IP為同個網段通信(隔離網絡模型)

# hostname
test
# ifconfig eth0 192.168.1.1/24

# hostname
test1
# ifconfig eth0 192.168.1.2/24

不通,原因是MAC地址相同,需要隨機生成:

[root@master1 ~]# qemu-kvm -m 128 -cpu host -smp 1 -name "test1" -drive file=cirros-no_cloud-0.3.0-i386-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic,macaddr=52:54:00:12:34:57 -net tap,ifname=vif1.0,script=/etc/qemu-ifup

網絡可以通了:
技術分享圖片

5.5 (路由網絡模型)

5.5.1 宿主機添加虛擬網卡

[root@master1 ~]# ip link add veth0.0 type veth peer veth1.0

[root@master1 ~]# ifconfig -a | grep veth
veth0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
veth1.0: flags=4098<BROADCAST,MULTICAST>  mtu 1500

veth0留在物理機,veth1添加到br0

激活兩塊網卡:
[root@master1 ~]# ip link set veth0 up
[root@master1 ~]# ip link set veth1.0 up

將vet1.0添加至br0
[root@master1 ~]# brctl addif br0 veth1.0
[root@master1 ~]# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.c2e8d51d8e78   no      veth1.0

[root@master1 ~]# ifconfig veth0 192.168.1.254/24

在KVM上的虛擬機測試ping
# hostname
test1
# ping 192.168.1.254
PING 192.168.1.254 (192.168.1.254): 56 data bytes
64 bytes from 192.168.1.254: seq=0 ttl=64 time=13.576 ms
64 bytes from 192.168.1.254: seq=1 ttl=64 time=2.025 ms

KVM客戶機添加去往物理機地址的網關:
# route add default gw 192.168.1.254
已經可以ping通物理機:
# ping 10.201.106.131
PING 10.201.106.131 (10.201.106.131): 56 data bytes
64 bytes from 10.201.106.131: seq=0 ttl=64 time=1.828 ms
64 bytes from 10.201.106.131: seq=1 ttl=64 time=2.080 ms

5.6 路由網絡模型

5.6.1 物理機打開路由轉發

[root@master1 ~]# cat /proc/sys/net/ipv4/ip_forward
0

[root@master1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

但是這時候還是通不了外網,因為包發出去回不來:
技術分享圖片

技術分享圖片

5.6.2 使用nat模式轉發到外網

root@master1 ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.201.106.131

KVM虛擬機已經可以ping通外網
技術分享圖片

技術分享圖片

5.6.3 上面方式太繁瑣,多了一層虛擬橋,其實只需把網關地址配置到br0即可實現外網轉發

[root@master1 ~]# ip link set veth0 down
[root@master1 ~]# ip link set veth1.0 down

[root@master1 ~]# ifconfig br0 192.168.1.254/24 up

KVM測試外網聯通性:
# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=127 time=72.507 ms
64 bytes from 8.8.8.8: seq=1 ttl=127 time=114.481 ms

抓包,br0上沒有轉換
技術分享圖片

是在物理網卡eth0轉換的
技術分享圖片

5.7 橋接模型

5.7.1 取消之前br0地址

[root@master1 ~]# ip addr del 192.168.1.254/24 dev br0

5.7.2 把物理網卡添加到br0

一旦物理網卡添加到br0,物理網卡就變成了交換機

首先拆除物理網卡地址,然後將物理網卡添加至br0,最後在br0配置原先的物理網卡的IP地址。由於擔心xshell斷掉,直接在終端操作:

技術分享圖片

[root@master1 ~]# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.000c29a77aec   no      eth0
                            vif0.0
                            vif1.0

5.7.3 KVM虛擬機配置跟宿主機同個網段IP和網關

# ifconfig eth0 10.201.106.81/24
# route add default gw 10.201.106.2

# ifconfig eth0 10.201.106.82/24
# route add default gw 10.201.106.2

又可以ping通外網了:
技術分享圖片

抓包物理機網卡,源地址全是KVM虛擬機IP發出的包:
技術分享圖片

5.8 一旦KVM虛擬機停止,網卡會自動刪除

關機前:
bridge name bridge id       STP enabled interfaces
br0     8000.000c29a77aec   no      eth0
                            vif0.0
關機                          vif1.0
# poweroff

會自動拆除網卡:
[root@master1 ~]# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.000c29a77aec   no      eth0
                            vif1.0

6、基於PXE環境安裝虛擬機

6.1 創建映像文件

[root@master1 ~]# mkdir /images/centos

[root@master1 ~]# qemu-img create /images/centos/centos6.img -o size=120G,preallocation=metadata -f qcow2

6.2 啟動虛擬機

[root@master1 ~]# qemu-kvm -m 512 -smp 1 -name centos -drive file=/images/centos/centos6.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:66:66:66 -net tap,ifname=centos6.0,script=/etc/qemu-ifup -boot order=nc,once=n

我沒有PXE環境,所以一直是獲取IP地址界面
技術分享圖片

7、其他操作

7.1 用光盤方式安裝一個CentOS6.6

[root@master1 ~]# qemu-kvm -m 512 -smp 1 -name centos -drive file=/images/centos/centos6.img,media=disk,if=virtio -drive file=/root/centos6.iso,media=cdrom -boot order=dc,once=d -net nic,model=virtio,macaddr=52:54:00:66:66:66 -net tap,ifname=centos6.0,script=/etc/qemu-ifup

安裝完畢查看模塊,網卡等設備是半虛擬化的virtio
技術分享圖片

7.2 宿主機熱遷移,需要共享存儲

在待遷入目的宿主機使用(指定哪個端口接收待遷移虛擬機進入)
    # qemu-kvm -vnc :N -incoming tcp:0:7777
    # vncviewer :590N

在源主機使用monitor接口,指定要遷入的宿主機信息:
        migrate tcp:DEST_IP:DEST:PORT

7.3 切換至控制臺

Ctrl+Alt+2 切換至控制臺

Ctrl+Alt+1 切換回系統操作界面

技術分享圖片

7.3.1 查看當前虛擬機CPU信息

CPU是用線程模擬的
技術分享圖片

7.3.2 qemu缺陷,無法遠程管理虛擬機

KVM虛擬化-qemu-kvm雜記