创建全系统模式的磁盘镜像
在全系统模式下,gem5依赖于包含操作系统的磁盘镜像来运行模拟。gem5中的磁盘设备从磁盘镜像获取其初始内容。磁盘镜像文件存储了磁盘上的所有字节,就像你在实际设备上找到的一样。一些其他系统也使用更复杂格式的磁盘镜像,这些格式提供压缩、加密等功能。当前,gem5仅支持原始镜像,因此如果你有其他格式的镜像,需要在使用前将其转换为原始镜像。通常有一些工具可以在不同格式之间进行转换。
创建可用于gem5的磁盘镜像有多种方法。以下是四种构建磁盘镜像的不同方法:
- 使用gem5 utils创建磁盘镜像
- 使用gem5 utils和chroot创建磁盘镜像
- 使用QEMU创建磁盘镜像
- 使用Packer创建磁盘镜像
这些方法彼此独立。接下来,我们将逐一讨论每种方法。
1)使用gem5 utils创建磁盘镜像
免责声明:这是来自旧网站的方法,其中一些内容可能已过时。
由于磁盘镜像代表磁盘本身的所有字节,因此它不仅仅包含文件系统。对于大多数系统上的硬盘,镜像从分区表开始。表中的每个分区(通常只有一个)也在镜像中。如果你想操作整个磁盘,你将使用整个镜像,但如果你只想处理一个分区和/或其上的文件系统,你需要专门选择镜像的那部分。losetup命令(后文讨论)有一个-o选项,可以让你指定从镜像的哪里开始。
使用QEMU处理Ubuntu 12.04 64位系统上的镜像文件的YouTube视频。视频分辨率可以设置为1080。
创建空镜像
你可以使用gem5提供的./util/gem5img.py脚本来构建磁盘镜像。了解如何构建镜像是个好主意,以防出现问题或需要以不寻常的方式做某些事情。然而,在这个方法中,我们使用gem5img.py脚本来完成镜像的构建和格式化过程。如果你想了解它的具体操作,请参见下文。运行gem5img.py可能需要你输入sudo密码。你不应该运行你不理解的root用户命令!你应该查看util/gem5img.py文件,确保它不会对你的电脑造成任何恶意操作!
你可以使用gem5img.py的“init”选项来创建一个空镜像,使用“new”、“partition”或“format”来分别执行初始化的各个部分,使用“mount”或“umount”来挂载或卸载现有镜像。
挂载镜像
要在你的镜像文件上挂载文件系统,首先找到一个环回设备,并将其附加到你的镜像上,并使用适当的偏移量,如在格式化部分中进一步描述的那样。
mount -o loop,offset=32256 foo.img
使用QEMU处理Ubuntu 12.04 64位系统上的镜像文件的YouTube视频。视频分辨率可以设置为1080。
卸载镜像
要卸载一个镜像,像平常一样使用umount命令
umount
镜像内容
现在你可以创建镜像文件并挂载其文件系统,你会希望实际放入一些文件。你可以自由使用任何文件,但gem5开发人员发现Gentoo stage3压缩包是一个很好的起点。它们本质上是几乎可启动的、相当简洁的Linux安装包,并且适用于多种架构。
如果你选择使用Gentoo压缩包,首先将其解压到挂载的镜像中。/etc/fstab文件将为根、启动和交换设备提供占位符条目。你需要根据需要更新此文件,删除你不打算使用的条目(例如启动分区)。接下来,你需要修改inittab文件,使其使用m5实用程序(在其他地方描述)读取主机提供的初始化脚本并运行它。如果你允许正常的初始化脚本运行,你感兴趣的工作负载可能需要更长的时间才能启动,例如,你将无法注入自己的初始化脚本以动态控制启动哪些基准测试,并且你将不得不通过模拟终端与模拟交互,这会引入非确定性。
修改
默认情况下,gem5不会将对磁盘的修改存回底层镜像文件。你所做的任何更改将存储在一个中间的COW层中,并在模拟结束时丢弃。如果你想修改底层磁盘,可以关闭COW层。
内核和引导程序
通常来说,gem5会跳过引导程序部分的启动并自行将内核加载到模拟内存中。这意味着无需将引导程序(如grub)安装到磁盘镜像中,也不需要将要引导的内核放在镜像上。内核是单独提供的,可以轻松更换,而无需修改磁盘镜像。
使用环回设备操作镜像
环回设备
Linux支持环回设备,这些设备由文件支持。通过将其中一个附加到你的磁盘镜像上,你可以使用标准的Linux命令来操作它,就像在真实磁盘设备上运行一样。你可以使用带有“loop”选项的mount命令来设置环回设备并将其挂载到某个地方。不幸的是,你不能指定镜像中的偏移量,因此这仅对文件系统镜像有用,而不是你需要的磁盘镜像。不过,你可以使用低级的losetup命令自己设置环回设备并提供正确的偏移量。一旦这样做了,你可以像对磁盘分区一样使用mount命令对其进行格式化等操作。如果不提供偏移量,环回设备将引用整个镜像,你可以使用你喜欢的程序在其上设置分区。
操作镜像文件
要从头创建一个空镜像,你需要创建文件本身,对其进行分区,并用文件系统格式化一个或多个分区。
创建实际文件
首先,决定你希望镜像的大小。建议将其设定为足够大,以容纳你知道需要放入的所有内容,并留出一些余地。如果后来发现它太小,你将不得不创建一个更大的新镜像并将所有内容移过去。如果做得太大,你将不必要地占用实际磁盘空间,并使镜像更难操作。一旦确定了大小,就要实际创建文件。基本上,你需要做的就是创建一个充满零的特定大小的文件。一种方法是使用dd命令从/dev/zero复制适量的字节到新文件中。或者,你可以创建文件,定位到最后一个字节,并写入一个零字节。你跳过的所有空间将成为文件的一部分,并被定义为读取时为零,但由于你没有显式地写入任何数据,大多数文件系统足够智能,不会真正将其存储到磁盘上。这样你可以创建一个大镜像,但占用的物理磁盘空间非常少。之后开始向文件写入数据时情况会改变,并且如果不小心,复制文件可能会将其扩展到其全部大小。
分区
首先,使用带有-f选项的losetup命令找到一个可用的环回设备。
losetup -f
接下来,使用losetup将该设备附加到你的镜像。如果可用的设备是/dev/loop0,而你的镜像是foo.img,你可以使用如下命令:
losetup /dev/loop0 foo.img
/dev/loop0(或你正在使用的其他设备)现在将指向你的整个镜像文件。使用你喜欢的分区程序对其进行设置,创建一个(或多个)分区。为了简单起见,最好只创建一个占据整个镜像的分区。我们说它占据了整个镜像,但实际上它占据了除了文件开头的分区表本身以外的所有空间,并且可能还有一些用于DOS/引导程序兼容性的浪费空间。
从现在开始,我们将只处理我们创建的新分区而不是整个磁盘,因此我们将使用losetup的-d选项释放环回设备。
losetup -d /dev/loop0
格式化
首先,像在上面的分区步骤中那样,使用losetup的-f选项找到一个可用的环回设备。
losetup -f
我们将再次将镜像附加到该设备,但这次我们只希望引用我们将要放置文件系统的分区。对于PC和Alpha系统,该分区通常在一个磁道内,一个磁道是63个扇区,每个扇区是512字节,或者63 * 512 = 32256字节。根据你的镜像的几何结构和布局,正确的值可能不同。无论如何,你应该使用-o选项设置环回设备,使其表示你感兴趣的分区
losetup -o 32256 /dev/loop0 foo.img
接下来,使用适当的格式化命令(通常是mke2fs)在分区上创建文件系统。
mke2fs /dev/loop0
你现在已经成功创建了一个空的镜像文件。如果你打算继续使用它(可能因为它仍然是空的),你可以将环回设备保持附加状态,或者使用losetup -d将其清理。
losetup -d /dev/loop0
不要忘记使用losetup -d命令清理附加到你的镜像的环回设备。
losetup -d /dev/loop0
2) 使用gem5工具和chroot创建磁盘镜像
本节讨论假设你已经检出(checked out )一个版本的gem5,并能够在全系统模式下构建和运行gem5。我们将在讨论中使用x86 ISA,这在很大程度上也适用于其他ISA。
创建一个空白磁盘镜像
第一步是创建一个空白的磁盘镜像(通常是.img文件)。这类似于我们在第一种方法中所做的。我们可以使用gem5开发者提供的gem5img.py脚本。要创建一个默认格式化为ext2的空白磁盘镜像,只需运行以下命令。
> util/gem5img.py init ubuntu-14.04.img 4096
此命令创建一个新的名为“ubuntu-14.04.img”的4096 MB镜像。如果你没有创建环回设备的权限,该命令可能会要求你输入sudo密码。你绝不应该运行你不理解的root用户命令!你应该查看util/gem5img.py文件,确保它不会对你的计算机做任何恶意操作!
我们将在本节中大量使用util/gem5img.py,因此你可能需要更好地理解它。如果你只运行util/gem5img.py
,它会显示所有可能的命令。
Usage: %s [command] <command arguments>
where [command] is one of
init: Create an image with an empty file system.
mount: Mount the first partition in the disk image.
umount: Unmount the first partition in the disk image.
new: File creation part of "init".
partition: Partition part of "init".
format: Formatting part of "init".
Watch for orphaned loopback devices and delete them with
losetup -d. Mounted images will belong to root, so you may need
to use sudo to modify their contents
将根文件复制到磁盘
现在我们已经创建了一个空白磁盘,需要用所有的操作系统文件来填充它。Ubuntu 分发了一组专门用于此目的的文件。你可以在Ubuntu core页面找到14.04版的分发文件,链接为:Ubuntu 14.04.6 LTS (Trusty Tahr)。由于我们在模拟x86机器,因此我们将使用ubuntu-core-14.04-core-amd64.tar.gz
。下载适用于你所模拟系统的镜像。
接下来,我们需要挂载空白磁盘并将所有文件复制到磁盘上。
mkdir mnt
../../util/gem5img.py mount ubuntu-14.04.img mnt
wget http://cdimage.ubuntu.com/ubuntu-core/releases/14.04/release/ubuntu-core-14.04-core-amd64.tar.gz
sudo tar xzvf ubuntu-core-14.04-core-amd64.tar.gz -C mnt
下一步是将工作系统中的一些必要文件复制到磁盘上,以便我们可以 chroot 到新磁盘。我们需要将/etc/resolv.conf
复制到新磁盘上。
sudo cp /etc/resolv.conf mnt/etc/
设置gem5特定文件
创建一个串行终端
默认情况下,gem5使用串行端口允许主机系统与模拟系统进行通信。要使用此功能,我们需要创建一个串行 tty。由于Ubuntu使用upstart控制初始化进程,我们需要在/etc/init中添加一个文件来初始化我们的终端。此外,在这个文件中,我们将添加一些代码来检测是否有脚本传递给模拟系统。如果有脚本,我们将执行该脚本,而不是创建一个终端。
将以下代码放入名为/etc/init/tty-gem5.conf的文件中。
# ttyS0 - getty
# 此服务会在系统启动时在 ttyS0 上维持一个 getty,直到系统再次关闭,除非有脚本传递给 gem5。
# 如果有脚本,则执行脚本,然后停止模拟。
start on stopped rc RUNLEVEL=[12345]
stop on runlevel [!12345]
console owner
respawn
script
# 创建串行 tty(如果尚不存在的话)
if [ ! -c /dev/ttyS0 ]
then
mknod /dev/ttyS0 -m 660 /dev/ttyS0 c 4 64
fi
# 尝试从主机系统读取脚本
/sbin/m5 readfile > /tmp/script
chmod 755 /tmp/script
if [ -s /tmp/script ]
then
# 如果有脚本,则执行脚本,然后退出模拟
exec su root -c '/tmp/script' # 赋予脚本在多用户模式下的root用户全部权限
/sbin/m5 exit
else
# 如果没有脚本,则登录root用户并进入控制台
# 使用m5term连接到此控制台
exec /sbin/getty --autologin root -8 38400 ttyS0
fi
end script
设置本地主机
如果我们打算使用任何使用本地主机回环设备的应用程序,还需要设置本地主机回环设备。为此,我们需要在/etc/hosts
文件中添加以下内容。
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
更新fstab
接下来,我们需要在/etc/fstab
中为每个我们希望从模拟系统访问的分区创建一个条目。只有一个分区是绝对必要的,即/
;然而,你可能还想添加其他分区,比如交换分区。
以下内容应出现在/etc/fstab
文件中。
# /etc/fstab: 静态文件系统信息。
# 使用 'blkid' 打印设备的全局唯一标识符 (UUID);这可以与 UUID= 一起使用,
# 作为命名设备的一种更可靠的方法,即使添加或移除磁盘也能正常工作。参见 fstab(5)。
#
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/hda1 / ext3 noatime 0 1
将m5
二进制文件复制到磁盘
gem5 带有一个额外的二进制应用程序,该应用程序执行伪指令以允许模拟系统与主机系统交互。要构建此二进制文件,请在gem5/m5
目录中运行make -f Makefile.<isa>
,其中<isa>
是你正在模拟的指令集架构(例如,x86)。之后,你应该会有一个m5
二进制文件。将此文件复制到新创建磁盘上的/sbin目录。
在用所有gem5特定文件更新磁盘后,除非你继续添加更多应用程序或复制其他文件,否则请卸载磁盘镜像。
> util/gem5img.py umount mnt
安装新应用程序
在磁盘上安装新应用程序的最简单方法是使用chroot
。此程序逻辑上将根目录(“/”)更改为不同的目录,在这种情况下为mnt。在更改根目录之前,首先必须在新根目录中设置特殊目录。为此,我们使用mount -o bind
。
> sudo /bin/mount -o bind /sys mnt/sys
> sudo /bin/mount -o bind /dev mnt/dev
> sudo /bin/mount -o bind /proc mnt/proc
绑定这些目录后,你现在可以chroot:
> sudo /usr/sbin/chroot mnt /bin/bash
此时,你会看到一个根提示符,并且你会位于新磁盘的/目录中。
你应该更新你的软件库信息。
> apt-get update
你可能希望通过以下命令将universe软件库添加到你的列表中。注意:在14.04版本中,第一个命令是必需的。
> apt-get install software-properties-common
> add-apt-repository universe
> apt-get update
现在,你可以通过apt-get
安装任何可以在原生Ubuntu机器上安装的应用程序。
请记住,退出后需要卸载我们使用bind挂载的所有目录。
> sudo /bin/umount mnt/sys
> sudo /bin/umount mnt/proc
> sudo /bin/umount mnt/dev
3) 使用QEMU创建磁盘镜像
此方法是前面创建磁盘镜像方法的后续。我们将了解如何使用qemu创建、编辑和设置磁盘镜像,而不是依赖gem5工具。本节假设你已经在系统上安装了qemu。在Ubuntu中,可以通过以下命令完成安装:
sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
第一步:创建一个空磁盘
使用qemu磁盘工具创建一个空白的原始磁盘镜像。在这种情况下,我选择创建一个名为“ubuntu-test.img”、大小为8GB的磁盘。
qemu-img create ubuntu-test.img 8G
第二步:使用qemu安装Ubuntu
现在我们有了一个空白磁盘,我们将使用qemu在该磁盘上安装Ubuntu。建议你使用Ubuntu的服务器版本,因为gem5对显示器的支持不是很好,因此桌面环境不是很有用。
首先,你需要从Ubuntu 网站下载安装CD镜像。
接下来,使用qemu从 CD 镜像启动,并将系统中的磁盘设置为你上面创建的空白磁盘。Ubuntu至少需要1GB的内存才能正确安装,因此请确保将qemu配置为使用至少1GB的内存。
qemu-system-x86_64 -hda ../gem5-fs-testing/ubuntu-test.img -cdrom ubuntu-16.04.1-server-amd64.iso -m 1024 -enable-kvm -boot d
在这里,你可以简单地按照屏幕上的指示将Ubuntu安装到磁盘镜像中。安装过程中的唯一注意事项是,gem5的IDE驱动程序似乎不能很好地处理逻辑分区。因此,在Ubuntu安装过程中,请确保手动分区并删除所有逻辑分区。除非你有特别需要交换空间的情况,否则磁盘上不需要任何交换空间。
第三步:启动并安装所需软件
一旦你在磁盘上安装了Ubuntu,退出qemu并移除-boot d
选项,以便不再从CD启动。现在,你可以从安装了Ubuntu的主磁盘镜像启动。
由于我们使用的是qemu,你应该有网络连接(尽管ping不会工作)。在qemu中启动时,你可以直接使用sudo apt-get install
并在你的磁盘上安装所需的任何软件。
qemu-system-x86_64 -hda ../gem5-fs-testing/ubuntu-test.img -cdrom ubuntu-16.04.1-server-amd64.iso -m 1024 -enable-kvm
第四步:更新初始化脚本
默认情况下,gem5需要一个修改过的初始化脚本,该脚本会从主机加载一个脚本以在访客系统中执行。要使用此功能,你需要按照以下步骤进行。
或者,你可以安装此网站上提供的x86预编译二进制文件。在qemu中,你可以运行以下命令,这些命令将为你完成上述步骤。
wget http://cs.wisc.edu/~powerjg/files/gem5-guest-tools-x86.tgz
tar xzvf gem5-guest-tools-x86.tgz
cd gem5-guest-tools/
sudo ./install
现在,你可以在Python配置脚本中使用system.readfile参数。这个文件将自动被gem5init脚本加载并执行。
手动安装gem5初始化脚本
首先,在主机上构建m5二进制文件。
cd util/m5
make -f Makefile.x86
然后,将这个二进制文件复制到访客系统,并将其放在/sbin目录下。同时,创建一个从/sbin/gem5到这个二进制文件的链接。 接着,为了让初始化脚本在gem5启动时执行,创建一个文件/lib/systemd/system/gem5.service内容如下:
[Unit]
Description=gem5 init script
Documentation=http://gem5.org
After=getty.target
[Service]
Type=idle
ExecStart=/sbin/gem5init
StandardOutput=tty
StandardInput=tty-force
StandardError=tty
[Install]
WantedBy=default.target
启用gem5服务并禁用ttyS0服务。如果你的磁盘启动到登录提示符,可能是由于没有禁用ttyS0服务导致的。
systemctl enable gem5.service
最后,创建由服务执行的初始化脚本。在/sbin/gem5init中:
#!/bin/bash -
CPU=`cat /proc/cpuinfo | grep vendor_id | head -n 1 | cut -d ' ' -f2-`
echo "Got CPU type: $CPU"
if [ "$CPU" != "M5 Simulator" ];
then
echo "Not in gem5. Not loading script"
exit 0
fi
# 尝试从主机系统读取脚本
/sbin/m5 readfile > /tmp/script
chmod 755 /tmp/script
if [ -s /tmp/script ]
then
# 如果有脚本,请执行脚本然后退出模拟
su root -c '/tmp/script' # 以多用户模式授予脚本作为root用户的全部权限
sync
sleep 10
/sbin/m5 exit
fi
echo "No script found"
问题及(部分)解决方案
在按照这种方法操作时,你可能会遇到一些问题。一些问题及解决方案在这个页面进行了讨论。
4)使用Packer创建磁盘镜像
本节讨论了一种自动化方法,用于创建安装了Ubuntu服务器的gem5兼容磁盘镜像。我们使用packer来实现这一点,它使用一个.json模板文件来构建和配置磁盘镜像。该模板文件可以配置为构建一个安装了特定基准测试的磁盘镜像。所提到的模板文件可以在这里找到。
使用Packer构建简单磁盘镜像
a. 工作原理简介
我们使用Packer和QEMU来自动化磁盘创建过程。本质上,QEMU负责设置虚拟机以及在构建过程中与磁盘镜像的所有交互。交互包括将Ubuntu服务器安装到磁盘镜像中,将文件从你的机器复制到磁盘镜像中,以及在Ubuntu安装后在磁盘镜像上运行脚本。不过,我们不会直接使用QEMU。Packer提供了一种更简单的方法,通过JSON脚本与QEMU交互,比从命令行使用QEMU更加直观。
b. 安装所需软件/依赖项
如果还没有安装,可以使用以下命令安装QEMU:
sudo apt-get install qemu
从官方网站下载Packer二进制文件。
c. 自定义Packer脚本
默认的 packer 脚本template.json
应根据所需的磁盘镜像和构建过程中的可用资源进行修改和调整。我们将默认模板重命名为[disk-name].json
。应修改的变量出现在[disk-name].json
文件末尾的variables
部分。用于构建磁盘镜像的配置文件和目录结构如下所示:
disk-image/
[disk-name].json:Packer脚本
任何实验特定的后安装脚本(Any experiment-specific post installation script)
post-installation.sh:在Ubuntu安装后执行的通用shell脚本(generic shell script that is executed after Ubuntu is installed)
preseed.cfg:用于安装Ubuntu的预设配置
i. 自定义虚拟机(VM:Virtual Machine)
在[disk-name].json
中,可以使用以下变量来自定义虚拟机:
Variable | Purpose | Example |
---|---|---|
vm_cpus (should be modified) | number of host CPUs used by VM | “2”: 2 CPUs are used by the VM |
vm_memory (should be modified) | amount of VM memory, in MB | “2048”: 2 GB of RAM are used by the VM |
vm_accelerator (should be modified) | accelerator used by the VM e.g. Kvm | “kvm”: kvm will be used |
ii. 自定义磁盘镜像
在[disk-name].json
中,可以使用以下变量来自定义磁盘镜像大小:
Variable | Purpose | Example |
---|---|---|
image_size (should be modified) | size of the disk image, in megabytes | “8192”: the image has the size of 8 GB |
[image_name] | name of the built disk image | “boot-exit” |
iii. 文件传输
在构建磁盘镜像时,用户需要将他们的文件(基准测试、数据集等)移动到磁盘镜像中。为了进行文件传输,可以在[disk-name].json
中的provisioners
部分添加以下内容:
{
"type": "file",
"source": "post_installation.sh",
"destination": "/home/gem5/",
"direction": "upload"
}
上述示例将post_installation.sh文件从主机复制到磁盘镜像中的/home/gem5/目录中。这种方法还可以将文件夹从主机复制到磁盘镜像中,反之亦然。需要注意的是,路径末尾的斜杠会影响复制过程(更多详情)。以下是一些在路径末尾使用斜杠时影响的显著示例:
source | destination | direction | Effect |
---|---|---|---|
foo.txt | /home/gem5/bar.txt | upload | 将文件(主机)复制到文件(镜像) |
foo.txt | bar/ | upload | 将文件(主机)复制到文件夹(镜像) |
/foo | /tmp | upload |
|
/foo/ | /tmp | upload | cp -r /foo/* (host) /tmp/ (image) |
如果direction
是download
,文件将从镜像复制到主机。
注意:这是一种在安装 Ubuntu 后无需复制到磁盘镜像中运行脚本的方法。
iv. 安装基准测试依赖项
要安装依赖项,可以使用post_installation.sh的
bash脚本,该脚本将在Ubuntu安装和文件复制完成后运行。例如,如果我们想安装gfortran
,请在post_installation.sh
中添加以下内容:
echo '12345' | sudo apt-get install gfortran;
在上述示例中,我们假设用户密码是12345。本质上,这是一个在文件复制完成后在虚拟机上执行的bash脚本,你可以将其修改为适合任何用途的bash脚本。
v. 在磁盘镜像上运行其他脚本
在[disk-name].json
中,我们可以在provisioners
部分添加更多的脚本。请注意,文件是在主机上,但其效果是在磁盘镜像上。例如,以下示例在安装Ubuntu后运行post_installation.sh
:
{
"type": "shell",
"execute_command": "echo '{{ user `ssh_password` }}' | {{.Vars}} sudo -E -S bash '{{.Path}}'",
"scripts":
[
"post-installation.sh"
]
}
d. 构建磁盘镜像
i. 构建
为了构建磁盘镜像,首先使用以下命令验证模板文件:
./packer validate [disk-name].json
然后,可以使用模板文件来构建磁盘镜像:
./packer build [disk-name].json
在一台较新的机器上,构建过程不应超过15分钟即可完成。将生成一个用户定义名称的磁盘镜像(image_name),并保存在名为[image_name]-image的文件夹中。我们建议使用 VNC 查看器来检查构建过程。
ii. 检查构建过程
在构建磁盘镜像时,Packer将运行一个VNC(虚拟网络计算)服务器,你可以通过从VNC客户端连接到VNC服务器来查看构建过程。VNC客户端有很多选择。当你运行Packer脚本时,它会告诉你VNC服务器使用的端口。例如,如果它显示qemu: Connecting to VM via VNC (127.0.0.1:5932)
,那么VNC端口是 5932。要从VNC客户端连接到VNC服务器,请使用地址 127.0.0.1:5932
对应端口号5932。如果需要端口转发以将VNC端口从远程机器转发到本地机器,请使用SSH隧道。
ssh -L 5932:127.0.0.1:5932 <username>@<host>
该命令将端口5932从主机转发到你的机器,然后你可以使用地址127.0.0.1:5932从VNC查看器连接到VNC服务器。
注意:在Packer安装Ubuntu期间,终端屏幕会长时间显示“waiting for SSH”而没有任何更新。这并不表示Ubuntu安装是否产生错误。因此,我们强烈建议至少使用一次VNC查看器来检查镜像构建过程。