计算机虚拟技术在软件测试,业务部署,远程办公等多应用中已经成为IT技术员工具箱中的基础工具。

这篇文章介绍KVM中如何快速创建新虚拟机。

主要涉及的知识点有:

  • qemu-img 创建 overlay qcow2 磁盘
  • cloud-init 配置

下面以创建 ubuntu18.04 虚拟机为例,进行介绍。

KVM 环境

如果 HOST 主机操作系统为 ubuntu ,其不同版本的KVM安装命令稍有不同:

  • ubuntu18.04: sudo apt-get install qemu-kvm libvirt-clients libvirt-daemon-system virtinst bridge-utils cpu-checker
  • ubuntu18.10 以后的版本: sudo apt-get install qemu-kvm libvirt-bin virtinst bridge-utils cpu-checker

安装完成后,需要确保以下服务开机运行:

sudo systemctl enable libvirtd
sudo systemctl start libvirtd

注意

这里并没有检查 HOST CPU 是否支持虚拟化技术,我们假设你知道如何检查 CPU 是否支持虚拟化。

下载云操作系统镜像

我们可以从 https://cloud-images.ubuntu.com/ 下载需要版本的镜像。ubuntu18.04 的下载地址为: https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img

使用 qemu-img info bionic-server-cloudimg-amd64.img 命令查看镜像信息:

image: bionic-server-cloudimg-amd64.img
file format: qcow2
virtual size: 2.2G (2361393152 bytes)
disk size: 330M
cluster_size: 65536
Format specific information:
    compat: 0.10
    refcount bits: 16

可以看到,镜像文件格式为 qcow2 。这种格式的好处是 HOST 主机中的磁盘空间不必在创建虚拟机磁盘文件的时候一次性分配到位,而是有多少数据就占用多少磁盘空间。

创建虚拟机磁盘

假设 bionic-server-cloudimg-amd64.img 存放目录为: /vmdata

可以使用 qemu-img 创建一个 40G 大小的 overlay 的 qcow2 磁盘文件,/vmdata/images/example.qcow2

sudo qemu-img create -f qcow2 -o backing_file=/vmdata/bionic-server-cloudimg-amd64.img /vmdata/images/example.qcow2 40G

这种文件的特点是,不用将 bionic-server-cloudimg-amd64.img 的内容复制一遍,只是做了相应的关联,如果有数据的变化,就保存到新创建的 example.qcow2 里面去。另外需要注意的是,原始磁盘文件不能够随意变更。

准备 cloud-init 配置文件

cloud-init 配置内容有很多,大家可以参考官网文档

这里主要是修改 ubuntu 用户的密码和修改 apt 仓库源,其文件为 /vmdata/cloud_init.cfg

#cloud-config
hostname: test1
fqdn: test1.example.com
manage_etc_hosts: true
users:
  - name: ubuntu
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: users, admin
    home: /home/ubuntu
    shell: /bin/bash
    lock_passwd: false
    ssh-authorized-keys:
      - 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDGsZSn79Jcy9hJ0COttZXf3v7ZU565/PHovT0Mb3Ew4WS/YcIDH6GOKl7xq0ucj8xtNxZU82IJd/4CzBmZQGn/VitMpvj9wf0XNZnPHLfbpYrpdRwTXD3VyRQhdDT6VZUkLshTcpuduWtNHatJtAf/4DQW8K73tJNBZN0s663DaSex0ESwRg27y1gGnbJE5O+5yYGZ2/M1+4XAnZQSZu+xK1ekA0F5HdCXS2X6LmixeYo4MluqugGK3GbbO3otn7faasprdOuCrdjF9OecFYh10XTKsQnJDy2QxlhCrn1q3MRTLPIECNhZZ4W3yJN6K4Pl3EGWNQxCR0OhgVzVyMj /home/ubuntu/.ssh/id_rsa'
ssh_pwauth: yes
disable_root: false
chpasswd:
  list: |
     ubuntu:$6$c0XBA8x7HxUsVQls$ipbupa7HTCTZ6eGzVVOXyUAwdTeWgJ3YI9yD5BflzJiqXStJOqX5rRfTZBMrAw6EtURSP19PjjtuWYnlw/FIf1
  expire: False
apt:
  primary:
    - arches: [default]
      uri: http://mirrors.aliyun.com/ubuntu/
packages:
  - qemu-guest-agent
# written to /var/log/cloud-init-output.log
final_message: "The system is finall up, after $UPTIME seconds"

注意:

一、 chpasswd:list:ubuntu: 后的字符串是给 ubuntu 用户的初始密码,可以使用下面的命令生成:

python3 -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA512)))'

二、 ssh-authorized-keys: 后的内容,替换成你自己的公钥,就可以使用 SSH key 登陆。

生成 cdrom iso 文件

通过上面的配置文件,生成用于 cloind-init nocloud 挂载使用的 ISO 文件

sudo cloud-localds config.iso cloud_init.cfg

运行 virt-install 创建虚拟机

sudo virt-install --memory 2048 --vcpus 2 --name example01 --disk /vmdata/images/example.qcow2,device=disk,bus=virtio --disk /vmdata/config.iso,device=cdrom --os-type Linux --os-variant ubuntu18.04 --virt-type kvm --graphics none --network network=default,model=virtio --import

完成这最后一步,我们的虚拟机就创建完成了。我们从控制台输出的时间可以看到,整个过程只用了几十秒。

对比以前使用 ubuntu ISO 镜像文件安装系统、以及使用 virt-clone 创建VM所花费的时间,确实节约了不少!

参考: