前言:


KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 线程。这使得 KMV 能够使用 Linux 内核的已有功能。 但是,KVM 本身不执行任何硬件模拟,需要用户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU

Qemu是一套独立的虚拟化解决方案; KVM是另一套虚拟化解决方案, 不过因为这个方案实际上只实现了内核中对处理器(Intel VT, AMD SVM)虚拟化特性的支持,换言之,他缺乏设备虚拟化以及相应的用户空间管理虚拟化的工具, 所以他借用了QEMU的代码并加以精简, 连同KVM一起构成了另外一个独立的虚拟化解决方案, 称之为: KVM+QEMU

Linux 上的用户空间、内核空间和虚机:

  • Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。

  • KVM:运行在内核空间,提供 CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。

  • QEMU:修改过的被 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 IOCTL /dev/kvm 设备和 KVM 交互。

KVM


1.1 KVM工具集合

  • libvirt:操作和管理KVM虚机的虚拟化 API,使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等在内的多种 Hypervisor。

  • Virsh:基于 libvirt 的 命令行工具 (CLI)

  • Virt-Manager:基于 libvirt 的 GUI 工具

  • virt-v2v:虚机格式迁移工具

  • virt-* 工具:包括 Virt-install (创建KVM虚机的命令行工具), Virt-viewer (连接到虚机屏幕的工具),Virt-clone(虚机克隆工具),virt-top 等

  • sVirt:安全工具

1.2 rhel KVM安装

RedHat 有两款产品提供 KVM 虚拟化:

  • Red Hat Enterprise Linux:适用于小的环境,提供数目较少的KVM虚机。

  • Red Hat Enterprise Virtualization (RHEV):提供企业规模的KVM虚拟化环境,包括更简单的管理、HA,性能优化和其它高级功能。

RedHat Linux KVM 有如下两种安装方式:

1.2.1 在安装redhat linux时安装KVM

在安装过程中安装源选择Virtualization Host的形式去安装

1.2.2 在已有的redhat linux中安装KVM

# 配置软件源
[root@localhost ~]# mount /dev/sr0 /mnt/
mount: /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# cat /etc/yum.repos.d/local.repo 
[rhel]
name=rhel
baseurl=file:///mnt
gpgcheck=0
enabled=1

# 安装kvm所需的所有组件
[root@localhost ~]# yum groupinstall 
# Virtualization Client
# Virtualization Hypervisor 
# Virtualization Platform
# Virtualization Tools
[root@localhost ~]# yum groupinstall "Virtualization*"

安装好之后执行命令 virt-manager 基于 libvirt 的 GUI 工具也就是KVM的web界面

[root@localhost ~]# virt-manager

1.3 KVM使用

1.3.1配置KVM桥接网络

kvm虚拟机的网络配置有两种模式:桥接模式和NAT模式

两种模式区别如下

1)NAT模式:也是用户模式,数据包由NAT方式通过主机的接口进行传送,可以访问公网,但是无法从外部访问虚拟机网络,所以一般不会用到。
2)Bridge:也就是桥接模式,这种模式允许虚拟机像一个独立的主机一样拥有网络,外部的机器可以直接访问到虚拟机内部,但需要网卡支持,一般有线网卡都支持。

配置KVM桥接模式

  1. 复制出一份网卡 ifcfg-br0

[root@localhost network-scripts]# cp ifcfg-eno16777736 ifcfg-br0
[root@localhost network-scripts]# vi ifcfg-br0 
[root@localhost network-scripts]# cat ifcfg-br0 
TYPE="Bridge"
BOOTPROTO=none
NAME=br0
DEVICE=br0
DELAY=0 # 使用PXE去安装虚拟机时 延迟等于0 解决pxe延迟太长导致获取不到ip的问题
ONBOOT=yes
IPADDR=192.168.20.200
NETMASK=255.255.255.0
GATEWAY=192.168.20.254
DNS1=8.8.8.8
  1. 配置物理网卡eno16777736 桥接到br0

[root@localhost network-scripts]# vi ifcfg-eno16777736 
BRIDGE="br0" 
  1. 重启网络

重启过程中可能会报错 因为rhel7 (rhel8.3中已解决)中NetworkManager不支持网卡的桥接模式,可以关闭NetworkManager然后再重启网络

