创建磁盘镜像

创建全系统模式的磁盘镜像

在全系统模式下,gem5依赖于包含操作系统的磁盘镜像来运行模拟。gem5中的磁盘设备从磁盘镜像获取其初始内容。磁盘镜像文件存储了磁盘上的所有字节,就像你在实际设备上找到的一样。一些其他系统也使用更复杂格式的磁盘镜像,这些格式提供压缩、加密等功能。当前,gem5仅支持原始镜像,因此如果你有其他格式的镜像,需要在使用前将其转换为原始镜像。通常有一些工具可以在不同格式之间进行转换。

创建可用于gem5的磁盘镜像有多种方法。以下是四种构建磁盘镜像的不同方法:

  • 使用gem5 utils创建磁盘镜像
  • 使用gem5 utils和chroot创建磁盘镜像
  • 使用QEMU创建磁盘镜像
  • 使用Packer创建磁盘镜像

这些方法彼此独立。接下来,我们将逐一讨论每种方法。

1)使用gem5 utils创建磁盘镜像

免责声明:这是来自旧网站的方法,其中一些内容可能已过时。

由于磁盘镜像代表磁盘本身的所有字节,因此它不仅仅包含文件系统。对于大多数系统上的硬盘,镜像从分区表开始。表中的每个分区(通常只有一个)也在镜像中。如果你想操作整个磁盘,你将使用整个镜像,但如果你只想处理一个分区和/或其上的文件系统,你需要专门选择镜像的那部分。losetup命令(后文讨论)有一个-o选项,可以让你指定从镜像的哪里开始。

视频文件1

使用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

视频文件2

使用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. 工作原理简介

我们使用PackerQEMU来自动化磁盘创建过程。本质上,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中,可以使用以下变量来自定义虚拟机:

VariablePurposeExample
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中,可以使用以下变量来自定义磁盘镜像大小:

VariablePurposeExample
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/目录中。这种方法还可以将文件夹从主机复制到磁盘镜像中,反之亦然。需要注意的是,路径末尾的斜杠会影响复制过程(更多详情)。以下是一些在路径末尾使用斜杠时影响的显著示例:

sourcedestinationdirectionEffect
foo.txt/home/gem5/bar.txtupload将文件(主机)复制到文件(镜像)
foo.txtbar/upload将文件(主机)复制到文件夹(镜像)
/foo/tmpupload

mkdir /tmp/foo (image);

cp -r /foo/* (host) /tmp/foo/ (image);

/foo//tmpuploadcp -r /foo/* (host) /tmp/ (image)

如果directiondownload,文件将从镜像复制到主机。

注意这是一种在安装 Ubuntu 后无需复制到磁盘镜像中运行脚本的方法

iv. 安装基准测试依赖项

要安装依赖项,可以使用post_installation.shbash脚本,该脚本将在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查看器来检查镜像构建过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值