搭建qemu运行arm64 Linux环境_qemu 跑arm64

237 阅读5分钟

build/qemu-system-cris build/qemu-system-microblaze build/qemu-system-mipsel build/qemu-system-riscv32 build/qemu-system-sh4eb build/qemu-system-xtensa


后面就可以通过 build/qemu-system-aarch64 模拟arm64平台处理器来运行Linux kernel了。


## **安装arm64交叉编译工具链**


当前我们选择用linaro的交叉编译工具链来编译uboot、kernel、busybox等,linaro交叉编译工具链的下载网址为:https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/,网页如下:


![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6a36b49461ce4cfaace981544c30d341~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1770908093&x-signature=FgaWcse9%2Brm0eNG4OzP67TcXIbk%3D)


我们先创建一个~/cross-compiler目录,然后在该目录下下载交叉编译工具链压缩包gcc-linaro-7.5.0-2019.12-x86\_64\_aarch64-linux-gnu.tar.xz 并解压,命令和日志如下:



max@ubuntu2204:~ mkdir ~/cross-compiler && cd ~/cross-compiler max@ubuntu2204:~/cross-compiler wget releases.linaro.org/components/… --2024-01-14 00:07:24-- releases.linaro.org/components/… Resolving releases.linaro.org (releases.linaro.org)... 52.215.200.125 …… …… gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu. 100%[===============================================================================================================>] 112.43M 1.13MB/s in 4m 37s

2024-01-14 00:12:04 (416 KB/s) - ‘gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz’ saved [117896452/117896452] max@ubuntu2204:/cross-compilermax@ubuntu2204: /crosscompiler max@ubuntu2204:~/cross-compiler tar xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz max@ubuntu2204:/cross-compiler$


把该交叉编译工具链的bin目录添加到 PATH 环境变量中,如下:



PATH=/home/max/cross-compiler/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH


这样我们就可以使用这个交叉编译工具链了,如下:



max@ubuntu2204:~/cross-compileraarch64linuxgnugccvUsingbuiltinspecs.COLLECTGCC=aarch64linuxgnugccCOLLECTLTOWRAPPER=/home/max/crosscompiler/gcclinaro7.5.02019.12x8664aarch64linuxgnu/bin/../libexec/gcc/aarch64linuxgnu/7.5.0/ltowrapperThreadmodel:posixgccversion7.5.0(LinaroGCC7.52019.12)max@ubuntu2204: /crosscompiler aarch64-linux-gnu-gcc -v Using built-in specs. COLLECT_GCC=aarch64-linux-gnu-gcc COLLECT_LTO_WRAPPER=/home/max/cross-compiler/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/7.5.0/lto-wrapper …… …… Thread model: posix gcc version 7.5.0 (Linaro GCC 7.5-2019.12) max@ubuntu2204:~/cross-compiler


到此arm64交叉编译工具链就安装完成了。


## **编译linux kernel**


### **安装工具**


在ubuntu上安装编译内核需要用到的工具,命令和日志如下:



max@ubuntu2204:~sudoaptinstallybuildessentiallibncursesdevbisonflexlibssldevlibelfdevgitReadingpackagelists...DoneBuildingdependencytree...DoneReadingstateinformation...DoneSettingupbuildessential(12.9ubuntu3)...Processingtriggersformandb(2.10.21)...Processingtriggersforlibcbin(2.350ubuntu3.1)...max@ubuntu2204:  sudo apt install -y build-essential libncurses-dev bison flex libssl-dev libelf-dev git Reading package lists... Done Building dependency tree... Done Reading state information... Done …… …… Setting up build-essential (12.9ubuntu3) ... Processing triggers for man-db (2.10.2-1) ... Processing triggers for libc-bin (2.35-0ubuntu3.1) ... max@ubuntu2204:~


### **下载linux内核源码**


我们这里下载的是linux官方最新的longterm版本linux-6.1.y 的内核,从linux官网下载源码耗时较长,所以我们选择从清华仓库中下载。大家可以参考 [获取Linux内核源码]( ) 这篇文章来查看linux官方发布的所有版本和各种快速下载内核源码方法。下载命令和日志如下:



