KVM环境部署

KVM 全称 Kernel-base Virtual Machine,是一种基于内核的虚拟化技术;原生自带内存压缩技术(KSM)。

一、 KVM安装

step 01 确认CPU支持虚拟化

开启虚拟化Intel VT-x/EPT 或 AMD-V/RVI 技术

lsmod | grep kvm
[root@kvm01 ~]# lsmod | grep kvm
kvm_intel             183621  0 
kvm                   586948  1 kvm_intel
irqbypass              13503  1 kvm

step 02 安装虚拟化管理软件

yum install -y libvirt virt-install qemu-kvm
软件包名称 作用 说明
libvirt 虚拟机通用管理软件 可管理KVM,Xen,qemu,lxc...
virt 虚拟机的安装工具和克隆工具 包含virt-install和virt-clone两个子功能
qemu-kvm 管理虚拟机的虚拟磁盘 包含qemu-img(qcow,raw)
[root@kvm01 ~]# yum install -y libvirt virt-install qemu-kvm
Loaded plugins: fastestmirror
Determining fastest mirrors
......
Dependency Updated:
  cyrus-sasl-lib.x86_64 0:2.1.26-24.el7_9                       device-mapper.x86_64 7:1.02.170-6.el7_9.5               
  device-mapper-libs.x86_64 7:1.02.170-6.el7_9.5                gnutls.x86_64 0:3.3.29-9.el7_6                          

Complete!

step 03 启动虚拟化管理软件

systemctl start libvirtd.service
systemctl enable libvirtd.service
[root@kvm01 ~]# systemctl start libvirtd.service
[root@kvm01 ~]# systemctl enable libvirtd.service
[root@kvm01 ~]# systemctl status libvirtd.service
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2022-03-21 15:36:34 CST; 15s ago
     Docs: man:libvirtd(8)
......
Hint: Some lines were ellipsized, use -l to show in full.

二、 创建KVM虚拟机

virt-install 参数

虚拟机的名字和磁盘路径必须唯一

核心参数

  • --virt-type 类型 #指定虚拟化类型(默认虚拟化类型是qemu)
  • --os-type=类型 #指定系统类型
  • --os-variant 系统版本 #指定系统版本
  • --name 名称 #指定虚拟机名称
  • --memory 数字 #指定虚拟机内存(单位MB)
  • --vcpus 数字 #指定虚拟CPU核数
  • --disk /目录/文件名称,format=磁盘格式,size=数字 #指定虚拟化磁盘位置,格式及容量(单位GB)
  • --cdrom /目录/镜像文件 #指定系统镜像文件
  • --network network=default #使用默认NAT的网络
  • --graphics vnc,listen=IP地址 #指定VNC监听地址
  • --noautoconsole
建议:
虚拟机内存不要低于1024M,否则安装系统特别慢!
使用KVM虚拟机安装Linux系统,不建议分配swap分区;
[root@kvm01 ~]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory=2048 --vcpus 1 --disk /opt/centos7.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-Minimal-2009.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

Starting install...
Allocating 'centos7.raw'         |  10 GB  00:00     
Domain installation still in progress. You can reconnect to 
the console to complete the installation process.
[root@kvm01 ~]# netstat -lntup | grep kvm
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      13725/qemu-kvm  
[root@kvm01 ~]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name test --memory=1024 --vcpus 1 --disk /opt/test.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-Minimal-2009.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

Starting install...
Allocating 'test.raw'                                                                            |  10 GB  00:00:00     
Domain installation still in progress. You can reconnect to 
the console to complete the installation process.

三、 virsh日常管理与配置

KVM虚拟机只有首次启动的时候,才能正常安装系统。
KVM虚拟机能登入系统,才算启动成功。
virsh list (--all) #查看虚拟机列表(默认仅查看处于运行状态的虚拟机)
virsh start 虚拟机名称 #开启虚拟机(该方式启动虚拟机不加载光盘)
virsh shutdown 虚拟机名称 #关闭虚拟机(该方式仅可关闭含有操作系统的虚拟机)
virsh destroy 虚拟机名称 #虚拟机断电
virsh reboot 虚拟机名称 #重启虚拟机(该方式仅可重启又操作系统的虚拟机)
virsh dumpxml 虚拟机名称 >/目录/备份文件名称 #导出配置
virsh undefine 虚拟机名称 #删除虚拟机(删除虚拟机配置文件;建议先将虚拟机断电,再删除虚拟机)
virsh define /目录/配置文件名称 #导入虚拟机配置文件
virsh edit 虚拟机名称 #修改虚拟机配置(自带语法检查)
virsh domname 虚拟机名称 #重命名虚拟机(低版本不支持,关机修改)
virsh suspend 虚拟机名称 #挂起虚拟机
virsh resume 虚拟机名称 #恢复虚拟机
virsh vncdisplay 虚拟机名称 #查看虚拟机VNC端口
virsh autostart 虚拟机名称 #设置虚拟机开机自启(--disable 取消虚拟机开机自启)
virsh console 虚拟机名称 #console控制台登录虚拟机(须修改虚拟机内核参数:grubby --update-kernel=ALL --args="console=ttyS0,115200n8")
若使用 undefine 删除处于运行状态的虚拟机,虚拟机不会停止,仍可保持正常运行;但当虚拟机 shutdown destroy 时(虚拟机进程终止),会被系统直接删除;
[root@kvm01 ~]# virsh list 
 Id    Name                           State
