我正在尝试为基于 Debian 的 ARM(或什至)设置一个可以与 QEMU 一起运行的完整armhf
系统armel
映像aarch64
。不幸的是,我在网上找到的所有示例都是通过传递内核来启动映像的(initrd
如果它需要一些模块,则可能是)。
但是,我真的很想启动系统qemu-system-amd64
,只需提供磁盘映像和 CD-ROM 映像(开始安装)。
-machine
我可以理解and没有默认值-cpu
,但我在网上找不到任何关于如何执行以下操作的线索:
#> wget \
http://cdimage.debian.org/.../armhf/iso-cd/debian-testing-armhf-netinst.iso
...
#> qemu-img create -f qcow2 debian-armhf.qcow 20G
...
#> qemu-system-arm -machine vexpress-a9 -cpu cortex-a9 \
-hda debian-armhf.qcow \
-cdrom debian-testing-amd64-netinst.iso \
-boot d
...
#> qemu-system-arm -machine vexpress-a9 -cpu cortex-a9 \
-hda debian-armhf.qcow \
-net nic -net user,hostfwd=tcp::2222-:22
...
所以,我真的很想知道这样的事情是否可能......如果是的话,怎么办?如果没有,为什么?
这是一个很好的问题,我不久前选择深入研究自己,只是对我来说它使用的是 MIPS/MIP64。
有几个问题使这项工作具有挑战性。
启动 Linux 主机时,内核需要了解它正在使用的硬件。对于某些架构(如 amd64),固件的发现由 BIOS 通过“高级配置和电源接口”(ACPI)处理。在其他情况下,这由可扩展固件接口 ( EFI ) 甚至 ATAGS 作为非常古老的解决方案来处理。在大多数现代嵌入式系统中,ATAGS 的使用已被一种称为“设备树 blob”( DTB ) 的机制所取代。一系列乐于助人的用户在解释差异方面做得比我做得更好。
所有这些的目的是帮助向内核提示硬件配置,并且通常与引导加载程序协同工作。在您的情况下,在 ARM 小端 (
armel
)、ARM 硬浮点 (armhf
) 和 ARM 64 位 (aarch64
) 之间进行选择是一个关键的第一个决定,因为它会对编译包、内核等的选择产生影响,因为一切都需要符合模拟的“指令集架构”(ISA)。我知道您想要空白磁盘和 CD 映像的简单性,但这最终就是为什么没有这种形式的“安装程序”用于像 Raspberry Pi* 这样的系统。当您下载 Raspbian 映像时,它包括一组结构化的分区,其中包括引导加载程序 (das uBoot)、相应硬件的设备树 blob,以及配置了包存储库的一组基本包。
这涉及到另一个有趣的琐事......你有没有看过 ISO 映像在你“安装”Linux 时做了什么?
让我以基于 Anaconda 的安装程序(Fedora、RHEL、CentOS 等)为例。
当您开始安装时,它会启动一个最小的实时系统,该系统会自动开始运行 python 实用程序Anaconda。Anaconda 然后提示用户回答一系列问题,以特定领域的语言填充配置文件,然后创建一个 chroot 并在该 chroot 内执行一组软件包安装。
这......在某种程度上,它就像使用那个 Raspbian 图像。
那么这是什么意思?
好吧,首先我会推荐一些答案,具体取决于您要如何进行?
如果模拟 RPi 就足够了,我建议: Using QEMU to emulate a Raspberry Pi
如果您想模拟更像是基于“云”的系统,George Hawkins 维护了一个Gist 并提供了一些很好的说明。
如果您真的想从头开始,Debian 用户 Aurel32 多年来一直维护着一组可以启动的基础镜像,并且在他们的博客上写了一篇关于类似过程的精彩文章。