使用 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这样接下来就可以开始进行修改并运行自己编译的内核了。