openEuler x86 中使用qemu搭建ARM64虚拟机运行环境

前提概要

我们日常一般都是相同架构的host上构建相同架构的虚拟机,例如在x86架构的服务器上搭建x86架构的虚拟机,在arm架构的服务器上也一样搭建aarch64架构的虚拟机;但是,如果你手上只有x86服务器,而你又想在使用arm环境来做开发/编译等,那就需要一种工具来支持跨架构翻译不通架构的质量了,把arm指令翻译成x86指令,把x86指令翻译成aarch64指令;具体是那种工具可以搞呢?来,我带你一起在openEuler x86环境上走一遍,你就熟悉了。let's go

 

1. 安装qemu-system-aarch64

一般我们日常在host上只是安装了qemu-kvm(最新的已经只有qemu了,qemu-kvm被qemu收编了),qemu-kvm本身是不支持跨架构的指令集翻译的,所以呢,我们就要到社区下载较新的qemu源码来编译qemu-system-aarch64,以此来支持跨架构的指令集翻译。

备注:这里对于qemu-kvm、qemu的区分想进一步了解的,可以看下面这篇帖子

http://blog.jcix.top/2016-11-02/qemu_commands/

1.1 下载qemu源码

wget https://download.qemu.org/qemu-2.11.0.tar.xz (这里你可以选择最新的qemu版本源码哈)

1.2 安装qemu-system-aarch64组件的安装依赖包

yum install zlib-devel 
yum install glib2-devel 
yum install pixman-devel

1.3 源码编译和安装

tar xvJf qemu-2.11.0.tar.xz (解压源码)
cd qemu-2.11.0 
./configure --target-list=aarch64-softmmu (这里要特别说明下,一定要加上 --target-list=aarch64-softmmu,否则就没法编译出来qemu-system-aarch64)
make
make install

备注:这里如果对于qemu编译配置感兴趣,想进一步了解,可以直接看社区代码

https://github.com/qemu/qemu/blob/master/configure

2. UEFI固件获取和介绍

centos7.x之前的系统在启动过程可以简化为 BIOS固件---->引导程序---->操作系统,但是由于传统的BIOS启动方式存在许多问题,如bios运行在16位模式,寻址空间小,运行慢等,所以现在主流的X86、ARM等架构都采用了改进的UEFI启动方式,openEuler也是一样,支持legacy和UEFI模式启动的,系统启动过程如下图所示
UEFI模式下系统启动流程

UEFI启动中开始执行时是需要UEFI固件,因此我们要想引导到安装光盘(支持UEFI模式)进一步安装aarch64架构虚拟机系统,先要下载对应架构(这里是aarch64)的UEFI固件。


QEMU_EFI.fd(下载地址:http://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/)

3. 虚拟机操作系统安装光盘下载
我这里使用的是arm64架构的openEuler LTS版本:openEuler-20.03-LTS-x86_64-dvd.iso

4. 创建虚拟硬盘
利用qemu-img指令可以创建1个空的虚拟硬盘,便于后面安装的时候将系统安装到虚拟硬盘上。
qemu-img create openEuler-20.03-LTS-x86_64-dvd.img 16G
如果没有上述命令,yum方式安装qemu-img组件即可
yum install qemu-img -y

5. ARM虚拟机安装,执行如下命令
qemu-system-aarch64 -m 2048 -cpu cortex-a57 -smp 2 -M virt -bios QEMU_EFI.fd -nographic -drive if=none,file=openEuler-20.03-LTS-x86_64-dvd.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom -drive if=none,file=openEuler-20.03-LTS-x86_64-dvd.img,id=hd0 -device virtio-blk-device,drive=hd0

执行上述命令时确保QEMU_EFI.fd、ubuntu-16.04.3-server-arm64.iso、ubuntu16.04-arm64.img文件在当前目前下,否则需要修改成对应的文件路径。

在上述参数中,如果想了解每个参数的意思和vale值,可以参考下面的文档

https://wiki.qemu.org/Documentation/Platforms/ARM

参数解释

-smp 2 // 2个(虚拟)核心。
-m 1024 // 1024MB的系统内存。
-M virt //模拟通用QEMU ARM机器。
-cpu cortex-a57 // 要模拟的CPU架构。
-bios QEMU_EFI.fd // 要使用的BIOS固件文件。
-nographic // 输出到终端(而不是打开一个支持图形的窗口)。
-device virtio-blk-device,drive=
image //创建一个名为“image”的Virtio块设备。
-drive if=none,id=
image,file=ubuntu-16.04-server-cloudimg-arm64-uefi1.img //使用“镜像”设备和我们虚拟机磁盘映像创建驱动器。
-device virtio-blk-device,drive=
cloud //创建另一个名为“cloud”的Virtio块设备。
-drive if=none,id=
cloud,file=cloud.img //使用“云”设备和我们的云配置磁盘映像创建驱动器。
-device virtio-net-device,netdev=user0 // 创建一个名为“user0”的Virtio网络设备
-netdev user,id=user0 // 使用设备“user0”创建用户模式网络堆栈
-redir tcp:2222::22 // 将主机上的端口2222映射到guest虚拟机上的端口22(标准ssh端口)。

6. 之后就直接进入串口界面来一步步走linux安装流程,之后就可以进入你的ARM虚拟机了哈(进入安装界面后的linux安装这里就不罗嗦了哈)

7. 如果你手里有现成的ARM虚拟机镜像,可以参考步骤5,直接用qemu-system-aarch64来加载虚拟机镜像来启动虚拟机,而不需走安装流程来安装ARM虚拟机;给一个在openEuler上已经验证过的命令示例

qemu-system-aarch64 -m 2048 -cpu cortex-a57 -smp 2 -M virt -bios QEMU_EFI.fd -nographic -device virtio-scsi-device -drive if=none,file=openEuler-20.03-LTS-aarch64.2.img,id=hd0 -device virtio-blk-device,drive=hd0

8. 当然还可以通过busybox制作建议文件系统来加载

这里有一篇华为OS内核实验室的大兄弟写的文章,参考就可以了,我这里就赘述了;

https://zhuanlan.zhihu.com/p/77564702

 

参考链接:

http://www.bubuko.com/infodetail-1955476.html?__cf_chl_jschl_tk__=09823595a18e58e9445ab0cf3af782bb7d962abe-1585205925-0-AXUwEiDztyqVTYF0_8fNaAOgE_wEovGBXI9rDoOVXpT7ewlB848Wo3J2T84K1PDRlF7zg34K5fb6JBGlN6y-n3kNxDkfjJVVRRxf9jxlcsDHEHxEPMsTGo8pbDMbPbvFcWrGnDM37Wmf7QYnJyp7HpnM3BNyLErIQ59c8i34I3HgCq2gwfPszeTgdSah-PwMPC5sbpiUIHL4AagD4mN6t6703x53hmHZXJ9K2sN99Os2XlqfnSfMqRwpyhmnU2NAn0SdkJfy2ix4beD_j58bEMTLWlQRoFWNd_576P7BwLc0Pdws1MLpPDPy10JclsdjVg

 

https://blog.lpxin.com/2019/05/16/QEMU%E8%B7%A8%E6%9E%B6%E6%9E%84%E4%BB%BF%E7%9C%9Faarch64%E4%BA%91%E6%9C%8D%E5%8A%A1/