根据上篇我们讲了搭建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源码
解压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
执行下面命令,重新配置.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文件,它是启机后运行的第一个脚本
inittab会先去执行/etc/init.d/rcS脚本的事情,rcS脚本内容如下所示
rcS它会做三件事:
1、挂载fstab的所有系统节点
2、mdev机制实现热插拔自动创建节点
3、给eth0设置静态IP
/etc/fstab主要是存放文件系统信息内容如下
/etc/profile文件是全局的shell配置文件,简单的讲就是登陆shell前的配置文件,主要是设置环境变量路径,设置主机用户名,创建设备节点
内容如下
我尝试过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
可以看到登录到串口上
退出当前运行的 qemu,使用组合键,CTRL + a,松开后然后再按 x 键
本篇制作的busybox文件系统内容,可以关注 Linux随笔录,回复关键字busybox 即可获得
作者潘小帅, 是一名Linux底层爱好者,平时写写技术原创文章,徒步,旅游,看电影的爱好,喜欢我的文章可以点赞收藏+关注,感谢你的支持,微信公众号【Linux随笔录】
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。