Linux 虚拟化技术 - KVM

警告
本文最后更新于 2023-12-18,文中内容可能已过时。

Linux 虚拟化技术 - KVM

简单介绍 KVM

参考博客:KVM 介绍(1):简介及安装 - SammyLiu - 博客园

在 Windows 操作系统中,通过虚拟机软件 VMware Workstation,可以在宿主机中虚拟化出很多虚拟机。

在 Linux 系统中,虚拟化技术也经过了多次进化,目前的主流是 Dokcer

通过 Docker,我们可以在 Linux 系统中再安装一个 Linux 系统,比如 Ubuntu。参考博客:在 Docker 里面安装 Ubuntu,并且使用 ssh 进行连接 - 掘金。过程也很简单:

  1. 拉取镜像

    1
    
    docker pull ubuntu
  2. 启动容器

    1
    
    docker run --name 新建的容器的名字 -ti -v /AAA:/BBB -d -p 3316:22 ubuntu(这个是镜像的名字)

但是有的时候,我们就是需要物理上完全隔离的机器,即:除了硬件是公用的,从操作系统开始都分开,这种情况下,Docker 就不满足我们的要求了。

这种场景下,最合适的方案是 VMware ESXI,但是如果一开始没有安装 VMware ESXI 就已经在硬件上安装了 Linux,现在需要在 Linux 内部虚拟化,那就只能选择 KVM(Kernel-based Virtual Machine)了。

关于 Docker 和虚拟机的区别,已经为什么要选择 KVM,请看《Docker 和虚拟机比较》

KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 线程。这使得 KMV 能够使用 Linux 内核的已有功能。

但是,KVM 本身不执行任何硬件模拟,需要用户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。

实践

接下来,我们准备在 Window 操作系统中通过 VMware Workstation 安装 Linux 操作系统,然后在 Linux 中再虚拟化出一个 Linux 系统。

我们选择的 Linux 发行版是 Ubuntu,其他发行版使用 KVM 的步骤也是差不多的

CentOS 如何使用 KVM,请看博客:CentOS 7 系统 KVM 实例教程 — 安装使用 KVM 以及部署虚拟机 | RULTR

首先我们需要在本机安装好 VMware Workstation,这里就不赘述了。网上教程有很多。

然后,我们需要到Ubuntu 的 ISO 下载页面去下载我们想要的版本的 Ubuntu,这里我们选择的是Ubuntu 20.04.6 LTS

安装 Ubuntu 操作系统

然后就可以开始新建虚拟机安装 Ubuntu,安装的过程这里就不赘述了,网上的教程有很多,比如VMware 上安装 Ubuntu22.04 - 掘金VMware 虚拟机安装 Ubuntu20.04 详细图文教程_vmware ubuntu-CSDN 博客,不过有几点需要注意的地方,这里额外进行说明:

在下面这一步,选择稍后安装操作系统,而不要选择第二个选项。

后面在自定义硬件的时候,再选择 ISO

在新建虚拟机的自定义硬件这一步,内存这里尽量给大一点,比如给 20G,因为这个虚拟机内部还需要安装一个虚拟机,如果此时内存不够大,在其内部新建虚拟机的时候,能分配的内存就会很小,运行就会很慢。

处理器内核总数也尽量给多一点,因为 CPU 核心数直接决定了虚拟机的性能,如果外层虚拟机(取名 A)的 CPU 核心数量一开始设置的比较低,安装了virt-manager之后,再安装了内层虚拟机(取名 B),此时,发现,因为 CPU 核心数少,B 运行很慢,如果此时再去修改 A 的 CPU 核心数,virt-manager和 B 的运行会出现异常。因此,一开始就把 A 的 CPU 核心数设置高才是良策。