max@ubuntu2204:~gitclonehttps://mirrors.tuna.tsinghua.edu.cn/git/linuxstable.gitblinux6.1.yCloningintolinuxstable...remote:Enumeratingobjects:12104695,done.Receivingobjects:100remote:Total12104695(delta0),reused0(delta0),packreused12104695Resolvingdeltas:100Checkingobjects:100Updatingfiles:100max@ubuntu2204:  git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux-stable.git -b linux-6.1.y Cloning into 'linux-stable'... remote: Enumerating objects: 12104695, done. Receiving objects: 100% (12104695/12104695), 2.58 GiB | 6.23 MiB/s, done. remote: Total 12104695 (delta 0), reused 0 (delta 0), pack-reused 12104695 Resolving deltas: 100% (10399156/10399156), done. Checking objects: 100% (33554432/33554432), done. Updating files: 100% (78744/78744), done. max@ubuntu2204:~


进入linux-stable目录查看下载的内核的版本为Linux 6.1.72,命令和日志如下:



max@ubuntu2204:~cdlinuxstable/max@ubuntu2204: /linuxstable cd linux-stable/ max@ubuntu2204:~/linux-stable git branch -vv

  • linux-6.1.y 7c58bfa711cb [origin/linux-6.1.y] Linux 6.1.72 max@ubuntu2204:~/linux-stable$

### **编译linux内核源码**


进入到linux-stable 内核目录下,通过menuconfig配置内核选项,命令和日志如下:



max@ubuntu2204:~/linux-stable$ make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build menuconfig make[1]: Entering directory '/home/max/linux-stable/build' GEN Makefile

using defaults found in arch/arm64/configs/defconfig

*** End of the configuration. *** Execute 'make' to start the build or try 'make help'.

make[1]: Leaving directory '/home/max/linux-stable/build' max@ubuntu2204:~/linux-stable$


执行上面的命令会进入到menuconfig 菜单页面,如下:


![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/f824d1b9cf4c48b78f55f01d9f0206fe~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1770908093&x-signature=D14MOBseJTVNJumcFwsUqoFoAew%3D)


在菜单中依次选择如下选项:



Device Drivers    >  Block devices     > RAM block device support


并且把 “Default RAM disk size (kbytes)”调整为65536,调整后界面如下:


![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/041acf0d7fa846a19fc0c8afe898d87f~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1770908093&x-signature=M5k80Kqp%2Fn2vwsMPw3PTup6bjKI%3D)


然后选择save保存,并退出menuconfig菜单,到此内核选项就配置完成了。下面开始编译内核镜像,命令和日志如下:



max@ubuntu2204:~/linux-stablemakeCROSSCOMPILE=aarch64linuxgnuARCH=arm64O=buildj8make[1]:Enteringdirectory/home/max/linuxstable/buildSYNCinclude/config/auto.conf.cmdGENMakefileLD[M]sound/soc/tegra/sndsoctegra210sfc.komake[1]:Leavingdirectory/home/max/linuxstable/buildmax@ubuntu2204: /linuxstable make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build -j8 make[1]: Entering directory '/home/max/linux-stable/build' SYNC include/config/auto.conf.cmd GEN Makefile …… …… LD [M] sound/soc/tegra/snd-soc-tegra210-sfc.ko make[1]: Leaving directory '/home/max/linux-stable/build' max@ubuntu2204:~/linux-stable


查看生成的Image内核镜像,命令和日志如下:



max@ubuntu2204:~/linux-stablefilebuild/arch/arm64/boot/Imagebuild/arch/arm64/boot/Image:LinuxkernelARM64bootexecutableImage,littleendian,4Kpagesmax@ubuntu2204: /linuxstable file build/arch/arm64/boot/Image build/arch/arm64/boot/Image: Linux kernel ARM64 boot executable Image, little-endian, 4K pages max@ubuntu2204:~/linux-stable


到此内核镜像Image就编译完成了。


## **编译busybox**


Busybox的官方网页为https://busybox.net/ ,我们通过wget下载主页上的BusyBox 1.36.1版本的源码,命令和日志如下:



max@ubuntu2204:~wgethttps://busybox.net/downloads/busybox1.36.1.tar.bz22024011411:50:58https://busybox.net/downloads/busybox1.36.1.tar.bz2Resolvingbusybox.net(busybox.net)...140.211.167.122busybox1.36.1.tar.bz21002024011411:51:15(1.11MB/s)busybox1.36.1.tar.bz2saved[2525473/2525473]max@ubuntu2204:  wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2 --2024-01-14 11:50:58-- https://busybox.net/downloads/busybox-1.36.1.tar.bz2 Resolving busybox.net (busybox.net)... 140.211.167.122 …… …… busybox-1.36.1.tar.bz2 100%[================================================================================>] 2.41M 1.11MB/s in 2.2s 2024-01-14 11:51:15 (1.11 MB/s) - ‘busybox-1.36.1.tar.bz2’ saved [2525473/2525473] max@ubuntu2204:~


解压busybox源码并进入源码目录,然后通过menuconfig菜单选择静态编译,即选择“Build static binary (no shared libs)”选项,命令和日志如下:



max@ubuntu2204:tarxfbusybox1.36.1.tar.bz2max@ubuntu2204:  tar xf busybox-1.36.1.tar.bz2 max@ubuntu2204:~ cd busybox-1.36.1/ max@ubuntu2204:/busybox-1.36.1makeCROSSCOMPILE=aarch64linuxgnuARCH=arm64menuconfigHOSTCCscripts/basic/fixdepHOSTCCscripts/basic/splitincludeEndofconfiguration.Executemaketobuildtheprojectortrymakehelp.max@ubuntu2204: /busybox1.36.1 make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 menuconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/split-include …… …… *** End of configuration. *** Execute 'make' to build the project or try 'make help'. max@ubuntu2204:~/busybox-1.36.1


执行上面的命令,会显示出busybox的menuconfig菜单,如下:


![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6c99b1b2f7c2458bb4c6c5bf6c5400ee~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1770908093&x-signature=ho46RJk9DQNpJv%2FS7Z%2B8uXo24gA%3D)


在菜单中依次选择:



Settings    > [*] Build static binary (no shared libs)


界面如下:


![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6b4c1cf2c525474895e02bf50f61641a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1770908093&x-signature=fZ7JetGObpHxm%2Fy12XxYT%2Bm4qik%3D)


然后保存退出,到此busybox的选项就配置完成了。下面开始编译busybox,命令和日志如下:



max@ubuntu2204:~/busybox-1.36.1$ make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 install -j8 SPLIT include/autoconf.h -> include/config/* GEN include/bbconfigopts.h GEN include/common_bufsiz.h …… ……

You will probably need to make your busybox binary setuid root to ensure all configured applets will work properly.


查看生成的busybox可执行文件,命令如下:



max@ubuntu2204:~/busybox-1.36.1$ file _install/bin/busybox _install/bin/busybox: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), stati


## **制作 initrd 文件系统镜像**


为了方便制作initrd文件系统镜像,我们通过mk\_initrd.sh脚本来生成initrd.ext4镜像文件,后面在内核跑起来后会挂载该镜像中的文件系统,脚本如下:



#!/bin/bash set -x CURR_DIR=pwd MOUNT_DIR=CURRDIR/mountpointBUSYBOXPREFIX=/home/max/busybox1.36.1ddif=/dev/zeroof=initrd.ext4bs=1Mcount=32mkfs.ext4initrd.ext4mkdirpCURR_DIR/mount_point BUSYBOX_PREFIX=/home/max/busybox-1.36.1 dd if=/dev/zero of=initrd.ext4 bs=1M count=32 mkfs.ext4 initrd.ext4 mkdir -p MOUNT_DIR sudo mount initrd.ext4 MOUNTDIRcparfMOUNT_DIR cp -arf BUSYBOX_PREFIX/_install/* MOUNTDIRcdMOUNT_DIR cd MOUNT_DIR mkdir -p etc dev mnt proc sys tmp mnt etc/init.d/ echo "proc /proc proc defaults 0 0" > etc/fstab echo "tmpfs /tmp tmpfs defaults 0 0" >> etc/fstab echo "sysfs /sys sysfs defaults 0 0" >> etc/fstab echo "#!/bin/sh" > etc/init.d/rcS echo "mount -a" >> etc/init.d/rcS echo "mount -o remount,rw /" >> etc/init.d/rcS echo "echo -e "Welcome to ARM64 Linux"" >> etc/init.d/rcS chmod 755 etc/init.d/rcS echo "::sysinit:/etc/init.d/rcS" > etc/inittab echo "::respawn:-/bin/sh" >> etc/inittab echo "::askfirst:-/bin/sh" >> etc/inittab chmod 755 etc/inittab cd dev mknod console c 5 1 mknod null c 1 3 mknod tty1 c 4 1 cd CURRDIRsudoumountCURR_DIR sudo umount MOUNT_DIR echo "make initrd ok!"


用户需要根据自己编译的busybox所在目录来调整脚本中的 BUSYBOX\_PREFIX 变量。修改完mk\_initrd.sh 脚本后,我们先创建一个make\_initrd目录,并把 mk\_initrd.sh 脚本拷贝到该目录下,由于在ubuntu下做mount和umount操作需要sudo权限,所以在执行mk\_initrd.sh脚本前需要先在终端进入sudo权限,然后再执行该 mk\_initrd.sh 脚本生成initrd.ext4镜像,命令和日志如下:



max@ubuntu2204:mkdirmakeinitrdmax@ubuntu2204:  mkdir make_initrd max@ubuntu2204:~ cd make_initrd/ max@ubuntu2204:/make_initrdlsmkinitrd.shmax@ubuntu2204: /makeinitrd ls mk_initrd.sh max@ubuntu2204:~/make_initrd max@ubuntu2204:~/make_initrd$ sudo su [sudo] password for max: root@ubuntu2204:/home/max/make_initrd# root@ubuntu2204:/home/max/make_initrd# sh mk_initrd.sh

  • pwd
  • CURR_DIR=/home/max/make_initrd
  • MOUNT_DIR=/home/max/make_initrd/mount_point
  • BUSYBOX_PREFIX=/home/max/busybox-1.36.1 …… ……
  • echo make initrd ok! make initrd ok! root@ubuntu2204:/home/max/make_initrd# root@ubuntu2204:/home/max/make_initrd# exit exit max@ubuntu2204:~/make_initrd$ ls -lh initrd.ext4 -rw-r--r-- 1 root root 32M 1月 14 12:32 initrd.ext4

到此文件系统镜像initrd.ext4就做好了。


## **使用qemu aarch64模拟器运行Linux内核**




![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/18c692ac90ef41f18c87735c2c7deb47~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1770908093&x-signature=Kg0Nc2U0UU9wyBYdr2hIpC3iZlQ%3D)

最全的Linux教程,Linux从入门到精通

======================

1.  **linux从入门到精通(第2版)**

2.  **Linux系统移植**

3.  **Linux驱动开发入门与实战**

4.  **LINUX 系统移植 第2版**

5.  **Linux开源网络全栈详解 从DPDK到OpenFlow**



![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6ed00c3ef8a94af3bcd556aa467c479f~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1770908093&x-signature=VW82v1SE5onY4zUIXj2dawB2ocE%3D)



第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。


![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7f279480d4dc4d19824fd2d1e8b71573~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1770908093&x-signature=nEpO%2FLdzdZtcf8S5EPN6np6cfTQ%3D)


**本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。**

> 需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论


详情docs.qq.com/doc/DSmdCdUNwcEJDTXFK