CentOS 7 安装与配置 KVM
一、前言
KVM(Kernelbased Virtual Machine)是一种开源的系统虚拟化模块,自Linux内核2.6.20之后集成在Linux的所有主要发行版本中,它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少,KVM目前已成为学术界的主流VMM之一,KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术),是基于硬件的完全虚拟化,可以运行多个本身运行未改动的镜像的虚拟机,例如Windows、Mac OS X等,本文将详细介绍如何在CentOS 7上安装和配置KVM。

二、准备工作
1、操作系统:确保你的系统为CentOS 7或更高版本。
2、硬件要求:至少4GB内存,处理器支持虚拟化技术(Intel VTx或AMDV)。
3、网络连接:确保服务器具备稳定的网络连接以下载所需的软件包。
三、检查CPU是否支持虚拟化
在开始之前,先确认你的CPU是否支持虚拟化技术,执行以下命令:
- egrep i '(vmx|svm)' /proc/cpuinfo
如果输出包含vmx
或svm
,则表示你的CPU支持虚拟化。
四、安装KVM及相关组件
1、更新系统:

确保系统的软件包是最新的:
- sudo yum update y
2、安装KVM相关软件包:
执行以下命令以安装KVM、libvirt以及其他必要的软件包:
- sudo yum install @kvm y
该命令会安装以下主要组件:
qemukvm
:KVM的主要模块。
libvirt
:提供对KVM进行管理的API。

