什么是KVM
KVM是英文Kernel-based Virtual Machine的简称,是基于硬件辅助的开源虚拟化解决方法,其优点如下:
- 开源免费
- 架构简单
- 性能卓越
- 社区活跃
KVM架构
基本上又两大方便组成,KVM模块以及QENMU-KVM
模块:kvm.ko,kvm_intel.ko, kvm_amd.ko
qemu-kvm:通过修改qemu代码而得出的专门为管理和创建虚拟机的工具
/dev/kvm:linux系统下kvm提供驱动接口
硬件支持
我这里用的是虚拟机,为了使cpu支持虚拟化勾选了"虚拟化Intel VT-x/EPT或AMD-V/RVI(V)"
生产环境中我们使用的是真实物理服务器,一般是默认开启的,如果没有开启,则需要在BIOS中开启
系统环境
CentOS 7.2.1511
生产环境当中,一般配置虚拟机和宿主机的网络为桥接模式
我宿主机的物理网卡名称为eno33554984(VMnet1),可以看到我们上面还有一个NAT,那是我们专门用来上网的,真实服务器一张网卡就够了
我们需要创建一个共享的桥接网络设备
# vim /etc/sysconfig/network-scripts/ifcfg-eno33554984 TYPE=Ethernet BOOTPROTO=none DEFROUTE=yes PEERDNS=yes PEERROUTES=yes NAME=eno33554984 DEVICE=eno33554984 ONBOOT=yes BRIDGE=br0 # vim /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 ONBOOT=yes TYPE=Bridge BOOTPROTO=static IPADDR=192.168.88.1 PREFIX=24 GATEWAY=192.168.88.254 DNS1=114.114.114.114
SSH连接192.168.88.1进入系统
检查cpu是否支持虚拟机化,Intel支持的会带有vmx标志,AMD支持会带有svm标志
# grep -E '(vmx|svm)' /proc/cpuinfo
安装组件
# yum install -y qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install
创建一个10G的硬盘(给虚拟机用)
准备一个系统镜像
创建虚拟机
# mkdir /data/images # virt-install #命令(详细用法 virt-install --help) --name CentOS7.1_88.100 #虚拟机名字 --ram 1024 #分配内存大小 --cdrom=/data/CentOS-7-x86_64-Minimal-1511.iso #安装镜像 --disk path=/data/images/CentOS7.1_88.100.img,size=8 #8G的存储文件,虚拟机的硬盘 --network bridge=br0 #桥接到br0 --graphics vnc,listen=0.0.0.0 --noautoconsole #开启vnc
查看正在运行的虚拟机
我们可以发现开启了一个5900端口,我们可以使用VNC来连接这个端口,远程连接到虚拟机
我们可以看到已经进入到安装界面
按正常步骤安装,虚拟机只要分一个分区就可以了(阿里云也没有分交换分区,哈哈)
安装完成后重启
然而虚拟机并没有重启,只是关闭了
我们回到宿主机使用virsh list并没有看到在运行的虚拟机
这里我们可以使用virsh --list all查看所有的虚拟机,可以发现,它处于一个关闭状态
开启虚拟机
# virsh start CentOS7.1_88.100 # virsh shutdown CentOS7.1_88.100 这是关闭的命令
这样我们使用VNC就可以连接上去了,查看虚拟机网络
配置eth0的ip为192.168.88.100
重启虚拟机的网络服务
然后我们就可以使用ssh远程192.168.88.100了
当我创建第二台虚拟机,它的VNC连接端口是5901
虚拟主机管理
virsh undefine [主机名字]
我们创建虚拟机的时候可以配置好cpu、 内存、硬盘的配置(安装前规划是最好的)
然后,当我们创建好,配置已经无法满足需求了,我们可以编辑xml修改
virsh edit [主机名字], 修改完配置需要重启虚拟机才能生效
---修改cpu--- 需求:最大支持4个cpu,当前为1个 <vcpu placement='static'>1</vcpu> 改为 <vcpu placement='auto' current='1'>4</vcpu> 重启动虚拟主机 virsh shutdown [ 主机名字] virsh start [主机名字] 这样我们就可以支持cpu的热添加(centos7才支持),不支持热减少 当前我们的cpu只有1个,现在我们改为2个 virsh setvcpus [主机名字] 2 --live 然后我们可以在虚拟机中查看cpu有没有多出1 个,如果没有,我们需要把它激活生效 # cat /sys/devices/system/cpu/cpu0/online #1表示死激活状态 1 # cat /sys/devices/system/cpu/cpu0/online 1 ---修改内存-- 需求:最大支持3G内存,当前为1G内存 <memory unit='KiB'>1048576</memory> <currentMemory unit='KiB'>1048576</currentMemory> 改为 <memory unit='KiB'>3048576</memory> <currentMemory unit='KiB'>1048576</currentMemory> 重启虚拟机 内存支持热添加和减少 查看当前内存 virsh qemu-monitor-command [主机名字] --hmp --cmd info balloon balloon: actual=1024 改为800M virsh qemu-monitor-command [主机名字] --hmp --cmd balloon 800 改大为2G virsh qemu-monitor-command [主机名字] --hmp --cmd balloon 2048
使用存储池
存储池是一个本地目录、本地存储设备、网络文件系统或块级联网存储,可以使用libvirt管理它们,并且可在其中创建和存储一个或多个虚拟机镜像。本地存储很简单,但可能不灵活且不支持企业虚拟化的最关键需求:实时迁移
默认情况下,基于libvirt的命令使用虚拟化主机上的目录/va/lib/libvirt/images作为初始文件系统目录存储池
使用virsh pool-create-as命令轻松创建一个新的存储池(我预先在88.2配置了nfs服务)
第一个参数 (NFS-POOL) 指定新存储池的名称 第二个参数指定所创建的存储池类型 --source-host 选项的参数指定了通过 NFS 导出存储池目录的主机 --source-path 选项的参数指定该主机上导出的目录的名称 --target 选项的参数指定了访问存储池时所使用的本地挂载点
创建新存储池后,它将virsh pool-list命令的输出中列出
输出中,注意新存储池标记不会自动启动,表明系统重新启动后它不会自动启动,而且它没有持久化,表明在系统重新启动后绝对不会定义它。存储池仅在它们受其XML描述支持时才能持久化,该XML描述位于目录/etc/libvirt/storage中。XML存储池描述文件名与它们相关联的存储池名称相同,但是扩展名是.xml.
要为手动定义的存储池创建xml描述文件,可以使用virsh pool-dumpxml命令指定一个池名称,将其XML描述转储为一个最终参数。此命令写入到标准输出,所以需要将它的输出重定向到合适的文件中。例如,以下命令将之前创建的NFS-POOL存储池创建正确的XML描述文件
即使将存储池持久化后,该池也不会标记为在重新启动虚拟化主机时自动启动。可使用virsh pool-autostart命令后跟一个存储池名称来将存储池设置为自动启动
将存储池标记为自动启动,意味着存储池将在虚拟化主机重新启动时可用。在技术上,它意味着/etc/libvirt/storage/autostart目录包含该存储池xml描述的一个符号链接
创建存储池后,可在该池内创建一个或多个虚拟机
每次都报这种错误
后来改了下nfs的配置
然后成功创建了虚拟机