License: Attribution-NonCommercial-ShareAlike 4.0 International
本文出自 Suzf Blog。 如未注明,均为 SUZF.NET 原创。
转载请注明:http://suzf.net/post/985
概述
KVM即基于内核的虚拟机(英语:Kernel-based Virtual Machine,缩写为 KVM),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illumos上。 KVM目前由Red Hat等厂商开发,对CentOS/Fedora/RHEL等Red Hat系发行版支持极佳。系统架构图
性能构架概述
以下几点提供了 KVM 的简要概述,它适用于系统性能和进程/线程的管理: 使用 KVM 时,客机作为一个 Linux 的进程在主机上运行。 虚拟 CPU(vCPU)作为正常线程执行,由 Linux 调度器执行。 客机会继承诸如内核中的 NUMA 和大页面一类的功能。 主机中的磁盘和网络 I/O 设置对性能有显著影响。 网络流量通常通过基于软件的网桥传送。KVM与virtualbox等的区别
KVM适合于服务端的虚拟化,图形显示能力差,但是CPU的利用效率高;virtualbox图形支持较好,支持2D、3D加速。 virtaulbox 暂不支持 LVM 嵌套虚拟化 详见 https://www.virtualbox.org/ticket/4032系统要求
CPU支持硬件虚拟化,有的需要在BIOS中的CPU设置启用虚拟化,在BIOS中的英文通常为virtualization,如果是disabled状态要改成enabled状态。 检查是否支持虚拟化# lscpu | egrep -i 'Vir|hy' Virtualization: VT-x Hypervisor vendor: VMware Virtualization type: full # egrep '(vmx|svm)' --color=always /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 rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi ept vpid fsgsbase smep 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 rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi ept vpid fsgsbase smep 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 rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi ept vpid fsgsbase smep 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 rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi ept vpid fsgsbase smep 相关CPU功能标志包括: svm=安全虚拟机(AMD-V) vmx=虚拟机x86(Inter VT-X) lm=长模式(64位支持)
系统初始化
# cat /etc/centos-release CentOS Linux release 7.1.1503 (Core) systemctl stop firewalld setenforce 0 sed -i 's/=enforcing/=disabled/g' /etc/selinux/config hostnamectl set-hostname lab.suzf.net
安装 KVM
yum -y install qemu-kvm libvirt virt-install bridge-utils acpid
检查模块加载
# lsmod | grep kvm kvm_intel 148081 3 kvm 461126 1 kvm_intel
启动 libvirt acpi 服务
systemctl start libvirtd systemctl enable libvirtd systemctl start acpid systemctl enable acpid # 注:virsh shutdown 需要调用 acpid 接口
查看服务状态
systemctl status libvirtd.service ● libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2016-07-22 21:26:39 CST; 36s ago Docs: man:libvirtd(8) http://libvirt.org Main PID: 1378 (libvirtd) CGroup: /system.slice/libvirtd.service ├─1378 /usr/sbin/libvirtd ├─2574 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/... └─2575 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/... Jul 22 21:26:40 lab.suzf.net dnsmasq-dhcp[2574]: DHCP, IP range 172.16.5.2 -- 172.16.5.110, lease time 1h Jul 22 21:26:40 lab.suzf.net dnsmasq[2574]: reading /etc/resolv.conf Jul 22 21:26:40 lab.suzf.net dnsmasq[2574]: using nameserver 8.8.8.8#53 Jul 22 21:26:40 lab.suzf.net dnsmasq[2574]: read /etc/hosts - 3 addresses Jul 22 21:26:40 lab.suzf.net dnsmasq[2574]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses Jul 22 21:26:40 lab.suzf.net dnsmasq-dhcp[2574]: read /var/lib/libvirt/dnsmasq/default.hostsfile Jul 22 21:27:06 lab.suzf.net dnsmasq[2574]: reading /etc/resolv.conf Jul 22 21:27:06 lab.suzf.net dnsmasq[2574]: using nameserver 8.8.8.8#53检查KVM是否安装成功
[[email protected] ~]# virsh -c qemu:///system list Id Name State ---------------------------------------------------- # 如果没有报错即是安装成功
配置桥接网络
bash -c "echo lab.suzf.net" bash -c "cat > /etc/sysconfig/network-scripts/ifcfg-eno33554984 << EOF DEVICE=eno33554984 TYPE=Ethernet ONBOOT=yes BRIDGE=br0 EOF" bash -c "cat > /etc/sysconfig/network-scripts/ifcfg-br0 << EOF TYPE=Bridge BOOTPROTO=none DEVICE=br0 ONBOOT=yes IPADDR=172.16.5.10 PREFIX=24 #GATEWAY=172.16.5.1 EOF"
配置完成后,需要重启网络
# systemctl restart network
查看当前桥接情况
# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c2920f4d5 no eno33554984 virbr0 8000.52540003c339 yes virbr0-nic # ip a | grep -w br0 3: eno33554984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000 6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP inet 172.16.5.10/24 brd 172.16.5.255 scope global br0
创建我的第一个KVM
# 创建目录 # mkdir /opt/data/kvm/{images,iso} -p # virt-install \ --connect qemu:///system \ --name hello_kvm \ --ram 512 \ --vcpus 1 \ --hvm \ --disk path=/opt/data/kvm/images/hello_kvm.img,size=10 \ --os-type linux \ --os-variant rhel7 \ --network bridge=br0 \ --noautoconsole \ --graphics vnc,listen=0.0.0.0 \ --location=/opt/data/kvm/iso/CentOS-7-x86_64-Minimal-1503-01.iso Starting install... Retrieving file .treeinfo... | 2.2 kB 00:00:00 Retrieving file vmlinuz... | 9.6 MB 00:00:00 Retrieving file initrd.img... | 68 MB 00:00:00 Allocating 'hello_kvm.img' | 10 GB 00:00:00 Creating domain... | 0 B 00:00:00 Domain installation still in progress. You can reconnect to the console to complete the installation process. 参数说明: --connect qemu:///system 连接到本地系统上的KVM,也可以连接到其他主机上的KVM --name hello_kvm 虚拟机的名称,这个例子中叫 hello_kvm --ram 512 分配给虚拟机的内存,此处为512M --vcpus=1 虚拟CPU 1个 --hvm 全虚拟化 --disk path=/opt/data/kvm/images/hello_kvm.img,size=10 虚拟机磁盘镜像文件存储路径,存储目录必须是已经存在的目录,文件大小为10GB --os-type linux 操作系统类型,如果是Windows操作系统,则是windows --os-variant rehel7 guest操作系统类型 --noautoconsole 不自动连接到控制台 --graphics vnc,listen=0.0.0.0 图形化访问虚拟机的方式:通过VNC协议。也可以使用效率更高的spice协议,spice协议支持音频和USB设备,不过配置较为复杂 --location=/opt/data/kvm/iso/CentOS-7-x86_64-Minimal-1503-01.iso 从哪里获取镜像 还支持 --cdrom CD/ISO, --pxe, --import 等
查看当前运行节点
# virsh list Id Name State ---------------------------------------------------- 2 hello_kvm running
开放防火墙访问vnc端口 < 若开启 >
# firewall-cmd --zone=public --add-port=5900/tcp --permanent # firewall-cmd --reload
查看本地的VNC连接地址
# virsh vncdisplay hello_kvm :0 :0代表第一个屏幕,VNC的默认连接端口为5900,:0即端口5900,如果是:1则端口是5901,:2端口是5902,以此类推。 支持VNC的客户端有TightVNC,TigerVNC,realvnc等。本文使用的是RealVNC。*** 这里也可以通过 Spice 服务连接 KVM nodes *** 继续后续安装工作。当然这里也可以使用自定义的 ISO自动安装系统 或者使用 PXE BIngGO BingGO
虚拟机管理命令
virsh 命令提供了操作虚拟机的一系列命令:- virsh list --all 获取虚拟机列表
- virsh dominfo {servername} 获取虚拟机信息
- virsh shutdown {servername} 关闭虚拟机
- virsh reboot {servername} 重启虚拟机
- virsh start {servername} 启动虚拟机
- virsh undefine {servername} 删除虚拟机定义文件,即删除/etc/libvirt/qemu目录下相应的xml文件,注意_这个命令并不会删除磁盘img文件,磁盘img文件需要手动删除
- virsh edit {servername} 编辑虚拟机配置文件,即修改虚拟机的内存、CPU以及VNC连接端口等配置
- virt-clone -o {old_servername} -n {new_servername} -f /path/to/img/file.img 复制虚拟机,复制完成后需要登录进虚拟机更改IP地址、hostname