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