多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# kvm简绍 KVM 全称是 基于内核的虚拟机(Kernel-basedVirtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor: * 它由 Quramnet 开发,该公司于 2008年被 Red Hat 收购。 * 它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。 * 它从 Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。 * 它需要支持虚拟化扩展的 CPU。 * 它是完全开源的。 (1)KVM特性 嵌入到Linux正式Kernel(提高兼容性),代码级资源调用(提高性能),虚拟机就是一个进程(内存易于管理) (2)KVM虚拟化架构 ![1.20](http://oxysobnip.bkt.clouddn.com/1.20.png) (3)KVM CPU性能优化 * 一个 KVM 虚机即一个 Linux qemu-kvm 进程,与其他Linux 进程一样被Linux 进程调度器调度。 * KVM 虚机包括虚拟内存、虚拟CPU和虚机 I/O设备,其中,内存和 CPU 的虚拟化由 KVM 内核模块负责实现,I/O 设备的虚拟化由 QEMU 负责实现。 * KVM户机系统的内存是 qumu-kvm 进程的地址空间的一部分。 * KVM 虚机的 vCPU 作为 线程运行在 qemu-kvm 进程的上下文中。 CPU虚拟化 ![1.21](http://oxysobnip.bkt.clouddn.com/1.21.png) # KVM安装 ## 检查主机是否支持虚拟化 打开您的虚拟机的虚拟化引擎 ![1.22](http://oxysobnip.bkt.clouddn.com/1.22.png) <pre> egrep -c '(vmx|svm)' /proc/cpuinfo </pre> 命令结果大于0表示cpu支持虚拟化 ![1.23](http://oxysobnip.bkt.clouddn.com/1.23.png) 最好关闭防火墙和关闭selinux <pre> systemctl stop firewalld systemctl disable firewalld vim /etc/selinux/config 将enforcing改为disabled </pre> ## 配置本地yum源 替换CentOS默认源,默认生产环境上不了外网,所以你得想办法用自己的内部Yum源,如果没有,需要搭建一个。让系统上网,然后运行下面命令: <pre> cd /etc/yum.repos.d rm -rf * wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo </pre> 在我的实验环境中我已经搭好了本地yum源,在这里我直接使用本地yum源,下面是我的yum配置文件 ![1.24](http://oxysobnip.bkt.clouddn.com/1.24.png) ## 安装kvm以及相应的依赖包 安装依赖包 <pre> yum -y groupinstall "Virtualization Host" yum -y install virt-{install,viewer,manager} </pre> 相关组件介绍 【1】libvirt:操作和管理KVM虚机的虚拟化 API,使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等 Hypervisor。 【2】Virsh:基于 libvirt 的 命令行工具 (CLI) 【3】Virt-Manager:基于 libvirt 的 GUI 工具 kvm内核模块 ![1.25](http://oxysobnip.bkt.clouddn.com/1.25.png) ## 配置网卡为桥接模式 <pre> cd /etc/sysconfig/network-scripts/ cp ifcfg-eno16777736 ifcfg-br0 </pre> 我的配置文件 <pre> [root@kvm network-scripts]# cat ifcfg-eno16777736 TYPE="Ethernet" DEVICE="eno16777736" NAME="eno16777736" BRIDGE=br0 [root@kvm network-scripts]# cat ifcfg-br0 TYPE=Bridge NAME=br0 DEVICE=br0 IPADDR=172.31.129.95 NETMASK=255.255.255.0 GATEWAY=172.31.129.254 </pre> ## 创建虚拟机硬盘 <pre> qemu-img create -f qcow2 /mnt/vm-test/iso/centos-7.2.qcow2 10G chown qemu:qemu /mnt/vm-test/iso/centos-7.2.qcow2 -R </pre> ## 创建虚拟机 <pre> [root@kvm iso]# virt-install --virt-type kvm --name centos-7.2 --ram 512 \ # name 是自己取得 > --vcpus 1 \ #指定cpu核数 > --cdrom=CentOS-7-x86_64-DVD-1511.iso \ #指定镜像 > --disk centos-7.2.qcow2,format=qcow2 \ #disk参数为上面创建的磁盘 > --network network=default \ #网络设置为默认网络(NAT) > --graphics vnc,listen=0.0.0.0 --noautoconsole \ #运行所有网段远程,远程方式采用vnc > --os-type=linux --os-variant=rhel7 #指定系统类型 </pre> 桥接网卡位置 <pre> virt-install --virt-type kvm --name centos-7.2 --ram 512 --vcpus 1 --cdrom=CentOS-7-x86_64-DVD-1511.iso --disk centos7.2.qcow2,format=qcow2 --network bridge=virbr0 --vnc --vncport=5910 --vnclisten=0.0.0.0 --os-type=linux --os-variant=rhel7 </pre> ## 远程虚拟机 查看端口:netstat –natp ![1.26](http://oxysobnip.bkt.clouddn.com/1.26.png) 在vnc输入172.31.129.95:5900即可远程虚拟机 # KVM命令介绍 ## virsh virsh:虚拟化交互式终端 ![1.27](http://oxysobnip.bkt.clouddn.com/1.27.png) * virsh list # 显示本地活动虚拟机 * virsh start kvm_name # 启动非活动虚拟机, kvm_name为你的虚拟机名字 * virsh create kvm_name.xml # 创建虚拟机(创建后,虚拟机立即执行,成为活动主机) * virsh suspend kvm_name # 暂停虚拟机 * virsh resume kvm_name # 启动暂停的虚拟机 * virsh shutdown kvm_name # 正常关闭虚拟机 * virsh destroy kvm_name # 强制关闭虚拟机 * virsh dominfo kvm_name # 显示虚拟机的基本信息 * virsh dumpxml kvm_name # 显示虚拟机的当前配置文件 * virsh setmem kvm_name 51200 # 给不活动虚拟机设置内存大小 * virsh setvcpus kvm_name 4 # 给不活动虚拟机设置cpu个数 * virsh edit kvm_name # 编辑配置文件(一般用在刚定义完VM) 虚拟机配置文件路径:/etc/libvirt/qemu ## 虚拟化vcpu操作 <pre> yum -y install numactl </pre> * nodeinfo #查看节点配置信息 * dominfo #查看虚拟机节点配置信息 * numactl --hardware #查看节点硬件信息 * numastat –c qemu-kvm * virsh - vcpuinfo kvm_name #查看运行在那个逻辑cpu上 - emulatorpin kvm_name #查看可以调度逻辑cpu - emulatorpin kvm_name 1-2 –live #限制可以调度逻辑cpu(重启生效) ![1.28](http://oxysobnip.bkt.clouddn.com/1.28.png) 虚拟机cpu优化 vcpu单独强制绑定 - vcpupin kvm_name 0 1 - vcpupin kvm_name 1 2 - vcpuinfo - dumpxml kvm_name 命令使用参考文章: [CPU性能监控之二-----Numa架构下进程与CPU绑定](http://hl914.blog.51cto.com/4128173/1557615/ ) [numa总结](http://blog.csdn.net/shaoyunzhe/article/details/53606584) ## 安装acpid 默认情况下virsh工具不能对linux虚拟机进行关机操作,linux操作系统需要开启与启动acpid服务。在安装KVM linux虚拟机必须配置此服务。 <pre> yum install -y acpid systemctl enable acpid </pre> ## 克隆虚拟机 (1)根据模板文件修改 - 进入对应目录拷贝模板文件 <pre> cd /etc/libvirt/qemu cp centos-7.2.xml clone-1.xml </pre> - 修改虚拟名称 - 删除uuid ![1.29](http://oxysobnip.bkt.clouddn.com/1.29.png) - 指定disk ![1.30](http://oxysobnip.bkt.clouddn.com/1.30.png) - 删除mac ![1.31](http://oxysobnip.bkt.clouddn.com/1.31.png) - 修改vnc远程允许端口(可选) 如果您上面选择桥接模式创建虚拟机且指定了端口5910,请您把5910改为5911,这样可以避免与centos7.3的端口冲突 (2)复制qcow2文件 <pre> cp centos-7.2.qcow2 clone-1.qcow2 </pre> (3)virsh define 模板文件路径 <pre> virsh define /etc/libvirt/qemu/clone-1.xml </pre> (4)启动虚拟机 <pre> virsh start clone-1 </pre> (5)删除克隆的虚拟机 <pre> virsh shutdown clone-1 virsh undefine clone-1 rm –rf /mnt/vm-test/clone-1.qcow2 </pre> (6)一个小坑 ![1.32](http://oxysobnip.bkt.clouddn.com/1.32.png) 这一行位置在第86行,修改配置文件时一定要删除,不知道为什么,它会出现在CentOS7.2版本的系统中,而在CentOS7.3版本的系统中不会出现这一行代码! ## 虚拟机快照snapshot <pre> virsh # snapshot-create-as centos-7.2 kuaizhao #创建虚拟机centos-7.2的快照,快照名字为kuaizhao Domain snapshot kuaizhao created virsh # snapshot-list centos-7.2 #显示虚拟机快照的名称 Name Creation Time State ------------------------------------------------------------ kuaizhao 2017-10-17 09:53:49 +0800 shutoff virsh # snapshot-revert centos-7.2 kuaizhao #恢复快照 </pre> ## 添加磁盘 (1)创建磁盘 <pre> qemu-img create -f qcow2 /mnt/vm-test/ios/testadd.qcow2 10G </pre> (2)修改配置文件 <pre> virsh edit centos-7.2 </pre> 添加以下内容并保存配置文件 ``` <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/mnt/vm-test/ios/testadd.qcow2'/> <target dev='vdb' bus='virtio'/> </disk> ``` <pre> virsh create /etc/libvirt/qemu/centos-7.2.xml virsh destroy centos-7.2 virsh start centos-7.2 </pre> 重启后进入虚拟机查看 ![1.33](http://oxysobnip.bkt.clouddn.com/1.33.png) (3)直接扩展qcow2磁盘 qcow2格式的好处就是支持直接扩展,下面我们关闭虚拟机直接对磁盘进行扩容 # qemu-img resize clone-3.qcow2 +10G ![1.35-1](http://oxysobnip.bkt.clouddn.com/1.35-1.png) 经过前后对比,磁盘大小已由20G扩展到30G,已扩展,qcow2磁盘格式必须采用此方式进行扩展! ## kvm虚拟机的网络模式 (1)nat网络模式 ![1.34](http://oxysobnip.bkt.clouddn.com/1.34.png) (2)桥接模式 ![1.35](http://oxysobnip.bkt.clouddn.com/1.35.png) (3)添加NAT网络 定义一个虚拟网络 <pre> virsh net-define /usr/share/libvirt/networks/default.xml </pre> 添加内容 ``` <network> <name>default</name> <bridge name="virbr0" /> <forward/> <ip address="192.168.122.1" netmask="255.255.255.0"> <dhcp> <range start="192.168.122.2" end="192.168.122.254" /> </dhcp> </ip> </network> ``` 设置为自动启动 <pre> virsh net-autostart default </pre> 查看网络 <pre> brctl show </pre> 修改/etc/sysctl.conf中参数,允许ip转发 <pre> net.ipv4.ip_forward=1 </pre> 修改虚拟机配置文件 <pre> virsh edit centos-7.2 </pre> 修改网卡链接模式 桥接模式 <interface type='bridge'> <source bridge='br0'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </interface> nat模式 <interface type='network'> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> 修改完之后,保存退出。 <pre> virsh create /etc/libvirt/qemu/centos-7.2.xml </pre> 4. 修改桥接后nat不能上网问题 默认配置文件:(virsh交互界面) ![1.36](http://oxysobnip.bkt.clouddn.com/1.36.png) 将默认配置文件修改为: <pre> vim /etc/libvirt/qemu/networks/default.xml </pre> ![1.37](http://oxysobnip.bkt.clouddn.com/1.37.png) 然后再执行如下命令 <pre> virsh # net-define /etc/libvirt/qemu/networks/default.xml virsh # net-destroy default virsh # net-start default </pre>