搭建arm64的qemu环境

说明

qemu在调试内核方面还是比较方便、效率的。以前基本上多是用arm32的平台,网上大部分资源也是关于arm32的。现在arm64的也比较普遍了,最近刚好要看一些内核的东西,花了2天的时间搭建了这个环境,希望看到的朋友少走弯路,节约点时间。(当然,arm32的qemu环境也可以参考本文,除需要使用qemu-system-arm命令代替qemu-system-aarch64和使用arm32的交叉编译工具链,其它的内容是一样的)。本文主要包含3部分内容:1.安装qemu虚拟机,2.配置网络,3.虚拟机挂载NFS。因为每个人的环境还是有点差异的,搭建的过程中需要根据自己的实际情况做些更改。

安装qemu虚拟机

在ubuntu安装qemu:

sudo apt install -y qemu-system-arm

查看版本信息:

qemu-system-aarch64 --version

在这里插入图片描述
查看qemu支持的板子:

qemu-system-aarch64 -M ?

在这里插入图片描述
安装交叉编译工具链:

sudo apt install gcc-aarch64-linux-gnu

安装后查看下版本

aarch64-linux-gnu-gcc -v

在这里插入图片描述
编译内核和设备树

make ARCH=arm64 defconfig
make ARCH=arm64 CROSS_COMPILE=arm-linux-gnueabi- uImage
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs

制作文件系统:

dd if=/dev/zero of=rootfs_ext4.img bs=1M count=256
mkfs.ext4 rootfs_ext4.img

挂载镜像后把最小文件系统内容拷贝进去(最小文件系统可以使用busybox来制作)。

编写启动脚本:

$ vim qemu.sh
#!
qemu-system-aarch64 \
	-nographic \
	-machine virt \
	-cpu cortex-a53 \
	-smp 4 \
	-m size=1024M \
	-kernel Image \
	-drive format=raw,file=./rootfs_ext4.img \
	-append "noinitrd root=/dev/vda rw console=ttyAMA0 loglevel=8"	\

运行qemu.sh脚本启动虚拟机。

配置网络

网络是现代计算机系统不可或缺的一部分,QEMU也对虚拟机提供丰富的网络支持。qemu-kvm中主要给客户机提供了如下4种不同模式的网络。
(1)基于网桥(Bridge)的虚拟网卡
(2)基于NAT(Network Addresss Translation)的虚拟网络
(3)QEMU内置的用户模式网络(user mode networking)
(4)直接分配网络设备(包括VT-d和SR-IOV)
QEMU命令行中,对客户机网络的配置(除了网络设备直接分配之外)都是用“-net”参数来进行配置的,如果没有设置任何的“-net”参数,则默认使用“-net nic -net user”参数从而使用完全基于QEMU内部实现的用户模式下的网络协议栈。
qemu-kvm提供了对一系列主流和兼容性良好的网卡的模拟,通过“-net nic,model=?”参数可以查询到当前的qemu-kvm工具实现了那些网卡的模拟,如下命令行显示了qemu-kvm-1.1.0中能模拟的网卡种类。

[root@jay-linux ~]# qemu-system-x86_64 -net nic,model=?
qemu: 
Supported NIC models: 
ne2k_pci,
i82551,i82557b,
i82559er,
rtl8139,
e1000,
pcnet,
virtio

其中的“e1000”系列是提供Intel e1000系列的网卡模拟,纯的QEMU(非qemu-kvm)默认就是提供Intel e1000系列的虚拟网卡。而其中的virtio类型是qemu-kvm对半虚拟化IO(virtio)驱动的支持。

其中常用的有两种方式(不同的网络后端):
user mode network :
这种方式实现虚拟机上网很简单,类似vmware里的nat,qemu启动时加入-user-net参数,虚拟机里使用dhcp方式,即可与互联网通信,但是这种方式虚拟机与主机的通信不方便。用户模式网络可以很方便的访问网络资源。但是它有很多限制:

  • 默认的,它运作方式类似于防火墙,且不允许任何入站流量。这个限制可以通过端口重定向解决
  • 仅仅支持TCP、UDP协议,对于ICMP则不支持
  • 性能比较差

