一、什么是虛擬化
虛擬化是一個廣義的術語,在計算機方面通常是指計算元件在虛擬的基礎上而不是真實的基礎上運行。虛擬化技術可以擴大硬件的容量,簡化軟件的重新配置過程。
二、虛擬化能做什么
CPU的虛擬化技術可以單CPU模擬多CPU并行,允許一個平臺同時運行多個操作系統,并且應用程序都可以在相互獨立的空間內運行而互不影響,從而顯著提高計算機的工作效率。
三、虛擬化分類
虛擬化可分為兩類,完全虛擬化(full virtualization)和半虛擬化(paravirtualization)。
完全虛擬化(full virtualization):完全虛擬化是一種虛擬化技術用于提供一種虛擬機環境,即一個完整的底層硬件仿真。完全虛擬化要求每個硬件的顯著特征被映射到每一個虛擬機上。在虛擬機(VM)和硬件之間之間增加一個軟件層–Hypervisor,實現虛擬機管理。工作與完全虛擬化的虛擬機不知道有hypervisor的存在。
半虛擬化(paravirtualization):半虛擬化是一種虛擬化技術,提出了一種虛擬機軟件界面相似,但不完全相同的底層硬件。宿主計算機操作系統需要支持para-API,并通過virtual machine monitor (VMM)管理。也就是讓虛擬機明確知道自己工作在虛擬環境中。
其中,hypervisor 可以劃分為兩大類。
類型 1,這種 hypervisor 是直接運行在物理硬件之上的,例如:vmware vsphere, kvm等。
類型 2,這種 hypervisor 運行在另一個操作系統(運行在物理硬件之上)中,例如:VMware workstation, xen(hvm)等。
除此之外,還有以下虛擬化分類:
用戶空間虛擬化(容器)擁有獨立的文件樹和進程樹于獨立的名字空間中,容器間可通信??纱虬鏷ttpd, tomcat
服務于一個文件中,利于快速部署。
docker是容器的一種易于快速部署的方式,kvm+docker是流行的部署方式。
docker的其他實現方式:lxc, openvz, solaris containers, FreeBSD jails
庫虛擬化:
WINE,Cywin
應用程序虛擬化:
jvm, pvm
四、KVM的相關術語
KVM (名稱來自英語: Kernel-basedVirtual Machine 的縮寫,即基于內核的虛擬機),是一種用于Linux內核中
的虛擬化基礎設施,可以將Linux內核轉化為一個hypervisor。KVM在2007年2月被導入Linux 2.6.20核心中,以
加載核心模塊的方式被移植到FreeBSD及illumos上。
KVM必須在在具備硬件支持的Intel VT或AMD-V功能的平臺上運行。
KVM安裝后,宿主機(HOST)的kernel變為hypervisor。原有操作系統變為domain 0,提供控制臺和I/O管理。KVM虛擬機可直接通過原kernel的kvm模塊調用宿主機的cpu和
內存,I/O部分則需要先到domain0,再到宿主硬件設備。
運行模式如下:
內核模式:GuestOS執行I/O類操作;
用戶模式:代表GuestOS請求I/O類操作;
來賓模式:GuestOS的非I/O類操作;
kvm hypervisor:安裝過KVM的kernel;
兩類組件:
/dev/kvm:字符設備文件,工作于hypervisor,主要用于創建VM、為VM分配內存、讀寫VCPU的寄存器、向VCPU注入中斷、運行VCPU等等;
qemu進程:工作于用戶空間,主要用于實現模擬PC機的IO設備;
QEMU主要提供以下功能:
五、安裝KVM
在正式安裝之前,我們先來看看這張kmv和各管理工具的關系圖。
QUME的主要功能:
處理器模擬器
仿真IO設備
關聯模擬的設備至真實設備;
調試器
與模擬器交互的用戶接口
qemu:kmv的文本管理工具,包括qemu-kvm、qemu-img
libvirt:是一套免費、開源的支持Linux下主流虛擬化工具的C函數庫,libvirtd是運行的守護進程的名稱。包括GUI: virt-manager, virt-viewer,CLI: virt-install, virsh
安裝步驟:
(1) 確保CPU支持HVM
# grep -E –color=auto "(vmx|svm)" /proc/cpuinfo
(2) 裝載模塊
# modprobe kvm
# lsmod | grep kvm
(3)驗證
ls -l /dev/kvm
(4)安裝libvirt
yum install libvirt -y
(5)安裝其他管理組件
yum install -y virt-manager virt-viewer virt-install
# yum install -y qemu-kvm
(6)啟動libvirtd守護進程
systemctl start libvirtd
驗證:ifconfig多了virbr0虛擬網橋(只能是nat模式)
[root@localhost ~]# ifconfig
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:57:1a:76 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
(7)啟動virt tui
# virt-manager
ps aux
root 14996 13.9 8.7 1197240 87980 ? Ssl 23:41 0:01 /usr/bin/python2 /usr/share/virt-manager/virt-manager
使用virsh測試各命令及創建虛擬機
1. 獲取各命令幫助
virsh help KEYWORD
#virsh help list
2. 查看域,–all選項可查看關機的虛擬機域,域id每次開關機后可能不一樣
root@localhost ~]# virsh list –all
Id Name State
—————————————————-
– debian8 shut off
3. 查看虛擬機配置文件
注意為xml格式,可以到處到某處查看或以此為模板創建其他虛擬機
虛擬機以域(domain)為單位創建
# virsh dumpxml debian8 > /tmp/mytemplate.xml
4. 創建域
create
virsh create <file> [–console] [–paused] [–autodestroy] [–pass-fds <string>] [–validate]
[–file] <string> file containing an XML domain description
–console attach to console after creation
–paused leave the guest paused after creation
–autodestroy automatically destroy the guest when virsh disconnects
–pass-fds <string> pass file descriptors N,M,… to the guest
–validate validate the XML against the schema
5. 獲取域id
[root@localhost ~]# virsh domid debian8
3
6. 獲取域uuid
[root@localhost ~]# virsh domuuid debian8
9332c5a4-4abc-4e7f-bec0-faf394950a55
7. 獲取域信息
[root@localhost ~]# virsh dominfo debian8
Id: 3
Name: debian8
UUID: 9332c5a4-4abc-4e7f-bec0-faf394950a55
OS Type: hvm
State: running
CPU(s): 2
CPU time: 428.6s
Max memory: 1047552 KiB
Used memory: 1047552 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
Security label: system_u:system_r:svirt_t:s0:c327,c602 (enforcing)
8. 登錄虛擬機控制臺
[root@localhost ~]# virsh console debian8
Connected to domain debian8
Escape character is ^]
使用ctrl+],退出console
9. 開啟域
[root@localhost ~]# virsh start debian8
Domain debian8 started
10. 重啟域
reboot
11. 關閉域
destory
shutdown
12. 刪除域
undefine
13. 暫停域并保存域狀態至某文件中
# virsh save debian8 /tmp/debian_save1 –running
–running 下次恢復,直接啟動
14. 從保存文件中恢復域
# virsh restore /tmp/debian_save1
管理域的命令:
15. 改變內存大小
不能超出預設值,只能調小,可以當前生效,也可以下次生效
# virsh setmem debian8 786m –current
[root@localhost ~]# virsh dominfo debian8
Id: 5
Name: debian8
UUID: 9332c5a4-4abc-4e7f-bec0-faf394950a55
OS Type: hvm
State: running
CPU(s): 2
CPU time: 1471.5s
Max memory: 1047552 KiB
Used memory: 804864 KiB #此處為改過的值
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
Security label: system_u:system_r:svirt_t:s0:c470,c985 (enforcing)
[root@localhost ~]# free -mh
total used free shared buff/cache available
Mem: 977M 741M 73M 4.2M 162M 64M
Swap: 1.9G 1.1G 827M
16. 設定內存最大內存
運行中的域不能修改最大內存值
[root@localhost ~]# virsh setmaxmem debian8 900m –config
下次啟動有效
17. 設定vcpu數量
# virsh setvcpus debian8 1 –config
不能實時改,下次啟動有效
18. 獲取vcpu信息
[root@localhost ~]# virsh vcpuinfo debian8
VCPU: 0 #vcpu
CPU: 0 #在宿主機cpu位置
State: running
CPU time: 675.5s
CPU Affinity: yyyy
VCPU: 1
CPU: 1
State: running
CPU time: 694.2s
CPU Affinity: yyyy
19. 獲取域網絡接口信息
[root@localhost ~]# virsh domiflist debian8
Interface Type Source Model MAC
——————————————————-
vnet0 network default virtio 52:54:00:82:53:a2
20. 獲取域的接口統計信息
[root@localhost ~]# virsh domifstat debian8 vnet0
vnet0 rx_bytes 197810
vnet0 rx_packets 3755
vnet0 rx_errs 0
vnet0 rx_drop 0
vnet0 tx_bytes 13400
vnet0 tx_packets 111
vnet0 tx_errs 0
vnet0 tx_drop 0
21. 獲取域塊設備信息
[root@localhost ~]# virsh domblklist debian8
Target Source
————————————————
vda /var/lib/libvirt/images/debian8.qcow2
hda –
22. 獲取域塊設備(存儲)統計信息
[root@localhost ~]# virsh domblkstat debian8
rd_req 21908
rd_bytes 670065746
wr_req 1105
wr_bytes 29772800
flush_operations 229
rd_total_times 97947369758
wr_total_times 60546346501
flush_total_times 1534616225
創建及管理磁盤:
23. 創建磁盤
[root@localhost ~]# qemu-img create -f qcow2 -o preallocation=metadata /tmp/test.qcow2 120G 稀疏格式
Formatting '/tmp/test.qcow2', fmt=qcow2 size=128849018880 encryption=off cluster_size=65536 preallocation='metadata' lazy_refcounts=off
[root@localhost ~]# du -lh /tmp/test.qcow2
19M /tmp/test.qcow2
[root@localhost ~]# ll -lh /tmp/test.qcow2
-rw-r–r–. 1 root root 121G Jan 12 13:53 /tmp/test.qcow2
24. 增加磁盤大小
[root@localhost ~]# qemu-img resize /tmp/test.qcow2 150G
Image resized.
[root@localhost ~]# ll -h /tmp/test.qcow2
-rw-r–r–. 1 root root 121G Jan 12 13:57 /tmp/test.qcow2
[root@localhost ~]# du -lh /tmp/test.qcow2
19M /tmp/test.qcow2
25. 附加磁盤到域
# qemu-img create -f qcow2 -o preallocation=metadata /tmp/mytest.img 20G
[root@localhost ~]# virsh attach-disk debian8 /tmp/mytest.img vdb
Disk attached successfully
26. 拆除磁盤
[root@localhost ~]# virsh detach-disk debian8 vdb
Disk detached successfully
網卡管理
網橋查看命令
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.525400571a76 yes virbr0-nic
vnet0
27.添加域網卡到宿主機橋上
[root@localhost ~]# virsh attach-interface debian8 bridge virbr0 為宿主機nat網橋
Interface attached successfully
[root@localhost ~]# virsh domiflist debian8
Interface Type Source Model MAC
——————————————————-
vnet0 network default virtio 52:54:00:82:53:a2
vnet1 bridge virbr0 rtl8139 52:54:00:ca:04:d3
vnet2 bridge br0 rtl8139 52:54:00:89:3b:1d
28. 刪除域網卡
[root@localhost ~]# virsh detach-interface debian8 bridge –mac 52:54:00:89:3b:1d
Interface detached successfully
使用qemu命令手動創建虛擬機
qemu-kvm為創建工具
原創文章,作者:allen,如若轉載,請注明出處:http://www.www58058.com/66897