跳转至

Virt builder

virt-builder 简介

virt-builder 是一种命令行工具,可轻松快速地构建供本地或云使用的各种虚拟机镜像

virt-builder 会下载经过精心准备的,经过数字签名的 OS 模板,因此不必手动安装 OS

官方文档:https://libguestfs.org/virt-builder.1.html

安装 virt-builder

virt-builder 是 libguestfs 库的一部分,因此请先在 Linux 上安装 libguestfs

dnf install -y guestfs-tools

使用 virt-builder 构建虚拟机镜像

列出可用的虚拟机模板:

virt-builder --list

可用的列表为:

ubuntu-20.04             x86_64     Ubuntu 20.04 (focal)
ubuntu-18.04             x86_64     Ubuntu 18.04 (bionic)
ubuntu-16.04             x86_64     Ubuntu 16.04 (Xenial)
ubuntu-14.04             x86_64     Ubuntu 14.04 (Trusty)
ubuntu-12.04             x86_64     Ubuntu 12.04 (Precise)
ubuntu-10.04             x86_64     Ubuntu 10.04 (Lucid)
scientificlinux-6        x86_64     Scientific Linux 6.5
opensuse-tumbleweed      x86_64     openSUSE Tumbleweed
freebsd-11.1             x86_64     FreeBSD 11.1
fedora-37                x86_64     Fedora® 37 Server
fedora-36                x86_64     Fedora® 36 Server
fedora-35                x86_64     Fedora® 35 Server
fedora-35                aarch64    Fedora® 35 Server (aarch64)
...
fedora-21                ppc64le    Fedora® 21 Server (ppc64le)
fedora-21                ppc64      Fedora® 21 Server (ppc64)
fedora-21                armv7l     Fedora® 21 Server (armv7l)
fedora-21                aarch64    Fedora® 21 Server (aarch64)
fedora-20                x86_64     Fedora® 20
fedora-19                x86_64     Fedora® 19
fedora-18                x86_64     Fedora® 18
debian-9                 x86_64     Debian 9 (stretch)
debian-8                 x86_64     Debian 8 (jessie)
debian-7                 x86_64     Debian 7 (wheezy)
debian-7                 sparc64    Debian 7 (Wheezy) (sparc64)
debian-6                 x86_64     Debian 6 (Squeeze)
debian-11                x86_64     Debian 11 (bullseye)
debian-10                x86_64     Debian 10 (buster)
cirros-0.3.5             x86_64     CirrOS 0.3.5
cirros-0.3.1             x86_64     CirrOS 0.3.1
centosstream-9           x86_64     CentOS Stream 9
centosstream-8           x86_64     CentOS Stream 8
centos-8.2               x86_64     CentOS 8.2
centos-8.0               x86_64     CentOS 8.0
centos-7.8               x86_64     CentOS 7.8
centos-7.7               x86_64     CentOS 7.7
centos-7.6               x86_64     CentOS 7.6
centos-7.5               x86_64     CentOS 7.5
centos-7.4               x86_64     CentOS 7.4
centos-7.3               x86_64     CentOS 7.3
centos-7.2               x86_64     CentOS 7.2
centos-7.2               aarch64    CentOS 7.2 (aarch64)
centos-7.1               x86_64     CentOS 7.1
centos-7.0               x86_64     CentOS 7.0
centos-6                 x86_64     CentOS 6.6
alma-8.5                 x86_64     AlmaLinux 8.5

下载的地址:https://builder.libguestfs.org/

在构建虚拟机镜像之前,可以查看客户机 OS 的安装说明以了解其中的内容

例如:

> virt-builder --notes centos-7.8

CentOS 7.8

This CentOS image contains only unmodified @Core group packages.

This template was generated by a script in the libguestfs source tree:
    builder/templates/make-template.ml
Associated files used to prepare this template can be found in the
same directory.

建立一个临时目录存放虚拟机

cd $(mktemp -d)

使用以下命令构建 CentOS 7 虚拟机

# 可执行下述语句:try running qemu directly without libvirt
export LIBGUESTFS_BACKEND=direct

virt-builder centos-7.8

此命令已构建了最小的 CentOS 7 镜像,它不会有任何用户帐户,只有随机的 root 密码和最少安装的软件

输出如下:

[   9.4] Downloading: http://builder.libguestfs.org/centos-7.8.xz
[   9.8] Planning how to build this image
[   9.8] Uncompressing
[  11.1] Opening the new disk
[  15.1] Setting a random seed
[  15.1] Setting passwords
virt-builder: Setting random password of root to 9LimFDhMuXCP7fgr
[  15.9] SELinux relabelling
[  20.8] Finishing off
                   Output file: centos-7.8.img
                   Output size: 6.0G
                 Output format: raw
            Total usable space: 5.4G
                    Free space: 4.1G (75%)