tap/tun network :
这种方式要比user mode复杂一些,但是设置好后 虚拟机<–>互联网 虚拟机<–>主机 通信都很容易。这种方式设置上类似vmware的host-only,qemu使用tun/tap设备在主机上增加一块虚拟网络设备(tun0),然后就可以象真实网卡一样配置它。
EMU的TAP后端利用宿主机的TAP设备,为客户机提供完整的桥接网络支持,如果外部需要使用标准端口连接到客户机,或者多个客户机需要相互通信,可以使用该方式。TAP后端还具有以下优势:

  • 非常好的性能
  • 可以配置以支持各种网络拓扑

但是,你需要在宿主机上进行网络拓扑的配置,而且各种系统的配置不同。

主机安装工具包:

sudo apt-get install uml-utilities bridge-utils -y

使用TAP后端前,你需要确认你的宿主机的内核支持TAP网络接口: /dev/net/tun 文件存在则说明支持。

$ ls /dev/net
tun

如果没有这样的文件,可以尝试手工创建:

sudo mkdir /dev/net
sudo mknod /dev/net/tun c 10 200
sudo /sbin/modprobe tun

修改网卡信息,设置桥接
使用qemu启动仿真一个虚拟开发板后,Ubuntu就不能上网了,这是因为我们的Ubuntu主机只有一块网卡,qemu启动后和虚拟开发板建立了连接,进行通信(挂载NFS根文件系统),所以Ubuntu也就无法连接互联网上网了。解决办法:在虚拟机上再添加一块网卡(在WMware启动页面添加),一个网卡和qemu连接,一个网卡用来连接互联网。
查看网卡名:

#ifconfig

在这里插入图片描述

修改网卡名称设置:

sudo vi /etc/netplan/01-network-manager-all.yaml
#Let NetworkManager manage all devices on this system
#network:
#version: 2
#renderer: NetworkManager

network:
  version: 2
  # renderer: networkd
  renderer: NetworkManager
  ethernets:
      ens33:    #桥接的网卡
          dhcp4: no
      ens36:
          dhcp4: yes    #上网的网卡
  bridges:
      br0:
          dhcp4: yes
          interfaces:
              - ens33   #br0接入的网卡

使设置生效:

sudo netplan apply

修改配置信息:

sudo vi /etc/qemu-ifup
#!/bin/sh

echo sudo tunctl -u $(id -un) -t $1
sudo tunctl -u $(id -un) -t $1

echo sudo ifconfig $1 0.0.0.0 promisc up
sudo ifconfig $1 0.0.0.0 promisc up

echo sudo brctl addif br0 $1
sudo brctl addif br0 $1

echo brctl show
brctl show

sudo ifconfig br0 192.168.33.145 #根据自己的实际情况修改IP地址
sudo vi /etc/qemu-ifdown
#! /bin/sh
#Script to shut down a network (tap) device for qemu.
#Initially this script is empty, but you can configure,
#for example, accounting info here.

echo sudo brctl delif br0 $1
sudo brctl delif br0 $1
echo sudo tunctl -d $1
sudo tunctl -d $1
echo brctl show
brctl show

重启网络使生效:

service NetworkManager restart或者
service network-manager restart

修改qemu启动脚本:

Vi qemu.sh
#!

qemu-system-aarch64 \
	-nographic \
	-machine virt \
	-cpu cortex-a53 \
	-smp 4 \
	-m size=1024M \
	-kernel Image \
	-drive format=raw,file=./rootfs_ext4.img \
	-append "noinitrd root=/dev/vda rw console=ttyAMA0 loglevel=8"	\
	-nic tap #增加这项

查看测试网络:
主机
在这里插入图片描述

虚拟机
在这里插入图片描述

使用ping相互测试:
在这里插入图片描述
在这里插入图片描述

启动qemu并查看是否有下面的信息:
在这里插入图片描述

虚拟机挂载NFS

搭建nfs文件系统很简单
1.在主机上安装nfs-kernel-server服务端

sudo apt install nfs-kernel-server

2.在主机上建立共享文件夹、设置

sudo vim /etc/exports
/home/andy/nfs *(rw,sync,no_subtree_check,no_root_squash)		//设置共享目录的权限,是以根目录为开始的

重启:

sudo /etc/init.d/nfs-kernel-server start    或者  
sudo /etc/init.d/nfs-kernel-server restart

3.在qemu上直接挂载共享的文件夹

mount -t nfs 10.202.220.9:/home/andy/nfs /mnt -o nolock
  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值