項目實戰系列,總架構圖 http://www.cnblogs.com/along21/p/8000812.html
KVM的介紹、准備工作和qemu-kvm 命令詳解
1、介紹
KVM:就是Keyboard Video Mouse的縮寫。KVM 交換機通過直接連接鍵盤、視頻和鼠標 (KVM) 端口,讓您能夠訪問和控制計算機。KVM 技術無需目標服務器修改軟件。這就意味着可以在 Windows 的 BIOS 環境下,隨時訪問目標計算機。KVM 提供真正的主板級別訪問,並支持多平台服務器和串行設備。
KVM 技術已經從最初的基礎SOHO辦公型,發展成為企業 IT 基礎機房設施管理系統。可以從kvm 客戶端管理軟件輕松的直接訪問位於多個遠程位置的服務器和設備。KVM over IP 解決方案具備完善的多地點故障轉移功能、符合新服務器管理標准 (IPMI) 的直接界面,以及將本地存儲媒體映射至遠程位置的功能。
KVM 是個"怪胎",原本是類型2 的主機虛擬化;但一旦在OS 上加載了kvm.ko 模塊,就會"感染"OS,使其變為hypervisor(kvm),原本的軟件空間作為控制台,轉化成類型1 模式的主機虛擬化

API 應用程序編程接口
qemu-KVM是一種開源虛擬器,它為KVM管理程序提供硬件仿真。
運行中的一個kvm虛擬機就是一個qemu-kvm進程,運行qemu-kvm程序並傳遞給它合適的選項及參數即能完成虛擬機啟動,終止此進程即能關閉虛擬機;
③ libvirt 虛擬化庫:Libvirt是一個C工具包,可以與最近版本的Linux(以及其他操作系統)的虛擬化功能進行交互。主包包含了導出虛擬化支持的libvirtd服務器。
C/S:
Client:
libvirt-client
virt-manager
Daemon:
libvirt-daemon
內核模式:GuestOS執行IO類的操作時,或其它的特殊指令操作時的模式;它也被稱為"Guest-Kernel"模式;
用戶模式:Host OS的用戶空間,用於代為GuestOS發出IO請求;
來賓模式:GuestOS的用戶模式;所有的非IO類請求
2、使用KVM 的准備
vmx:Intel VT-x
svm:AMD AMD-v
③ 在虛擬機上再虛擬化,需開啟虛擬化 Intel VT-x/EPT

[root@master ~]# grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
vmx:Intel VT-x
svm:AMD AMD-v

[root@master ~]# yum install libvirt-daemon-kvm qemu-kvm virt-manager -y
[root@master ~]# modprobe kvm 裝載kvm 模塊
[root@master ~]# lsmod |grep kvm

[root@master ~]# ll /dev/kvm 字符設備

