「KVM」- 虚拟机创建

  CREATED BY JENKINSBOT

问题描述

在 libvirt 中,具有创建虚拟机的 virsh 命令,能够使用 virsh create configuration-file.xml 命令来创建虚拟机。所以,在使用该命令创建虚拟机前,需要先要创建描述虚拟机信息的 XML 文件,然而编写 XML 文件是件繁琐的工作。

我们希望找到创建虚拟机的快捷方法,能够快速且批量地创建虚拟机,而非简单重复的手动安装。当然,如果使用 IaaS 平台(比如 OpenStack、OpenNebula 等等)管理 KVM 虚拟化,则通常无需这些方法,因为很多 IaaS 平台已经具备这些功能。

该笔记将记录:当使用 KVM 虚拟化时,创建虚拟机的方法,以及常见问题处理。

解决方案

virt-manager(图形化界面安装)

概述:该方法并没有实现快速安装,属于传统的操作系统安装。但是,比创建 XML 文件的方法容易许多。

如果喜欢使用图形化工具,使用 virt-manager 命令。在 Debian 中,该命令属于 virt-manager 软件包:

apt-get install virt-manager

鉴于图形界面比较容器使用,这里不再叙述详细的使用方法。

vrit-install(从命令行安装)

概述:通过命令行安装,我们使用固定的命令行参数,每次都执行相同的命令,也许能简化初始过程。但是,操作系统的安装过程依旧需要我们人工进行,填写必要参数,完成操作系统的安装。

命令 virt-install 是个命令行工具,用于创建虚拟机。在 Debian 中,该命令属于 virtinst 软件包(实际上来自于 virt-manager 软件包,只是发行版将其拆分到不同的包中)。在 CentOS 中,该命令属于 virt-viewer 软件包。(注意,在不同的Linux发行版、或相同Linux发行版的不同版本中,软件包的名字可能会有些许的差异,大体上是一样的)

首先,创建虚拟机。如下命令,指定了虚拟机的名称、内存大小、硬盘大小:

virt-install \
    --connect qemu:///system \
    --virt-type kvm \
    --name guestosname \
    --memory 500 \
    --disk size=10 \
    --cdrom /path/to/os.iso

至此,虚拟机已经从操作系统镜像 /path/to/os.iso 启动,并进入了安装界面。(就像平时从U盘启动后,进入安装界面。)

然后,安装操作系统。接下来,进入显示控制台,进行安装步骤。就像实体机安装操作系统一样,进行操作系统的安装:

# 连接到机器上,选项 -X 对 X11 进行转发
ssh root@hostnameoripaddress -X

# 在远程主机上执行该命令,由于ssh已经进行了X11转发(-X),所以会在本地打开窗口
virt-viewer guestosname

上面是一种通用办法(不用关心显示设备的设置),很少会遇到问题。

还可以使用SSH连接到远程主机,查找客户端配置文件,然后创建到控制台的隧道连接。执行如下命令:

# virt-viewer --connect qemu+ssh://root@hostnameoripaddress/system guestosname

这期间需要进行两次SSH密码输入。同时,使用这种方式要求虚拟机中创建的 Graphics 正确配置。在我的测试中,类型为 VNC server 的 Graphics 连接成功。但是类型为 Spice server 的 Graphics 连接失败了。以后再折腾吧。

virt-clone(虚拟机克隆)

概述:通过虚拟机克隆,克隆已有虚拟机,以生成新的虚拟机,能够简化安装过程。

过程:
1)首先,我们安装操作系统;
2)然后,将其转化为“虚拟机模板”;
3)后续,在创建虚拟机时,将克隆该模板;
4)最后,直接启动克隆生成的系统。

缺点:
1)“虚拟机模板”需要进行处理(比如 删除 SSH Host Key 文件),否则克隆生成的虚拟机会包含原系统的特征信息。
2)然而,被处理(删除)的文件无法自动生成。比如,“虚拟机模板”将移出 SSH Host Key 文件,但是新虚拟机不会自动生成,导致 SSH 无法连接,而需要 ssh-kengen -A 重新生成。据我们所知,还没有相关工具来自动创建这些文件。

实现:参考 Clone existing KVM vm 笔记。

virt-install + Kickstart

概述:当通过命令 virt-install 安装系统时,指定向内核传递 Kickstart 配置文件,以完成操作系统的自动安装。

过程:
1)创建 Kickstart 配置文件;
2)在执行 virt-install 系统时,通过 -x 选项传递 Kickstart 配置文件;

缺点:
1)发行版不同,工具不同:对于 RHEL 及 CentOS 能够使用 Kickstart 工具;对于 Debian 需要使用 FAI 或 Debian Installer Preseed 等等工具。

实现:KVM: Install CentOS / RHEL Using Kickstart File (Automated Installation) – nixCraft

PXE + Kickstart

概述:该方法与 virt-install + Kickstart 类似,在启动虚拟机时,将自动完成操作系统的安装,而我们仅需要创建虚拟机。

Cloud Images + Cloud-init

概述:通过各个 Linux 发行版提供的 Cloud Image,配合我们创建的 cloud_init.cfg 来完成主机的初始化。我们使用的阿里云主机的 Ubuntu 18.04 通过便是通过 Cloud-init 进行主机初始化(查看 /etc/cloud/ 目录),其他发行版应该也是。

过程:
1)需要创建 cloud_init.cfg 配置文件;
2)通过 cloud-localds(或其他命令)将配置文件写入镜像;
3)使用该修改后的镜像来创建虚拟机;
4)在启动时,将自动加载 Cloud Init 配置,完成主机初始化;

缺点:
1)需要“云镜像”(Cloud Image)。不过,主流的发行办似乎都提供 Cloud Image 文件,所以这并非严重的问题。

实现:KVM: Testing cloud-init locally using KVM for an Ubuntu cloud image – Fabian Lee : Software Architect

Multipass (Ubuntu)

概述:
multipass 是创建虚拟机的工具,能够快速安装 Ubuntu 虚拟机。

过程:
1)安装 multipass 命令
2)通过 multipass 命令快速创建 Ubuntu 虚拟机实例;且能够通过 Cloud-init 进行初始化;

优点:
1)能够使用 Cloud-init 完成虚拟机初始化;

缺点:
1)仅能用于安装 Ubunut 系统。但是对我们来说是好消息,因为我们的测试环境以 Ubuntu 为主,所以该方法适合我们。
2)该方法创建的虚拟机仅能通过 multipass 管理,因为它并不使用 libvirtd 服务;

实现:
Multipass orchestrates virtual Ubuntu instances

参考文献

How to create and manage KVM virtual machines from CLI
How to Install Linux KVM and Create Guest VM with Examples
Chapter 20. Managing guests with virsh/Creating a guest
Creating a virtual machine XML dump(configuration file)
kvm virtualization – Install guest CentOS 7 on KVM also on CentOS7 without GUI – Server Fault
Multipass orchestrates virtual Ubuntu instances