记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。

在 QEMU 的 64 位 ARM"virt"板上安装 Debian

 

这篇文章是 描述了如何让 Debian 运行 Qemu 模仿一个 32 位 ARM "virt" 板。 

为什么是"virt"板?

对于 64 位 ARM QEMU 模拟更少的板,因此"virt"几乎是唯一的选择,除非您特别知道要模拟 64 位 Xilinx 板之一。

"virt" 支持 PCI、virtio、最近的 ARM CPU 和大量 RAM。它唯一没有开箱即用的东西是图形。

先决条件和假设

我假设你有一个 Linux 主机, 和最新版本的 Qemu (至少 Qemu 2.8) 。我还使用libguestfs从 QEMU 磁盘映像中提取文件,但如果您愿意,您可以使用其他工具执行该步骤。

我要记录如何设置直接启动内核的来宾。也应该有QEMU启动一个UEFI映像,然后从磁盘映像启动内核,但这不是我自己研究过的事情。(网络上其他地方可能有教程。

获取安装程序文件

我建议为这些和我们要创建的其他文件创建一个子目录。


将它们保存在本地,意味着它们不会与安装过程产生的最终内核和 initrd 混淆。installer-linuxinstaller-initrd.gz

(如果我们在真正的硬件上安装,我们还需要一个"设备树"文件来告诉内核它运行的确切硬件的详细信息。QEMU 的"virt"板在内部自动创建一个设备树,并传递到内核,因此我们不需要提供一个设备树。

安装

首先,我们需要创建一个空磁盘驱动器安装。我选了一个 5gb 的磁盘, 但你可以使它更大, 如果你喜欢。

1
qemu-img create -f qcow2 hda.qcow2 5G


现在,我们可以运行安装程序:

1
2
3
4
5
6
7
8
qemu-system-aarch64 -M virt -m 1024 -cpu cortex-a53 \
  -kernel installer-linux \
  -initrd installer-initrd.gz \
  -drive if=none,file=hda.qcow2,format=qcow2,id=hd \
  -device virtio-blk-pci,drive=hd \
  -netdev user,id=mynet \
  -device virtio-net-pci,netdev=mynet \
  -nographic -no-reboot

安装程序将在文本控制台上(通过模拟串行端口)显示其消息。按照其说明将 Debian 安装到虚拟磁盘;很简单, 但如果您有任何困难, Debian 安装指南可能会有帮助。

实际安装过程需要几个小时,因为它下载包通过网络,并将它们写入磁盘。偶尔会停下来问你问题。

在此过程后期,安装程序将打印以下警告对话框:

1
2
3
4
5
6
7
8
9
10
11
12
+-----------------| [!] Continue without boot loader |------------------+
|                                                                       |
|                       No boot loader installed                        |
| No boot loader has been installed, either because you chose not to or |
| because your specific architecture doesn't support a boot loader yet. |
|                                                                       |
| You will need to boot manually with the /vmlinuz kernel on partition  |
| /dev/vda1 and root=/dev/vda2 passed as a kernel argument.             |
|                                                                       |
|                              <Continue>                               |
|                                                                       |
+-----------------------------------------------------------------------+ 

按现在继续,我们稍后再解决。

最终,安装程序将重新启动完成 - 这应该会导致 QEMU 退出(因为我们使用了选项)。-no-reboot

此时,您可能希望复制硬盘映像文件,以保存以后重复安装的乏味。

提取内核

安装程序警告我们,它不知道如何安排自动启动正确的内核,所以我们需要手动完成。对于 QEMU,这意味着我们需要提取安装程序放入磁盘映像中的内核,以便我们可以将其传递给命令行上的 QEMU。

有多种工具,你可以为此使用,但我要推荐libguestfs,因为它是最简单的使用。要检查其工作原理,让我们看看虚拟磁盘映像中的分区:

1
2
3
$ virt-filesystems -a hda.qcow2
/dev/sda1
/dev/sda2

如果这不起作用,那么你应该先解决这个问题。我见过几个常见原因:

  • 如果你在 Ubuntu 上, 那么你的内核被安装为不可读;你可以解决这个问题/bootsudo chmod 644 /boot/vmlinuz*
  • 如果您在同一主机上运行 Virtualbox,它将干扰 libguestfs 运行 KvM 的尝试;您可以通过退出虚拟框来解决这个问题

查看磁盘中有什么,我们可以看到内核和 in/boot 中的 initrd:

1
2
3
4
5
6
7
8
9
10
$ virt-ls -a hda.qcow2 /boot/
System.map-4.9.0-3-arm64
config-4.9.0-3-arm64
initrd.img
initrd.img-4.9.0-3-arm64
initrd.img.old
lost+found
vmlinuz
vmlinuz-4.9.0-3-arm64
vmlinuz.old

我们可以将它们复制到主机文件系统:

1
virt-copy-out -a hda.qcow2 /boot/vmlinuz-4.9.0-3-arm64 /boot/initrd.img-4.9.0-3-arm64 .

(我们想要更长的文件名,因为 和 只是符号链接和 virt 复制出来不会复制它们。vmlinuzinitrd.img

有关 libguestfs 或从主机系统访问磁盘映像的任何其他工具的重要警告:在 QEMU 运行时不要试图使用它们,否则当 QEMU 和 libguestfs 中的来宾 OS 尝试更新同一映像时,您将遇到磁盘损坏。

如果随后升级来宾中的内核,则需要重复此步骤来提取新内核和 initrd,然后适当更新 QEMU 命令行。

运行

要运行已安装的系统,我们需要一个不同的命令行来启动已安装的内核和 initrd,然后传递内核命令行参数,安装程序告诉我们我们需要:

1
2
3
4
5
6
7
8
9
qemu-system-aarch64 -M virt -m 1024 -cpu cortex-a53 \
  -kernel vmlinuz-4.9.0-3-arm64 \
  -initrd initrd.img-4.9.0-3-arm64 \
  -append 'root=/dev/vda2' \
  -drive if=none,file=hda.qcow2,format=qcow2,id=hd \
  -device virtio-blk-pci,drive=hd \
  -netdev user,id=mynet \
  -device virtio-net-pci,netdev=mynet \
  -nographic

这应该引导到登录提示,您可以在其中使用安装过程中设置的用户和密码登录。

安装具有 SSH 客户端,因此获取文件的一个简单方法就是使用 VM 内部的"scp"与它外部的 SSH 服务器通信。或者,您可以使用 libguestfs 将文件直接写入磁盘映像(例如使用 virt 复制),但请确保仅在 VM 未运行时使用 libguestfs,否则将会使磁盘损坏。



转载请标明出处【QEMU-aarch64中模拟ARM64环境virt开发板中安装debian】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论