手把手教你搭建ARM64 QEMU环境

根据上篇我们讲了搭建ARM32 QEMU环境没看到的小伙伴可以看下

本篇咱们模拟ARM64 QEMU开发环境

环境准备

PC系统:Windows10

虚拟机:VMware-17

虚拟机系统:Ubuntu-20.04

模拟的64位cpu:cortex-a57

搭建环境时使用的源码版本

qemu-8.2.0

linux-5.10.209(Linux Kernel)

busybox-1.36.1

AARCH64的工具链安装准备:

sudo apt-get install gcc-aarch64-linux-gnu -y

下载编译安装QEMU

下载QEMU源码

去qemu官网上下载最新的8.2.0源码包,并解压出来

wget https://download.qemu.org/qemu-8.2.0.tar.bz2
tar -xjf qemu-8.2.0.tar.bz2

配置QEMU

配置qemu源码前要要求本地环境python版本要大于3.8和glib2.0环境依赖。

检查下自己主机的python版本,如果低于python3.8需要去python官网下载源码自行安装https://www.python.org/downloads/source/

cd Python-3.8.17/
./configure --prefix=/usr/local
make -j8 
make install
rm /usr/bin/python
sudo ln -s /usr/local/bin/python3.8 /usr/bin/

然后安装各种环境

sudo apt-get install python3-venv
sudo apt-get install python3-pip
sudo apt-get update  
pip3 install --upgrade pip
pip3 install sphinx
pip3 install sphinx_rtd_theme
pip3 install Ninja
sudo apt-get install libglib2.0-0 libglib2.0-dev ninja-build libpixman-1-dev

安装完配置前的环境依赖后,进入到qemu目录下,配置下qemu源码。本篇模拟ARM64架构的开发环境,接下来创建编译目录,然后进行配置

~/qemu-8.2.0$ mkdir build/
~/qemu-8.2.0$ cd build/
~/qemu-8.2.0/build/$ ../configure --target-list=aarch64-softmmu --audio-drv-list=

编译安装qemu

~/qemu-8.2.0/build/$ make -j8 && make install

下载编译kernel

安装好qemu模拟器后,在[www.kernel.org] 官网上,下载Linux kernel源码,我这里选的5.10源码

alt

解压kernel源码

tar -xf linux-5.10.209.tar.xz

进入kernel目录下,配置编译kernel并编译生成Image文件,存放在arch/arm/boot/下面

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image -j8

编译kernel modules ​ 编译完的ko文件存放在arch/arm/boot/下面

~/linux-5.10.209$ make modules -j8

使用busybox制作根文件系统

本篇根文件系统我们使用busybox进行制作,下一篇我们也可以尝试用Buildroot进行做文件系统

先下载busybox官网上的最新版本源码,并进行解压

wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xjf busybox-1.36.1.tar.bz2

设置交叉编译工具链

-> Settings

[*] Build static binary (no shared libs)

(aarch64-linux-gnu-) Cross compiler prefix

alt

执行下面命令,重新配置.config文件并编译

~/busybox-1.36.1$ make defconfig && make -j8

执行下面命令,进行安装文件系统

~/busybox-1.36.1$ make install

会默认安装在_install目录下

~/busybox-1.36.1/_install$ ls
bin  linuxrc  sbin  usr

创建rootfs目录用来存放所需要的文件系统内容,把busybox里安装的目录拷贝到这里,创建lib目录本地安装的工具链放到这里,在创建其他所需目录

mkdir rootfs
mkdir -p rootfs/lib
cp -r /usr/aarch64-linux-gnu/lib/ rootfs/lib/
cp -r busybox-1.36.1/_install/* rootfs
cd rootfs/
mkdir -p etc dev mnt proc sys tmp mnt root etc/init.d/
touch etc/initab etc/fstab etc/profile etc/init.d/rcS
chmod +x etc/inittab etc/init.d/rcS

一个完整文件系统是启机要做很多事情,这些事情都是由启机脚本去做 etc目录下创建inittab文件,它是启机后运行的第一个脚本 alt inittab会先去执行/etc/init.d/rcS脚本的事情,rcS脚本内容如下所示 alt

rcS它会做三件事:

1、挂载fstab的所有系统节点

2、mdev机制实现热插拔自动创建节点

3、给eth0设置静态IP

/etc/fstab主要是存放文件系统信息内容如下 alt

/etc/profile文件是全局的shell配置文件,简单的讲就是登陆shell前的配置文件,主要是设置环境变量路径,设置主机用户名,创建设备节点 内容如下

alt

我尝试过aarch64架构就不能用上篇的sd卡制作文件系统,会报机器类型不支持

qemu-system-aarch64: -sd rootfs_arm64.ext4: machine type does not support if=sd,bus=0,unit=0

所以换cpio工具制作initrd内存文件系统

~/rootfs$ find . | cpio -o -H newc > ../rootfs.img
98684 blocks
~$ cd ../
~$ ls -lh rootfs.img 
-rw-rw-r-- 1 forlinx forlinx 49M 2月   5 10:47 rootfs.img

或者cpio做出来的镜像用gzip压缩成img,两者区别是gzip压缩更小

~/rootfs$ find . | cpio -o -H newc |gzip > ../rootfs.cpio.gz

~$ cd ../
~$ ls -lh rootfs.cpio.gz
-rw-rw-r-- 1 forlinx forlinx 15M 2月   5 10:47 rootfs.cpio.gz

qemu模拟kernel启动

输入qemu命令启动内核

qemu-system-aarch64 -machine virt,virtualization=true,gic-version=3 -nographic -m size=1024M -cpu cortex-a57 -smp 4 -kernel arch/arm64/boot/Image -initrd rootfs.cpio.gz -append "root=/dev/ram console=ttyAMA0 rdinit=/linuxrc"
  • -machine virt,virtualization=true,gic-version=3 因为qemu不能模拟出具体64位机器类型,只能是virt虚拟化出64位机器类型,所以dtb就不需要指定
  • -cpu cortex-a57 目前qemu支持armv8的cpu有cortex-a53,cortex-a55,cortex-a57,cortex-a72,cortex-a76
  • smp 4 使用4核CPU
  • -m 1024M 单板物理内存1024M
  • -kernel ./arch/arm/boot/Image 指定内核镜像及路径
  • -nographic 不使用图形界面,使用串口
  • -initrd rootfs.cpio.gz 内存文件系统
  • -append "root=/dev/ram console=ttyAMA0 init=/linuxrc" 指定内核启动参数,串口设备使用ttyAMA0,告诉kernel,init进程是/linuxrc

可以看到登录到串口上

alt 退出当前运行的 qemu,使用组合键,CTRL + a,松开后然后再按 x 键

本篇制作的busybox文件系统内容,可以关注 Linux随笔录,回复关键字busybox 即可获得


作者潘小帅, 是一名Linux底层爱好者,平时写写技术原创文章,徒步,旅游,看电影的爱好,喜欢我的文章可以点赞收藏+关注,感谢你的支持,微信公众号【Linux随笔录】

本文由 mdnice 多平台发布

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值