镜像的输出名称应与模板名称相同,可以使用 -o 进行指定

virt-builder centos-7.8 -o centos-7.8-builder.img

虚拟机格式

默认情况下,镜像格式为 img,可以将其转换为其他格式,例如 qcow2,如下所示:

virt-builder centos-7.8 --format qcow2

虚拟机架构

默认情况下,virt-builder 将构建与主机 OS 体系结构相同的镜像,用 --arch 选项进行更改():

virt-builder centos-7.2 --arch aarch64

构建自定义尺寸的镜像,使用如下命令构建大小为 50 GB 的 VM,在将客户机操作系统复制到输出时,将使用virt-resize 命令自动调整其大小:

virt-builder centos-7.8 --size 50G

虚拟机 root 用户

设置 root 密码:

virt-builder centos-8.2 --format qcow2 --root-password password:centos

可以从文本文件设置密码:

virt-builder centos-8.2 --root-password file:~/pass.txt

要禁用 root 密码,请运行:

virt-builder centos-8.2 --root-password disabled

锁定根帐户:

virt-builder centos-8.2 --root-password locked

锁定 root 帐户并禁用 root 密码:

virt-builder centos-8.2 --root-password locked:disabled

要分配 root 密码但锁定 root 帐户,请使用以下选项:

virt-builder centos-8.2 --root-password locked:file:FILENAME

virt-builder centos-8.2 --root-password locked:password:PASSWORD

使用 passwd -u 命令解锁 root 用户后,可以使用 root 密码

建立普通用户

要在构建虚拟机镜像时创建用户帐户,请运行:

virt-builder centos-8.2 --firstboot-command 'useradd -m -p "" sk ; chage -d 0 sk'

上面的命令将创建一个没有密码的名为 sk 的用户,并强制在首次登录时设置密码

设置主机名

virt-builder centos-8.2 --hostname virt-centos8

软件包管理

要在虚拟机上安装软件包,运行:

virt-builder centos-8.2 --install vim

要安装多个软件包,请用引号引起来,并用逗号分隔,如下所示:

virt-builder centos-8.2 --install "apache2,htop"

更新虚拟机中的所有软件包:

virt-builder centos-8.2 --update

SELinux

如果 VM 使用 SELinux,则需要在安装或更新软件包后重新标记 SELinux:

virt-builder centos-8.2 --update --selinux-relabel

自定义 VM 镜像

Virt-builder 在构建镜像时有许多选项可以自定义镜像

例如,可以在 vm 首次启动时运行特定的命令/脚本:

virt-builder centos-8.2 --firstboot-command 'dnf -y update'

添加一行:

virt-builder centos-8.2 --append-line '/etc/hosts:192.168.225.1 server.local'

缓存模板

默认情况下,所有模板都将从下载网络,由于模板很大,因此下载的模板将被缓存在用户的主目录中

可以使用以下命令打印缓存目录的详细信息以及当前缓存的模板:

> virt-builder --print-cache
cache directory: /root/.cache/virt-builder
opensuse-tumbleweed      x86_64     no
alma-8.5                 x86_64     no
centos-6                 x86_64     no
centos-7.0               x86_64     no
centos-7.1               x86_64     no
centos-7.2               aarch64    cached
centos-7.2               x86_64     no
centos-7.3               x86_64     no
centos-7.4               x86_64     no
centos-7.5               x86_64     no
centos-7.6               x86_64     no
centos-7.7               x86_64     no
centos-7.8               x86_64     cached
centos-8.0               x86_64     no
centos-8.2               x86_64     no
...
fedora-31                x86_64     no
fedora-32                x86_64     no

可以通过手动查看缓存文件夹来验证它:

> ls $HOME/.cache/virt-builder
centos-7.2.aarch64.1  centos-7.8.x86_64.1

可以使用以下命令将所有可用模板下载到本地缓存文件夹中:

virt-builder --cache-all-templates

如果不想在构建镜像时缓存模板,使用 --no-cache 选项

要删除所有缓存的模板,请运行:

virt-builder --delete-cache

示例

启动一个空白的 centos7 镜像

virt-builder centos-7.8 \
    --size 50G \
    --output /var/lib/libvirt/images/centos7-base.qcow2 \
    --format qcow2 \
    --hostname centos7-base \
    --root-password password:f