[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ping baidu.com
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10: icmp_seq=1 ttl=128 time=39.0 ms
64 bytes from 39.156.66.10: icmp_seq=2 ttl=128 time=37.4 ms

1.3.2 安装KVM虚拟机

  1. 创建qcow2磁盘

KVM中只支持QCOW2格式的磁盘,如果是正常安装的话,默认安装磁盘就会在/var/lib/libvirt/images/里面, 也可以自己手动创建一个qcow2格式的磁盘 并且使用qemu-img创建的磁盘默认是精简模式 然后在安装的时候手动指定磁盘位置

[root@localhost data]# qemu-img create -f qcow2 VM2.qcow2 10g
Formatting 'VM2.qcow2', fmt=qcow2 size=10737418240encryption=off cluster_size=65536lazy_refcounts=off 
[root@localhost data]# ls -l
total 196
-rw-r--r--. 1 root root 197120 Mar 2223:39 VM2.qcow2
  1. 使用命令创建虚拟机

[root@localhost ~]# virt-install -n VM2 -r 1024 --vcpus=2 --location=/root/rhel-server-7.1-x86_64-dvd.iso --disk path=/data/VM2.qcow2 --network bridge=br0

参数详解

-n: 虚拟机名字
-r: 内存容量
--vcpus: vcpu数量
--location: 安装源位置  iso镜像位置
--disk    # 当磁盘存在时直接指定磁盘位置  当不存在时需要配置size和format
# 示例 --disk path=/var/lib/libvirt/images/VM2.qcow2,size=10,format=qcow2
​    path:安装位置
​    size: 磁盘容器
​    format: 磁盘格式
--network 网络
  1. 登录创建的虚拟机 测试网络连通性

# 配置kvm虚拟机网络
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens3 
TYPE=Ethernet
BOOTPROTO=static
...
ONBOOT=yes
IPADDR=192.168.20.201
NETMASK=255.255.255.0
GATEWAY=192.168.20.254
DNS1=8.8.8.8
# 重启网络测试网络连通性 可以发现 因为网络设置的是桥接模式 所以kvm虚拟机是通过桥接到物理网卡去访问外网
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ping ww.baidu.com
PING ps_other.a.shifen.com (220.181.38.251) 56(84) bytes of data.
64 bytes from 220.181.38.251: icmp_seq=1 ttl=128 time=49.9 ms

同时物理机网络上会出现一个vnet0的网卡 这个就是kvm虚拟机使用的网卡

1.3.3 通过console口去配置KVM虚拟机

  1. 在KVM虚拟机内部编辑/etc/default/grub文件

[root@localhost ~]# vi /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/swap crashkernel=auto rd.lvm.lv=rhel/root rhgb quiet console=ttyS0" # 添加的参数 console=ttyS0
GRUB_DISABLE_RECOVERY="true"
  1. 让grub配置生效再重启KVM虚拟机

[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg 
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-229.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-b2608aa19069469b840585520b323eb9
Found initrd image: /boot/initramfs-0-rescue-b2608aa19069469b840585520b323eb9.img
done
[root@localhost ~]# reboot
  1. KVM主机验证 通过console口去连接KVM虚拟机

[root@localhost qemu]# virsh console VM6
Connected to domain VM6
Escape character is ^]

Red Hat Enterprise Linux Server 7.1 (Maipo)
Kernel 3.10.0-229.el7.x86_64 on an x86_64

localhost login: root
Password: 
Last login: Wed Mar 22 20:56:28 from 192.168.20.1
[root@localhost ~]# 

1.4 KVM虚拟机配置

1.4.1 硬盘配置

给已经创建好的虚拟机增加硬盘

1)创建一块磁盘

[root@localhost data]# qemu-img create -f qcow2 disk15g.qcow2 15g
Formatting 'disk15g.qcow2', fmt=qcow2 size=16106127360 encryption=off cluster_size=65536 lazy_refcounts=off 

# 查看磁盘信息
[root@localhost data]# qemu-img info disk15g.qcow2 
image: disk15g.qcow2
file format: qcow2
virtual size: 15G (16106127360 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

2)编辑虚拟机配置文件

#编辑虚拟机 xml文件 (虚拟机的所有配置文件都存放在/etc/libvirt/qemu)
#找到磁盘相关配置 关键词 disk  新增下面一段
[root@localhost data]# virsh edit VM6
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/data/disk10g.qcow2'/>  # 磁盘路径
      <target dev='hdc' bus='ide'/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
      # 这行可以不写 添加完后会自动生成
    </disk>

3)登录KVM虚拟机验证

​磁盘添加成功

[root@localhost ~]# lsblk 
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0   10G  0 disk 
├─sda1          8:1    0  500M  0 part /boot
└─sda2          8:2    0  9.5G  0 part 
  ├─rhel-swap 253:0    0    1G  0 lvm  [SWAP]
  └─rhel-root 253:1    0  8.5G  0 lvm  /
sdb             8:16   0   10G  0 disk  # 新添加的10g硬盘
sr0            11:0    1 1024M  0 rom  

1.4.2 网卡配置

1)编辑KVM虚拟机xml文件添加如下配置

[root@localhost ~]# vi /etc/libvirt/qemu/VM6.xml   
    <interface type='bridge'>
      <mac address='52:54:00:4e:08:31'/>  # mac地址必须和另一个网卡不同
      <source bridge='br0'/>
      <model type='rtl8139'/>
    </interface>

2)修改完配置文件之后重启libvirt服务并重启KVM虚拟机

[root@localhost qemu]# systemctl restart libvirtd

[root@localhost qemu]# virsh shutdown  VM6
Domain VM6 is being shutdown

[root@localhost qemu]# virsh start VM6
Domain VM6 started

3)登录到KVM虚拟机验证可以发现多了一张网卡

# 登录到KVM虚拟机查看状态
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:4e:08:30 brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.201/24 brd 192.168.20.255 scope global ens3
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe4e:830/64 scope link 
       valid_lft forever preferred_lft forever
3: ens8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:4e:08:31 brd ff:ff:ff:ff:ff:ff

# 同样的本地KVM主机会多一张网卡 vnet1
10: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 500
    link/ether fe:54:00:4e:08:31 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fe4e:831/64 scope link 
       valid_lft forever preferred_lft forever

1.5 KVM常用命令

 virsh list 查看运行的虚拟机
 virsh list -all 查看所有虚拟机
 virsh shutdown vm1 关闭虚拟机
 virsh reboot vm1 重启虚拟机
 virsh start vm1 启动虚拟机
 virsh destroy vm1 强制关机 
 virsh save vm1 vm1file 休眠虚拟机 把正在开机的虚拟机的状态,从内存写入硬盘
 virsh restore vm1file 恢复虚拟在状态
 virsh autostart 物理机启动,之后虚拟机就会启动
 virsh undefine 删除虚拟机

Logo

鸿蒙生态一站式服务平台。

更多推荐