因为没有找到完整版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/
所以这里我们就要自己来制作这三个文件,至少两个文件。
交叉编译环境配置
因为我们要仿真的路由器架构是arm32,所以要想在amd64架构下编译出可以运行在arm架构的文件,我们需要配置我们的交叉编译环境。
到这个网站下载我们arm版本的交叉编译器
https://releases.linaro.org/archive/12.11/components/toolchain/binaries/
然后进行解压
Linux内核文件制作
https://cdn.kernel.org/pub/linux/kernel/
在这个网站下载对应版本的内核文件
进入目录,生成默认配置文件
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
这里可能会报错
显示是yyloc多次定义错误,解决方法是修改内核目录下'scripts/dtc/dtc-lexer.lex.c_shipped'文件,在'YYLTYPEyyloc'前添加'extern'关键字,然后重新编译,问题即可得到解决。
编译成功后在内核目录下会有 zImage 和 vexpress-v2p-ca9.dtb,这里的zImage文件即为我们需要的linux内核文件。
文件系统制作
这里我们要制作系统的文件系统,即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文件。
在配置lib目录时要注意:将交叉编译工具链里面的 lib 目录拷贝到当前的 _install 目录,而交叉编译工具链下面有好几个 lib 目录。如果不能确定的话,就用命令find xxx -name "ld-linux-armhf.so.3"
搜索,有这个 ld 的文件就是要拷贝的 lib 目录。我们在把这个交叉编译目录的lib目录拷贝进去的同时,也要把我们之前一并下载解压的 _runtime目录中文件拷贝进去。
这是完整的_install/lib目录下的动态链接库文件
创建 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
构建磁盘文件(文件系统)
用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内核文件。
启动QEMU
将这两个文件移动到新的目录下并创建qemu启动脚本和网络配置脚本
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系统了:
看雪ID:GotEOF
https://bbs.kanxue.com/user-home-1009405.htm
#
原文始发于微信公众号(看雪学苑):Linux 3.10 版本编译 qemu仿真 busybox
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论