Product SiteDocumentation Site

12.2. 虚拟化

虚拟化是近年来计算领域最重要的进步之一。该术语涵盖模拟虚拟计算机的各种抽象和技术,虚拟计算机在实际硬件上具有不同程度的独立性。然后,一台物理服务器可以托管多个系统,同时单独工作。应用程序很多,通常派生自此隔离:例如具有不同配置的测试环境,或跨不同虚拟机分离托管服务以保障安全。
有多种虚拟化解决方案,每种解决方案都有自己的优缺点。本书将重点介绍 Xen、LXC 和 KVM,但其他值得注意的实现包括:

12.2.1. Xen

Xen 是一种"准虚拟化"解决方案。它引入了硬件和上层系统之间的一个薄抽象层,称为"虚拟机管理程序";这充当控制从虚拟机访问硬件的裁判。但是,它只处理一些指令,其余指令由硬件代表系统直接执行。主要优点是性能不会下降,系统运行接近本机速度;缺点是,希望在 Xen 虚拟机管理程序上使用的操作系统内核需要调整才能在 Xen 上运行。
让我们花些时间在条款上。虚拟机管理程序是最低层,直接在硬件上运行,甚至低于内核。此虚拟机管理程序可以跨多个domains(域),这可视为许多虚拟机。其中一个域(第一个入门域)称为 dom0,具有特殊作用,因为只有此域可以控制虚拟机管理程序和其他域的执行。其他域称为domU。换句话说,从用户的角度来看,dom0与其他虚拟化系统的"主机"匹配,而domU可以被视为"来宾"。
在 Debian 下使用 Xen 需要3个组件:
  • The hypervisor itself. According to the available hardware, the appropriate package providing xen-hypervisor will be either xen-hypervisor-4.17-amd64, xen-hypervisor-4.17-armhf, or xen-hypervisor-4.17-arm64.
  • A kernel that runs on that hypervisor. Any kernel more recent than 3.0 will do, including the 6.1 version present in Bookworm.
The hypervisor also brings xen-utils-4.17, which contains tools to control the hypervisor from the dom0. This in turn brings the appropriate standard library. During the installation of all that, configuration scripts also create a new entry in the GRUB bootloader menu, so as to start the chosen kernel in a Xen dom0. Note, however, that this entry is not usually set to be the first one in the list, but it will be selected by default.
安装这些先决条件后,下一步是测试 dom0 本身的行为;这涉及到重新启动虚拟机管理程序和 Xen 内核。系统应以标准方式启动,在初始化步骤前期,控制台上会显示一些额外的消息。
现在可以使用 xen-tools 中的工具在 domU 系统上实际安装系统。此包提供 xen-create-image 命令,这在很大程度上是自动执行任务的。唯一的必需参数 --hostname,指定 domU 的名称;其他选项也很重要,但它们可以存储在 /etc/xen-tools/xen-tools.conf 配置文件中,并且它们不在命令行中不会触发错误。因此,在创建映像之前检查此文件的内容,或在 xen-create-image 中使用额外的参数。需要注意的重要参数包括:
  • --memory,指定新创建系统的RAM大小;
  • --size--swap,指定 domU 使用的“虚拟磁盘”的大小;
  • --debootstrap-cmd, to specify the which debootstrap command is used. The default is debootstrap if debootstrap and cdebootstrap are installed. In that case, the --dist option will also most often be used (with a distribution name such as bookworm).
  • --dhcp 指示 domU 的网络配置应该由 DHCP 获取,而 --ip 允许定义静态 IP 地址。
  • 最后,必须选择存储方式才能创建映像(视为来自 domU 的硬盘驱动器) 。最简单的方式,对应 -dir 选项是为 domU 使用的每个设备在 dom0 上创建一个文件。对于使用 LVM 的系统,另一种选择是使用 --lvm选项,后跟卷组的名称; xen-create-image 在该组内创建新的逻辑卷,并将此逻辑卷作为硬盘提供给 domU。
