、KVM 原理
二、KVM 基礎(chǔ)功能
2.1 CPU
2.2 內(nèi)存
2.3 存儲(chǔ)
2.4 網(wǎng)絡(luò)
三、KVM 高級(jí)功能
3.1 半虛擬化驅(qū)動(dòng)
3.2 熱插拔 (hot plugging)
3.3 動(dòng)態(tài)遷移
四、KVM 管理工具
libvirt
五、參考文檔
一、KVM 原理
KVM「Kernel-based Virtual Machine」,KVM 是基于虛擬化擴(kuò)展 (Intel VT/AMD-V) 的 X86 硬件,是 Linux 完全原生的全虛擬化解決方案。
KVM 本身不執(zhí)行任何模擬,需要用戶空間應(yīng)用程序QEMU
通過/dev/kvm
接口設(shè)置一個(gè)客戶機(jī)虛擬服務(wù)器的地址空間,向它提供模擬的 I/O,KVM 模塊實(shí)現(xiàn)處理器的虛擬化和內(nèi)存虛擬化。在硬件虛擬化技術(shù)的支持下,內(nèi)核的 KVM 模塊與 QEMU 的設(shè)備模擬協(xié)同工作,構(gòu)成一套和物理計(jì)算機(jī)系統(tǒng)完全一致的虛擬化計(jì)算機(jī)軟硬件系統(tǒng)。
二、KVM 基礎(chǔ)功能
2.1 CPU
在 QEMU/KVM 中,QEMU 提供對(duì) CPU 的模擬,展現(xiàn)給客戶機(jī)一定的 CPU 數(shù)目和 CPU 的特性。在 KVM 打開的情況下,客戶機(jī)中 CPU 指令的執(zhí)行由硬件處理器的虛擬化功能「如 Intel VT-x 和 AMD AMD-V」輔助執(zhí)行,具有非常高的執(zhí)行效率。
在 KVM 環(huán)境中,每個(gè)客戶機(jī)都是一個(gè)標(biāo)準(zhǔn)的 Linux 進(jìn)程(QEMU 進(jìn)程),而每一個(gè) vCPU 在宿主機(jī)中是 QEMU 進(jìn)程派生的一個(gè)普通線程。
在 Linux 中,一般進(jìn)程有兩種執(zhí)行模式:
內(nèi)核模式
用戶模式
而在 KVM 環(huán)境中,增加了第三條模式:客戶模式。vCPU 在三種執(zhí)行模式下的分工如下:
用戶模式
主要處理 I/O 的模擬和管理,由 QEMU 的代碼實(shí)現(xiàn)
內(nèi)核模式
主要處理特別需要高性能和安全相關(guān)的指令,如處理客戶模式到內(nèi)核模式的轉(zhuǎn)換,處理客戶模式下的 I/O 指令或其它特權(quán)指令引起的 VM-Exit,處理影子內(nèi)存管理 (shadow MMU)
客戶模式
主要執(zhí)行 Guest 中的大部分指令,I/O 和一些特權(quán)指令除外「它們會(huì)引起 VM-Exit,被 hypervisor 截獲并模擬」
2.2 內(nèi)存
內(nèi)存是一個(gè)非常重要的部件,它是與 CPU 溝通的一個(gè)橋梁。
在通過 QEMU 命令行啟動(dòng)客戶機(jī)時(shí)設(shè)置內(nèi)存的參數(shù)是-m
:
-m
megs # 設(shè)置客戶機(jī)的內(nèi)存為 megs MB 大小
EPT 和 VPID
EPT(Extended Page Tables,擴(kuò)展頁表),屬于 Intel 的第二代硬件虛擬化技術(shù),它是針對(duì)內(nèi)存管理單元(MMU)的虛擬化擴(kuò)展。如果只是一臺(tái)物理服務(wù)器,這個(gè)物理地址就只為一個(gè)操作系統(tǒng)服務(wù),但如果進(jìn)行了虛擬化部署,有多個(gè)虛擬機(jī)時(shí),就存在著穩(wěn)定性的隱患。因?yàn)樵谶M(jìn)行 VM Entry(虛擬機(jī)進(jìn)入)與 VM Exit(虛擬機(jī)退出)時(shí)(尤其是后者),都要對(duì)內(nèi)存頁進(jìn)行修改。但物理內(nèi)存是多個(gè)虛擬機(jī)共享的,因此不能讓虛擬機(jī)直接訪問物理地址,否則一個(gè)虛擬機(jī)出現(xiàn)內(nèi)存錯(cuò)誤,就會(huì)殃及整個(gè)物理服務(wù)器的運(yùn)行。所以必須要采取虛擬地址,而 EPT 的作用就在于加速從虛擬機(jī)地址至主機(jī)物理地址的轉(zhuǎn)換過程,節(jié)省傳統(tǒng)軟件處理方式的系統(tǒng)開銷。
VPID(Virtual-Processor Identifiers,虛擬處理器標(biāo)識(shí))。是對(duì)現(xiàn)在的 CPUID 功能的一個(gè)強(qiáng)化,因?yàn)樵诿總€(gè) CPU 中都有一個(gè) TLB,用來緩存邏輯地址到物理地址的轉(zhuǎn)換表,而每個(gè)虛擬機(jī)都有自己的虛擬 CPU 來對(duì)應(yīng)。所以,在進(jìn)行遷移時(shí)要進(jìn)行 TLB 的轉(zhuǎn)存和清除。而 VPID 則會(huì)跟蹤每個(gè)虛擬 CPU 的 TLB,當(dāng)進(jìn)行虛擬機(jī)遷移或 VM Entry 與 VM Exit 時(shí),VMM可以動(dòng)態(tài)的分配非零虛擬處理器的 ID 來迅速匹配(0 ID 給 VMM 自己使用),從而避免了 TLB 的轉(zhuǎn)存與清除的操作,節(jié)省了系統(tǒng)開銷,并提高了遷移速度,同時(shí)也降低對(duì)系統(tǒng)性能的影響。
# grep -E 'ept|vpid' /proc/cpuinfo # 查看 cpu 是否支持相應(yīng)特性# cat /sys/module/kvm_intel/parameters/{ept,vpid} # 確認(rèn)是否開啟 ept 和 vpidY Y
2.3 存儲(chǔ)
QEMU 提供了對(duì)多種塊存儲(chǔ)設(shè)備的模擬,包括 IDE、SCSI、軟盤、U盤、virtio 磁盤等。
qemu-kvm 提供-drive
參數(shù)來詳細(xì)定義一個(gè)存儲(chǔ)驅(qū)動(dòng)器:
-drive option[,option[,option[,...]]]
Define a new drive. Valid options are: file=file # 指定硬盤鏡像,file=鏡像文件名
if=interface # 指定驅(qū)動(dòng)器使用的接口類型,如 ide, scsi, sd, mtd, floppy, pflash, virtio
snapshot=snapshot # 是否啟動(dòng)快照
snapshot is "on" or "off" and allows to enable snapshot for given drive.
Write to temporary files instead of disk image files. In this case, the
raw disk image you use is not written back. You can however force the
write back by pressing C-a s. cache=cache # 設(shè)置宿主機(jī)對(duì)塊設(shè)備數(shù)據(jù)訪問中的 cache 情況
cache is "none", "writeback", "unsafe", or "writethrough" and
controls how the host cache is used to access block data. format=format # 指定使用的磁盤格式
Specify which disk format will be used rather than detecting the format.
Can be used to specifiy format=raw to avoid interpreting an untrusted format
header.
... ...
cache 不同模式工作原理圖:
writethrough
即直寫模式,KVM cache 默認(rèn)使用writethrough
,它是在調(diào)用 write 寫入數(shù)據(jù)的同時(shí)將數(shù)據(jù)寫入磁盤緩存和后端塊設(shè)備才返回,缺點(diǎn)是寫入性能較低,但是安全性高。qcow2
格式在使用writethrough
時(shí)性能很差
writeback
即回寫模式,在調(diào)用 write 寫入數(shù)據(jù)時(shí)只將數(shù)據(jù)寫入到主機(jī)頁緩存中即返回,寫入性能高,有安全風(fēng)險(xiǎn)。當(dāng)使用-snapshot
選項(xiàng)的時(shí)候,writeback
cache 是默認(rèn)項(xiàng)
none
關(guān)閉緩存,直接從磁盤 IO 讀寫
unsafe
這個(gè)選項(xiàng)告訴 QEMU 不需要寫入任何數(shù)據(jù)到磁盤,只要保證在緩存即可
qemu-img
qemu-img
是 QEMU 的磁盤管理工具,支持多種虛擬鏡像格式
$ qemu-img -h | grep Supported
Supported formats: raw cow qcow vdi vmdk cloop dmg bochs vpc vvfat
qcow2 qed parallels nbd blkdebug host_cdrom host_floppy host_device file
qemu-img
默認(rèn)創(chuàng)建的格式是raw
,man手冊(cè)中對(duì)幾種格式也都有介紹。以下為對(duì) raw 和 qcow2 鏡像的詳細(xì)介紹:
raw
原始的磁盤鏡像格式,qemu-img 默認(rèn)支持的格式,它的優(yōu)勢(shì)在于它非常簡(jiǎn)單而且非常容易移植到其他模擬器(emulator,QEMU 也是一個(gè) emulator)上去使用。如果客戶機(jī)文件系統(tǒng)(如 Linux 上的 ext2/ext3/ext4、Windows 的 NTFS)支持“空洞” (hole),那么鏡像文件只有在被寫有數(shù)據(jù)的扇區(qū)才會(huì)真正占用磁盤空間,從而有節(jié)省磁盤空間的作用。qemu-img
默認(rèn)的raw
格式的文件其實(shí)是稀疏文件(sparse file)「稀疏文件就是在文件中留有很多空余空間,留備將來插入數(shù)據(jù)使用。如果這些空余空間被 ASCII 碼的 NULL 字符占據(jù),并且這些空間相當(dāng)大,那么這個(gè)文件就被稱為稀疏文件,而且,并不分配相應(yīng)的磁盤塊」,dd 命令創(chuàng)建的也是 raw 格式,不過 dd 一開始就讓鏡像實(shí)際占用了分配的空間,而沒有使用稀疏文件的方式對(duì)待空洞而節(jié)省磁盤空間。盡管一開始就實(shí)際占用磁盤空間的方式?jīng)]有節(jié)省磁盤的效果,不過它在寫入新的數(shù)據(jù)時(shí)不需要宿主機(jī)從現(xiàn)有磁盤空間中分配,從而在第一次寫入數(shù)據(jù)時(shí)性能會(huì)比稀疏文件的方式更好一點(diǎn)。簡(jiǎn)單來說,raw 有以下幾個(gè)特點(diǎn):
尋址簡(jiǎn)單,訪問效率高
可以通過格式轉(zhuǎn)換工具方便地轉(zhuǎn)換為其它格式
格式實(shí)現(xiàn)簡(jiǎn)單,不支持壓縮、快照和加密
能夠直接被宿主機(jī)掛載,不用開虛擬機(jī)即可在宿主和虛擬機(jī)間進(jìn)行數(shù)據(jù)傳輸
qcow2
qcow2
是 qcow 的一種改進(jìn),是 QEMU 實(shí)現(xiàn)的一種虛擬機(jī)鏡像格式。更小的虛擬硬盤空間(尤其是宿主分區(qū)不支持 hole 的情況下),支持壓縮、加密、快照功能,磁盤讀寫性能較 raw 差。
qemu-img 支持的命令分為以下幾種
(1)check [-f fmt] filename
對(duì)磁盤鏡像文件進(jìn)行一致性檢查,查找鏡像文件中的錯(cuò)誤,目前僅支持對(duì)qcow2
、qed
、vdi
格式文件的檢查。其中,qcow2
是 QEMU 0.8.3 版本引入的鏡像文件格式,也是目前使用最廣泛的格式。qed
(QEMU enhanced disk)是從 QEMU 0.14 版開始加入的增強(qiáng)磁盤文件格式,為了避免 qcow2 格式的一些缺點(diǎn),也為了提高性能,不過目前還不夠成熟。而vdi
(Virtual Disk Image)是 Oracle 的 VirtualBox 虛擬機(jī)中的存儲(chǔ)格式。參數(shù)-f fmt
是指定文件的格式,如果不指定格式qemu-img
會(huì)自動(dòng)檢測(cè),filename
是磁盤鏡像文件的名稱(包括路徑)。
$ qemu-img check CentOS6.4-x86_64.qcow2
No errors were found on the image.
(2)create [-f fmt] filename [size]
創(chuàng)建一個(gè)格式為 fmt 大小為 size 文件名為 filename 的鏡像文件。
$ qemu-img create -f qcow2 test.qcow2 10GFormatting 'test.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 $ qemu-img create -f qcow2 test.raw 10GFormatting 'test.raw', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536
注意:這里的 qcow2 后綴只是為了便于自己區(qū)分格式方便,如果不加后綴也可以通過 qemu-img 來獲取鏡像的格式。
(3)info [-f fmt] filename
顯示 filename 鏡像文件的信息。如果文件是使用稀疏文件的存儲(chǔ)方式,也會(huì)顯示出它的本來分配的大小以及實(shí)際已占用的磁盤空間大小。如果文件中存放有客戶機(jī)快照,快照的信息也會(huì)被顯示出來。
$ qemu-img info test.qcow2
image: test.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)disk size: 136Kcluster_size: 65536$ qemu-img info test.raw# qemu-img 生成 raw 格式鏡像也是采用稀疏文件方式存儲(chǔ)的image: test.raw
file format: qcow2
virtual size: 10G (10737418240 bytes)disk size: 136Kcluster_size: 65536$ dd </dev/zero >test.dd bs=1MB count=10001000+0 records in1000+0 records out1000000000 bytes (1.0 GB) copied, 1.80597 s, 554 MB/s$ qemu-img info test.dd
# 可以看到 dd 產(chǎn)生的格式也是 raw 格式的,并且沒有用到稀疏存儲(chǔ)方式image: test.dd
file format: raw
virtual size: 954M (1000000000 bytes)disk size: 954M
(4) convert [-c] [-f fmt] [-O output_fmt] [-o options] filename [filename2 […]] output_filename
鏡像格式轉(zhuǎn)換,將 fmt 格式的 filename 鏡像文件根據(jù) options 選項(xiàng)轉(zhuǎn)換為格式為output_fmt
的名為output_filename
的鏡像文件。它支持不同格式的鏡像文件之間的轉(zhuǎn)換,比如可以用 VMware 用的 vmdk 格式文件轉(zhuǎn)換為 qcow2 文件,這對(duì)從其他虛擬化方案轉(zhuǎn)移到 KVM 上的用戶非常有用。一般來說,輸入文件格式 fmt 由 qemu-img 工具自動(dòng)檢測(cè)到,而輸出文件格式 output_fmt 根據(jù)自己需要來指定,默認(rèn)會(huì)被轉(zhuǎn)換為與 raw 文件格式(且默認(rèn)使用稀疏文件的方式存儲(chǔ)以節(jié)省存儲(chǔ)空間)。 其中,“-c”
參數(shù)是對(duì)輸出的鏡像文件進(jìn)行壓縮,不過只有 qcow2 和 qcow 格式的鏡像文件才支持壓縮,而且這種壓縮是只讀的,如果壓縮的扇區(qū)被重寫,則會(huì)被重寫為未壓縮的數(shù)據(jù)。同樣可以使用“-o options”
來指定各種選項(xiàng),如:后端鏡像、文件大小、是否加密等等。使用backing_file
選項(xiàng)來指定后端鏡像,讓生成的文件是copy-on-write
的增量文件,這時(shí)必須讓轉(zhuǎn)換命令中指定的后端鏡像與輸入文件的后端鏡像的內(nèi)容是相同的,盡管它們各自后端鏡像的目錄、格式可能不同。
如果使用qcow2
、qcow
、cow
等作為輸出文件格式來轉(zhuǎn)換raw
格式的鏡像文件(非稀疏文件格式),鏡像轉(zhuǎn)換還可以起到將鏡像文件轉(zhuǎn)化為更小的鏡像,因?yàn)樗梢詫⒖盏纳葏^(qū)刪除使之在生成的輸出文件中并不存在。
$ qemu-img info test.dd
image: test.dd
file format: rawvirtual size: 954M (1000000000 bytes)disk size: 954M$ qemu-img convert -O qcow2 test.dd test_qcow2.qcow2$ qemu-img info test_qcow2.qcow2
image: test_qcow2.qcow2
file format: qcow2virtual size: 954M (1000000000 bytes)disk size: 136K
cluster_size: 65536
2.4 網(wǎng)絡(luò)
QEMU 支持的網(wǎng)絡(luò)模式
基于網(wǎng)橋的虛擬網(wǎng)卡
基于 NAT 的虛擬網(wǎng)絡(luò)
QEMU 內(nèi)置的用戶模式網(wǎng)絡(luò)
直接分配網(wǎng)絡(luò)設(shè)備的網(wǎng)絡(luò)「VT-d 和 SR-IOV」
qemu-kvm 通過-net
參數(shù)配置網(wǎng)絡(luò)選項(xiàng)
-net
nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v] Create a new Network Interface Card and connect it to VLAN n (n=0 is
the default). The NIC is an rtl8139 by default on the PC target. Optionally, the MAC address can be changed to mac, the device address set to addr (PCI cards only), and a name can be assigned for use in
monitor commands. Optionally, for PCI cards, you can specify the number v of MSI-X vectors that the card should have; this option
currently only affects virtio cards; set v=0 to disable MSI-X. If no
-net option is specified, a single NIC is created. Qemu can emulate
several different models of network card. Valid values for type are
"virtio", "i82551", "i82557b", "i82559er", "ne2k_pci", "ne2k_isa", "pcnet", "rtl8139", "e1000", "smc91c111", "lance" and "mcf_fec". Not
all devices are supported on all targets. Use -net nic,model=? for a list of available devices for your target.
-net nic
必需的參數(shù),表明是一個(gè)網(wǎng)卡的配置
vlan=n
表示將網(wǎng)卡放入到編號(hào)為 n 的 VLAN,默認(rèn)為 0
macaddr=mac
自定義 MAC 地址
model=type
設(shè)置模擬的網(wǎng)卡類型,默認(rèn)為 rtl8139
如果提供 VM 多個(gè)網(wǎng)卡,則需要多次使用-net
參數(shù)。
橋接網(wǎng)絡(luò)
手動(dòng)橋接
qemu-kvm安裝或者啟動(dòng)虛擬系統(tǒng)的時(shí)候如果需要和外界通信,那么就要設(shè)置網(wǎng)絡(luò)橋接
/usr/libexec/qemu-kvm -m 1024 \-drive file=/data/images/CentOS6_4.qcow2,if=virtio \-net nic,model=virtio -net tap,script=no -nographic -vnc :0
使用-net tap,script=no
方式啟動(dòng)之后,系統(tǒng)會(huì)生成 tapX 的虛擬網(wǎng)卡,默認(rèn)是 DOWN 狀態(tài)
# ip link show dev tap037: tap0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 500
link/ether d2:b0:af:7b:23:0f brd ff:ff:ff:ff:ff:ff
如果想和外界通信,可以手動(dòng)執(zhí)行生效,如下所示當(dāng)前與 br0 橋接的設(shè)備,并沒有 tap 相關(guān)的網(wǎng)卡
# brctl show br0bridge name bridge id STP enabled interfaces
br0 8000.b8975a626020 no eth0
vnet0
vnet1
我們需要把 tap0 也橋接到 br0 下以便和外界通信,方法如下:
# ip link set tap0 up # 使 tap0 狀態(tài)變?yōu)?up# brctl addif br0 tap0 # 橋接 tap0 到 br0# brctl show br0 bridge name bridge id STP enabled interfaces
br0 8000.b8975a626020 no eth0
tap0
vnet0
vnet1
brctl delif br0 tap0
刪除橋接網(wǎng)絡(luò),qemu-kvm 工具在客戶機(jī)關(guān)閉時(shí)會(huì)自動(dòng)解除 TAP 設(shè)備的 bridge 綁定,所以這一步無需操作。
腳本實(shí)現(xiàn)
/usr/libexec/qemu-kvm -m 1024 \-drive file=/data/images/CentOS6_4.qcow2,if=virtio \-net nic,model=virtio -net tap,script=/tmp/qemu-ifup.sh -nographic -vnc :0
如上tap,script=/tmp/qemu-ifup.sh
指定 script 網(wǎng)絡(luò)配置啟動(dòng)前啟動(dòng)腳本,腳本內(nèi)容如下
# cat /tmp/qemu-ifup.sh #!/bin/bash# 橋接網(wǎng)絡(luò)設(shè)備switch=br0if [ -n ]; then # 為qemu-kvm傳遞值,這里是tap
ip link set up
brctl addif ${switch}
exit 0else
echo "no interface!"
exit 1fi
三、KVM 高級(jí)功能
3.1 半虛擬化驅(qū)動(dòng)
virtio
KVM 是必須使用硬件虛擬化輔助技術(shù)(如 Intel VT-x、AMD-V)的 hypervisor,在 CPU 運(yùn)行效率方面有硬件支持,其效率是比較高的;在有 Intel EPT 特性支持的平臺(tái)上,內(nèi)存虛擬化的效率也較高。QEMU/KVM 提供了全虛擬化環(huán)境,可以讓客戶機(jī)不經(jīng)過任何修改就能運(yùn)行在 KVM 環(huán)境中。不過,KVM 在 I/O 虛擬化方面,傳統(tǒng)的方式是使用 QEMU 純軟件的方式來模擬 I/O 設(shè)備(如模擬的網(wǎng)卡、磁盤、顯卡等等),其效率并不非常高。在 KVM 中,可以在客戶機(jī)中使用半虛擬化驅(qū)動(dòng)(Paravirtualized Drivers,PV Drivers)來提高客戶機(jī)的性能(特別是 I/O 性能)。目前,KVM 中實(shí)現(xiàn)半虛擬化驅(qū)動(dòng)的方式是采用了virtio
這個(gè) Linux 上的設(shè)備驅(qū)動(dòng)標(biāo)準(zhǔn)框架。
QEMU 模擬 I/O 設(shè)備的基本原理和優(yōu)缺點(diǎn)
使用 QEMU 模擬 I/O 的情況下,當(dāng)客戶機(jī)中的設(shè)備驅(qū)動(dòng)程序(device driver)發(fā)起 I/O 操作請(qǐng)求之時(shí),KVM 模塊中的 I/O 操作捕獲代碼會(huì)攔截這次 I/O 請(qǐng)求,然后經(jīng)過處理后將本次 I/O 請(qǐng)求的信息存放到 I/O 共享頁,并通知用戶控件的 QEMU 程序。QEMU 模擬程序獲得 I/O 操作的具體信息之后,交由硬件模擬代碼來模擬出本次的 I/O 操作,完成之后,將結(jié)果放回到 I/O 共享頁,并通知 KVM 模塊中的 I/O 操作捕獲代碼。最后,由 KVM 模塊中的捕獲代碼讀取 I/O 共享頁中的操作結(jié)果,并把結(jié)果返回到客戶機(jī)中。當(dāng)然,這個(gè)操作過程中客戶機(jī)作為一個(gè) QEMU 進(jìn)程在等待I/O時(shí)也可能被阻塞。另外,當(dāng)客戶機(jī)通過 DMA(Direct Memory Access)訪問大塊 I/O 之時(shí),QEMU 模擬程序?qū)⒉粫?huì)把操作結(jié)果放到 I/O 共享頁中,而是通過內(nèi)存映射的方式將結(jié)果直接寫到客戶機(jī)的內(nèi)存中去,然后通過 KVM 模塊告訴客戶機(jī) DMA 操作已經(jīng)完成。
QEMU 模擬 I/O 設(shè)備的方式,其優(yōu)點(diǎn)是可以通過軟件模擬出各種各樣的硬件設(shè)備,包括一些不常用的或者很老很經(jīng)典的設(shè)備(如 RTL8139 網(wǎng)卡),而且它不用修改客戶機(jī)操作系統(tǒng),就可以實(shí)現(xiàn)模擬設(shè)備在客戶機(jī)中正常工作。在 KVM 客戶機(jī)中使用這種方式,對(duì)于解決手上沒有足夠設(shè)備的軟件開發(fā)及調(diào)試有非常大的好處。而它的缺點(diǎn)是,每次 I/O 操作的路徑比較長,有較多的 VMEntry、VMExit 發(fā)生,需要多次上下文切換(context switch),也需要多次數(shù)據(jù)復(fù)制,所以它的性能較差。
virtio 的基本原理和優(yōu)缺點(diǎn)
virtio 是一個(gè)在 hypervisor 之上的抽象 API 接口,讓客戶機(jī)知道自己運(yùn)行在虛擬化環(huán)境中,從而與 hypervisor 根據(jù) virtio 標(biāo)準(zhǔn)協(xié)作,從而在客戶機(jī)中達(dá)到更好的性能(特別是 I/O 性能)。其中前端驅(qū)動(dòng)(frondend,如 virtio-blk、virtio-net 等)是在客戶機(jī)中存在的驅(qū)動(dòng)程序模塊,而后端處理程序(backend)是在 QEMU 中實(shí)現(xiàn)的。在這前后端驅(qū)動(dòng)之間,還定義了兩層來支持客戶機(jī)與 QEMU 之間的通信。其中,virtio 這一層是虛擬隊(duì)列接口,它在概念上將前端驅(qū)動(dòng)程序附加到后端處理程序。一個(gè)前端驅(qū)動(dòng)程序可以使用 0 個(gè)或多個(gè)隊(duì)列,具體數(shù)量取決于需求。例如,virtio-net 網(wǎng)絡(luò)驅(qū)動(dòng)程序使用兩個(gè)虛擬隊(duì)列(一個(gè)用于接收,另一個(gè)用于發(fā)送),而 virtio-blk 塊驅(qū)動(dòng)程序僅使用一個(gè)虛擬隊(duì)列。虛擬隊(duì)列實(shí)際上被實(shí)現(xiàn)為跨越客戶機(jī)操作系統(tǒng)和 hypervisor 的銜接點(diǎn),但它可以通過任意方式實(shí)現(xiàn),前提是客戶機(jī)操作系統(tǒng)和 virtio 后端程序都遵循一定的標(biāo)準(zhǔn),以相互匹配的方式實(shí)現(xiàn)它。而 virtio-ring 實(shí)現(xiàn)了環(huán)形緩沖區(qū)(ring buffer),用于保存前端驅(qū)動(dòng)和后端處理程序執(zhí)行的信息,并且它可以一次性保存前端驅(qū)動(dòng)的多次 I/O 請(qǐng)求,并且交由后端去動(dòng)去批量處理,最后實(shí)際調(diào)用宿主機(jī)中設(shè)備驅(qū)動(dòng)實(shí)現(xiàn)物理上的 I/O 操作,這樣做就可以根據(jù)約定實(shí)現(xiàn)批量處理而不是客戶機(jī)中每次 I/O 請(qǐng)求都需要處理一次,從而提高客戶機(jī)與 hypervisor 信息交換的效率。
Virtio 半虛擬化驅(qū)動(dòng)的方式,可以獲得很好的 I/O 性能,其性能幾乎可以達(dá)到和 native(即:非虛擬化環(huán)境中的原生系統(tǒng))差不多的 I/O 性能。所以,在使用 KVM 之時(shí),如果宿主機(jī)內(nèi)核和客戶機(jī)都支持 virtio 的情況下,一般推薦使用 virtio 達(dá)到更好的性能。當(dāng)然,virtio 的也是有缺點(diǎn)的,它必須要客戶機(jī)安裝特定的Virtio驅(qū)動(dòng)使其知道是運(yùn)行在虛擬化環(huán)境中,且按照 Virtio 的規(guī)定格式進(jìn)行數(shù)據(jù)傳輸,不過客戶機(jī)中可能有一些老的 Linux 系統(tǒng)不支持 virtio 和主流的Windows系統(tǒng)需要安裝特定的驅(qū)動(dòng)才支持 Virtio。不過,較新的一些 Linux 發(fā)行版(如 RHEL 6.x、Fedora 17 等)默認(rèn)都將 virtio 相關(guān)驅(qū)動(dòng)編譯為模塊,可直接作為客戶機(jī)使用 virtio。Windows 系統(tǒng)需要額外的安裝相應(yīng)的 virtio 區(qū)別,virtio-win。
virtio_net 和 vhost_net
使用 virtio_net 半虛擬化驅(qū)動(dòng),可以提高網(wǎng)絡(luò)吞吐量和降低網(wǎng)絡(luò)延遲。vhost_net 能夠把網(wǎng)絡(luò) IO 請(qǐng)求的后端處理在內(nèi)核空間完成,則效率更高,會(huì)提高網(wǎng)絡(luò)吞吐量和減少網(wǎng)絡(luò)延遲。
virtio_blk
virtio_blk 驅(qū)動(dòng)使用 virtio API 為客戶機(jī)提供了一個(gè)高效訪問塊設(shè)備 I/O 的方法。使用 virtio_blk 驅(qū)動(dòng)的磁盤顯示為/dev/vd*
。
Device Assignment and SR-IOV
3.2 熱插拔 (hot plugging)
熱插拔可以提高服務(wù)器擴(kuò)展性、靈活性以及對(duì)相關(guān)硬件問題的及時(shí)恢復(fù)能力。在服務(wù)器中,可以實(shí)現(xiàn)熱插拔的部件主要是 SATA 硬盤、CPU、內(nèi)存、USB、網(wǎng)卡、風(fēng)扇等。在 KVM 虛擬化環(huán)境中,也支持客戶機(jī)相應(yīng)的設(shè)備熱插拔。目前,KVM 對(duì)熱插拔的支持還不是很完善,主要支持 PCI 設(shè)備和 CPU 的熱插拔,內(nèi)存的熱插拔目前還不是很完善。
Red_Hat_Enterprise_Linux_6.5_Release_NotesRHEL 6.5 開始支持 CPU 的熱插拔
CPU hot plugging and hot unplugging are supported with the help of the QEMU guest agent on Linux guests; CPUs can be enabled or disabled while the guest is running, thus mimicking the hot plug or hot unplug feature.
KVM 熱插拔的操作可以參考 KVM 官方文檔:
CPU Hotplug
Using PCI Hotplug Support
3.3 動(dòng)態(tài)遷移
動(dòng)態(tài)遷移(Live Migration):也叫在線遷移(Online Migration)。就是在保證虛擬機(jī)上服務(wù)正常運(yùn)行的同時(shí),將一個(gè)虛擬機(jī)系統(tǒng)從一個(gè)物理主機(jī)移動(dòng)到另一個(gè)物理主機(jī)的過程。該過程不會(huì)對(duì)最終用戶造成明顯的影響,從而使得管理員能夠在不影響用戶正常使用的情況下,對(duì)物理服務(wù)器進(jìn)行離線維修或者升級(jí)。與靜態(tài)遷移不同的是,為了保證遷移過程中虛擬機(jī)服務(wù)的可用,遷移過程僅有非常短暫的停機(jī)時(shí)間。遷移的前面階段,服務(wù)在源主機(jī)的虛擬機(jī)上運(yùn)行,當(dāng)遷移進(jìn)行到一定階段,目的主機(jī)已經(jīng)具備了運(yùn)行虛擬機(jī)系統(tǒng)的必須資源,經(jīng)過一個(gè)非常短暫的切換,源主機(jī)將控制權(quán)轉(zhuǎn)移到目的主機(jī),虛擬機(jī)系統(tǒng)在目的主機(jī)上繼續(xù)運(yùn)行。對(duì)于虛擬機(jī)服務(wù)本身而言,由于切換的時(shí)間非常短暫,用戶感覺不到服務(wù)的中斷,因而遷移過程對(duì)用戶是透明的。動(dòng)態(tài)遷移適用于對(duì)虛擬機(jī)服務(wù)可用性要求很高的場(chǎng)合。
四、KVM 管理工具
libvirt
libvirt 是目前使用最為廣泛的對(duì) KVM 虛擬機(jī)進(jìn)行管理的工具和應(yīng)用程序接口(API),而且一些常用的虛擬機(jī)管理工具(如virsh、virt-install、virt-manager等)和云計(jì)算框架平臺(tái)(如 OpenStack、OpenNebula、Eucalyptus 等)都在底層使用 libvirt 的應(yīng)用程序接口。
libvirt 是為了更方便地管理平臺(tái)虛擬化技術(shù)而設(shè)計(jì)的開放源代碼的應(yīng)用程序接口、守護(hù)進(jìn)程和管理工具,它不僅提供了對(duì)虛擬化客戶機(jī)的管理,也提供了對(duì)虛擬化網(wǎng)絡(luò)和存儲(chǔ)的管理。盡管 libvirt 項(xiàng)目最初是為 Xen 設(shè)計(jì)的一套API,但是目前對(duì)KVM等其他 Hypervisor 的支持也非常的好。libvirt 支持多種虛擬化方案,既支持包括 KVM、QEMU、Xen、VMware、VirtualBox 等在內(nèi)的平臺(tái)虛擬化方案,又支持 OpenVZ、LXC 等 Linux 容器虛擬化系統(tǒng),還支持用戶態(tài) Linux(UML)的虛擬化。
libvirt 作為中間適配層,讓底層 Hypervisor 對(duì)上層用戶空間的管理工具是可以做到完全透明的,因?yàn)?libvirt 屏蔽了底層各種 Hypervisor 的細(xì)節(jié),為上層管理工具提供了一個(gè)統(tǒng)一的、較穩(wěn)定的接口(API)。通過 libvirt,一些用戶空間管理工具可以管理各種不同的 Hypervisor 和上面運(yùn)行的客戶機(jī)。
libvirt的管理功能主要包含如下五個(gè)部分:
域的管理:包括對(duì)節(jié)點(diǎn)上的域的各個(gè)生命周期的管理,如:?jiǎn)?dòng)、停止、暫停、保存、恢復(fù)和動(dòng)態(tài)遷移。也包括對(duì)多種設(shè)備類型的熱插拔操作,包括:磁盤、網(wǎng)卡、內(nèi)存和 CPU,當(dāng)然不同的 Hypervisor 上對(duì)這些熱插拔的支持程度有所不同。
遠(yuǎn)程節(jié)點(diǎn)的管理:只要物理節(jié)點(diǎn)上運(yùn)行了 libvirtd 這個(gè)守護(hù)進(jìn)程,遠(yuǎn)程的管理程序就可以連接到該節(jié)點(diǎn)進(jìn)程管理操作,經(jīng)過認(rèn)證和授權(quán)之后,所有的 libvirt 功能都可以被訪問和使用。libvirt 支持多種網(wǎng)絡(luò)遠(yuǎn)程傳輸類型,如 SSH、TCP 套接字、Unix domain socket、支持 TLS 的加密傳輸?shù)取<僭O(shè)使用最簡(jiǎn)單的 SSH,則不需要額外配置工作,比如:example.com 節(jié)點(diǎn)上運(yùn)行了 libvirtd,而且允許 SSH 訪問,在遠(yuǎn)程的某臺(tái)管理機(jī)器上就可以用如下的命令行來連接到 example.com 上,從而管理其上的域。
virsh -c qemu+ssh://root@example.com/system
存儲(chǔ)的管理:任何運(yùn)行了 libvirtd 守護(hù)進(jìn)程的主機(jī),都可以通過 libvirt 來管理不同類型的存儲(chǔ),如:創(chuàng)建不同格式的客戶機(jī)鏡像(qcow2、raw、qde、vmdk等)、掛載 NFS 共享存儲(chǔ)系統(tǒng)、查看現(xiàn)有的 LVM 卷組、創(chuàng)建新的 LVM 卷組和邏輯卷、對(duì)磁盤設(shè)備分區(qū)、掛載 iSCSI 共享存儲(chǔ),等等。當(dāng)然 libvirt 中,對(duì)存儲(chǔ)的管理也是支持遠(yuǎn)程管理的。
網(wǎng)絡(luò)的管理:任何運(yùn)行了 libvirtd 守護(hù)進(jìn)程的主機(jī),都可以通過libvirt來管理物理的和邏輯的網(wǎng)絡(luò)接口。包括:列出現(xiàn)有的網(wǎng)絡(luò)接口卡,配置網(wǎng)絡(luò)接口,創(chuàng)建虛擬網(wǎng)絡(luò)接口,網(wǎng)絡(luò)接口的橋接,VLAN 管理,NAT 網(wǎng)絡(luò)設(shè)置,為客戶機(jī)分配虛擬網(wǎng)絡(luò)接口,等等。
提供一個(gè)穩(wěn)定、可靠、高效的應(yīng)用程序接口(API)以便可以完成前面的 4 個(gè)管理功能。
libvirt 主要由三個(gè)部分組成,它們分別是:應(yīng)用程序編程接口(API)庫、一個(gè)守護(hù)進(jìn)程(libvirtd)和一個(gè)默認(rèn)命令行管理工具(virsh)。應(yīng)用程序接口(API)是為了其他虛擬機(jī)管理工具(如 virsh、virt-manager等)提供虛擬機(jī)管理的程序庫支持。libvirtd 守護(hù)進(jìn)程負(fù)責(zé)執(zhí)行對(duì)節(jié)點(diǎn)上的域的管理工作,在用各種工具對(duì)虛擬機(jī)進(jìn)行管理之時(shí),這個(gè)守護(hù)進(jìn)程一定要處于運(yùn)行狀態(tài)中,而且這個(gè)守護(hù)進(jìn)程可以分為兩種:一種是 root 權(quán)限的libvirtd,其權(quán)限較大,可以做所有支持的管理工作;一種是普通用戶權(quán)限的 libvirtd,只能做比較受限的管理工作。virsh 是 libvirt 項(xiàng)目中默認(rèn)的對(duì)虛擬機(jī)管理的一個(gè)命令行工具
在以往農(nóng)歷新年到來的前幾天,北上廣深的艾米、斯蒂芬、露西們,都會(huì)搭載飛機(jī)、高鐵、火車、汽車、三蹦子等交通工具,在除夕前陸續(xù)趕回家鄉(xiāng)。但2021年的春節(jié)前夕,卻因新冠疫情的反復(fù),讓諸位打工人留在了工作地就地過年。
以往吃完年夜飯后,一家人守著電視看看春晚。但今年的特殊,讓大家的跨年方式的選擇上更加多樣。相信大多數(shù)年輕人都會(huì)考慮在除夕美滋滋的玩上兩把游戲,但不同的年輕人喜歡的游戲類型卻不盡相同,而錯(cuò)誤的電競(jìng)外設(shè),會(huì)降低游戲的體驗(yàn)。所以今天為喜愛不同游戲的玩家,來推薦適合的顯示器外設(shè),一起來看看吧。
01 雜食游戲黨
相信有很多玩家并沒有對(duì)某種游戲特別偏愛,無論是網(wǎng)絡(luò)游戲還是3A大作都有所涉及。想要滿足這類玩家的需求,需要顯示器的綜合性能足夠優(yōu)秀。除了更高的刷新率來保障游戲畫面的流暢外,還需要有更好的色彩還原能力來呈現(xiàn)宏大壯觀的游戲場(chǎng)景。
AOC AG273QXP便是一款滿足此要求的電競(jìng)顯示器,它搭載了27英寸2K分辨率的Nano IPS面板,既有165Hz高刷新率,帶來流暢的游戲體驗(yàn)。又有133%的sRGB色域容積帶來的驚艷游戲畫面。
此外,這款電競(jìng)顯示器還提供了自適應(yīng)刷新率技術(shù)。可以讓顯示器跟隨顯卡的幀率而實(shí)時(shí)變化屏幕的刷新率,完美解決了屏幕畫面撕裂和卡頓等現(xiàn)象。讓你精準(zhǔn)掌控每一幀,提高勝算、搶占先機(jī)!
追求沉浸游戲感的玩家還可以考慮下飛利浦275M1RZ,它同樣使用了27英寸2K分辨率的Nnao IPS面板,畫面的色彩和流暢感都非常出色。而它背后所提供的RGB燈效為飛利浦獨(dú)家的流光溢彩燈效,提供了其他顯示器無法實(shí)現(xiàn)的神奇視覺效果。
具體來說,這款電競(jìng)顯示器所搭載的流光溢彩電競(jìng)AI燈效,可以識(shí)別顯示器中所展現(xiàn)的畫面色彩,并在背部鑲嵌的燈珠上同步表達(dá)出來。在黑夜使用時(shí),仿佛畫面中的內(nèi)容突破次元壁來到了現(xiàn)實(shí)世界,這對(duì)于熱衷于打造光污染的電競(jìng)玩家來說,是非常有用。
優(yōu)派VX3418-2K-PRO-2這款帶魚屏電競(jìng)顯示器也是個(gè)不錯(cuò)的選擇,除了可以暢快的享受游戲外,21:9的屏幕比例在觀看電影時(shí)可以帶來無黑邊畫面,觀影更為沉浸。同時(shí),更多的畫面也能顯示更多的內(nèi)容,在進(jìn)行工作時(shí)也更為高效。
面板參數(shù)方面,這款顯示器搭載了34英寸的IPS面板,分辨率達(dá)到了超2K級(jí)別的3440x1440,游戲畫面的呈現(xiàn)效果真實(shí)細(xì)膩。面板擁有144Hz的屏幕刷新率和1ms的響應(yīng)時(shí)間,讓游戲畫面得到流暢順滑的呈現(xiàn),為玩家提供了真實(shí)驚艷的游戲體驗(yàn)。
02 多設(shè)備黨、非PC黨
除了PC電腦外,還有其他平臺(tái)的游戲也值得一玩。要滿足這部分玩家需求的顯示器,除了要有更好的畫質(zhì)外,還需要內(nèi)置音箱來為玩家提供畫與音的雙重享受。
明基EX2710這款顯示器就非常適合用于連接Switch主機(jī)進(jìn)行游戲。它同樣搭載了色彩表現(xiàn)更加真實(shí)、可視角度更廣的IPS面板,為你提供更加真實(shí)的游戲畫面。144Hz刷新率和1ms的極速響應(yīng)時(shí)間,也讓游戲畫面得到流暢順滑的呈現(xiàn)。
由于任天堂的Switch最高支持1080P畫面輸出,所以使用這款分辨率略低但提供環(huán)繞音箱、智慧愛眼等護(hù)眼功能的游戲顯示器是非常不錯(cuò)的選擇。既有較高水準(zhǔn)的畫面流暢度和色彩表現(xiàn),又能讓它在多個(gè)使用場(chǎng)景下為玩家?guī)砀玫氖褂皿w驗(yàn)。
還有不少手游玩家,也希望通過大屏幕獲得更好的游戲體驗(yàn)。但由于桌面顯示器本身是為PC電腦提供畫面顯示的,所以市面上可滿足這種需求的顯示器尚少。這里筆者推薦兩款通過不同形式實(shí)現(xiàn)顯示手機(jī)游戲的桌面顯示器,大家可以按需選購。
首先是內(nèi)置桌面智能OS系統(tǒng)的京東方拾光紀(jì)SA27D0,它可以通過WIFI建立手機(jī)與顯示器內(nèi)部系統(tǒng)之間的連接,來實(shí)現(xiàn)無線同屏/投屏的功能。IOS和安卓用戶均可與這臺(tái)智慧屏顯示器相連,IOS手機(jī)與顯示器在同一wifi下,點(diǎn)擊屏幕鏡像找到“拾光紀(jì)”進(jìn)行連接,就可以進(jìn)行同屏顯示;如果是安卓手機(jī),可以通過Miracast協(xié)議來實(shí)現(xiàn)無線同屏的功能。在顯示器中的桌面OS智能系統(tǒng)中,打開設(shè)置-投屏設(shè)置-Miracast服務(wù),然后打開手機(jī)中投屏功能,找到有“拾光紀(jì)”字眼的設(shè)備即可連接即可,操作簡(jiǎn)捷方便。
面板參數(shù)上,這款顯示器采用了京東方自研的ADS-IPS面板規(guī)格,屏幕尺寸為27英寸、分辨率為2K,畫面顯示效果震撼細(xì)膩。122%的sRGB色域容積,可為你顯示更多的色彩數(shù)量,呈現(xiàn)畫面中不同色彩變化時(shí)更加自然,帶來更真實(shí)的畫面顯示。
另外一臺(tái)電競(jìng)顯示器,便是技嘉推出的KVM電競(jìng)顯示器——M27Q。這款顯示器除了常規(guī)的視頻接口外,還提供了一個(gè)Type-C接口,可供玩家連接筆記本、手機(jī)等支持Type-C接口的設(shè)備。像QQ飛車、和平精英等手游,都能在27英寸的大尺寸屏幕上獲得更為震撼的體驗(yàn)。
在面板的選擇上,技嘉M27Q使用了一塊基于快速液晶技術(shù)打造的IPS面板。擁有170Hz的屏幕刷新率和0.5ms急速響應(yīng)時(shí)間,并支持AMD FreeSync? Premium技術(shù)和NVIDIA G-Sync Compatible(Ready)技術(shù),可毫無壓力的滿足中高端游戲玩家對(duì)游戲畫面穩(wěn)定、順滑、清晰的需求。
03 極致電競(jìng)黨
除了以上兩種玩家外,還有部分玩家喜愛在游戲中贏得最后勝利的感覺。享受隊(duì)友的膜拜需要自身極為強(qiáng)勁的實(shí)力,所以就對(duì)電競(jìng)顯示器的刷新率和響應(yīng)時(shí)間提出了更高的要求。這里為這部分玩家推薦ZOWIE GEAR XL2546K這款專業(yè)的電競(jìng)顯示器。
它擁有240Hz的屏幕刷新率和0.5ms的響應(yīng)時(shí)間,為你帶來極為清晰、順暢的畫面呈現(xiàn)效果。24.5英寸的屏幕尺寸也更加適合電競(jìng)游戲,加上全新的K系列顯示器在細(xì)節(jié)上升級(jí)諸多,讓你獲得更好的電競(jìng)體驗(yàn)。
相信這份為喜愛不同類型游戲的各位玩家所提供的顯示器清單,可以讓大家更好的享受除夕以及接下來的娛樂時(shí)光。
就地過年的各位,別忘了春節(jié)結(jié)束后,找個(gè)時(shí)間回家看看呦。
(7623865)