使用 qemu 运行 linux 5.17

2022-12-14  本文已影响0人  android小奉先

本篇介绍

本篇记录下本地搭建QEMU环境,运行linux 仿真环境,这样就可以运行自己编译或修改的内核了。

步骤介绍

安装qemu

qemu就是linux 仿真环境,可以直接从官网下载源码进行编译。由于我的环境是ubuntu 22.04,因此就下载最新的qemu就好了。

wget https://download.qemu.org/qemu-7.2.0-rc4.tar.xz
tar xvf qemu-7.2.0-rc4.tar.xz
mkdir -p build
cd build
../configure --target-list=arm-softmmu,i386-softmmu,x86_64-softmmu,aarch64-linux-user,arm-linux-user,i386-linux-user,x86_64-linux-user,aarch64-softmmu --audio-drv-list=alsa --enable-virtfs
make && sudo make install

这儿我遇到一个错误是不支持virtfs,临时解决方法就是把virtfs关掉了。

编译busybox

busybox是linux 常用命令的大合集,也是官网下载最新的就好, 我这边是编译arm64架构的:

wget https://busybox.net/downloads/busybox-1.34.1.tar.bz2
tar xvjf busybox-1.34.1.tar.bz2
cd busybox-1.31.1
mkdir out

# 默认配置编译,也就是动态编译,这样还需要搞依赖的动态库,比较麻烦
make  ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=./out defconfig

# 静态编译
make  ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=./out menuconfig

执行静态编译后,会有这样一个弹窗


image.png

先选中Settings,然后回车走进去,找到 Build static binary(no shard libs),然后选中,再一路exit退出


image.png

这样继续编译生成根文件系统:

make  ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=./out install

继续制作根文件系统:

cd out/_install
mkdir -pv {bin,dev,d,sbin,etc/init.d,mnt,proc,sys,usr/{bin,sbin},tmp}
sudo mknod dev/null c 1 3
sudo mknod dev/console c 5 1

我们知道linux的第一个进程是init,那么根文件系统中也需要一个init,直接将linuxrc 重命名成init 就好了
mv linuxrc init

继续制作设备挂载:

cd out/_install
新建fstab文件,vim fstab, 写入如下内容:
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 /d debugfs defaults 0 0

创建rcS脚本,让进程启动后自动挂载设备:

cd out/_install/etc/init.d
vim rcS
写入如下内容:
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

# mount net9p fs
mkdir -pv /mnt/net9p
mount -t 9p -o trans=virtio net9p /mnt/net9p

记得把这个文件权限改成777。

编译内核

下载linux源码,然后编译,也是arm64:

进去linux 代码根目录:
mkdir out
# 默认配置
make  ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=./out defconfig

# 配置根文件系统
touch out/out.config
将下面内容写到该文件中:
CONFIG_INITRAMFS_SOURCE="your busybox dir  /out/_install"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
CONFIG_INITRAMFS_COMPRESSION=".gz"

再merge一下:
scripts/kconfig/merge_config.sh -m -O out out/.config out/out.config

# 编译内核
make  ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=./out

qemu 运行kernel

终于到了最后一步:

qemu-system-aarch64 -machine virt -cpu cortex-a57 -nographic -smp 1 -m 2048 -kernel out/arch/arm64/boot/Image

顺利的话就可以看到让人兴奋的画面了:


image.png

一长串的开机启动log,接下来就会正常开机

image.png

这样接下来就可以开始进行修改并运行自己编译的内核了。

上一篇下一篇

猜你喜欢

热点阅读