一旦做出这些选择,我们就可以为 Xen domU 创建映像:
# xen-create-image --hostname testxen --dhcp --dir /srv/testxen --size=4G --dist=bookworm --role=udev


General Information
--------------------
Hostname       :  testxen
Distribution   :  bookworm
Mirror         :  http://deb.debian.org/debian
Partitions     :  swap            512M  (swap)
                  /               4G    (ext4)
Image type     :  sparse
Memory size    :  256M
Bootloader     :  pygrub

Networking Information
----------------------
IP Address     : DHCP [MAC: 00:16:3E:9F:55:BB]


Creating partition image: /srv/testxen/domains/testxen/swap.img
Done

Creating swap on /srv/testxen/domains/testxen/swap.img
Done

Creating partition image: /srv/testxen/domains/testxen/disk.img
Done

Creating ext4 filesystem on /srv/testxen/domains/testxen/disk.img
Done
Installation method: debootstrap
Done

Running hooks
Done

Role: udev
	File: /etc/xen-tools/role.d/udev
Role script completed.

Creating Xen configuration file
Done

No role scripts were specified.  Skipping
Setting up root password
Generating a password for the new guest.
All done


Logfile produced at:
	 /var/log/xen-tools/testxen.log

Installation Summary
---------------------
Hostname        :  testxen
Distribution    :  bookworm
MAC Address     :  00:16:3E:9F:55:BB
IP Address(es)  :  dynamic
SSH Fingerprint :  SHA256:JsTNzWbiRoqTwZ60GAFFpl+s+/rmWf5GhQexQz1gCm8 (DSA)
SSH Fingerprint :  SHA256:iEuV3oFhRdDRoytTpxF4YMMgewTsQKYTU709kxCH+tk (ECDSA)
SSH Fingerprint :  SHA256:LSrc0bAIaeKI0neSEeT+Oun6uBbu47sKAo2agmq+jCI (ED25519)
SSH Fingerprint :  SHA256:/4OS5h74tkzSlk5/EU/tchvrar32vpoJoCudyDnw9W0 (RSA)
Root Password   :  3Bbnf5qFcEMDucK4sMYFJY7
我们现在有一个虚拟机,但目前还未运行(因此只使用 dom0 硬盘上的空间)。当然,我们可以创建更多的映像,可以使用不同的参数。
在打开这些虚拟机之前,我们需要定义如何访问它们。当然,它们可以视为隔离的计算机,只能通过其系统控制台访问,但这很少使用这种模式。在大多数情况下,domU 视为远程服务器,并且只能通过网络访问。但是,为每个 domU 添加一个网卡会非常不方便;这就是为什么 Xen 允许创建每个域都可以以标准方式查看和使用虚拟网络接口的原因。请注意,这些网卡即使是虚拟的,也只有在连接到网络(即使是虚拟网络)时才有用。Xen 具有多个网络模式:
  • 最简单的模式是 bridge 模式;所有 eth0 网卡 (在 dom0 和 domu 系统中) 的行为就像它们直接插入以太网交换机一样。
  • 然后是 routing 模式,其中 dom0 充当位于 domU 系统和(物理)外部网络之间的路由器。
  • 最后,在 NAT 模式中,dom0 也是位于 domU 系统和网络其余部分之间,但 domU 系统不能从外部直接访问,并且流量通过 dom0 上的一些网络地址转换。
这3种网络节点涉及许多具有特定名称的接口,例如 vif*veth*peth*xenbr0。Xen 虚拟机管理程序在用户空间工具的控制之下,以已定义的布局排列它们。由于 NAT 和路由模式仅适合特定情况,因此我们仅说明桥接模式。
The standard configuration of the Xen packages does not change the system-wide network configuration. However, the xend daemon is configured to integrate virtual network interfaces into any pre-existing network bridge (with xenbr0 taking precedence if several such bridges exist). We must therefore set up a bridge in /etc/network/interfaces (which requires installing the bridge-utils package, which is why the xen-utils package recommends it) to replace the existing eth0 entry. Be careful to use the correct network device name:
auto xenbr0
iface xenbr0 inet dhcp
    bridge_ports eth0
    bridge_maxwait 0
重新启动以确保自动创建网桥后,我们现在可以使用 Xen 控制工具启动 domU,特别是 xl命令。此命令允许对域进行不同的操作,包括列出它们以及启动/停止它们。您可能需要通过从配置文件(在这种情况下是 /etc/xen/testxen.cfg)编辑内存变量来增加默认内存。在这里,我们已设置为 1024(兆字节)。
# xl list
Name                                ID   Mem VCPUs      State   Time(s)
Domain-0                             0  7973     4     r-----      13.6
# xl create /etc/xen/testxen.cfg
Parsing config from /etc/xen/testxen.cfg
# xl list
Name                                ID   Mem VCPUs      State   Time(s)
Domain-0                             0  7841     4     r-----      87.1
testxen                              4     0     0     --p---       0.0
请注意,testxen domU 使用 RAM 中的实际内存,否则该内存将提供给 dom0,而不是模拟内存。因此,在构建用于承载 Xen 实例的服务器时,应注意相应地预配物理 RAM。
Voilà!我们的虚拟机正在启动。我们可以使用两种方式访问它。通常的方式是通过网络"远程"连接到,就像连接到一台真正的机器一样;这通常需要设置 DHCP 服务器或某些 DNS 配置。另一种方式,这可能是网络配置不正确的唯一方法,是使用 xl console 命令使用 hvc0 控制台:
# xl console testxen
[...]

Debian GNU/Linux 12 testxen hvc0

testxen login: 
然后,可以打开一个会话,就像坐在虚拟机的键盘上一样。通过组合按键 Control+] 分离控制台。
一旦 domU 启动,它可以像使用任何其他服务器一样使用(因为它是一个 GNU/Linux 系统)。但是,其虚拟机状态允许一些额外的功能。例如,domU 可以使用 xl pause 命令暂停,然后使用 xl unpause 命令恢复。请注意,即使暂停的 domU 不使用任何处理器资源,其分配的内存仍在使用中。此外,xl savexl restore 命令可能很有趣:保存 domU 使用的资源,包括 RAM。当恢复(或未停止),domU 甚至没有注意到任何时间的流逝。如果在 dom0 关闭时正在运行 domU,则打包的脚本会自动保存 domU,并在下次启动时还原它。这当然会涉及在休眠笔记本电脑时产生的不变便;如果 domU 挂起的时间过长,网络连接可能会过期。另外,Xen 到目前为止与 ACPI 电源管理的主要部分不兼容,这排除了挂起主机 (dom0) 系统的可能性。
停止或重新启动 domU 可以从 domU 内部(使用 shutdown 命令)或从 dom0 执行,也可以使用 xl shutdownxl reboot 命令。
大多数xl 的子命令都需要一个或多个参数,通常是 domU 名称。这些参数在 xl(1) 手册页中有详细描述。

12.2.2. LXC

即使它用于构建"虚拟机",但严格来说,LXC 不是虚拟化系统,而是一个将进程组彼此隔离的系统,即使它们都在同一主机上运行。它利用了Linux内核中一组最近的演变,统称为 control groups(控制组),根据这些过程,称为"组"的不同进程集对整个系统的某些方面有不同的看法。在这些方面中,最值得注意的是进程标识符、网络配置和挂载点。这样一组隔离进程不能对系统中的其他进程进行任何访问,并且它对文件系统的访问可以限制为特定的子集。它还可以有自己的网络接口和路由表,并且可以配置为仅看到系统上存在的可用设备的子集。
这些功能可以组合起来,以隔离从init 进程开始的整个过程系列,结果集看起来非常像虚拟机。此类设置的官方名称是"容器"(因此 LXC 名称:LinuX Containers),但与 Xen 或 KVM 提供的"真实"虚拟机(如 Xen 或 KVM 提供的虚拟机)的一个相当重要的区别是,没有第二个内核;容器使用与主机系统完全相同的内核。这既有优点也有缺点:优点包括由于减少开销而具有出色的性能,以及内核对系统上运行的所有进程都有全局视野,因此,如果两个独立的内核要安排不同的任务集,调度效率会更高。其中最给您带来的不便是不能在容器中运行不同的内核(无论是不同的Linux版本还是完全不同的操作系统)。
由于我们处理的是隔离而不是普通虚拟化,因此设置 LXC 容器比在虚拟机上运行 debian 安装程序更为复杂。我们将介绍几个先决条件,然后继续进行网络配置;然后,我们将能够实际创建要在容器中运行的系统。

