Fork me on GitHub
Suzf  Blog

How-to setup KVM on CentOS7

概述
KVM即基于内核的虚拟机英语:Kernel-based Virtual Machine,缩写为 KVM),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSDillumos上。 KVM目前由Red Hat等厂商开发,对CentOS/Fedora/RHEL等Red Hat系发行版支持极佳。
系统架构图
kvm_arch  
性能构架概述
以下几点提供了 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 *** kvm_vnc 继续后续安装工作。当然这里也可以使用自定义的 ISO自动安装系统 或者使用 PXE BIngGO BingGO hello_kvm

虚拟机管理命令

virsh 命令提供了操作虚拟机的一系列命令:
  1. virsh list --all 获取虚拟机列表
  2. virsh dominfo {servername} 获取虚拟机信息
  3. virsh shutdown {servername} 关闭虚拟机
  4. virsh reboot {servername} 重启虚拟机
  5. virsh start {servername} 启动虚拟机
  6. virsh undefine {servername} 删除虚拟机定义文件,即删除/etc/libvirt/qemu目录下相应的xml文件,注意_这个命令并不会删除磁盘img文件,磁盘img文件需要手动删除
  7. virsh edit {servername} 编辑虚拟机配置文件,即修改虚拟机的内存、CPU以及VNC连接端口等配置
  8. virt-clone -o {old_servername} -n {new_servername} -f /path/to/img/file.img 复制虚拟机,复制完成后需要登录进虚拟机更改IP地址、hostname
  Reference: https://wiki.centos.org/HowTos/KVM ~ EOF~