Linux 3.10 版本编译 qemu仿真 busybox

admin 2025年6月18日00:58:22评论1 views字数 4076阅读13分35秒阅读模式

因为没有找到完整版linux 3.10版本编译加qemu仿真教程,准备自己总结一下整个的过程。因为我的出发点是为了仿真一个内核为linux3.10版本、交叉编译器版本也为特定的版本路由器固件。

预备知识

我们要进行qemu系统仿真,需要至少两个文件,linux内核文件,磁盘文件(文件系统)。这里我们可能看到过不同的仿真命令,有的会需要三个文件:内核文件,磁盘文件(文件系统),initrd文件。这里的主要区别是,内核有没有内置访问存储设备所需的所有驱动

当只有两个文件时,qemu的启动过程是:

内核启动 → 直接检测硬盘 → 挂载根分区

当多了一个initrd文件时,qemu的启动过程是:

1.内核启动 → 运行 initrd 中的初始化脚本

2.initrd 加载 SD 卡控制器驱动

3.initrd 加载文件系统驱动 (如 ext4)

4.initrd 挂载真实根文件系统

5.切换根文件系统并继续启动流程

在一般我们的系统模拟路由器固件的过程中,我们只需要去下载打包好的三种文件即可:

下载网站:

https://people.debian.org/~aurel32/qemu/

Linux 3.10 版本编译 qemu仿真 busybox

所以这里我们就要自己来制作这三个文件,至少两个文件。

交叉编译环境配置

因为我们要仿真的路由器架构是arm32,所以要想在amd64架构下编译出可以运行在arm架构的文件,我们需要配置我们的交叉编译环境。

到这个网站下载我们arm版本的交叉编译器

https://releases.linaro.org/archive/12.11/components/toolchain/binaries/

Linux 3.10 版本编译 qemu仿真 busybox

然后进行解压

Linux内核文件制作

https://cdn.kernel.org/pub/linux/kernel/

在这个网站下载对应版本的内核文件

Linux 3.10 版本编译 qemu仿真 busybox

进入目录,生成默认配置文件

make ARCH=arm vexpress_defconfig

指定交叉编译器开始编译

make ARCH=arm CROSS_COMPILE=/home/ccy/hardware/Linuxkernel_3.10.31_9350/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/arm-linux-gnueabihf- all

这里可能会报错

Linux 3.10 版本编译 qemu仿真 busybox

显示是yyloc多次定义错误,解决方法是修改内核目录下'scripts/dtc/dtc-lexer.lex.c_shipped'文件,在'YYLTYPEyyloc'前添加'extern'关键字,然后重新编译,问题即可得到解决。

编译成功后在内核目录下会有 zImage 和 vexpress-v2p-ca9.dtb,这里的zImage文件即为我们需要的linux内核文件。

Linux 3.10 版本编译 qemu仿真 busybox

文件系统制作

这里我们要制作系统的文件系统,即Linux下的常规目录,我们使用BusyBox进行制作,这里BusyBox版本我使用的是和Linux 3.10内核版本发行时间差不多的1.30.1

下载busybox源码

https://busybox.net/downloads/busybox-1.30.1.tar.bz2

生成配置文件

make ARCH=arm menuconfig

这里直接默认,到界面下方Save即可

编译busybox

make ARCH=arm CROSS_COMPILE=/home/ccy/hardware/Linuxkernel_3.10.31_9350/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/arm-linux-gnueabihf- all

再进行busybox安装,就是生成常规的linux命令

make ARCH=arm CROSS_COMPILE=/home/ccy/hardware/Linuxkernel_3.10.31_9350/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/arm-linux-gnueabihf- install

这个命令会在busybox目录下生成一个_install文件

现在的文件系统 _install 并不完整,缺少了很多目录。下面补充一些缺少的必要目录和文件。这里是我已经补充过的完整目录(直接mkdir,然后补充常规文件即可),正常刚install完成,里面只有bin、usr、sbin和linuxrc文件。

Linux 3.10 版本编译 qemu仿真 busybox

在配置lib目录时要注意:将交叉编译工具链里面的 lib 目录拷贝到当前的 _install 目录,而交叉编译工具链下面有好几个 lib 目录。如果不能确定的话,就用命令find xxx -name "ld-linux-armhf.so.3"搜索,有这个 ld 的文件就是要拷贝的 lib 目录。我们在把这个交叉编译目录的lib目录拷贝进去的同时,也要把我们之前一并下载解压的 _runtime目录中文件拷贝进去。