[root@master ~]# yum install libvirt-daemon-kvm qemu-kvm virt-manager -y
3、qemu-kvm命令語法
qemu-kvm [options] [disk_image]
選項有很多類別:標准選項、塊設備相關選項、顯示選項、網絡選項、...
(1)標准選項: -machine [type=]name:-machine help來獲取列表,用於指定模擬的主機類型; -cpu cpu:-cpu help來獲取列表;用於指定要模擬的CPU型號; -smp n[,maxcpus=cpus][,cores=cores][,threads=threads]多少線程[,sockets=sockets]多少核:指明虛擬機上vcpu的數量及拓撲; -boot [order=drives][,once=drives]只用一次(如按照系統時只用一次光盤引導)[,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off] order:各設備的引導次序:c表示第一塊硬盤,d表示第一個光驅設備;-boot order=dc,once=d -m megs:虛擬機的內存大小; -name NAME:當前虛擬機的名稱,要惟一; (2)塊設備相關的選項: -hda/-hdb file:指明IDE總線類型的磁盤映像文件路徑;第0和第1個; -hdc/-hdd file:第2和第3個; -cdrom file:指定要使用光盤映像文件; -drive [file=file路徑][,if=type接口][,media=d接口對應的設備類型][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]: ① file=/PATH/TO/SOME_IMAGE_FILE:映像文件路徑;
② if=TYPE:塊設備總線類型,ide, scsi, sd, floppy, virtio,... ③ media=TYPE:介質類型,cdrom和disk; ④ index=i:設定同一類型設備多個設備的編號; ⑤ cache=writethrough|writeback|none|directsync|unsafe:緩存方式; ⑥ format=f:磁盤映像文件的格式; CentOS磁盤鏡像文件下載: https://cloud.centos.org/centos/7/images/ (3)顯示選項: -display type:顯示的類型,sdl, curses, none和vnc; -nographic:不使用圖形接口; 顯卡型號 -vga [std|cirrus|vmware|qxl|xenfb|none]:模擬出的顯卡的型號; -vnc display[,option[,option[,...]]]]:啟動一個vnc server來顯示虛擬機接口; 讓qemu進程監聽一個vnc接口; display: ① HOST:N 在HOST主機的第N個桌面號輸出vnc; ② unix:/PATH/TO/SOCK_FILE ③ none options: password:連接此服務所需要的密碼;
-monitor stdio:在標准輸出上顯示monitor界面; Ctrl-a, c:在console和monitor之間切換; Ctrl-a, h (4)網絡選項: -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v] 為虛擬機創建一個網絡接口,並將其添加至指定的VLAN; model=type:指明模擬出的網卡的型號,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio; net nic,model=? macaddr=mac:指明mac地址;52:54:00: -net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]: 通過物理的TAP網絡接口連接至vlan; script=file:啟動虛擬機時要執行的腳本,默認為/etc/qemu-ifup downscript=dfile:關閉虛擬機時要執行的腳本,/etc/qemu-ifdown ifname=NAME:自定義接口名稱; 其它選項: -daemonize:以守護進程運行;
實戰一:圖形化工具virt-manager 創建虛擬機
1、創建物理橋橋接接口br0
[root@master ~]# systemctl start libvirtd.service
[root@master ~]# virsh iface-bridge eth0 br0
分析:把自己的物理網卡eth0 作為交換機,把br0 當網卡,提供IP
注意:命令可能會卡死或出錯,終端被強制退出;等一會,在登錄就OK 了

2、圖形化工具創建虛擬機
注意:這個命令需在支持圖形化界面的機器才能執行, 用其他機器 ssh -X 連接,再執行








實戰二:命令行工具qemu-kvm創建使用虛擬機
1、准備橋
[root@master ~]# yum -y install bridge-utils 下載brctl 命令的包
[root@master ~]# brctl addbr br-int0 添加網橋
[root@master ~]# brctl show 查詢所有網橋
[root@master ~]# ifconfig -a 每一個橋,在機器上都表現為一個網卡接口,只是沒有激活

[root@master ~]# ip link set br-int0 up 激活橋,會分配mac 地址

[root@master ~]# ip link set br-int0 down 先down掉網橋
[root@master ~]# brctl delbr br-int0 再刪除
[root@master ~]# ifconfig -a 查詢不到這個網卡了
[root@master ~]# brctl show 查詢不到網橋
[root@master network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@master network-scripts]# cp ifcfg-eth1 ifcfg-br0
[root@master network-scripts]# vim ifcfg-br0
DEVICE=br0 NAME=br0 TYPE=Bridge ONBOOT=yes IPADDR=172.16.1.7 NETMASK=255.255.0.0 GATEWAY=172.16.0.1 DNS1=172.16.0.1
注意:是要充當正常網卡使用的,所有IP、NETMASK、GATEWAY、DNS1 都要有
[root@master network-scripts]# vim ifcfg-eth1
DEVICE=eth1 ONBOOT=yes BRIDGE=br0
注意:主機的網卡連接網橋后,是要充當交換機的,所以不需要IP、NETMASK、GATEWAY、DNS1
[root@master network-scripts]# systemctl restart network

