文章目录

  • 安装qemu
  • CentOS宿主机系统网络配置
  • 将网桥连接到网卡
  • 创建TAP设备
  • 第一次安装ubuntu镜像安装
  • 第二次启动ubuntu arm64
  • efi界面设置
  • 手动配置网络
  • 通过ssh使用windows连接centos 上的qemu ubuntu arm64虚拟机


windows下vmware 桥接模式 (一定要桥接)创建宿主机centos,然后在centos上安装qemu,使用qemu创建ubuntu arm64虚拟机。

没错,就是双层套娃,性能还不错,不算卡。

安装qemu

感谢这位老大,让我对大致流程有个了解:

安装的脚本:

#!/bin/bash

# install repo 
yum -y install epel-release

# install dep
sudo yum -y install bridge-utils
sudo yum -y install net-tools
sudo yum -y install zlib-devel
sudo yum -y install glib2-devel
sudo yum -y install pixman-devel
sudo yum -y install gcc
sudo yum -y install gcc-c++
sudo yum -y install flex bison

# 替换为解压后的qemu包路径
# 下载路径为 https://download.qemu.org
cd $YOUR_QEME_PATH

./configure --target-list=aarch64-softmmu
sudo make
sudo make install

CentOS宿主机系统网络配置

其实大概的网络拓扑可以这么理解:

arm运行 docker x86 arm运行x86虚拟机_arm


只有3个网桥和ubuntu的网卡是有ip地址的,CentOS(有windows 10 vmware桥接模式创建的虚拟机)不需要有ip地址,因为它是桥接到有ip的网桥上,由网桥通过物理网卡发送包到外网。因为所有设备都是网桥,网桥是二层设备,因此所有的主机都在同一个二层局域网内,可以相互通信。

另外tap模式除了需要在宿主机创建网络接口缺点外,优点是:不禁ping(默认SLIRP模式是禁止ping的).

(实际上不是这么回事啊,因为TAP设备具体我也不太懂,反正用户空间的程序比如qemu进程或者更确切的来说,ubuntu客户机系统可以把tap0当作网卡用,tap0作为网络接口插入到网桥br0上)

将网桥连接到网卡

ip link add br0 type bridge
ip link set dev eth0 master br0
ip address delete $PREFIX dev eth0 # e.g. 192.168.10.8/24 原网卡地址
ip route add default via $ROUTE dev br0 # $ROUTE windows gateway ip

创建TAP设备

tap0创建出来,它将作为虚拟机(ubuntu arm64)的网卡。

ip tuntap add dev tap0 mode tap
ip link set dev tap0 master br0 
ip link set dev br0 up

设置qemu启动网卡脚本:

$ vim /etc/qemu-ifup


#! /bin/sh
switch=br0
ifconfig $1 up
#ip link set $1 up
brctl addif ${switch} $1

设置qemu停止网卡脚本:

$ vim /etc/qemu-ifdown
#! /bin/sh 
switch=br0
brctl delif ${switch} $1

增加脚本执行权限:

chmod +x /etc/qemu-ifup 
chmod +x /etc/qemu-ifdown

都弄好之后ip a是这样的:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 00:0c:29:72:85:8e brd ff:ff:ff:ff:ff:ff
    inet6 fe80::20c:29ff:fe72:858e/64 scope link 
       valid_lft forever preferred_lft forever
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:72:85:8e brd ff:ff:ff:ff:ff:ff
    inet 192.168.199.199/24 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe72:858e/64 scope link 
       valid_lft forever preferred_lft forever
4: tap0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br0 state DOWN group default qlen 1000
    link/ether 72:6d:0b:70:ca:f4 brd ff:ff:ff:ff:ff:ff

参考连接:

  1. Documentation/Networking
  2. Use qemu to build a virtual machine test environment based on aarch64 on the x86_64 platform

第一次安装ubuntu镜像安装

# create raw img
qemu-img create ubuntu16.04-arm64.img 16G
# install from iso
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

这个过程还是挺长的,需要做很多系统安装设置。

相关资源:

下载unbuntu 16.04 arm64

  1. http://cdimage.ubuntu.com/releases/16.04.3/release/ubuntu-16.04.3-server-arm64.iso

下载QEMU_EFI.fd

  1. http://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/

第二次启动ubuntu arm64

第二次启动需要舍弃-drive if=none,file=ubuntu-16.04.3-server-arm64.iso,id=cdrom,media=cdrom-device scsi-cd,drive=cdrom,因为不需要再安装系统。

-netdev type=tap,id=net0指明使用tap0设备:

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=ubuntu16.04-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0 -netdev type=tap,id=net0 -device virtio-net-device,netdev=net0

efi界面设置

途中你会遇到一个问题,就是会进入到efi启动界面(高级版BIOS):

arm运行 docker x86 arm运行x86虚拟机_arm_02


按exit退出到这个图形界面:不要慌,一路回车Boot Maintenance Manager -> Boot From file -> No VOLUME LABEL xxx -> EFI -> ubuntu -> grubaa64.efi , 就可以顺利启动系统。

arm运行 docker x86 arm运行x86虚拟机_arm运行 docker x86_03

原因是什么呢?EFI启动没有默认的启动选项,加个启动选项就可以了

  1. Boot Manger

arm运行 docker x86 arm运行x86虚拟机_arm运行 docker x86_04


选择Add Option,里面选择Boot from file(就是把上面选择efi的那个选项加上去),给这个选项价格名字defaultroot,把这个defaultroot选项调上去(按shift 和 +),保存并退出:

arm运行 docker x86 arm运行x86虚拟机_arm_05


刚才的选项会变成continue, 按enter,选择ubuntu,进入ubuntu引导程序,可以看到如下输出。

arm运行 docker x86 arm运行x86虚拟机_arm_06

手动配置网络

# 配置网络
ip address add $PREFIX dev eth0
# 重启网卡
ifconfig eth0 up
# 桥接模式下,windows主机的网关
ip route add default via 192.168.199.1 dev eth0

添加DNS, 手动修改/etc/resolv.conf

nameserver 8.8.8.8

然后ping百度就可以了。

通过ssh使用windows连接centos 上的qemu ubuntu arm64虚拟机

apt-get install openssh-server
systemctl restart sshd && systemctl enable ssh

然后可以通过连接eth0 ip地址即可。

arm运行 docker x86 arm运行x86虚拟机_ubuntu_07