宿主机:Ubuntu16.04 x64(Linux内核4.4.0)
交叉编译工具链:gcc-arm-linux-gnueabi
arm-linux-gcc:4.4.3
QEMU:2.5.0
Linux kernel:4.4.1
busybox:1.25.1
一、准备
1.创建工作目录armv7/,进入该目录
2.下载内核源码文件linux-4.4.1.tar.xz
3.下载busybox源码文件busybox-1.25.1.tar.bz2
4. http://files.cnblogs.com/files/pengdonglin137/etc.tar.gz下载内核启动配置文件etc.tar.gz,解压
二、编译Linux内核
在armv7/目录下
1.解压linux-4.4.1.tar.xz
2.进入linux-4.4.1目录
3.执行:
1 export ARCH=arm 2 export CROSS_COMPILE=arm-linux-gnueabi- 3 make vexpress_defconfig
完成后,执行:(j2表示两个线程执行)
1 make zImage -j2
最后执行:(一定要make dtbs,且启动时加上相应的dtb,否则内核启动不了)
1 make dtbs
或省略以上两步直接:
1 make all
4.在armv7/目录下新建temp/目录
5.将生成的arch/arm/boot/zImage和arch/arm/boot/dts/vexpress-v2p-ca9.dtb复制到temp/中
三、编译busybox
在armv7/目录下
1.解压busybox-1.25.1.tar.bz2
2.进入busybox-1.25.1目录
3.执行:
1 1 export ARCH=arm 2 2 export CROSS_COMPILE=arm-linux-gnueabi- 3 make menuconfig
出现图形界面,做如下配置(这一步是可选的,如果执行了就可以不用执行cp /usr/arm-linux-gnueabi/lib rootfs/这一步):
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
完成后,执行:
1 make
完成后,执行:
1 make install
完成后,该目录下生成的_install中即是基本的busybox指令。
四、制作根文件系统
1. 先在Ubuntu主机环境下,形成目录结构,里面存放的文件和目录与虚拟arm板上linux内核运行所需要的目录结构完全一样,然后再打包成镜像(在虚拟arm板看来就是SD卡),这个临时的目录结构称为根目录。在armv7/目录下,创建bash脚本,并运行(注意这里不能使用ext4格式,否则内核启动后文件系统是只读的,原因目前不清楚):
1 #!/bin/bash 2 3 rm -rf rootfs 4 rm -rf tmpfs 5 rm -rf rootfs.ext3 6 7 mkdir rootfs 8 mkdir -p rootfs/proc/ 9 mkdir -p rootfs/sys/ 10 mkdir -p rootfs/tmp/ 11 mkdir -p rootfs/root/ 12 mkdir -p rootfs/var/ 13 mkdir -p rootfs/mnt/ 14 15 cp busybox-1.25.1/_install/* rootfs/ -arf 16 cp /usr/arm-linux-gnueabi/lib rootfs/ -arf 17 cp etc rootfs/ -arf 18 19 mkdir -p rootfs/dev/ 20 mknod rootfs/dev/tty1 c 4 1 21 mknod rootfs/dev/tty2 c 4 2 22 mknod rootfs/dev/tty3 c 4 3 23 mknod rootfs/dev/tty4 c 4 4 24 mknod rootfs/dev/console c 5 1 25 mknod rootfs/dev/null c 1 3 26 27 dd if=/dev/zero of=rootfs.ext3 bs=1M count=64 28 mkfs.ext3 rootfs.ext3 29 30 mkdir -p tmpfs 31 mount -t ext3 rootfs.ext3 tmpfs/ -o loop 32 cp -r rootfs/* tmpfs/ 33 umount tmpfs
五、网络配置
在armv7/目录下
1.修改etc/init.d/rcS文件,在ifconfig lo 127.0.0.1 下加一句ifconfig eth0 192.168.xxx.xxx(也可以内核启动后手动运行,但这样开机自动运行比较方便)
2.依次执行以下shell指令:
1 ifconfig ens33 down # 关闭ens33接口 2 brctl addbr br0 # 添加一个虚拟网桥br0 3 brctl addif br0 ens33 # 把ens33连接到br0上 4 ifconfig br0 promisc up # 以混杂模式打开br0接口 5 ifconfig ens33 promisc up # 以混杂模式打开ens33接口 6 dhclient br0 # 为br0分配ip 7 tunctl -t tap0 -u root # 创建一个tap0接口,只允许root用户访问 8 brctl addif br0 tap0 # 在虚拟网桥中增加一个tap0接口 9 ifconfig tap0 up # 打开tap0接口
六、系统启动运行
qemu-system-arm \ -M vexpress-a9 \ -m 512M \ -kernel temp/zImage \ -dtb temp/vexpress-v2p-ca9.dtb \ -nographic \ -append "root=/dev/mmcblk0 rw console=ttyAMA0" \ -sd rootfs.ext3 \ -net nic \ -net tap,ifname=tap0,script=no
七、后记
存在的问题:
1.显示文件系统是只读的 (已解决:文件系统格式改为ext3)
2.联网问题尝试过之前的方法,失败(已解决,宿主机内需要进行网桥、接口的配置,还要修改etc/init.d/rcS,加入一句ifconfig eth0 <ip>,<ip>是希望分配给虚拟arm板的ip)
3.ARM9选择了versatilepb (ARM926EJ-S)平台,但在启动时提示无法加载设备树,追溯问题发现是versatile-pb.dts没有编译导致dtb文件没有生成
新增问题:
1.qemu虚拟机只能与宿主机ping通,无法ping通外网
2.宿主机进行网桥、接口配置只能一条条输入shell指令完成,写成脚本运行后ping不通外网,但ifconfig信息与正确配置是一样的