12.2.2.1. 准备步骤

lxc 软件包包含运行LXC所需的工具,因此必须安装。
LXC 还要求 control groups 配置系统,这是一个虚拟文件系统,挂载在 /sys/fs/cgroup。由于 Debian 8 切换系统,也依赖于控制组,因此现在在启动时自动完成,无需进一步配置。

12.2.2.2. 网络配置

安装 LXC 的目的是设置虚拟机;虽然我们可以将它们与网络隔离,并且只能通过文件系统与它们通信,但大多数用例都涉及至少给予容器最小网络访问权限。在典型情况下,每个容器将得到一个虚拟网络接口,通过网桥连接到真正的网络。此虚拟接口可以直接插入主机的物理网络接口(在这种情况下,容器直接在网络上),也可以插入主机上定义的另一个虚拟接口(然后主机可以过滤或路由流量)。在这两种情况下,bridge-utils 软件包也是必需的。
The simple case is just a matter of editing /etc/network/interfaces, moving the configuration for the physical interface (for instance, eth0 or enp1s0) to a bridge interface (usually br0), and configuring the link between them. For instance, if the network interface configuration file initially contains entries such as the following:
auto eth0
iface eth0 inet dhcp
应禁用它们,并替换为以下内容:
auto eth0
iface eth0 inet static

auto br0
iface br0 inet dhcp
    bridge-ports eth0
此配置的效果将类似于如果容器是插入与主机相同的物理网络的计算机获得的效果。"桥接"配置管理所有桥接接口之间的以太网帧传输,包括物理 eth0 以及为容器定义的接口。
如果无法使用此配置(例如,如果无法将公共 IP 地址分配给容器),将创建一个虚拟 tap 接口并连接到网桥。然后,等效的网络拓扑变为主机的拓扑,该主机将第二个网卡插入单独的交换机,容器也插入该交换机。然后,如果容器要与外部世界通信,则主机必须充当容器的网关。
除了 bridge-utils 之外,这种"丰富"配置还需要 vde2 软件包;然后/etc/network/interfaces文件变为:
# Interface eth0 is unchanged
auto eth0
iface eth0 inet dhcp

# Virtual interface 
auto tap0
iface tap0 inet manual
    vde2-switch -t tap0

# Bridge for containers
auto br0
iface br0 inet static
    bridge-ports tap0
    address 10.0.0.1
    netmask 255.255.255.0
然后,可以在容器中静态地设置网络,也可以在主机上运行 DHCP 服务器时动态地设置网络。此类 DHCP 服务器需要配置为应答 br0 查询。

12.2.2.3. 搭建系统

