KVM虛擬化-qemu-kvm雜記
阿新 • • 發佈:2018-03-25
虛擬化 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雜記