項目實戰系列,總架構圖 http://www.cnblogs.com/along21/p/8000812.htmlhtml
KVM:就是Keyboard Video Mouse的縮寫。KVM 交換機經過直接鏈接鍵盤、視頻和鼠標 (KVM) 端口,讓您可以訪問和控制計算機。KVM 技術無需目標服務器修改軟件。這就意味着能夠在 Windows 的 BIOS 環境下,隨時訪問目標計算機。KVM 提供真正的主板級別訪問,並支持多平臺服務器和串行設備。 linux
KVM 技術已經從最初的基礎SOHO辦公型,發展成爲企業 IT 基礎機房設施管理系統。能夠從kvm 客戶端管理軟件輕鬆的直接訪問位於多個遠程位置的服務器和設備。KVM over IP 解決方案具有完善的多地點故障轉移功能、符合新服務器管理標準 (IPMI) 的直接界面,以及將本地存儲媒體映射至遠程位置的功能。web
KVM 是個"怪胎",本來是類型2 的主機虛擬化;但一旦在OS 上加載了kvm.ko 模塊,就會"感染"OS,使其變爲hypervisor(kvm),本來的軟件空間做爲控制檯,轉化成類型1 模式的主機虛擬化編程
API 應用程序編程接口windows
qemu-KVM是一種開源虛擬器,它爲KVM管理程序提供硬件仿真。centos
運行中的一個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類請求
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
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:以守護進程運行;
[root@master ~]# systemctl start libvirtd.service
[root@master ~]# virsh iface-bridge eth0 br0
分析:把本身的物理網卡eth0 做爲交換機,把br0 當網卡,提供IP
注意:命令可能會卡死或出錯,終端被強制退出;等一會,在登陸就OK 了
注意:這個命令需在支持圖形化界面的機器才能執行, 用其餘機器 ssh -X 鏈接,再執行
[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 也能查到
[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 查詢命令幫助
(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
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
[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
[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
# ifconfig eth0 10.1.0.1/16 up
# ifconfig eth0 10.1.0.2/16 up
(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
[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 查詢
[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
[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
(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:查詢虛擬機的網卡設備
[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
原理:利用已下好的虛擬機,用命令把建立虛擬機的過程生成一個.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/
[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
[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