QEMU搭建Linux-ARM系统

1、安装QEMU需要的nijia工具

在安装QEMU前需要安装nijia工具,使用ninja1.12会出现bug,更换官网1.11.1版本,就可以正常编译了
下载地址:
https://github.com/ninja-build/ninja/releases
配置安装

hudahua@wiat:~/workspace/QEMU/ninja-1.11.1$ ./configure.py --bootstrap

提示:/usr/bin/env: “python”: 没有那个文件或目录
hudahua@wiat:~/workspace/QEMU/ninja-1.11.1$

hudahua@wiat:~/workspace/QEMU/ninja-1.11.1$ vi configure.py

方法: 将运行的程序开头的声明 #! /usr/bin/env python 改为 #! /usr/bin/env python3 ,因为noetic(或者使用者安装)的python版本是3。再配置。
复制ninja执行文件到系统

sudo cp ninja /usr/bin/		

ninja --version #查看安装版本,出现版本即安装成功

2、下载安装QEMU

wget https://download.qemu.org/qemu-8.2.0.tar.xz  #下载源码
tar xf qemu-8.2.0.tar.xz  # 解压
mkdir build && cd build  # 在下载目录新建文件夹build(这是必须的,因为configure命令必须在build文件夹下执行)

以下均在/build目录下
./…/qemu-8.2.0/configure -prefix ~/path/test/qemu-install #执行配置文件,可参看上一个教程

hudahua@wiat:~/workspace/QEMU/build_qemu$ ./../qemu-8.2.0/configure -prefix ~/workspace/test/qemu-install

python determined to be ‘/usr/bin/python3’
python version: Python 3.10.12

hudahua@wiat:~/workspace/QEMU/build_qemu$ make 
hudahua@wiat:~/workspace/QEMU/build_qemu$ sudo make install
hudahua@wiat:~/workspace/QEMU/build_qemu$ which qemu-system-aarch64

3、下载安装kernel

下载最新Linux kernel版本内核。
https://www.kernel.org/

hudahua@wiat:~/workspace/kernel$ tar xf linux-6.7.3.tar.xz

到ARM官网下载交叉编译工具
https://developer.arm.com/downloads/-/gnu-a#panel4a

gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz

hudahua@wiat:~/workspace/tools$ tar xf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz

重命名交叉编译工具文件夹

mv gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu  aarch64-linux-gnu-8.3

配置环境变量,生效。

aarch64-linux-gnu-gcc -v

__gcc 版本 8.3.0
安装kernel必要的包

sudo apt-get install libncurses5-dev  build-essential git bison flex libssl-dev

编译内核

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

编译成功。

hudahua@wiat:~/workspace/kernel/linux-6.7.3$ ls arch/arm64/boot/
dts  Image  install.sh  Makefile

4、制作rootfs文件系统

下载rootfs
https://busybox.net/downloads/
配置rootfs

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

打开静态库编译选项

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

安装ncurses库

 sudo apt-get install libncurses5-dev libncursesw5-dev

执行安装

make  # 编译源码

出错:
/usr/bin/ld: coreutils/lib.a(mktemp.o): in function mktemp_main': mktemp.c:(.text.mktemp_main+0x98): 警告: the use of mktemp’ is dangerous, better use mkstemp' or mkdtemp’
/usr/bin/ld: networking/lib.a(ipcalc.o): in function `ipcalc_main’:

date.c:(.text.date_main+0x25b): undefined reference to `stime’
collect2: error: ld returned 1 exit status

需要声明环境变量,

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0$ export ARCH=arm64
hudahua@wiat:~/workspace/rootfs/busybox-1.31.0$ export CROSS_COMPILE=aarch64-linux-gnu-

重新编译通过

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0$ make
hudahua@wiat:~/workspace/rootfs/busybox-1.31.0$ make install

安装路径:

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0$ ls _install/

配置必要的系统文件

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install$ mkdir etc dev lib

声明系统环境参数

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install$ vi etc/profile
#!/bin/sh
export HOSTNAME=myQEMU
export USER=root
export HOME=/home
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH

配置系统初始化文件
inittab文件中关于运行等级的所有操作执行完成,便代表了boot完成,之后就引导进入登录界面,用户可以使用账户密码登陆进入系统

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install$ vi etc/fstab

#device  mount-point    type     options   dump   fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0
kmod_mount /mnt 9p trans=virtio 0 0

系统启动文件,挂载系统

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install$ vi etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r

编写rootfs启动脚本文件

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install$ mkdir etc/init.d

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install$ vi etc/init.d/rcS
mkdir -p /sys
mkdir -p /tmp
mkdir -p /proc
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

创建系统console
hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install/dev$

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install/dev$ sudo mknod console c 5 1
hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install/dev$ sudo mknod null c 1 3

5、使用QEMU启动系统

首先压缩rootfs为cpio.gz文件系统

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install$ find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz

3990 块

将编译制作完成的 Image,rootfs.cpio.gz和启动脚本qemu.sh放在同一目录

hudahua@wiat:~/workspace$ mkdir aarch64_rootfs
hudahua@wiat:~/workspace/aarch64_rootfs$ cp ../kernel/linux-6.7.3/arch/arm64/boot/Image ./
hudahua@wiat:~/workspace/aarch64_rootfs$ cp ../rootfs/busybox-1.31.0/rootfs.cpio.gz .
hudahua@wiat:~/workspace/aarch64_rootfs$ ls
Image  rootfs.cpio.gz

编写QEMU启动脚本

$ cat qemu.sh
	qemu-system-aarch64 \
        -machine virt,virtualization=true,gic-version=3 \
        -nographic \
        -m size=1024M \
        -cpu cortex-a57 \
        -smp 2 \
        -kernel Image \
        -initrd rootfs.cpio.gz \
        --append "console=ttyAMA0 rdinit=/linuxrc"
hudahua@wiat:~/workspace/aarch64_rootfs$ chmod +x qemu.sh

启动 QEMU成功。

hudahua@wiat:~/workspace/aarch64_rootfs$ ./qemu.sh
[root@myQEMU ]#
[root@myQEMU ]#

提示rcS启动脚本,不能运行,没有权限

can't run '/etc/init.d/rcS': Permission denied
[root@myQEMU ]# ls etc/init.d/rcS -l
-rw-rw-r--    1 1000     1000           172 Feb  2 11:01 etc/init.d/rcS
[root@myQEMU ]#

脚步没有执行权限。
退出 QEMU
快捷键:按住Crtl+a,然后松开,按x。

hudahua@wiat:~/workspace/aarch64_rootfs$ cd ../rootfs/busybox-1.31.0/_install/

修改rcS的执行权限。

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install$ chmod +x etc/init.d/rcS

重新压缩成cpio.gz文件系统

hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install$ find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
hudahua@wiat:~/workspace/rootfs/busybox-1.31.0/_install$ cd ../../../aarch64_rootfs/
hudahua@wiat:~/workspace/aarch64_rootfs$ cp ../rootfs/busybox-1.31.0/rootfs.cpio.gz .

编写QEMU启动脚本
QEMU 启动 Qt

mount: mounting kmod_mount on /mnt failed: No such file or directory
/etc/init.d/rcS: line 8: can't create /proc/sys/kernel/hotplug: nonexistent directory

参考博文
https://blog.csdn.net/m0_56588389/article/details/123201717
https://zhuanlan.zhihu.com/p/662500724
https://zhuanlan.zhihu.com/p/77564702

你可能感兴趣的:(linux,arm开发)