X86_64平台上利用qemu安装aarch64架构的虚拟机

https://blog.csdn.net/chenxiangneu/article/details/78955462

遇到原作者一样的问题.. 还是不可行.. 无解了.

升级kernel 到 5.1.8 还不行。。。不知道如何处理了。。

EFI stub: Booting Linux Kernel... [ initrd.img 28.21MiB 100% 3.48MiB/s ]
EFI stub: Using DTB from configuration table
EFI stub: Exiting boot services and installing virtual address map...


希望有高手 指点一下。

 
 

前一段时间摸索了以下在x86平台上安装arm架构(包括aarch64和armhf)的虚拟机,中间遇到了不少问题。把经验总结下来希望能帮到大家。


1.安装qemu-system-aarch64

如果在宿主机上只安装了qemu-kvm的话,宿主机上只能运行X86构架的虚拟机,并能够利用kvm加速,并不能将arm指令翻译成X86指令运行。所有还需要安装qemu-system-aarch64,它提供了aarch64架构虚拟机在x86架构上的运行支持。 
可以通过下载源代码并编译安装:

wget https://download.qemu.org/qemu-2.11.0.tar.xz
tar xvJf qemu-2.11.0.tar.xz
cd qemu-2.11.0
./configure –-target-list=aarch64-softmmu
make
sudo make install

在安装的过程中可能会报缺少一些依赖包,我在安装过程中安装了以下依赖包后成功安装。

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

安装成功后qemu-system-aarch64会安装到/usr/local/bin/目录下。

2.UEFI固件下载

以前系统的启动过程可以简化为 BIOS固件—->引导程序—->操作系统,但是由于传统的BIOS启动方式存在许多问题,如bios运行在16位模式,寻址空间小,运行慢等,所以现在X86、ARM架构等架构都改采用了改进的 UEFI 启动方式(当然会有兼容传统BIOS启动方式的考虑),这种情况下系统启动过程如下图所示。 
 
