虚拟化的分类
全虚拟化,半虚拟化
全虚拟化代表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首选)