Let us now set up the filesystem to be used by the container. Since this “virtual machine” will not run directly on the hardware, some tweaks are required when compared to a standard filesystem, especially as far as the kernel, devices and consoles are concerned. Fortunately, the lxc package includes scripts that mostly automate this configuration. For instance, the following commands (which require the debootstrap and rsync packages) will install a Debian container:
# lxc-create -n testlxc -t debian
debootstrap is /usr/sbin/debootstrap
Checking cache download in /var/cache/lxc/debian/rootfs-stable-amd64 ... 
Downloading debian minimal ...
I: Retrieving Release 
I: Retrieving Release.gpg 
[...]
Download complete.
Copying rootfs to /var/lib/lxc/testlxc/rootfs...
[...]
# 
请注意,文件系统最初是在 /var/cache/lxc ,然后移动到目标目录。这允许更快地创建相同的容器,因为只需要复制。
请注意,Debian 模板创建脚本接受 -arch 选项,用于指定要安装的系统的体系结构和 --release 选项(如果您想要安装 Debian 的当前稳定版本以外的其他内容)。您还可以将 MIRROR 设置为指向本地 Debian 镜像。
The lxc package further creates a bridge interface lxcbr0, which by default is used by all newly created containers via /etc/lxc/default.conf and the lxc-net service:
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
These entries mean, respectively, that a virtual interface will be created in every new container; that it will automatically be brought up when said container is started; and that it will be automatically connected to the lxcbr0 bridge on the host. You will find these settings in the created container's configuration (/var/lib/lxc/testlxc/config), where also the device' MAC address will be specified in lxc.net.0.hwaddr. Should this last entry be missing or disabled, a random MAC address will be generated.
该文件中的另一个有用条目是主机名的设置:
lxc.uts.name = testlxc
The newly-created filesystem now contains a minimal Debian system and a network interface.

12.2.2.4. 启动容器

Now that our virtual machine image is ready, let's start the container with lxc-start --name=testlxc.
In LXC releases following 2.0.8, root passwords are not set by default. We can set one running lxc-attach -n testlxc passwd if we want. We can login with:
# lxc-console -n testlxc
Connected to tty 1
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself

Debian GNU/Linux 12 testlxc tty1

testlxc login: root
Password: 
Linux testlxc 6.1.0-23-amd64 #1 SMP Debian 6.1.99-1 (2024-07-15) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Jun  7 18:39:37 UTC 2024 on console
root@testlxc:~# ps auxwf
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.2  18964 11464 ?        Ss   01:36   0:00 /sbin/init
root          45  0.0  0.2  31940 10396 ?        Ss   01:37   0:00 /lib/systemd/systemd-journald
root          71  0.0  0.1  99800  5724 ?        Ssl  01:37   0:00 /sbin/dhclient -4 -v -i -pf /run/dhclient.eth0.pid [..]
root          97  0.0  0.1  13276  6980 ?        Ss   01:37   0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root         160  0.0  0.0   6276  3928 pts/0    Ss   01:46   0:00 /bin/login -p --
root         169  0.0  0.0   7100  3824 pts/0    S    01:51   0:00  \_ -bash
root         172  0.0  0.0   9672  3348 pts/0    R+   01:51   0:00      \_ ps auxwf
root         164  0.0  0.0   5416  2128 pts/1    Ss+  01:49   0:00 /sbin/agetty -o -p -- \u --noclear [...]
root@testlxc:~# 
我们现在在容器里;我们对进程的访问仅限于从容器本身启动的进程,我们对文件系统的访问同样限于完整文件系统的专用子集 (/var/lib/lxc/testlxc/rootf)。我们可以用 Control+aq 退出控制台。
Note that we ran the container as a background process, thanks to lxc-start starting using the --daemon option by default. We can interrupt the container with a command such as lxc-stop --name=testlxc.
lxc 软件包包含一个初始化脚本,当主机启动时,该脚本可以自动启动一个或多个容器(它依赖于 lxc-autostart,启动 lxc.start.auto 选项设置为 1的容器)。使用 lxc.start.orderlxc.group 可以对启动顺序进行更细粒度的控制:默认情况下,初始化脚本首先启动 onboot 组的容器,然后启动不是任何组的容器。在这两种情况下,组中的顺序由 lxc.start.order 选项定义。

12.2.3. KVM 虚拟化

