使用Qemu在x86_64机器上安装aarch64的ubuntu server 16.04

转载自https://morningd.github.io/2018/01/08/how-to-run-aarch64-ubuntu-server-cloudimg-on-x86-64/

0. 安装Qemu & 下载ubuntu

我就说说Ubuntu的镜像吧,我下载是xenial-server-cloudimg-arm64-uefi1.img,下载地址。选择arm64和uefi1结尾的img镜像即可。这里我使用的直接镜像启动,核启动需要下载disk1结尾的镜像,另外还需要提取linuz和initramfs,方法可以参考ARM64调试环境 - 简单地快乐 - 博客园

1. 安装AAVMF

编译并安装好Qemu后,还需要安装aarch64的UEFI固件。这里可以使用OVMF (Open Virtual Machine Firmware),其中aarch64架构的又叫做AAVMF。安装非常简单,其实就是下载一个叫QEMU_EFI.fd的文件。如果有apt,直接sudo apt-get install qemu-efi,固件就会下载到/usr/share/qemu-efi/中。如果用的是yum,便是yum install edk2.git-aarch64,只不过目录在/usr/share/edk2.git/aarch64/中。

2.准备UEFI flash

虽然OVMF手册上写可以直接使用-pflash参数直接使用QEMU_EFI.fd固件用于启动。但实际操作会报无法读取pfalsh0的错误。所以还需要准备一下启动用的pflash,命令如下:

 
    
1
2
3
 
    
dd if=/dev/zero of=flash0.img bs=1M count=64
dd if=/usr/share/qemu-efi/QEMU_EFI.fd of=flash0.img conv=notrunc
dd if=/dev/zero of=flash1.img bs=1M count=64

其中flash0.img即UEFI固件,flash1是VARS。

3. 准备初始化配置文件

由于ubuntu server不提供密码配置,也就是说安装后是无法通过root用户和密码登录系统的,我们需要在系统启动前编写好配置文件,将自己的ssh公钥添加进去,然后使用ssh登录。首先要下载云配置文件生成工具sudo apt install cloud-utils。编写配置文件cloud.txt,参考如下

 
    
1
2
3
4
5
6
7
8
9
 
    
#cloud-config
users:
- name: ubuntu
ssh-authorized-keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCw+5N1GWY1KM7ZQEKc/CIPOdwqM4BbBGvcNwodtxPZv0pTCR5PnzxHAY/36bEjRyqcR81dg72LeF3DIjmEqkjfXnr44yVmUfqyN0lz/4EzWI8a6A6vXMKf1wJbPRNXR5utEFFg4VAbc7noYHpa8j3dzPBmp5kjzzy0+z421r4MMzJFRoiqQWMLOdHKl7R/SDB/36fHeBSwzFmfJVlhtiSfk3e51nsS7ISC0MBfBi0baliutbVWS+YyZkoibQOgY01uL11zc5JzUQ9W0/GjImZn99GA23hFU04Fxle88YF3sEvohBZy7tAPwVBySRxB3fMuDaHVOPjHtpfCIYdzjN7r yooo@yooo-pc
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: sudo
shell: /bin/bash

name为登录用的有户名,ssh-rsa下方的内容为你的ssh公钥,一般在~/.ssh/id_rsa.pub中。编写好后保存,执行cloud-localds cloud.img cloud.txt即可生成配置文件cloud.img

4. 编写启动脚本

由于启动参数比较多,最好编写一个Qemu的启动脚本,就叫./qemu_start.sh吧,参考如下:

 
    
1
2
3
4
5
6
7
8
9
 
    
qemu-system-aarch64 \
-m 4096 -cpu cortex-a57 -M virt \
-serial stdio \
-pflash flash0.img -pflash flash1.img \
-drive if=none,file=xenial-server-cloudimg-arm64-uefi1.img,id=image \
-device virtio-blk-device,drive=image \
-device virtio-blk-device,drive=cloud \
-drive if=none,id=cloud,file=cloud.img \
-netdev user,hostfwd=tcp::2222-:22,id=unet -device virtio-net-device,netdev=unet \

关于每一项的具体含义我就不解释啦,可以查找Qemu手册

万事俱备 启动Qemu

 
    
1
 
    
sudo ./qemu_start.sh

按照网上的教程这一步应该就可以进入虚拟机了,新开一个终端,输入ssh ubuntu@localhost -p 2222(这里的ubuntu为cloud.txt配置中的name),即用ssh协议登录虚拟机了。

但是,我还遇到了一些麻烦,你遇到了吗??如下图一样
img

修复引导(找不到root请继续看)

  1. 对的,如果显示error:no such device: root,那么就是引导出了问题。再次执行启动脚本,就会进入UEFI界面。
    img
  2. 输入c进入GRUB命令行模式。输入ls查看硬盘状态,找到ubuntu系统根目录,从分区boot目录下的内容可以找到,这里根目录在(hd3,gpt1)中:
    img
  3. 输入以下命令启动
     
          
    1
    2
    3
    4
     
          
    set root=(hd3,gpt1)
    linux /boot/vmlinuz-4.4.0-104-generic root=/dev/vdb1
    initrd /boot/initrd.img-4.4.0-104-generic
    boot

注意:这里(hd3,gpt1)是ubuntu系统根目录分区,即boot目录下有内容的那个分区,不是请替换。linux后的vmlinuz-4.4.0-104-generic对应(hd3,gpt1)/boot下的内容,不是请替换。initrd.img-4.4.0-104-generic同理。另外这里的/dev/vdb1是不确定的,如果无法启动linux进入了initramfs,输入ls /dev/查看是否有vdb1设备,如果是vda1,或者vdc等等等等,那就改成对应设备重新启动一次。

  1. 系统启动后使用ssh登录系统,输入:
     
          
    1
     
          
    sudo update-grub2

自动更新GRUB配置文件,再次启动就不会找不到根目录了。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值