此外还需要把虚拟化引擎下的三个复选框都勾上,其实最重要的是勾选虚拟化 Intel VT-x/EPT 或 AMD-V/RVI(V),这是在虚拟机内部再新建虚拟机实现虚拟机嵌套的前提,但是 Windows11 默认不支持这个选项,勾选之后直接运行虚拟机的话,会提示:

参考博客:关于“VMware Workstation 16 此平台不支持虚拟化的 Intel VT-x/EPT. 不使用虚拟化的 Intel VT-x/EPT,是否继续?”的有关问题的总结解答-CSDN博客

因此,在启动虚拟机之前,我们还需要到 Windos 安全中心 -> 设备安全性 -> 内核隔离中,关闭内存完整性才可以启动虚拟机

设置好之后,启动虚拟机,然后就进入了 Ubuntu 的安装引导程序,网上的教程有很多,比如VMware 上安装 Ubuntu22.04 - 掘金VMware 虚拟机安装 Ubuntu20.04 详细图文教程_vmware ubuntu-CSDN 博客,这里就不重复贴图了,只说一些需要注意的点。

首先是安装过程中可能出现引导窗口显示不全导致无法点击下一步的问题,像下图这样:

选择中文简体,然后点击安装 Ubuntu

此时,就无法往下走了,下一步的按钮都看不到

此时,我们可以按住Alt+F7,此时鼠标变成小手,窗口会随着鼠标的移动而移动,我们可以将窗口上移,看到可以拖到下面的继续按钮,

然后是选择安装哪些应用的时候,默认是正常安装,选择最小化安装即可,开发够用了。

然后是设置用户名的时候,用户名不应该跟系统保留的用户名重名,比如 root,admin 之类的,也不应该跟系统组件重名,比如 kvm,systemd 之类的,否则 Ubuntu 会无法安装成功。

其他的就没有什么需要注意的,根据网上找到的教程下一步即可。最终经过重启,Ubuntu 装好了

配置固定 IP - 可选

在设置 -> 网络 -> 有线 -> 点击右侧的齿轮

选择 IPV4,手动设置 IP 地址

注意要配置 DNS,因为下载软件的时候需要解析域名,DNS 设置成网关的地址即可。

取消自动,填写具体的 DNS 服务器的地址,一般就填网关。

配置软件源 - 可选

点击左下角九个点的图标,然后选择软件和更新

Ubuntu 软件默认下载自位于中国的服务器,这是因为你在安装系统的时候选择地区的是上海

如果觉得软件速度下载很慢,可以点击下载自右侧的列表选择其他

选择一个国内源

安装 SSH

最小化安装的时候,Ubuntu 默认只有 ssh 客户端,没有 ssh 服务端,所以,我们无法在外部通过 SSH 连接到此虚拟机,因此我们需要手动安装 ssh 服务端

参考博客:解决 ubuntu 下 SSH 无法连接的问题-mcc543-ChinaUnix 博客

1
sudo apt-get install openssh-server

安装 FTP

参考博客:超简单 Ubuntu Server 配置 FTP 服务器教程_ubuntu ftp 服务器-CSDN 博客

最小化安装的时候,也没有安装 FTP 服务端,所以我们无法上传文件到虚拟机,因此我们需要手动安装 FTP 服务器

1
sudo apt install vsftpd

然后修改配置文件

1
sudo vi /etc/vsftpd.conf

确保以下几项没有被注释掉:

1
2
3
4
5
6
#禁止匿名访问
anonymous_enable=NO
#接受本地用户
local_enable=YES
#允许上传
write_enable=YES

重启 FTP 服务端

1
sudo service vsftpd restart

然后就可以用 ssh 登录上去,然后用 ftp 上传文件了。注意,上传的目录必须是登录的 SSH 用户有w权限的目录,否则就会上传不上去,比如/opt目录默认只有 root 用户有写权限,因此保险起见上传到/tmp目录最好。为了后续不被删除,后面可以将文件从/tmp中移出到指定目录。

配置 KVM 虚拟化