KVM 代表 Kernel-based Virtual Machine(基于内核的虚拟机),它首先是一个内核模块,提供虚拟化器可以使用的基础结构,但它本身并不是虚拟机。虚拟化的实际控制由基于 QEMU 的应用程序处理。如果本节提到 qemu-* 命令,不要担心:它仍然是关于 KVM 的。
与其他虚拟化系统不同,KVM 从一开始就被并入 Linux 内核。其开发人员选择利用专用于虚拟化的处理器指令集(Intel-VT 和 AMD-V),使 KVM 保持轻巧、优雅且不资源消耗。当然,对应的是 KVM 只能在那些具有合适的处理器的计算机上工作。对于基于 x86 的计算机,您可以通过在 /proc/cpuinfo 中列出的 CPU 标志中查找"vmx"或"svm"来验证是否具有此类处理器。
随着 Red Hat 积极支持开发,KVM 或多或少成为 Linux 虚拟化的参考。

12.2.3.1. 准备步骤

Unlike such tools as VirtualBox, KVM itself doesn't include any user-interface for creating and managing virtual machines. The virtual qemu-kvm package only provides an executable able to start a virtual machine, as well as an initialization script that loads the appropriate kernel modules.
Fortunately, Red Hat also provides another set of tools to address that problem, by developing the libvirt library and the associated virtual machine manager tools. libvirt allows managing virtual machines in a uniform way, independently of the virtualization system involved behind the scenes (it currently supports QEMU, KVM, Xen, LXC, OpenVZ, VirtualBox, VMWare, and UML). virt-manager is a graphical interface that uses libvirt to create and manage virtual machines.
首先安装所需的软件包,使用 apt-get install libvirt-clients libvirt-daemon-system qemu-kvm virtinst virt-manager virt-viewer 命令。libvirt-daemon-system 提供 libvirtd 守护程序,允许(可以远程)管理主机运行的虚拟机,并在主机启动时启动所需的 VM。libvirt-clients 提供了 virsh 命令行工具,允许控制 libvirtd 管理的计算机。
virtinst 软件包提供 virt-install,允许从命令行创建虚拟机。最后,virt-viewer 允许访问 VM 的图形控制台。

12.2.3.2. 网络配置

与 Xen 和 LXC 一样,最常见的网络配置涉及对虚拟机的网络接口进行桥接分组(参见 第 12.2.2.2 节 “网络配置”)。
或者,在 KVM 提供的默认配置中,虚拟机被分配一个专用地址(在 192.168.122.0/24 范围内),并设置 NAT 以便 VM 可以访问外部网络。
本节的其余部分假定主机具有 eth0 物理接口和 br0 网桥,而前者连接到后者。

12.2.3.3. 使用 virt-install 安装

创建虚拟机与安装普通系统非常相似,只不过虚拟机的特征在看似无穷无尽的命令行中描述。
实际上,这意味着我们将使用 Debian 安装程序,在虚拟 DVD-ROM 驱动器上启动虚拟机,该驱动器映射到存储在主机上的 Debian DVD 映像。VM 将在 VNC 协议上导出其图形控制台(有关详细信息,请参阅 第 9.2.2 节 “使用远程图形桌面”),这将使我们能够控制安装过程。
We first need to tell libvirtd where to store the disk images, unless the default location (/var/lib/libvirt/images/) is fine.
# mkdir /srv/kvm
# virsh pool-create-as srv-kvm dir --target /srv/kvm
Pool srv-kvm created

# 
现在开始虚拟机的安装过程,并仔细了解 virt-install 最重要的选项。此命令在 libvirtd 中注册虚拟机及其参数,然后启动它,以便其安装可以继续。
# virt-install --connect qemu:///system  1
               --virt-type kvm           2
               --name testkvm            3
               --memory 2048             4
               --disk /srv/kvm/testkvm.qcow,format=qcow2,size=10  5
               --cdrom /srv/isos/debian-12.6.0-amd64-netinst.iso  6
               --network bridge=virbr0   7
               --graphics vnc            8
               --os-type linux           9
               --os-variant debiantesting


Starting install...
Allocating 'testkvm.qcow'

1

