學習筆記-KVM虛擬化
虛擬化的分類
全虛擬化,半虛擬化
全虛擬化代表KVM,靠硬件來實現的
半虛擬化代表:XEN(它支持全虛擬化和半虛擬化)
KVM是硬件虛擬化,準確的說就是一個Linux的模塊,模塊是內核態的,不需要安裝,只要加載,頂多提供一個cpu和內存,但我們創建的機器還有別的東西(網卡,USB等等),所以要借助QEMU,QEMU本身是一個虛擬機程序(它本身就能做虛擬機),還比較全,模擬CPU內存都能幹,支持異構,性能很好。
KVM需要CPU中虛擬化功能的支持,只可在具有虛擬化支持的CPU上運行,即具有VT功能的intel CPU和具有AMD-V功能的AMD cpu。
Vmware中選擇:
嵌套虛擬化vmware是可以的
檢測是否支持虛擬化:
[root@linux_node1 ~]# grep -E "(vmx|svm)" /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc up arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm ida arat epb xsaveopt pln pts dts tpr_shadow vnmi ept vpid fsgsbase bmi1 avx2 smep bmi2 invpcid
出現內容說明它支持虛擬化
vmx inter的標誌
svm amd的標誌
Centos6及以後的就不用裝KVM的模塊了
為了減少不必要的麻煩,請關閉防火墻和SELinux,下面宿主機的主機名為linux-node1,創建的虛擬機的主機名為localhost
安裝管理工具:
Centos6:
[root@linux-node1 ~]# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt -y
Centos7:
[root@localhost ~]# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install -y
啟動libvirtd:
[root@linux_node1 ~]# /etc/init.d/libvirtd start Starting libvirtd daemon: [ OK ]
之後會多一個網橋:
virbr0 Link encap:Ethernet HWaddr 52:54:00:23:A6:55 inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Iptables上也會寫上橋接網卡相關的規則,假如你自己關閉了iptables,它會自動把你的iptables打開.
創建一臺虛擬機:(首先你要準備一個虛擬機的鏡像,其次你要準備一個虛擬機的硬盤)
創建一個硬盤:
[root@linux_node1 ~]# qemu-img create -f raw /opt/CentOS-6.6-x86_64.raw 5G Formatting ‘/opt/CentOS-6.6-x86_64.raw‘, fmt=raw size=5368709120
-f 指定鏡像的格式
[root@linux_node1 ~]# qemu-img info /opt/CentOS-6.6-x86_64.raw image: /opt/CentOS-6.6-x86_64.raw file format: raw virtual size: 5.0G (5368709120 bytes) disk size: 0
[root@linux_node1 ~]# dd if=/dev/cdrom of=/opt/CentOS-6.6-x86_64.iso 8726528+0 records in 8726528+0 records out 4467982336 bytes (4.5 GB) copied, 164.523 s, 27.2 MB/s
生成一臺虛擬機:
[root@linux_node1 ~]# virt-install --virt-type kvm --name CentOS-6.6-x86_64 --ram 512 --cdrom=/opt/CentOS-6.6-x86_64.iso --disk path=/opt/CentOS-6.6-x86_64.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=rhel6
Starting install...
Creating domain... | 0 B 00:00
Domain installation still in progress. You can reconnect to
the console to complete the installation process.
這些參數--help都可以看到
--name 名稱
--virt-type虛擬機類型
--ram內存大小
--cdrom鏡像(光盤)
--disk硬盤 後接路徑
--network網卡(默認)
-graphics圖形
--noautoconsole不讓它自動打開console端口,因為我們要vnc連接上去
用TightVNC Viewer連接,ip地址為原主機的ip地址,端口5900,連不上的話看一下防火墻
安裝系統,安裝完之後重啟操作系統,vnc客戶端自動退出
如果沒有安裝上(就是各種原因比如磁盤空間不夠,這裏會有你的名字,你下次安裝的話,要把原來的名字取消定義)
[root@linux_node1 ~]# virsh undefine CentOS-6.6-x86_64
查看當前虛擬機的狀態
virsh(這個是libvirt的工具而已)
[root@linux_node1 ~]# virsh list --all Id Name State ---------------------------------------------------- - CentOS-6.6-x86_64 shut off
virsh list 只查看正在運行的
啟動虛擬機:
[root@linux_node1 ~]# virsh start CentOS-6.6-x86_64 Domain CentOS-6.6-x86_64 started
[root@linux_node1 ~]# cd /etc/libvirt/qemu [root@linux_node1 qemu]# ll total 8 -rw------- 1 root root 3061 Feb 13 14:03 CentOS-6.6-x86_64.xml drwx------ 3 root root 4096 Feb 13 13:00 networks
編輯虛擬機,實際上就是編輯他的xml,直接改這個xml重啟也不會生效的,要用下面這個命令
[root@linux_node1 qemu]# virsh edit CentOS-6.6-x86_64
這裏創建的虛擬機的網絡類型有三種:NAT,橋接,內部,(默認是NAT的能上外網,假如你不能用在創建的虛擬機裏面執行dhclient命令,能ping的通防火墻裏面有nat規則,就是讓他上網的,能連得到外網,但是別人連不上它,大多數情況我們用橋接的 )
在宿主機上執行:
[root@linux_node1 ~]# ifconfig ... virbr0 Link encap:Ethernet HWaddr 52:54:00:23:A6:55 inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:14 errors:0 dropped:0 overruns:0 frame:0 TX packets:11 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1332 (1.3 KiB) TX bytes:1395 (1.3 KiB) vnet0 Link encap:Ethernet HWaddr FE:54:00:27:38:F7 inet6 addr: fe80::fc54:ff:fe27:38f7/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:15 errors:0 dropped:0 overruns:0 frame:0 TX packets:775 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:1630 (1.5 KiB) TX bytes:41279 (40.3 KiB)
vnet0就是虛擬機的網卡,連接到網橋的virbr0的端口上,這個網橋大家可以想象成是一臺交換機往上插端口
但是現在外面的是ping不通裏面的虛擬機的,要改成橋接的才可以
[root@linux_node1 ~]# brctl addbr br0 #創建一個橋接網卡br0 [root@linux_node1 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000000000000 no virbr0 8000.52540023a655 yes virbr0-nic vnet #把這個網橋加到宿主機的eth0上 [root@linux_node1 ~]# brctl addif br0 eth0 #這時候你的securecrt就連不上了,這時候到你的vmware中操作,要避免這樣的話,把下面的命令寫成一條命令執行就可以了 #把宿主機裏面的eth0的IP地址幹掉: [root@linux_node1 ~]# ip addr del dev eth0 192.168.229.130/24 [root@linux_node1 ~]# ifconfig br0 192.168.229.130/24 up #這樣執行就可以了 [root@linux_node1 ~]# brctl addif br0 eth0 && ip addr del dev eth0 192.168.229.130/24 && ifconfig br0 192.168.229.130/24 up #這裏幹的事就是以後openstack幹的事 #現在我的宿主機是不能上網的
關閉正在運行的虛擬機
[root@linux_node1 ~]# virsh list --all
Id Name State
----------------------------------------------------
2 CentOS-6.6-x86_64 running
[root@linux_node1 ~]# virsh shutdown CentOS-6.6-x86_64 # 優雅的關閉,需要一會時間
Domain CentOS-6.6-x86_64 is being shutdown
[root@linux_node1 ~]# virsh list --all
Id Name State
----------------------------------------------------
2 CentOS-6.6-x86_64 running
[root@linux_node1 ~]# virsh destroy CentOS-6.6-x86_64 # 相當於直接關電源
Domain CentOS-6.6-x86_64 destroyed
[root@linux_node1 ~]# virsh edit CentOS-6.6-x86_64
52 <interface type=‘bridge‘>
53 <mac address=‘52:54:00:27:38:f7‘/>
54 <source bridge=‘br0‘/>
55 <model type=‘virtio‘/>
56 <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x03‘ function=‘0x0‘/>
57 </interface>
[root@linux_node1 ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29df66a0 no eth1
vnet0
virbr0 8000.52540023a655 yes virbr0-nic
虛擬機裏面可以ping通www.baidu.com
eth0的ip地址與宿主機的IP地址在同一個局域網內
這裏解決宿主機不能上網:
[root@linux_node1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.229.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
[root@linux_node1 ~]# route add default gw 192.168.229.2
CentOS7的KVM很多新特性,CPU的熱添加,內存熱添加,大頁內存在Centos7默認是開啟的
要想實現cpu的熱添加,必須要該虛擬機的xml裏面的最大值要改大一點,不能和你當前值一樣,這樣才能實現熱添加
下面是CentOS7裏面生成的虛擬機
[root@linux-node1 ~]# virsh edit CentOS-7.4-x86_64
將
<vcpu placement=‘static‘>1</vcpu>
改成:
<vcpu placement=‘auto‘ current=‘1‘>4</vcpu>
# 最大支持4個CPU當前是1個
要重啟才能生效的,當然你創建虛擬機的時候是可以指定相應的參數,達到這樣的效果
[root@linux-node1 ~]# virsh shutdown CentOS-7.4-x86_64
Domain CentOS-7.4-x86_64 is being shutdown
[root@linux-node1 ~]# virsh start CentOS-7.4-x86_64
Domain CentOS-7.4-x86_64 started
現在可以CPU的熱添加了
進入虛擬機查看
[root@localhost ~]# cat /proc/cpuinfo |grep processor
processor : 0
[root@linux-node1 ~]# virsh setvcpus CentOS-7.4-x86_64 2 --live
# 該命令在宿主機上執行
[root@localhost ~]# cat /proc/cpuinfo |grep processor
processor : 0
processor : 1
如果沒有出現兩個,執行
[root@localhost ~]# echo "1" /sys/devices/system/cpu/cpu1/online
cpu只支持熱添加不支持熱刪除,總數不能超過最大CPU。
[root@linux-node1 ~]# virsh setvcpus CentOS-7.4-x86_64 1 --live
error: unsupported configuration: failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count
[root@linux-node1 ~]# virsh setvcpus CentOS-7.4-x86_64 5 --live
error: invalid argument: requested vcpus is greater than max allowable vcpus for the live domain: 5 > 4
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 992 118 756 6 117 729
Swap: 1999 0 1999
# 宿主機上操作,配置內存的最大值,方便膨脹與收縮
[root@linux-node1 ~]# virsh edit CentOS-7.4-x86_64
將
<memory unit=‘KiB‘>1048576</memory>
<currentMemory unit=‘KiB‘>1048576</currentMemory>
改成
<memory unit=‘KiB‘>4048576</memory>
<currentMemory unit=‘KiB‘>1048576</currentMemory>
[root@linux-node1 ~]# virsh shutdown CentOS-7.4-x86_64
Domain CentOS-7.4-x86_64 is being shutdown
[root@linux-node1 ~]# virsh start CentOS-7.4-x86_64
Domain CentOS-7.4-x86_64 started
[root@localhost ~]# free -m # 現在只有720M了
total used free shared buff/cache available
Mem: 720 139 392 8 188 353
Swap: 1999 0 1999
[root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.4-x86_64 --hmp info balloon
balloon: actual=1024
改變內存的大小(不能超過最大內存):
# 宿主機上操作
[root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.4-x86_64 --hmp --cmd balloon 2000 # 設置當前的虛擬機的內存為2000M
[root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.4-x86_64 --hmp info balloon # 查看當前虛擬機的內存
balloon: actual=2000
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 1696 140 1368 8 188 1329
Swap: 1999 0 1999
# 宿主機上操作
[root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.4-x86_64 --hmp --cmd balloon 600
[root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.4-x86_64 --hmp info balloon
balloon: actual=600
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 296 128 110 6 57 7
Swap: 1999 11 1988
Kvm的存儲:
#硬盤:
全鏡像模式 稀疏模式
代表raw qcow2
qemu-img
raw 格式你給他設置多大,他就占多大,性能最優,非常方便的轉成其他格式
qcow2格式支持壓縮,快照,用多少占多少(openstack首選)
學習筆記-KVM虛擬化