----------------------------------------------------
 2     test                           running

[root@kvm01 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 2     test                           running
 -     centos7                        shut off
[root@kvm01 ~]# virsh start centos7 
Domain centos7 started

[root@kvm01 ~]# virsh shutdown centos7  
Domain centos7 is being shutdown

[root@kvm01 ~]# virsh list 
 Id    Name                           State
----------------------------------------------------
 2     test                           running
 3     centos7                        running
[root@kvm01 ~]# virsh destroy test 
Domain test destroyed
[root@kvm01 ~]# virsh reboot centos7 
Domain centos7 is being rebooted
[root@kvm01 ~]# virsh suspend centos7 
Domain centos7 suspended
[root@kvm01 ~]# virsh resume centos7 
Domain centos7 resumed
[root@kvm01 ~]# virsh undefine test 
Domain test has been undefined
[root@kvm01 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 3     centos7                        running
[root@kvm01 ~]# virsh dumpxml centos7 > centos7.xml
[root@kvm01 ~]# ll centos7.xml 
-rw-r--r-- 1 root root 5294 Mar 21 21:19 centos7.xml
[root@kvm01 ~]# virsh undefine centos7 
Domain centos7 has been undefined

[root@kvm01 ~]# virsh shutdown centos7 
Domain centos7 is being shutdown

[root@kvm01 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------

[root@kvm01 ~]# virsh define centos7.xml 
Domain centos7 defined from centos7.xml

[root@kvm01 ~]# virsh start centos7
Domain centos7 started

[root@kvm01 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 4     centos7                        running

 [root@kvm01 ~]# virsh shutdown centos7 
Domain centos7 is being shutdown

[root@kvm01 ~]# mv /opt/centos7.raw /opt/centos7-web01.raw 
[root@kvm01 ~]# virsh domrename centos7 centos7-web01
Domain successfully renamed
[root@kvm01 ~]# virsh edit centos7-web01 
Domain centos7-web01 XML configuration edited.
[root@kvm01 ~]# grep -A3 '<disk' /etc/libvirt/qemu/centos7-web01.xml | head -4
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/opt/centos7-web01.raw'/>
      <target dev='vda' bus='virtio'/>
[root@kvm01 ~]# virsh start centos7-web01 
Domain centos7-web01 started

[root@kvm01 ~]# virsh list --all 
 Id    Name                           State
----------------------------------------------------
 5     centos7-web01                  running
虚拟机配置文件目录为/etc/libvirt/qemu
KVM开启自动主机目录为/etc/libvirt/qemu/autostart
[root@kvm01 ~]# ls /etc/libvirt/qemu/
centos7.xml  networks
[root@kvm01 ~]# virsh autostart centos7-web01 
Domain centos7-web01 marked as autostarted

[root@kvm01 ~]# systemctl restart libvirtd.service 
[root@kvm01 ~]# ls /etc/libvirt/qemu/autostart/ -l
total 0
lrwxrwxrwx 1 root root 35 Mar 22 10:25 centos7-web01.xml -> /etc/libvirt/qemu/centos7-web01.xml
[root@kvm01 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     centos7-web01                  running

四、. console控制台登录

step 01 登录Linux虚拟机,修改内核参数;

修改内核前,建议备份内核文件;

grubby --update-kernel=ALL --args="console=ttyS0,115200n8"

step 02 重启Linux虚拟机;

[root@kvm01 ~]# ssh root@192.168.122.126
root@192.168.122.126's password: 
Last login: Tue Mar 22 13:16:29 2022
[root@localhost ~]# reboot
Connection to 192.168.122.126 closed by remote host.
Connection to 192.168.122.126 closed.

step 03 Console控制台登录Linux虚拟机;

virsh console 虚拟主机名称
[root@kvm01 ~]# virsh console centos7-web01 
Connected to domain centos7-web01
Escape character is ^]

CentOS Linux 7 (Core)
Kernel 3.10.0-1160.el7.x86_64 on an x86_64

localhost login: root
密码:
Last login: Tue Mar 22 14:01:08 from gateway
[root@localhost ~]# lscpu | grep -i kvm
超管理器厂商:  KVM