安装好 Ubuntu 之后,我们就可以开始通过 KVM 在其内部再装一个 Linux 系统,这里选择的依旧是 Ubuntu。

参考文档:Ubuntu 20.04 物理机 QEMU-KVM + Virt-Manager 创建桥接模式的虚拟机 - NavyW - 博客园

上传下载好的ubuntu-20.04.6-desktop-amd64.iso到服务器的/tmp目录,然后赋权

1
sudo chmod a+rwx ubuntu-20.04.6-desktop-amd64.iso

为了后续不被删除,可以移动到/opt目录。

然后开始安装virt-manager

1
sudo apt-get install virt-manager

启动 libvirtd 服务并设置开启启动

1
2
sudo systemctl start libvirtd
sudo systemctl enable libvirtd

打开网络编辑页面

1
nm-connection-editor

此时只有有线连接 1

选中以太网,点击底部的加号,选择网桥

点击网桥连接下的添加按钮,选择以太网

在弹出框的以太网标签页下的设备下拉框中选择物理网卡,这里是ens33,然后点击保存

回到页面

然后切换到 IPv4 这个标签页,开始编辑 IP,我们需要设置网桥的 IP 为固定 IP,且子网掩码、网关、DNS 这些东西都跟物理网卡的一样

点击保存

接下来这一步很关键,我们删掉物理网卡的网络连接,即有线连接 1,然后重启,这样,系统对外就会通过网桥来进行通信,同时系统也就只有一个 IP,就是网桥设置的 IP

接着,我们就可以通过 virt-manager 创建虚拟机了,在终端执行

1
virt-manager

点击文件下方的那个图标新建虚拟机

选择本地安装介质 ISO

点击浏览

点击本地浏览,找到你上传的 ISO,

然后点击确定,系统会自动识别 ISO 的对应的操作系统

识别成功,点击前进,配置内存和 CPU 核心数

配置硬盘空间

然后选择网络这里,因为我们删掉了有线连接1,只有桥接,因此这里会自动选择我们在前面手动创建的桥接 bridge0。这样,虚拟机的网卡跟宿主机的物理网卡就都连接到了同一个网桥

点击完成,就会开始安装虚拟机。

因为是在虚拟机里面装虚拟机,所以有可能在桌面卡一会儿才会出现下面这个安装引导页面,不要慌

剩下的步骤就跟之前安装虚拟机的时候一样了,虚拟机安装好之后,依旧是配置固定 IP、安装 SSH、安装 FTP。

此时,虚拟机和通过 KVM 安装的虚拟机相互之间都是可以建立 SSH 连接的。

KVM 克隆

首先关闭被克隆的虚拟机,选中之后,点击右键,选择克隆即可

启动克隆出来的机器之后,记得修改固定 IP,并重启生效,

搭建网络并进行测试

在 Windows 下创建 VM1 和 VM2 两台虚拟机,VM2 下再通过 KVM 虚拟出 VM2-1 和 VM2-2 两台机器

其中,VM2 中建立了桥接网络,VM2 的物理网卡和 VM2-1 和 VM2-2 这两个虚拟机的虚拟网卡共同桥接到 VM2 的桥接网卡中,VM2 的桥接网卡跟 VM1 以 NAT 模式部署在 Windows 物理机中的两台虚拟机,网络结构图如下:

其实就跟《Vmware 虚拟机三种网络模式详解》中的Bridged(桥接模式)小节中的图是一样的

因此,这四台机器之间哦都是互联互通的。

192.168.101.160 通过 SSH 连接192.168.101.163

192.168.101.160 通过 SSH 连接192.168.101.162

192.168.101.160 通过 SSH 连接192.168.101.161

192.168.101.163通过 SSH 连接192.168.101.160

192.168.101.163通过 SSH 连接192.168.101.161

192.168.101.163通过 SSH 连接192.168.101.162

其他的基本上就不测了,基本上都是通的

0%