学习笔记-KVM虚拟化

Posted jdilong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记-KVM虚拟化相关的知识,希望对你有一定的参考价值。

虚拟化的分类

  全虚拟化,半虚拟化

全虚拟化代表KVM,靠硬件来实现的

半虚拟化代表:XEN(它支持全虚拟化和半虚拟化)

 

KVM是硬件虚拟化,准确的说就是一个Linux的模块,模块是内核态的,不需要安装,只要加载,顶多提供一个cpu和内存,但我们创建的机器还有别的东西(网卡,USB等等),所以要借助QEMU,QEMU本身是一个虚拟机程序(它本身就能做虚拟机),还比较全,模拟CPU内存都能干,支持异构,性能很好。

 

KVM需要CPU中虚拟化功能的支持,只可在具有虚拟化支持的CPU上运行,即具有VT功能的intel CPU和具有AMD-V功能的AMD cpu。

 

Vmware中选择:

技术分享图片

 

嵌套虚拟化vmware是可以的

 

检测是否支持虚拟化:

[[email protected]_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:

[[email protected] ~]# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt -y

Centos7:

[[email protected] ~]# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install -y

 

启动libvirtd: 

[[email protected]_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打开.

创建一台虚拟机:(首先你要准备一个虚拟机的镜像,其次你要准备一个虚拟机的硬盘)

  创建一个硬盘:

[[email protected]_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 指定镜像的格式

[[email protected]_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

  

[[email protected]_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

  

生成一台虚拟机:

[[email protected]_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客户端自动退出

 

如果没有安装上(就是各种原因比如磁盘空间不够,这里会有你的名字,你下次安装的话,要把原来的名字取消定义)

[[email protected]_node1 ~]# virsh undefine CentOS-6.6-x86_64

 

查看当前虚拟机的状态

virsh(这个是libvirt的工具而已)

 

[[email protected]_node1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     CentOS-6.6-x86_64              shut off

virsh list 只查看正在运行的

 

启动虚拟机:

[[email protected]_node1 ~]# virsh start CentOS-6.6-x86_64
Domain CentOS-6.6-x86_64 started

  

[[email protected]_node1 ~]# cd /etc/libvirt/qemu
[[email protected]_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重启也不会生效的,要用下面这个命令

[[email protected]_node1 qemu]# virsh edit CentOS-6.6-x86_64

  

 

这里创建的虚拟机的网络类型有三种:NAT,桥接,内部,(默认是NAT的能上外网,假如你不能用在创建的虚拟机里面执行dhclient命令,能ping的通防火墙里面有nat规则,就是让他上网的,能连得到外网,但是别人连不上它,大多数情况我们用桥接的 )

 

在宿主机上执行:

[[email protected]_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不通里面的虚拟机的,要改成桥接的才可以

 

[[email protected]_node1 ~]# brctl addbr br0 #创建一个桥接网卡br0
[[email protected]_node1 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000000000000       no
virbr0          8000.52540023a655       yes             virbr0-nic
                                                        vnet

#把这个网桥加到宿主机的eth0上
[[email protected]_node1 ~]# brctl addif br0 eth0
#这时候你的securecrt就连不上了,这时候到你的vmware中操作,要避免这样的话,把下面的命令写成一条命令执行就可以了
#把宿主机里面的eth0的IP地址干掉:
[[email protected]_node1 ~]# ip addr del dev eth0 192.168.229.130/24
[[email protected]_node1 ~]# ifconfig br0 192.168.229.130/24 up

#这样执行就可以了
[[email protected]_node1 ~]# brctl addif br0 eth0 && ip addr del dev eth0 192.168.229.130/24 && ifconfig br0 192.168.229.130/24 up   
#这里干的事就是以后openstack干的事
#现在我的宿主机是不能上网的

  

关闭正在运行的虚拟机

  

[[email protected]_node1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 2     CentOS-6.6-x86_64              running

[[email protected]_node1 ~]# virsh shutdown CentOS-6.6-x86_64  # 优雅的关闭,需要一会时间
Domain CentOS-6.6-x86_64 is being shutdown

[[email protected]_node1 ~]# virsh list --all                 
 Id    Name                           State
----------------------------------------------------
 2     CentOS-6.6-x86_64              running

[[email protected]_node1 ~]# virsh destroy CentOS-6.6-x86_64  # 相当于直接关电源
Domain CentOS-6.6-x86_64 destroyed

 

 

    [[email protected]_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>

 

[[email protected]_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地址在同一个局域网内

 

这里解决宿主机不能上网:

[[email protected]_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
[[email protected]_node1 ~]# route add default gw 192.168.229.2

 

 

CentOS7的KVM很多新特性,CPU的热添加,内存热添加,大页内存在Centos7默认是开启的

 

要想实现cpu的热添加,必须要该虚拟机的xml里面的最大值要改大一点,不能和你当前值一样,这样才能实现热添加

下面是CentOS7里面生成的虚拟机

[[email protected] ~]# virsh edit CentOS-7.4-x86_64
将
<vcpu placement=‘static‘>1</vcpu>
改成:
<vcpu placement=‘auto‘ current=‘1‘>4</vcpu>
# 最大支持4个CPU当前是1个

要重启才能生效的,当然你创建虚拟机的时候是可以指定相应的参数,达到这样的效果

[[email protected] ~]# virsh shutdown CentOS-7.4-x86_64 
Domain CentOS-7.4-x86_64 is being shutdown
[[email protected] ~]# virsh start CentOS-7.4-x86_64         
Domain CentOS-7.4-x86_64 started

 

现在可以CPU的热添加了

进入虚拟机查看

[[email protected] ~]# cat /proc/cpuinfo |grep processor
processor       : 0

[[email protected] ~]# virsh setvcpus CentOS-7.4-x86_64 2 --live
# 该命令在宿主机上执行

[[email protected] ~]# cat /proc/cpuinfo |grep processor
processor       : 0
processor       : 1

如果没有出现两个,执行

[[email protected] ~]# echo "1" /sys/devices/system/cpu/cpu1/online

cpu只支持热添加不支持热删除,总数不能超过最大CPU。

[[email protected] ~]# 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

[[email protected] ~]# 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

 

 

  
[[email protected] ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            992         118         756           6         117         729
Swap:          1999           0        1999


# 宿主机上操作,配置内存的最大值,方便膨胀与收缩
[[email protected] ~]# 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>
[[email protected] ~]# virsh shutdown CentOS-7.4-x86_64
Domain CentOS-7.4-x86_64 is being shutdown
[[email protected] ~]# virsh start CentOS-7.4-x86_64   
Domain CentOS-7.4-x86_64 started


[[email protected] ~]# free -m   # 现在只有720M了
              total        used        free      shared  buff/cache   available
Mem:            720         139         392           8         188         353
Swap:          1999           0        1999
[[email protected] ~]#  virsh qemu-monitor-command CentOS-7.4-x86_64 --hmp  info  balloon 
balloon: actual=1024

 

 

 改变内存的大小(不能超过最大内存):

# 宿主机上操作
[[email protected] ~]# virsh qemu-monitor-command CentOS-7.4-x86_64 --hmp  --cmd   balloon 2000 # 设置当前的虚拟机的内存为2000M
[[email protected] ~]# virsh qemu-monitor-command CentOS-7.4-x86_64 --hmp  info  balloon      # 查看当前虚拟机的内存
balloon: actual=2000


[[email protected] ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1696         140        1368           8         188        1329
Swap:          1999           0        1999


# 宿主机上操作

[[email protected]ux-node1 ~]#  virsh qemu-monitor-command CentOS-7.4-x86_64 --hmp  --cmd   balloon 600
[[email protected] ~]#  virsh qemu-monitor-command CentOS-7.4-x86_64 --hmp  info  balloon     
balloon: actual=600


[[email protected] ~]# 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虚拟化的主要内容,如果未能解决你的问题,请参考以下文章

kvm虚拟化学习笔记(十八)之ESXi到KVM之v2v迁移

KVM虚拟化系统学习笔记

OpenStack学习笔记----安装虚拟化工具

kvm学习笔记(一,基础概念)

KVM虚拟化知识的一些笔记

kvm学习笔记