1. QEMU、KVM 、QEMU-KVM
QEMU 提供了一系列的硬件模擬設備(cpu、網卡、磁盤等),客戶機指令都需要QEMU翻譯,因此性能較差。KVM 是Linux 內核提供的虛擬化模塊,負責CPU和內存的虛擬化,但是缺少I/O設備的虛擬化。QEMU-KVM 就是 KVM 與 QEMU 的結合,KVM 負責CPU虛擬化+內存虛擬化,QEMU 模擬其他I/O設備。
2. QEMU-KVM 命令詳解
2.1 qemu-kvm 命令基本格式
qemu-kvm 工具命令格式如下:
qemu-kvm [options] [disk_image]
其中,opions 是各種選項、參數,disk_image 是客戶機的磁盤鏡像文件(默認被掛載為第一個 IDE 磁盤設備)。
2.2 CPU 相關的參數
(1)-cpu 參數
指定CPU模型,默認的 CPU 模型為 qemu64,"-cpu ?" 可以查詢當前 qemu-kvm 支持哪些 cpu 模型。
[root@192.168.118.14 ~]#qemu-kvm -cpu ? x86 qemu64 QEMU Virtual CPU version 1.5.3 x86 phenom AMD Phenom(tm) 9550 Quad-Core Processor x86 core2duo Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz x86 kvm64 Common KVM processor x86 qemu32 QEMU Virtual CPU version 1.5.3 x86 kvm32 Common 32-bit KVM processor x86 coreduo Genuine Intel(R) CPU T2600 @ 2.16GHz x86 486 x86 pentium x86 pentium2 x86 pentium3 x86 athlon QEMU Virtual CPU version 1.5.3 x86 n270 Intel(R) Atom(TM) CPU N270 @ 1.60GHz x86 cpu64-rhel6 QEMU Virtual CPU version (cpu64-rhel6) x86 Conroe Intel Celeron_4x0 (Conroe/Merom Class Core 2) x86 Penryn Intel Core 2 Duo P9xxx (Penryn Class Core 2) x86 Nehalem Intel Core i7 9xx (Nehalem Class Core i7) x86 Westmere Westmere E56xx/L56xx/X56xx (Nehalem-C) x86 SandyBridge Intel Xeon E312xx (Sandy Bridge) x86 Haswell Intel Core Processor (Haswell) x86 Broadwell Intel Core Processor (Broadwell) x86 Opteron_G1 AMD Opteron 240 (Gen 1 Class Opteron) x86 Opteron_G2 AMD Opteron 22xx (Gen 2 Class Opteron) x86 Opteron_G3 AMD Opteron 23xx (Gen 3 Class Opteron) x86 Opteron_G4 AMD Opteron 62xx class CPU x86 Opteron_G5 AMD Opteron 63xx class CPU x86 host KVM processor with all supported host features (only available in KVM mode)
如果想盡可能多的將宿主機的 CPU 特性暴露給客戶機使用,則可以使用 "-cpu host" 參數。使用 "-cpu host" 參數會帶來動態遷移的限制,不讓客戶機在不同的cpu硬件上遷移。
(2)-smp 參數
-smp n[,scores=scores][,threads=threads][,sockets=sockets]
設置客戶機總共有 n 個邏輯CPU,並設置了其中 CPU socket 的數量、每個socket 上核心(core)的數量、每個核心上的線程(thread)數量。其中:n = sockets x cores x threads
2.3 內存相關的參數
(1) -m megs 參數
設置客戶機內存大小為 megs MB。默認單位:MB,可設置 GB
(2)--mem-path path參數
從path路徑表示的臨時文件中為客戶機分配內存,主要是分配大頁內存(如2 MB 大頁),如 "--mem-path /dev/hugepages"
(3)--mem-prealloc 參數
啟動時即分配全部的內存,而不是根據客戶機請求而動態分配,必須與 "--mem-path" 參數一起使用
(4)-balloon 開啟內存氣球的設置
"-balloon virtio" 為客戶機提供 virtio_balloon 設備,從而通過內存氣球balloon,可以在 QEMU monitor 中用 "balloon"命令來調節客戶機占用內存的大小。
2.4 磁盤相關的參數
Block device options: -fda/-fdb file use 'file' as floppy disk 0/1 image -hda/-hdb file use 'file' as IDE hard disk 0/1 image -hdc/-hdd file use 'file' as IDE hard disk 2/3 image -cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master) -drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i] [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f] [,serial=s][,addr=A][,id=name][,aio=threads|native] [,readonly=on|off][,copy-on-read=on|off] [[,bps=b]|[[,bps_rd=r][,bps_wr=w]]][[,iops=i]|[[,iops_rd=r][,iops_wr=w]] use 'file' as a drive image -mtdblock file use 'file' as on-board Flash memory image -sd file use 'file' as SecureDigital card image -pflash file use 'file' as a parallel flash image -snapshot write to temporary files instead of disk image files -hdachs c,h,s[,t] force hard disk 0 physical geometry and the optional BIOS translation (t=none or lba) (usually QEMU can guess them) -fsdev fsdriver,id=id[,path=path,][security_model={mapped-xattr|mapped-file|passthrough|none}] [,writeout=immediate][,readonly][,socket=socket|sock_fd=sock_fd] -virtfs local,path=path,mount_tag=tag,security_model=[mapped-xattr|mapped-file|passthrough|none] [,writeout=immediate][,readonly][,socket=socket|sock_fd=sock_fd] -virtfs_synth Create synthetic file system image
(1)-hda、-hdb 和 -cdrom 等參數
設置客戶機的 IDE 磁盤和光盤設備。如 "-hda centos7.img" 將 centos7.img 鏡像文件作為客戶機的第一個 IDE 磁盤。
(2)-drive 參數
詳細的配置一個驅動。
例如: -drive file=/images/centos7.img,if=virtio,cache=writeback 使用 virtio_blk 驅動 和 磁盤回寫機制 來支持該磁盤文件
(3)-boot 參數
-boot [order=drives][,once=drives][,menu=on|off]
設置客戶機啟動的各種選項(包括啟動順序等),如:在安裝客戶機操作系統時,使用 "-boot order=dc -hda centos7.img -cdrom centos7.iso",讓 centos.img 文件作為IDE磁盤,安裝光盤 centos7.iso 作為 IDE 光驅,並且從光盤啟動客戶機,從而讓客戶機進入到系統安裝的流程中。
2.5 網絡相關參數
(1) -net nic 參數
為客戶機創建一個網卡,凡是使用 qemu-kvm 模擬的網卡作為客戶機網絡設備的情況都應該使用該參數,通常該參數與 -net tap 連用。
例如:-net nic model=virtio, macaddr=52:54:00:ac:0f:11 使用 -net nic 命令時,一定要手動指定mac地址,否則客戶機的mac地址會與宿主機mac一致。
(2)-net user參數
讓客戶機使用不需要管理員權限的用戶模式網絡
例如:-net nic -net user
(3)-net tap參數
使用宿主機的TAP網絡接口來幫助客戶機建立網絡。使用網橋連接和NAT模式網絡的客戶機都會使用到 "-net tap" 參數。
例如:-net nic -net tap,ifname=vnet0,script=/etc/qeum-ifup,downscript=no ifname 指定在宿主機空間的網卡名稱,script 和 downscript 為配置網絡腳本。
2.6 顯示相關的參數
(1)vnc參數
默認使用 vnc 方式顯示客戶機。
例如手動指定:-vnc localhost:2
(2)-nographic參數
讓客戶機以命令行的方式在當前終端啟動顯示。
例如:
[root@192.168.118.14 ~]#qemu-kvm -smp 2 -m 512m /images/cirros-0.3.5-i386-disk.img -nographic ... [系統啟動信息] ... login as 'cirros' user. default password: 'cubswin:)'. use 'sudo' for root. <!DOCTYPE login: # 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 [00:00:33.833] login as 'cirros' user. default password: 'cubswin:)'. use 'sudo' for root. <!DOCTYPE login: # Ctrl+A C 切換到 qemu-monitor 模式 [00:00:37.237] (qemu) [00:00:37.237] (qemu) # Ctrl+A C 切換為命令行模式 [00:01:13.592] login as 'cirros' user. default password: 'cubswin:)'. use 'sudo' for root. <!DOCTYPE login:
(3)-daemonize 參數
在啟動時讓 qemu-kvm 作為守護進程在后台運行。如果沒有該參數,默認 qemu-kvm 在啟動客戶機后就會占用標准輸入輸出,直到客戶機退出。
2.7 其他參數
(1)-name 參數
-name 指定客戶機名稱可用於宿主機上唯一標識該客戶機。
2.8 總結
總結實際場景中經常用到的一些關於 qeum-kvm 的命令組合:
(1)直接通過鏡像文件啟動客戶機方式:
[root@192.168.118.14 ~]#qemu-img -name 'test' -smp 1 -m 512m /images/cirros-0.3.5-i386-disk.img [-daemonize | -nographic] # -daemonize 守護進程方式啟動 # -nographic 占用終端輸出輸入直接顯示 二者選其一。
(2)創建鏡像文件並通過 iso 安裝 客戶機操作系統:
關於 qemu-img 的使用查看:KVM 基礎功能詳解 倒數第二部分。
[root@192.168.118.14 ~]#qemu-kvm -name "centos7" -smp 2 -m 1024m -drive file=/images/centos_7.qcow2,if=virtio,cache=writeback -cdrom /usr/local/src/CentOS-7-x86_64-Minimal-1511.iso -daemonize VNC server running on `::1:5900'
上面兩種方式都沒有應用網絡方式,如果需要使用網絡服務請參考: