KVM簡單介紹與管理
簡介
KVM(Kernel-basedVirtual Machine,基於核心的虛擬機器)是適用於包含虛擬化擴充套件(Intel VT或AMD-V)的x86硬體上的Linux的完全虛擬化解決方案。它由可載入的核心模組kvm.ko組成,它提供核心虛擬化基礎架構和處理器特定模組,kvm-intel.ko或kvm-amd.ko。
使用KVM,可以執行多個執行未修改的Linux或Windows映像的虛擬機器。每個虛擬機器都有專用的虛擬化硬體:網絡卡,磁碟,圖形介面卡等。
原理
安裝 KVM 之後,您可以在使用者空間啟動客戶作業系統。每個客戶作業系統都是主機作業系統(或系統管理程式)的一個單個程序。 參考上面的架構圖,底部是能夠進行虛擬化的硬體平臺(目前指的是 Intel VT 或 AMD-SVM 處理器)。在裸硬體上執行的是系統管理程式(帶有 KVM 模組的 Linux 核心)。這個系統管理程式與可以執行其他應用程式的普通 Linux 核心類似。但是這個核心也可以支援通過 kvm 工具載入的客戶作業系統。最後,客戶作業系統可以支援主機作業系統所支援的相同應用程式。
其中CPU和記憶體交由KVM進行虛擬化,而I/O裝置通過qemu模擬進行模擬(QEMU 是一個平臺虛擬化解決方案,允許對一個完整的 PC 環境進行虛擬化(包括磁碟、圖形介面卡和網路裝置)。客戶作業系統所生成的任何 I/O 請求都會被中途截獲,並重新發送到 QEMU 程序模擬的使用者模式中。)
KVM 向 Linux 中引入了一種除現有的核心和使用者模式之外的新模式。這種新模式就稱為客戶模式,它用來執行客戶作業系統程式碼。核心模式表示程式碼執行的特權模式,而使用者模式則表示非特權模式(用於那些執行在核心之外的程式)。根據執行內容和目的,執行模式可以針對不同的目的進行定義。客戶模式的存在就是為了執行客戶作業系統程式碼,但是隻針對那些非 I/O 的程式碼。在客戶模式中有兩種標準模式,因此客戶作業系統在客戶模式中執行可以支援標準的核心,而在使用者模式下執行則支援自己的核心和使用者 空間應用程式。客戶作業系統的使用者模式可以用來執行 I/O 操作,這是單獨進行管理的
安裝
第一步:先檢視是否支援虛擬化功能
grep -E "svm|vmx" /proc/cpuinfo
類似這個圖表示不支援,則需要開啟cpu的虛擬化功能
吧下面這兩項打勾,然後啟動虛擬機器
開啟之後,可以再執行一次
grep -E "svm|vmx" /proc/cpuinfo
- vmx:Intel VT-x
- svm:AMD AMD-v
出現下面類似資訊,則可以認為CPU虛擬化功能打開了
第二步:安裝方便管理的KVM工具
yum install libvirt libvirt-daemon-kvm qemu-kvm virt-manager virt-install -y
- libvirt :用於管理虛擬化平臺的開源的API,後臺程式和管理工具。它可以用於管理KVM、Xen、VMware ESX,QEMU和其他虛擬化技術
- libvirt-daemon-kvm:libvirt的守護程式
- virt-manager :提供了一個VMM(Virtual Machine Manager)的圖形化管理工具,用於管理KVM, Xen, 和LXC,可以用來啟動,停止,新增,移除虛擬裝置等功能
- virt-install:安裝虛擬機器的一個工具
- qemu-kvm :QEMU本身是一個完整的虛擬化解決方案,它通過動態的二進位制轉換,模擬CPU,並且提供一組裝置模型,使它能夠執行多種未修改的客戶機OS,但是這種方式效能非常差。
當KVM+QEMU時,KVM對CPU和記憶體進行虛擬,而QEMU負責對I/O裝置進行模擬。一起使用可以大大的提高效能,接近真實計算機的執行速度。
QEMU本身是個完整的虛擬化解決方案,也有幾個分支我們可以從官網看出來
而qemu-kvm就是qemu配合kvm進行虛擬化的一個分支。
第三步:載入KVM核心模組
載入kvm模組
modprobe kvm
檢視kvm模組相關資訊
modinfo kvm
第四步:啟動libvirt守護程式
systemctl start libvirtd
啟動之後會啟動啟動一個橋裝置
管理虛擬機器例項
可以通過圖形化介面,也可以通過命令列管理,兩種方法都簡單說一下。
圖形化介面管理
第一步:啟動libvirt守護程序
啟動圖形化管理介面
virt-manager
接下來的操作就和VMware類似。
命令列方式管理
這種方式又可以再細分2種,可以用通用的虛擬機器管理介面進行管理,也可以通過KVM自帶的原生工具管理。
1.KVM管理工具
qemu-img
簡介:用於建立、轉換和修改映像檔案。它可以處理QEMU支援的所有映像。
語法格式:qemu-img command [command options]
qemu-kvm
簡介:管理虛擬機器工具
語法格式:qemu-kvm [options] [disk_image]
這個命令需要執行一下
ln -sv /usr/libexec/qemu-kvm /usr/bin
因為它的路徑預設不再環境變數PATH中,需要做個軟連線才能用
選項
這個命令選項非常多,標準選項,USB選項,顯示選項,i386平臺專用選項,網路選項,字元裝置選項,藍芽相關選項,Linux系統引導專用選項,除錯/專家模式選項,PowerPC專用選項,Sparc32專用選項;
標準選項
-machine [type=]name:-machine help來獲取列表,用於指定模擬的主機型別;
-cpu cpu:-cpu help來獲取列表;用於指定要模擬的CPU型號;
-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:指明虛擬機器上vcpu的數量及拓撲;
cores:cpu數量
threads:每個cpu的執行緒數
-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:當前虛擬機器的名稱,要惟一;
塊裝置相關的選項:
-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:磁碟映像檔案的格式;
顯示選項:
-vnc display[,option[,option[,...]]]]:啟動一個vnc server來顯示虛擬機器介面; 讓qemu程序監聽一個vnc介面;
display:
(1) HOST:N
在HOST主機的第N個桌面號輸出vnc;
5900+N
(2) unix:/PATH/TO/SOCK_FILE
(3) none
網路選項
-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 n;
script=file:啟動虛擬機器時要執行的指令碼,預設為/etc/qemu-ifup
downscript=dfile:關閉虛擬機器時要執行的指令碼,/etc/qemu-ifdown
ifname=NAME:自定義介面名稱;
瞭解了上面兩個命令就直接來建立一個虛擬機器例項測試一下
建立虛擬機器例項
建立一個存放映像檔案的目錄
mkdir -pv /kvm
建立映像檔案
qemu-img create -f qcow2 -o preallocation=metadata,size=5G /kvm/centos.test.img
建立虛擬機器
qemu-kvm -name centos7 -m 512 -cpu host -smp 1 -drive file=/kvm/centos.test.img,if=virtio,media=disk,cache=writeback,format=qcow2 -vnc :1
然後可以通過vnc訪問,使用vnc需要先安裝tigervnc-server
yum install tigervnc-server -y
連線虛擬機器
vncviewer 127.0.0.1:5901
建立網橋
brctl addbr br0
brctl addif br0 ens33 ;\
ip addr del dev ens33 192.168.253.134/24 ;\
ifconfig br0 192.168.253.134/24 up
先建立一個指令碼
/etc/qemu-ifup
#!/bin/bash
#
bridge=virbr0
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 1
fi
增加一個執行的許可權
chmod +x /etc/qemu-ifup
匯入光碟映象引導,安裝系統,併為虛擬機器建立網路介面
qemu-kvm -name c1 -smp 2,sockets=1,cores=1 -m 512 \
-drive file=/kvm/centos7.iso,media=cdrom \
-drive file=/kvm/centos.test.img,media=disk \
-vnc :1 -boot order=cd,once=d \
-net nic,model=e1000,macaddr=52:54:00:00:00:01 \
-net tap,ifname=tap1,script=/etc/qemu-ifup \
-daemonize
這裡可以看到進入安裝系統的頁面了。接下來就正常安裝和使用虛擬機器。
2.virsh命令管理
建立一個磁碟映像檔案
qemu-img create -f raw /kvm/test.raw 5G
建立iso映象
dd if=/dev/cdrom of=/kvm/c7.iso
建立虛擬機器
virt-install --name Centos-7-x86_64 --virt-type kvm --ram 1024 \
--cdrom=/kvm/c7.iso --disk path=/kvm/test.raw \
--network network=default \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole
#--name:指定虛擬機器名稱Centos-7-x86_64
#--virt-type:虛擬型別為kvm
#--ram:記憶體1024
#--cdrom:映象路徑/kvm/c7.iso
#--disk 磁碟映像
#--network 網路型別
virsh命令
簡介:
virsh是管理virsh客戶域的主要介面。程式可以是用於建立、暫停和關閉域。它還可以用於列出當前域。Linux作業系統的虛擬化意味著執行多個系統的能力。在單個硬體系統上同時操作作業系統的例項,資源是由Linux例項驅動的。virsh提供長期穩定的C應用程式程式設計介面。它目前支援Xen、QEMU、KVM、LXC、OpenVZ、VIALALBOX和VMware ESX。
語法格式:
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')
Storage Volume (help keyword 'volume')
域管理常用命令
Domain Management (help keyword 'domain')
create:從xml格式的配置檔案建立並啟動虛擬機器;
define:從xml格式的配置檔案建立虛擬機器;
start:開始
destroy:強行關機;
shutdown:關機;
reboot:重啟;
undefine:刪除虛擬機器;
suspend/resume:暫停於記憶體中,或繼續執行暫停狀態的虛擬機器;
save/restore:儲存虛擬機器的當前狀態至檔案中,或從指定檔案恢復虛擬機器;
console:連線至指定domain的控制檯;
attach-disk/detach-disk:磁碟裝置的熱插拔;從XML檔案附加裝置
attach-interface/detach-interface:網路介面裝置的熱插拔;
type:bridge
source:BRIDGE_NAME
示例:
1.檢視虛擬機器狀態
virsh list --all #如果不加--all 關閉的虛擬機器看不到
2.啟動虛擬機器
virsh start Centos-7-x86_64 #名稱為Centos-7-x86_64 的虛擬機器
3.暫停/恢復虛擬機器
虛擬機器處於paused暫停狀態,一般情況下是被admin運行了virsh suspend才會處於這種狀態,但是仍然消耗資源,只不過不被超級管理程式排程而已。這種暫停狀態是將狀態儲存在記憶體中,重啟就沒了。
暫停
virsh suspend Centos-7-x86_64
恢復
virsh resume Centos-7-x86_64
4.儲存/恢復虛擬機器
這裡的儲存是將狀態儲存在磁碟上,重啟物理機,仍然可以恢復
儲存為/kvm/Centos7-x86_64.s1
virsh save Centos-7-x86_64 /kvm/Centos7-x86_64.s1
恢復
virsh restore /kvm/Centos7-x86_64.s1
5.強制關閉虛擬機器(約等於拔電源)、
virsh destroy Centos-7-x86_64
6.修改虛擬機器配置
virsh edit Centos-7-x86_64
7.刪除虛擬機器
virsh undefine Centos-7-x86_64
8.建立虛擬機器
create建立需要有xml檔案,我們可以通過修改現有的xml
virsh dumpxml Centos-7-x86_64 > /kvm/test.xml
修改/kvm/test.xml
<name>test</name>##修改虛擬機器名稱
<uuid>60368396-c0d4-495f-9bed-858196ed79e4</uuid> # 刪除此行
建立虛擬機器並啟動
virsh create /kvm/test.xml
9.連線虛擬機器終端
virsh console Centos-7-x86_64
會遇到卡住的問題
解決方法參考的文章是:https://www.linuxidc.com/Linux/2014-10/107891.htm
利用vnc進入虛擬機器執行
echo "ttyS0" >> /etc/securetty
在/etc/grub.conf檔案中為核心新增引數
console=ttyS0
然後重啟虛擬機器
就可以發現可以連線到終端了
這種方法在CentOS6可以用類似方法,如果是CentOS7還有一種更簡單的方法
只需要在虛擬機器裡執行
grubby --update-kernel=ALL --args="console=ttyS0"
然後重啟就可以了
參考文章:
官方文件: https://www.linux-kvm.org/page/Main_Page
https://www.ibm.com/developerworks/cn/linux/l-using-kvm/index.html
https://www.ibm.com/developerworks/cn/linux/l-linux-kvm/