Linux 3.10 版本编译 qemu仿真 busyboxLinux 3.10 版本编译 qemu仿真 busybox

这是完整的_install/lib目录下的动态链接库文件

Linux 3.10 版本编译 qemu仿真 busybox

创建 etc/inittab 文件,写入下面内容

# 系统启动时::sysinit:/etc/init.d/rcS# 系统启动按下Enter键时::askfirst:-/bin/sh# 按下Ctrl+Alt+Del键时::ctrlaltdel:/sbin/reboot# 系统关机时::shutdown:/sbin/swapoff -a::shutdown:/bin/umount -a -r# 系统重启时::restart:/sbin/init

创建 etc/init.d/rcS 文件,写入下面内容。并且给 etc/init.d/rcS 文件 777 的权限。

#!/bin/sh# 挂载 /etc/fstab 中定义的所有文件系统/bin/mount -a# 挂载虚拟的devpts文件系统用于用于伪终端设备/bin/mkdir -p /dev/pts/bin/mount -t devpts devpts /dev/pts# 使用mdev动态管理u盘和鼠标等热插拔设备/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug# 扫描并创建节点/sbin/mdev -s

创建 etc/fstab 文件,写入下面内容

<filesystem><mountpoint><type><options><dump><pass>proc                  /proc          proc     defaults       0         0sysfs                 /sys           sysfs    defaults       0         0tmpfs                 /tmp           tmpfs    defaults       0         0tmpfs                 /dev           tmpfs    defaults       0         0

创建 etc/profile 文件,写入下面内容。

export HOSTNAME=ccy# 用户名export USER=root# 用户目录export HOME=/root# 终端默认提示符export PS1="[$USER@$HOSTNAME:$PWD]# "    # 环境变量export PATH=/bin:/sbin:/usr/bin:/usr/sbin# 动态库路径export LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH

创建 dev 目录

mkdir dev

创建终端文件

sudo mknod dev/console c 5 1sudo mknod dev/null c 1 3

创建其他目录

mkdir mnt proc tmp sys root

Linux 3.10 版本编译 qemu仿真 busybox

构建磁盘文件(文件系统)

dd创建一个 1024M 的空白镜像,再用mkfs.ext3命令在 rootfs.ext3.img 文件中生成一个 ext3 格式的文件系统。通过挂载的方式,访问 rootfs.ext3.img 文件,将之前的 _install 目录下文件拷贝至挂载点 mnt_tmpfs,最后取消挂载。至此一个装有文件系统的磁盘镜像制作完毕。

mkdir mnt_tmpfsdd if=/dev/zero of=rootfs.ext3.img bs=1M count=1024sudo mkfs.ext3 rootfs.ext3.imgsudo mount -t ext3 rootfs.ext3.img ./mnt_tmpfs -o loopsudo cp -r _install/* mnt_tmpfssudo umount mnt_tmpfs

Linux 3.10 版本编译 qemu仿真 busybox

到此我们需要的至少两个文件就准备好了,即为带有文件系统的磁盘文件和linux内核文件。

启动QEMU

将这两个文件移动到新的目录下并创建qemu启动脚本和网络配置脚本

Linux 3.10 版本编译 qemu仿真 busybox

boot.sh

#!/bin/shqemu-system-arm -M vexpress-a9 -m 1G -kernel ./zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3.img -net nic -net tap,ifname=tap0,script=no,downscript=no

net.sh,需要提前下载virbruntils工具

#!/bin/bashsudo ip tuntap add dev tap0 mode tapsudo ip link set tap0 upsudo brctl addif virbr0 tap0sudo chmod 666 /dev/net/tun

启动完net.sh之后,启动boot.sh我们就可以成功模拟出我们想要的linux系统了:

Linux 3.10 版本编译 qemu仿真 busybox

Linux 3.10 版本编译 qemu仿真 busybox

Linux 3.10 版本编译 qemu仿真 busybox

看雪ID:GotEOF

https://bbs.kanxue.com/user-home-1009405.htm

*本文为看雪论坛优秀文章,由 GotEOF原创,转载请注明来自看雪社区
Linux 3.10 版本编译 qemu仿真 busybox
议题征集中!看雪·第九届安全开发者峰会

#

原文始发于微信公众号(看雪学苑):Linux 3.10 版本编译 qemu仿真 busybox

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月18日00:58:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Linux 3.10 版本编译 qemu仿真 busyboxhttp://cn-sec.com/archives/4172476.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息