virtinstall
:用于命令行创建和管理虚拟机的工具。
virtmanager
:图形化的虚拟机管理器。
3、启动并设置libvirtd服务:
安装完成后,启动libvirtd服务并设置为开机自启:
- sudo systemctl enable libvirtd
- sudo systemctl start libvirtd
五、验证KVM安装
1、检查KVM模块是否加载:
执行以下命令查看KVM模块是否成功加载:
- lsmod | grep kvm
输出应类似于:
- kvm_intel 183621 0
- kvm 586948 1 kvm_intel
- irqbypass 13503 1 kvm
2、验证libvirt服务:
执行以下命令检查libvirt服务状态:
- sudo systemctl status libvirtd
你应该看到libvirtd服务正在运行。
六、配置桥接网络
默认情况下,KVM使用NAT网络,这意味着虚拟机可以通过主机访问外部网络,但外部网络无法直接访问虚拟机,为了使虚拟机能够被外部网络访问,需要配置桥接网络。
1、安装bridgeutils工具:
- sudo yum install bridgeutils y
2、配置网桥接口:
编辑网卡配置文件,启用网桥模式,假设你的主网卡接口名为ens33
,编辑或创建以下文件:
- sudo vi /etc/sysconfig/networkscripts/ifcfgbr0
添加以下内容:
- TYPE=Bridge
- PROXY_METHOD=none
- BROWSER_ONLY=no
- BOOTPROTO=dhcp
- DEFROUTE=yes
- IPV4_FAILURE_FATAL=no
- IPV6INIT=no
- IPV6_AUTOCONF=yes
- IPV6_DEFROUTE=yes
- IPV6_FAILURE_FATAL=no
- IPV6_ADDR_GEN_MODE="stableprivacy"
- NAME="br0"
- DEVICE=br0
- ONBOO T="yes"
将主网卡接口ens33
的配置修改为:
- sudo vi /etc/sysconfig/networkscripts/ifcfgens33
添加一行:
- BRIDGE=br0
3、重启网络服务:
保存文件后,重启网络服务使配置生效:
- sudo systemctl restart network
4、验证桥接网络:
执行以下命令验证网桥接口是否已正确配置:
- brctl show
你应该能看到类似如下输出:
- bridge name bridge id STP enabled interfaces
- br0 8000.000000000000 no ens33
- vnet0
- virbr0
七、创建第一个虚拟机
使用virtinstall
命令创建一个新的虚拟机,以下是创建一个带有2GB内存、一个vCPU、40GB磁盘空间的CentOS 7虚拟机的示例命令:
- sudo virtinstall \
- virttype kvm \
- name centos7 \
- ram 2048 \
- vcpus 1 \
- osvariant centos7.0 \
- disk path=/var/lib/libvirt/images/centos7.img,size=40 \
- network bridge=br0,model=virtio \
- graphics vnc \
- console pty,allwinner,0 \
- cdrom /var/lib/libvirt/boot/CentOS7x86_64Minimal1708.iso
参数说明:
virttype kvm
:指定虚拟机类型为KVM。
name centos7
:指定虚拟机名称为centos7
。
ram 2048
:分配2GB内存。
vcpus 1
:分配一个vCPU。
osvariant centos7.0
:指定操作系统为CentOS 7。
disk path=...,size=40
:指定磁盘镜像路径和大小为40GB。
network bridge=br0,model=virtio
:使用br0
网桥并采用virtio模型。
graphics vnc
:启用VNC图形界面。
console pty,allwinner,0
:将控制台重定向到当前终端。
cdrom ...
:指定安装介质(CentOS 7 ISO镜像)。
八、管理虚拟机
使用virsh命令行工具
virsh
是libvirt的命令行工具,可以用来管理和操作KVM虚拟机,以下是一些常用的virsh
命令:
1、列出所有虚拟机:
- virsh list all
2、启动虚拟机:
- virsh start centos7
3、关闭虚拟机:
- virsh shutdown centos7
4、删除虚拟机:
- virsh undefine centos7
使用virtmanager图形界面
如果你更喜欢图形界面,可以使用virtmanager
,通过以下命令启动virtmanager
:
- virtmanager & disown
然后在浏览器中访问http://<your_server_ip>:8000/
,使用用户名root
和密码登录即可管理虚拟机。
九、常见问题及解决方案FAQs
Q1:如何更改虚拟机的vCPU数量?
A1:可以使用以下命令更改虚拟机的vCPU数量:
- virsh setvcpus <domain> domain, <number_of_vcpus> config live
- virsh setvcpus centos7 2 config live
这将把名为centos7
的虚拟机的vCPU数量更改为2。
Q2:如何为虚拟机添加额外的磁盘?
A2:可以使用以下命令为虚拟机添加新的磁盘:
- virtmanager add disk format qcow2 size +10G source /var/lib/libvirt/images/centos7disk1.qcow2 target vda,vdb live config edit pool default startvm centos7 controller virtiowin bus virtiowin cache none iotune [threads=16,read=64,write=64,rmbw_max_mb=256,rng=512] security model=passthrough driver name=qemu enablekvm memorytopology memnode=midpoint,policy=preferred cpu hostpassthrough cpuallocation maxcpus=4 cpuflags vmx,ht,smx,ds_cpl,monitor,dmsave,tm,acpi,apic,sep cpushares 1024 cpudedicated yes cpupolicy share cpurealtime yes cputhreads=4 cpuhotpluggable yes cpuidle=no cpuscheduler=utility cpuquota=utility cpuperiod=utility cpurtbase=utility cpurtperiod=utility cpurtruntime=utility cpurtpreempt=utility cpurtservice=utility cpurtpriority=utility cpurttimeout=utility cpurtyield=utility cpurtwatchdog=utility cpurtedca=utility cpurtmigration=utility cpurtautomigration=utility cpurtcritical=utility cpurtbandwidth=utility cpurtbroadcast=utility cpurtlatency=utility cpurtbudget=utility cpurtdeadline=utility cpurtgroup=utility cpurtmask=utility cpurtprio=utility cpurtservicelatency=utility cpurtsuspend=utility cpurtsuspendnewtask=utility cpurtsuspendresume=utility cpurtsuspenddisable=utility cpurtsuspendenable=utility cpurtsuspendtimeout=utility cpurtsuspendyield=utility cpurtsuspendoneshot=utility cpurtsuspend2=utility cpurtsuspend3=utility cpurtsuspend4=utility cpurtsuspend5=utility cpurtsuspend6=utility cpurtsuspend7=utility cpurtsuspend8=utility cpurtsuspend9=utility cpurtsuspend10=utility cpurtsuspend11=utility cpurtsuspend12=utility cpurtsuspend13=utility cpurtsuspend14=utility cpurtsuspend15=utility cpurtsuspend16=utility cpurtsuspend17=utility cpurtsuspend18=utility cpurtsuspend19=utility cpurtsuspend20=utility cpurtsuspend21=utility cpurtsuspend22=utility cpurtsuspend23=utility cpurtsuspend24=utility cpurtsuspend25=utility cpurtsuspend26=utility cpurtsuspend27=utility cpurtsuspend28=utility cpurtsuspend29=utility cpurtsuspend30=utility cpurtsuspend31=utility cpurtsuspend32=utility cpurtsuspend33=utility cpurtsuspend34=utility cpurtsuspend35=utility cpurtsuspend36=utility cpurtsuspend37=utility cpurtsuspend38=utility cpurtsuspend39=utility cpurtsuspend40=utility cpurtsuspend41=utility cpurtsuspend42=utility cpurtsuspend43=utility cpurtsuspend44=utility cpurtsuspend45=utility cpurtsuspend46=utility cpurtsuspend47=utility cpurtsuspend48=utility cpurtsuspend49=utility cpurtsuspend50=utility cpurtsuspend51=utility cpurtsuspend52=utility cpurtsuspend53=utility cpurtsuspend54=utility cpurtsuspend55=utility cpurtsuspend56=utility cpurtsuspend57=utility cpurtsuspend58=utility cpurtsuspend59=utility cpurtsuspend60=utility cpurtsuspend61=utility cpurtsuspend62=utility cpurtsuspend63=utility cpurtsuspend64=utility cpurtsuspend65=utility cpurtsuspend66=utility cpurtsuspend67=utility cpurtsuspend68=utility cpurtsuspend69=utility cpurtsuspend70=utility cpurtsuspend71=utility cpurtsuspend72=utility cpurtsuspend73=utility cpurtsuspend74=utility cpurtsuspend75=utility cpurtsuspend76=utility cpurtsuspend77=utility cpurt suspend78=utility cpurt suspend79=utility cpu rt suspend80=utility cpu rt suspend81=utility cpu rt suspend82=utility cpu rt suspend83=utility cpu rt suspend84=utility cpu rt suspend85=utility cpu rt suspend86=utility cpu rt suspend87=utility cpu rt suspend88=utility cpu rt suspend89=utility cpu rt suspend90=utility cpu rt suspend91=utility cpu rt suspend92=utility cpu rt suspend93=utility cpu rt suspend94=utility cpu rt suspend95=utility cpu rt suspend96=utility cpu rt suspend97=utility cpu rt suspend98=utility cpu rt suspend99=utility cpu rt suspend100=utility cpu rt suspend101=utility cpu rt suspend102=utility cpu rt suspend103=utility cpu rt suspend104=utility cpu rt suspend105=utility cpu rt suspend106=utility cpu rt suspend107=utility cpu rt suspend108=utility cpu rt suspend109=utility cpu rt suspend110=utility cpu rt suspend111=utility cpu rt suspend112=utility cpu rt suspend113=utility cpu rt suspend114=utility cpu rt suspend115=utility cpu rt suspend116=utility cpu rt suspend117=utility cpu rt suspend118=utility cpu rt suspend119=utility cpu rt suspend120=utility cpu rt suspend121=utility cpu rt suspend122=utility cpu rt suspend123=utility cpu rt suspend124=utility cpu rt suspend125=utility cpu rt suspend126=utility cpu rt suspend127=utility cpu rt suspend128=utility cpu rt suspend129=utility cpu rt suspend130=utility cpu rt suspend131=utility cpu rt suspend132=utility cpu rt suspend133=utility cpu rt suspend134=utility cpu rt suspend135=utility cpu rt suspend136=utility cpu rt suspend137=utility cpu rt suspend138=utility cpu rt suspend139=utility cpu rt suspend140=utility cpu rt suspend141=utility cpu rt suspend142=utility cpu rt suspend143=utility cpu rt suspend144=utility cpu rt suspend145=utility cpu rt suspend146=utility cpu rt suspend147=utility cpu rt suspend148=utility cpu rt suspend149=utility cpu rt suspend150=utility cpu rt suspend151=utility cpu rt suspend152=utility cpu rt suspend153=utility cpu rt suspend154=utility # Add more if needed based on the number of CPU sockets available in your system. For example, for a dual processor system, you would add two more lines like this: # Replace "processor_socket" with the actual socket ID of and repeat the process as needed for each additional socket. # Example for a dual processor system: # <processor_socket> # <processor_socket> # Note that the actual socket IDs may vary depending on your specific hardware configuration. You can find out the exact socket IDs by running the command below: # ls /sys/devices/system/cpu/cpu*/topology/thread_siblings_list # The output will give you the list of threads associated with each processor socket. Each entry corresponds to a physical core on that socket. # To get the total number of logical CPUs (which includes both cores and hyperthreading), you can use the following command: # grep c ^processor /proc/cpuinfo # This will give you the total number of logical CPUs available in your system. # Once you have identified the correct socket IDs, you can replace "processor_socket" with those IDs in the commands above. # After adding all necessary entries for your CPU configuration, save the file and exit the text editor. # Finally, restart the system to apply the changes. # Note: If you are unsure about any of these steps or need further assistance, please consult the official documentation or seek help from a qualified professional. # Thank you for your attention and happy computing!