宿主機: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信息與正確配置是一樣的