上图启动过程详细我也不太清楚,大家可以看看wiki上的进一步介绍,这里需要说明的是,UEFI启动中最开始执行的也是专门的UEFI固件。因此,我们要想引导到安装光盘(支持UEFI模式)进一步安装aarch64架构的系统,先要下载对应架构(这里是aarch64)的UEFI固件。 
QEMU_EFI.fd(下载地址:http://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/)

3.操作系统下载

我这里采用的是arm64架构的ubuntu 16.04 server版:ubuntu-16.04.3-server-arm64.iso

4.创建虚拟硬盘

利用qemu-img指令可以创建1个空的虚拟硬盘,便于后面安装的时候将系统安装到虚拟硬盘上。

qemu-img create ubuntu16.04-arm64.img 16G
  • 1

如果没有上述命令,大家联网安装即可。

5.虚拟机安装

执行如下命令:

qemu-system-aarch64 -m 2048 -cpu cortex-a57 -smp 2 -M virt -bios QEMU_EFI.fd -nographic -drive if=none,file=ubuntu-16.04.3-server-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom -drive if=none,file=ubuntu16.04-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0

执行上述命令时确保QEMU_EFI.fd、ubuntu-16.04.3-server-arm64.iso、ubuntu16.04-arm64.img文件在当前目前下,否则需要修改成对应的文件路径。在上述参数中,指定安装光盘这里-drive if=none,file=ubuntu-16.04.3-server-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom我在有些网站上找到了不同的方式并尝试,但进入到光盘的安装界面后会报如下图所示错误,最后发现上述指定能正确的完成安装。 

下面是安装过程的一些截图。 

6.虚拟机启动

安装完成之后,下面就是启动虚拟机。正常情况下,安装完成后会自动重新启动,然后发现进入到下面的界面。顿时慌了,又出问题了。安装过程中出现问题大家不要轻易放弃,一定要理性的分析问题和解决问题。 

上面是进入到了UEFI的交互shell里面,为什么没有执行grub并引导进入ubuntu系统咧?说明UEFI固件没有找到ESP分区(EFI system partition,安装过程中就会看见创建了一个ESP分区)或者没有找到ESP分区中的EFI文件,因为系统需要该EFI文件来引导。在该shell下执行exit进入到UEFI的管理界面,并手动选择EFI文件启动系统,如下图所示。

终于进入到了系统中…… 

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

6.利用virt-manager启动虚拟机

前面能够利用命令成功启动虚拟机啦,但是对于我这种入门级的选手来说更想用带界面的virt-manager工具去直观地管理虚拟机(开关虚拟机、添加删除网络接口也很方便),于是进行了一番尝试,找到了一个可行的方法。 
首先是安装virt-manager工具。

sudo yum install virt-manager

安装完成后启动virt-manager,如下图。在选择Architecture为aarch64后,出现了图中所示的warning,表示找不到aarch64架构的UEFI固件,并且在安装方式上自动选择了Import existing disk image。一想也是,系统最开始执行的就是UEFI固件,而我们并没有指定UEFI固件的路径。

这种情况下需要提供系统镜像外,还要提供vmlinuz内核文件和initrd文件。 

这里给出了安装UEFI固件的步骤,网页打开较慢,我这里给出步骤的截图。

安装完成后,从下面的图中可以看到,warning消失了,并且只需要导入硬盘镜像文件,说明UEFI固件已经起作用了。只要UEFI固件能够执行到硬盘ESP分区上的EFI文件,那就能够成功启动系统了。 

指定镜像文件后启动系统,出现了下面错误 

通过查阅资料,发现这是由于libvirt库的版本导致的,将libvirt版本升级到3.10.0。在libvirt官网上最新稳定版本是3.10.0,但通过yum直接安装还没有这个最新版本。我直接找到了一个可用源。在/etc/yum.repos.d目录下建一个virt.repo文件,将下面代码复制到文件中。

[virt]
name=CentOS-$releasever - virt
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://mirrors.nwsuaf.edu.cn/centos/$releasever/virt/$basearch/libvirt-latest/
ailovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

运行sudo yum update libvirt完成更新! 
更新完成后再次启动虚拟机,本以为会没有问题了额,结果卡在了下面的界面中

个人觉得是新安装的UEFI固件的问题,在网上也没有找到可用的解决方法。如果有读者能够找到上面问题的解决方法,也可以留言告知我。

最终不得不采用内核启动的方式。将前面的系统镜像/boot目录挂载到本地,然后提取其中的vmlinuz和initrd文件。

首先用fdisk查看系统镜像的分区和偏移,下图是我的系统镜像的信息。 

可以看到,我的/boot在/所在的第二个分区中,执行下面命令将/所在分区挂载到本地的/mnt目录下(注意偏移量的修改),并将两个文件拷贝出来。命令如下

sudo mount -o loop,ro,offset=$((1050624*512)) xxx.img /mnt
sudo cp /mnt/boot/vmlinuz .
sudo cp /mnt/boot/initrd .

然后再导入过程中指定虚拟机镜像和vmlinuz、initrd文件、内核参数指定为root=/dev/sda2,或者在自定义阶段配置,如下图所示。 

再次启动系统,成功进入到系统中……

如果发现采用内核启动方式仍然无法启动,并停留在下图所示的界面,说明是还是该UEFI固件的问题,我就遇到了这个问题。大家可以将最前面用到的QEMU_EFI.fd文件,采用如下命令对安装的UEFI固件进行替换即可

dd if=QEMU_EFI.fd of=/usr/share/edk2.git/aarch64/QEMU_EFI-pflash.raw conv=notrunc

7.参考链接

https://wiki.linaro.org/LEG/UEFIforQEMU 
https://kennedy-han.github.io/2015/06/16/QEMU-debian-ARMv8.html 
https://en.opensuse.org/openSUSE:AArch64 
https://gmplib.org/~tege/qemu.html 
https://marcin.juszkiewicz.com.pl/2015/04/17/running-vms-on-fedoraaarch64/ 
https://bugzilla.redhat.com/show_bug.cgi?id=1449837 
https://marcin.juszkiewicz.com.pl/2015/04/17/running-vms-on-fedoraaarch64/

[转帖]X86_64平台上利用qemu安装aarch64架构的虚拟机的更多相关文章

  1. window上利用pip安装pandas

    官网推荐的是直接使用Anoconda,它集成了pandas,可以直接使用.安装挺简单的,有windows下的安装包.如果不想安装庞大的Anoconda,那就一步一步用pip来安装pandas.下面我主 ...

  2. 在ZYNQ-7000平台上利用PS点亮PL上的LED灯

    在ZYNQ-7000平台上利用PS点亮PL上的LED灯 1.实验方案 图1    实验方案系统框图 2.具体步骤 2.1.vivado工程建立 ①打开vivado集成开发环境,点击“Create Pr ...

  3. 在mac上利用homebrew安装软件

    在mac经常需要安装一些软件,你可以通过app store下载,或者可以通过浏览袭搜索下载.这里介绍通过homebrew安装一些软件,它会自动为你下载一些软件的相关依赖,免去安装的烦恼. 首先我们需要 ...

  4. 在 mac 上利用 homebrew 安装软件

    在mac经常需要安装一些软件,你可以通过app store下载,或者可以通过浏览袭搜索下载.这里介绍通过homebrew安装一些软件,它会自动为你下载一些软件的相关依赖,免去安装的烦恼. 首先我们需要 ...

  5. 在海思hisiv100nptl平台上交叉编译并安装SRS

    ./configure --with-arm-ubuntu12 && make 须要安装: apt-get installgcc-arm-linux-gnueabi     ,但hi3 ...

  6. Domino V8 在 UNIX/Linux 平台上的安装及其常见问题

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 Domino V8 的安装需求 Domino V8 可以支持多种平台和操作系统,表1 列出了其支持的各种 UNIX/Lin ...

  7. phongap开发中安卓平台上如何调用第三方播放器来播放HLS视频

    前文曾经讲了关于在安卓平台上利用phonegap开发播放HLS的解决方案,其实最好的方案就是自己针对HLS视频开发自己的播放器,但是开发播放器是一个浩大的工程,必须对原生安卓开发非常熟悉,并且对视频播 ...

  8. iOS 平台上常见的安装包有三种,deb、ipa 和 pxl

    前言:目前 iOS 平台上常见的安装包有三种,deb.ipa 和 pxl. 其中 deb 格式是 Debian 系统(包含 Debian 和 Ubuntu )专属安装包格式,配合 APT 软件管理系统 ...

  9. 龙芯GO!龙芯平台上构建Go语言环境指南

    龙芯软件生态系列——龙芯GO!龙芯平台上构建Go语言环境指南2016-07-05 龙芯中科1初识Go语言Go语言是Google公司于2009年正式推出的一款开源的编程语言,是由Robert Gries ...

随机推荐

  1. react 中的路由 属性exact

    https://www.cnblogs.com/nailc/p/8718137.html(copy)

  2. CentOS 7 各个版本的区别

    CentOS 7 各个版本的区别 2017年07月04日 10:44:37 程诺 阅读数 52029    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.n ...

  3. Angular 主从组件

    此刻,HeroesComponent 同时显示了英雄列表和所选英雄的详情. 把所有特性都放在同一个组件中,将会使应用“长大”后变得不可维护. 你要把大型组件拆分成小一点的子组件,每个子组件都要集中精力 ...

  4. gwyh 测试赛 验题人 - 题解 (非std做法)

    测试赛 - ljc20020730 解题报告 标签(空格分隔): solution Task A Tiat's easy question 首先,判断图中是否存在长度为奇数的环等价于判断图是否为二分图 ...

  5. String类型中"=="和"equals"的区别

    "=="比较的是两个字符串的内存地址.  "equals"比较的是两个字符串的实际值. 例子1. String s1="abc"; Stri ...

  6. hash索引

    hash算法 哈希表(hash table ,也叫散列表),是根据关键码值(key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个 ...

  7. php的while函数

    PHP while 循环 PHP Switch PHP For 循环 PHP while 循环在指定条件为 true 时执行代码块. PHP 循环 在您编写代码时,经常需要反复运行同一代码块.我们可以 ...

  8. Java中FileOutputStream流的write方法

    本文为大家分享了FileOutputStream流的write方法,供大家参考,具体内容如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

  9. Zookeeper基础命令操作

    转载链接:https://blog.csdn.net/dandandeshangni/article/details/80558383 安装参考链接https://blog.csdn.net/qiun ...

  10. C++入门经典-例3.15-使用do-while循环计算1到10的累加

    1:代码如下: // 3.15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...