1. 程式人生 > >學習筆記-KVM虛擬化

學習筆記-KVM虛擬化

fault 執行 4.5 ado cow 名稱 也會 qemu-kvm inet6

虛擬化的分類

  全虛擬化,半虛擬化

全虛擬化代表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虛擬化