前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 qemu 运行 linux 5.17

使用 qemu 运行 linux 5.17

作者头像
一只小虾米
发布2023-01-18 11:13:03
2K0
发布2023-01-18 11:13:03
举报
文章被收录于专栏:Android点滴分享Android点滴分享

本篇介绍

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

步骤介绍

安装qemu

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

代码语言:javascript
复制
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架构的:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
make  ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=./out install

继续制作根文件系统:

代码语言:javascript
复制
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

继续制作设备挂载:

代码语言:javascript
复制
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脚本,让进程启动后自动挂载设备:

代码语言:javascript
复制
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:

代码语言:javascript
复制
进去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

终于到了最后一步:

代码语言:javascript
复制
qemu-system-aarch64 -machine virt -cpu cortex-a57 -nographic -smp 1 -m 2048 -kernel out/arch/arm64/boot/Image

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

image.png

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

image.png

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本篇介绍
  • 步骤介绍
    • 安装qemu
      • 编译busybox
        • 编译内核
          • qemu 运行kernel
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档