使用 QEMU 建構和執行 ARM 系統映像?
我正在嘗試為基於 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 多年來一直維護著一組可以啟動的基礎鏡像,並且在他們的部落格上寫了一篇關於類似過程的精彩文章。