[root@master ~]# brctl show 也能查到

2、創建虛擬機前准備
[root@master ~]# yum install qemu-kvm libvirt-daemon-kvm virt-manager 安裝qemu-kvm 命令行工具
[root@master ~]# modprobe kvm 加載模塊
[root@master ~]# lsmod |grep kvm

[root@master ~]# rpm -ql qemu-kvm 因為qemu-kvm 命令路徑不在PATH 路徑下

[root@master ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/
[root@master ~]# qemu-kvm -h 查詢命令幫助

3、創建一個虛擬機
(1)創建一個虛擬機,用kubuntu 的鏡像文件(用windows、linux 什么鏡像文件都行)
[root@master ~]# qemu-kvm -cpu host -smp 2,sockets=1,cores=2,threads=1 -m 512 -drive file=/data/imgs/test.img,if=virtio,media=disk,format=qcow2 -drive file=/root/kubuntu-17.10-desktop-amd64.iso,if=ide,media=cdrom -boot order=dc,once=d -vnc 172.16.1.7:0
[root@master ~]# vncviewer 172.16.1.7:0

實戰三:手動構建虛擬機間的虛擬通道、僅主機網橋和NAT 網橋
1、准備虛擬機鏡像文件
CentOS磁盤鏡像文件下載: https://cloud.centos.org/centos/7/images/
[root@master ~]# qemu-img info cirros-no_cloud-i386.img

[root@master ~]# mkdir -pv /data/imgs/
[root@master ~]# cp cirros-no_cloud-i386.img /data/imgs/c1.img
[root@master ~]# cp cirros-no_cloud-i386.img /data/imgs/c2.img
2、創建虛擬的准備
[root@master imgs]# brctl addbr br-c1-and-c2 創建網橋接口
[root@master imgs]# ifconfig br-c1-and-c2 up 激活網橋
[root@master imgs]# brctl show

① [root@master ~]# vim /etc/qemu-ifup-pn1
#!/bin/bash # bridge=br-c1-and-c2 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 2 fi
[root@master ~]# chmod +x /etc/qemu-ifup-pn1
3、創建、登錄兩個虛擬機
[root@master ~]# qemu-kvm -name c1 -cpu host -smp 2 -m 64 -drive file=/data/imgs/c1.img,if=virtio,media=disk,format=qcow2 -vnc :0 -net nic,model=e1000,macaddr=52:54:00:00:01:01 -net tap,script=/etc/qemu-ifup-pn1 -daemonize [root@master ~]# qemu-kvm -name c2 -cpu host -smp 2 -m 64 -drive file=/data/imgs/c2.img,if=virtio,media=disk,format=qcow2 -vnc :1 -net nic,model=e1000,macaddr=52:54:00:00:00:01 -net tap,script=/etc/qemu-ifup-pn1 -daemonize
注意:-vnc :0/1 是窗口號;MAC 地址52:54:00 不能改,后邊隨意
[root@master ~]# ss -nutl 開啟了5900 和5901 的端口

[root@master ~]# vncviewer 192.168.30.107:0
[root@master ~]# vncviewer 192.168.30.107:1

4、建立虛擬機間的虛擬通道
# ifconfig eth0 10.1.0.1/16 up
# ifconfig eth0 10.1.0.2/16 up


5、通過僅主機網橋連通宿主機
(1)在宿主機上的br-c1-and-c2 網橋,添加虛擬機網段的地址

② [root@master ~]# ip addr add 10.1.0.10/16 dev br-c1-and-c2
[root@master ~]# ip a show br-c1-and-c2


6、通過NAT 網橋實現NAT 模式
[root@master ~]# sysctl -w net.ipv4.ip_forward=1

# route add default gw 10.1.0.10
# ping 172.16.1.7 發現ping 宿主機的另一塊網卡能ping 通了,因為內核機制

# ping 172.16.0.1 但是外網還是ping不同,原因:宿主機上只有出包,沒有進包
[root@master ~]# tcpdump -i eth1 -nn icmp 只有出包,沒有進包

[root@master ~]# iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 172.16.1.7
[root@master ~]# iptables -vnL -t nat 查詢



7、關閉虛擬機

實戰四:命令行工具virt 創建虛擬機及命令管理虛擬機
1、創建前准備
[root@master imgs]# yum install libvirt-daemon-kvm virt-install -y
[root@master ~]# mkdir -pv /data/imgs/
[root@master ~]# cp cirros-no_cloud-i386.img /data/imgs/c1.img
[root@master imgs]# brctl addbr br0 創建網橋接口
[root@master imgs]# ifconfig br0 up 激活網橋
[root@master imgs]# brctl show
[root@master ~]# systemctl start libvirtd.service
[root@master ~]# virsh iface-bridge eth0 br0

2、創建虛擬機
[root@master imgs]# virt-install -n c1 --vcpus 2 --memory 64 -w bridge=br0 --import --disk /data/imgs/c1.img --dry-run
[root@master imgs]# virt-install -n c1 --vcpus 2 --memory 64 -w bridge=br0 --import --disk /data/imgs/c1.img

3、virsh命令詳解,下有實例
(1)virsh命令: 虛擬機的生成需要依賴於預定義的xml格式的配置文件;其生成工具有兩個:virt-manager, virt-install; virsh [OPTION]... COMMAND [ARG].. 子命令的分類: Domain Management (help keyword 'domain') 域管理(幫助關鍵字“域”) Domain Monitoring (help keyword 'monitor') 域監視(幫助關鍵字“監視器”) Host and Hypervisor (help keyword 'host') 主機和管理程序(幫助關鍵字“主機”) Interface (help keyword 'interface') 接口(幫助關鍵字“接口”) Networking (help keyword 'network') 網絡(幫助關鍵字“網絡”) Network Filter (help keyword 'filter') 網絡過濾器(幫助關鍵字“過濾器”) Snapshot (help keyword 'snapshot') 快照(幫助關鍵字“快照”) Storage Pool (help keyword 'pool') 存儲池(help關鍵字“池”) Storage Volume (help keyword 'volume') 存儲卷(幫助關鍵字“卷”) (2)域管理 Domain Management (help keyword 'domain') 創建虛擬機: create:從xml格式的配置文件創建並啟動虛擬機; define:從xml格式的配置文件創建虛擬機; 停止: destroy:強行關機、拔電源; shutdown:關機; start:啟動 reboot:重啟; undefine:刪除虛擬機; suspend/resume:暫停於內存中,或繼續運行暫停狀態的虛擬機;真正實現的效果:pause/unpause save/restore:掛起/繼續;保存虛擬機的當前狀態至文件中,或從指定文件恢復虛擬機; console:連接至指定domain的控制台; (3)域的設備資源管理: ① cpu cpu-stats 查看cpu 信息 vcpuinfo 查看vcpu 信息 vcpucount 看有幾個cpu setvcpus 可以調整cpu數(如果是調整的是動態的,在創建虛擬機時設置,靜態的不行) vcpupin 把vcpu 綁定到真正的cpu 上 ② memcache setmaxmem 修改最大內存(創建虛擬機時設置的是否可以修改) setmem 修改內存大小(沒超過上限時) ③ 設備 attach-disk/detach-disk:磁盤設備的熱插拔; domblklist:查詢虛擬機的磁盤設備 attach-interface/detach-interface:網絡接口設備的熱插拔; domiflist:查詢虛擬機的網卡設備
4、virsh命令演示
[root@master imgs]# virsh list 列出所有正在開啟running 的虛擬機
[root@master imgs]# virsh list --all 列出所有的虛擬機,包括關機的、沒運行的
[root@master imgs]# virsh 交互式執行命令
[root@master imgs]# virsh nodeinfo 查詢信息
[root@master imgs]# virsh uri 查詢uri 路徑

[root@master imgs]# virsh console c1 連接至c1 虛擬機的控制台
# ping 172.16.0.1 因為物理橋已經連接到了網卡,所以有地址,且能ping 通外網

[root@master ~]# virsh destroy c1 先關掉虛擬機
[root@master ~]# virsh undefine c1 在刪除虛擬機
[root@master ~]# ls /etc/libvirt/qemu/ .xml 文件被刪除
[root@master ~]# virsh list --all 查詢不到c1 虛擬機,刪除成功
[root@master ~]# virsh suspend c1 暫停虛擬機
[root@master ~]# virsh resume c1 恢復暫停
[root@master ~]# virsh save /app/c1.bin 掛起虛擬機
[root@master ~]# virsh restore /app/c1.bin 恢復掛起

[root@master ~]# virsh cpu-stats c1 查看cpu 信息
[root@master ~]# virsh vcpuinfo c1 查看vcpu 信息
[root@master ~]# virsh vcpucount c1 看有幾個cpu

5、利用已有的虛擬機配置文件,創建一個新的虛擬機
原理:利用已下好的虛擬機,用命令把創建虛擬機的過程生成一個.xml的文件,利用這個文件創建新的虛擬機
[root@master ~]# virsh dumpxml c1 > /app/c2.xml
[root@master ~]# vim /app/c2.xml 需要修改的,都在下面列出了
<domain type='kvm' id='5'> <name>c2</name> #名字 <uuid>7303d4d3-b8d2-4e22-aac8-feb881882a73</uuid> #UUID隨便改,只要不相同 <source file='/data/imgs/c2.img'/> #鏡像文件 <mac address='52:54:00:52:10:34'/> #mac隨便改,只要不相同 <source bridge='br0'/> #橋接的網橋 <target dev='vnet1'/> #默認的后端設備
[root@master ~]# virsh create /app/c2.xml --console
注:--console 直接連接虛擬機,或不加;再用下邊的命令連接虛擬機
[root@master ~]# virsh console c2
[root@master ~]# virsh list 已有2個虛擬機了

(4)把.xml 文件放入/etc/libvirt/qemu
[root@master ~]# ls /etc/libvirt/qemu
[root@master ~]# cp /app/c2.xml /etc/libvirt/qemu/

6、c1 虛擬機磁盤設備的熱插拔
[root@master ~]# qemu-img create -f qcow2 -o preallocation=metadata,size=10G /data/imgs/c1.2.img
[root@master ~]# qemu-img info /data/imgs/c1.2.img 查詢

[root@master ~]# virsh domblklist c1 查看c1 已有的磁盤設備
[root@master ~]# virsh attach-disk c1 /data/imgs/c1.2.img vda

(3)連接至虛擬機,可以對這個磁盤做分區、文件系統格式化、掛載等操作
[root@master ~]# virsh console c1


7、網卡的熱插拔
[root@master ~]# brctl addbr br-int0
[root@master ~]# ifconfig br-int0 up

[root@master ~]# ip addr add 10.1.0.254/16 dev br-int0
[root@master ~]# ifconfig br-int0

[root@master ~]# virsh attach-interface c1 bridge br-int0

[root@master ~]# virsh console c1
# ifconfig eth1 10.1.0.1/16 up
# ping 10.1.0.254 ping宿主機,測試是否生效

[root@master ~]# virsh domiflist c1 查詢虛擬機的網卡設備

[root@master ~]# virsh detach-interface c1 bridge --mac 52:54:00:5b:d8:04

實戰五:推薦幾個圖形化管理虛擬機的工具
kimchi:基於H5研發的web GUI;virt-king; 網上搜索kimchi kvm 有安裝使用教程
OpenStack:IaaS 非常重量級,非常吃資源;至少10台以上的虛擬機才用它
oVirt:比kimchi 功能強大的多,比OpenStack輕量;但配置也較麻煩
proxmox VE
(2)kvm 官方的管理工具棧:https://www.linux-kvm.org/page/Management_Tools