--connect 选项指定要使用的"虚拟机管理程序"。它的形式是包含虚拟化系统(xen://qemu://lxc://openvz://vbox:// 等)和托管 VM 的计算机(对于本地主机,这一点可能为空)的 URL。除此之外,在使用 QEMU/KVM 的情况下,每个用户可以管理使用授权的虚拟机,并且 URL 路径允许将"系统"计算机 (/system) 和其他计算机 (/session) 进行区分。

2

由于 KVM 的管理方式与 QEMU 相同,因此 -virt type kvm 允许指定使用 KVM,使 URL 看起来像 QEMU。

3

--name 选项定义虚拟机的(唯一)名称。

4

--memory 选项指定要为虚拟机分配的 RAM(MB)量。

5

--disk 指定虚拟机硬盘的映像文件的位置;除非存在,否则将创建由 size 参数指定的大小(GB)的映像。format 参数选择存储映像文件的格式。默认格式(qcow2) 的大小仅在虚拟机实际使用空间时增长。

6

The --cdrom option is used to indicate where to find the optical disk to use for installation. The path can be either a local path for an ISO file, an URL where the file can be obtained, or the device file of a physical CD-ROM drive (i.e. /dev/cdrom).

7

The --network specifies how the virtual network card integrates in the host's network configuration. The default behavior (which we explicitly forced in our example) is to integrate it into any pre-existing network bridge. If no such bridge exists, the virtual machine will only reach the physical network through NAT, so it gets an address in a private subnet range (192.168.122.0/24).
The default network configuration, which contains the definition for a virbr0 bridge interface, can be edited using virsh net-edit default and started via virsh net-start default if not already done automatically during system start.

8

--graphics vnc states that the graphical console should be made available using VNC. The default behavior for the associated VNC server is to only listen on the local interface; if the VNC client is to be run on a different host, establishing the connection will require setting up an SSH tunnel (see 第 9.2.1.5 节 “通过端口转发建立加密通道”). Alternatively, --graphics vnc,listen=0.0.0.0 can be used so that the VNC server is accessible from all interfaces; note that if you do that, you really should design your firewall accordingly.

9

The --os-type and --os-variant options allow optimizing a few parameters of the virtual machine, based on some of the known features of the operating system mentioned there.
The full list of OS types can be shown using the osinfo-query os command from the libosinfo-bin package.
At this point, the virtual machine is running, and we need to connect to the graphical console to proceed with the installation process. If the previous operation was run from a graphical desktop environment, this connection should be automatically started. If not, or if we operate remotely, virt-viewer can be run from any graphical environment to open the graphical console (note that the root password of the remote host is asked twice because the operation requires 2 SSH connections):
$ virt-viewer --connect qemu+ssh://root@server/system testkvm
root@server's password: 
root@server's password: 
Connecting to installer session using virt-viewer

图 12.1. Connecting to installer session using virt-viewer

当安装过程结束,虚拟机重启后,就可以使用了。

12.2.3.4. 使用 virsh 管理机器

现在安装已经完成,让我们看看如何处理可用的虚拟机。首先要尝试的是向 libvirtd 索取它所管理的虚拟机列表:
# virsh -c qemu:///system list --all
 Id Name                 State
----------------------------------
  8 testkvm              shut off
让我们开始测试虚拟机:
# virsh -c qemu:///system start testkvm
Domain testkvm started
We can now get the connection instructions for the graphical console (the returned VNC display can be given as parameter to vncviewer):
# virsh -c qemu:///system vncdisplay testkvm
127.0.0.1:0
其他可用的 virsh 子命令包括:
  • reboot 重启一个虚拟机;
  • shutdown to trigger a clean shutdown;
  • destroy, to stop it brutally;
  • suspend to pause it;
  • resume to unpause it;
  • autostart to enable (or disable, with the --disable option) starting the virtual machine automatically when the host starts;
  • undefine to remove all traces of the virtual machine from libvirtd.
All these sub-commands take a virtual machine identifier as a parameter.