上面已完成了u-boot,kernel现在我们来做一个根文件系统
用busybox制作根文件系统
1.下载Busybox,
官方下载地址:
https://busybox.net/downloads/
sudo mkdir root_system 将下载后的文件放入/qemu_arm/root_system中
2.解压
book@book-virtual-machine:/qemu_arm/root_system$ tar xjf busybox-1.26.2.tar.bz2
3.编译
make clean
make menuconfig
在”Busybox Settings ---> Build Options --->“ 关闭“Build BusyBox as a static binary。
打开”Build shared libbusybox“。
关闭”Produce a binary for each applet“与”Produce additional busybox binary“。
保存退出
打开”Build shared libbusybox“。
关闭”Produce a binary for each applet“与”Produce additional busybox binary“。
保存退出
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- install
生成的文件就放在_install目录中了
4.查看要用到的动态库
方式1:
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$ arm-none-linux-gnueabi-readelf -d busybox| grep NEEDED
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$
方式2:
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$ arm-none-linux-gnueabi-objdump -x busybox| grep NEEDED
NEEDED libm.so.6
NEEDED libc.so.6
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$
NEEDED libm.so.6
NEEDED libc.so.6
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$
方式3:
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$ strings busybox | grep lib
/lib/ld-linux.so.3
libm.so.6
libc.so.6
__libc_start_main
/lib/modules
/var/lib/misc/udhcpd.leases
/lib/firmware
/var/lib/dpkg/info/%s.%s
/var/lib/dpkg/status
/var/lib/dpkg/status.udeb
/var/lib/dpkg/status.udeb.bak
shlibs
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$
/lib/ld-linux.so.3
libm.so.6
libc.so.6
__libc_start_main
/lib/modules
/var/lib/misc/udhcpd.leases
/lib/firmware
/var/lib/dpkg/info/%s.%s
/var/lib/dpkg/status
/var/lib/dpkg/status.udeb
/var/lib/dpkg/status.udeb.bak
shlibs
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$
方式4:
ldd busybox
显示:not a dynamic executable //不知为什么 ,原因有待查找
//-------------应该显示为下面的提示才是正确的-----------------
linux-gate.so.1 => (0xb775d000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb76ea000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7530000)
/lib/ld-linux.so.2 (0x800ab000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb76ea000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7530000)
/lib/ld-linux.so.2 (0x800ab000)
//--------------这说明 linux.so.2的库还是存在依赖关系-------------
5.将编译后的文件拷到一个文件夹(rootfs)中:
sudo mkdir rootfs
sudo chmod 777 rootfs/
sudo cp busybox-1.26.2/_install/* -r rootfs/
6.将busybox-1.26.2/examples/bootfloppy下的etc文件夹拷到rootfs文件夹中
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mkdir etc
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo chmod 777 etc
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo chmod 777 etc
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo cp -r /qemu_arm/root_system/busybox-1.26.2/examples/bootfloppy/etc/* etc/
6.拷贝链接文件
查找libm.so.6文件位置
book@book-virtual-machine:/qemu_arm/root_system/rootfs$
arm-none-linux-gnueabi-readelf -d bin/busybox | grep NEEDED
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ locate libm.so.6 //查找在哪里
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/armv4t/lib/libm.so.6
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/lib/libm.so.6 //我们拷这个文件
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/thumb2/lib/libm.so.6
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ locate libm.so.6 //查找在哪里
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/armv4t/lib/libm.so.6
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/lib/libm.so.6 //我们拷这个文件
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/thumb2/lib/libm.so.6
/lib/i386-linux-gnu/libm.so.6
book@book-virtual-machine:/qemu_arm/root_system/rootfs$
查找libc.so.6文件位置
book@book-virtual-machine:/qemu_arm/root_system/rootfs$
locate libc.so.6
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/armv4t/lib/libc.so.6
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/lib/libc.so.6 //我们拷这个库文件
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/thumb2/lib/libc.so.6
/lib/i386-linux-gnu/libc.so.6
book@book-virtual-machine:/qemu_arm/root_system/rootfs$
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/armv4t/lib/libc.so.6
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/lib/libc.so.6 //我们拷这个库文件
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/thumb2/lib/libc.so.6
/lib/i386-linux-gnu/libc.so.6
book@book-virtual-machine:/qemu_arm/root_system/rootfs$
book@book-virtual-machine:/qemu_arm/root_system/rootfs$
sudo mkdir lib
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo chmod 777 lib
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo chmod 777 lib
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ cp /arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/lib/lib*.so.6 lib //文件库没拷全,启动时会提示 Kernel panic - not syncing: No working init found.
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ cp /arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/lib/*.so* lib
7.创建4个tty端终设备
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mkdir dev
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mknod dev/tty1 c 4 1
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mknod dev/tty2 c 4 2
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mknod dev/tty3 c 4 3
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mknod dev/tty4 c 4 4
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mknod dev/tty2 c 4 2
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mknod dev/tty3 c 4 3
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mknod dev/tty4 c 4 4
8.制作根文件系统镜像
1. 生成32M大小的镜像
busybox-1.26.2 busybox-1.26.2.tar.bz2 rootfsbook@book-virtual-machine:/qemu_arm/root_system$ dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32
32+0 records in
32+0 records out
33554432 bytes (34 MB, 32 MiB) copied, 0.31139 s, 108 MB/s
book@book-virtual-machine:/qemu_arm/root_system$
2. 格式化成ext3文件系统
book@book-virtual-machine:/qemu_arm/root_system$ mkfs.ext3 a9rootfs.ext33. 将文件拷贝到镜像中
book@book-virtual-machine:/qemu_arm/root_system$
sudo mkdir tmpfs
book@book-virtual-machine:/qemu_arm/root_system$ sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
book@book-virtual-machine:/qemu_arm/root_system$ sudo cp -r rootfs/* tmpfs/
book@book-virtual-machine:/qemu_arm/root_system$ sudo umount tmpfs
book@book-virtual-machine:/qemu_arm/root_system$ sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
book@book-virtual-machine:/qemu_arm/root_system$ sudo cp -r rootfs/* tmpfs/
book@book-virtual-machine:/qemu_arm/root_system$ sudo umount tmpfs
9.用Qemu测试生成的根文件系统
qemu-system-arm -M vexpress-a9 -m 512M -kernel /qemu_arm/linux-kernel/linux-3.16.39/arch/arm/boot/zImage -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd /qemu_arm/root_system/a9rootfs.ext3
显示一大堆信息,最后出现提示如下:
#0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 43
input: ImExPS/2 Generic Explorer Mouse as /devices/mb:kmi1/serio1/input/input2
kjournald starting. Commit interval 5 seconds
EXT3-fs (mmcblk0): mounted filesystem with writeback data mode
VFS: Mounted root (ext3 filesystem) readonly on device 179:0.
Freeing unused kernel memory: 244K (805d6000 - 80613000)
random: nonblocking pool is initialized
mount: mounting proc on /proc failed: No such file or directory
Processing /etc/profile... Done
/ #
input: ImExPS/2 Generic Explorer Mouse as /devices/mb:kmi1/serio1/input/input2
kjournald starting. Commit interval 5 seconds
EXT3-fs (mmcblk0): mounted filesystem with writeback data mode
VFS: Mounted root (ext3 filesystem) readonly on device 179:0.
Freeing unused kernel memory: 244K (805d6000 - 80613000)
random: nonblocking pool is initialized
mount: mounting proc on /proc failed: No such file or directory
Processing /etc/profile... Done
/ #
说明内核已启动并且挂接了文件系统,此时已可以使用busybox的命令集了.
遇到的问题:
make clean
make menuconfig
make
make install 后生成的busybox不能用在ARM开发板中,因为没有修改过MAKEFILE文件所以就没有指定用交叉编译工具并且也不是arm的文件格式
可使用file busybox查看
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$ file busybox
busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.16, stripped
busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.16, stripped
注意红色字ARM,这才是用于arm开发板的busybox
根文件能挂接上,但不能运行,提示:
Kernel panic - not syncing: No working init found.
使用file命令查看
book@book-virtual-machine:/qemu_arm/root_system/rootfs$
file linuxrc
linuxrc: symbolic link to bin/busybox
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ file /bin/busybox
/bin/busybox: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=3009223865ed1ed7bfab5468767d7cd504d6ef49, stripped
linuxrc: symbolic link to bin/busybox
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ file /bin/busybox
/bin/busybox: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=3009223865ed1ed7bfab5468767d7cd504d6ef49, stripped
还有要注间的就是链接库的文件要拷全,不能只拷libm.so.6和[libc.so.6两个
另一个可能就在于上面提示的80386,可能在制作的过程中没有指定ARCH=arm造成的
参考文档:
http://blog.csdn.net/f413933206/article/details/6534685
本文介绍了如何在Ubuntu环境下使用QEMU模拟ARM,并通过Busybox制作根文件系统。详细步骤包括下载并解压Busybox,编译,检查并拷贝所需动态库,创建tty终端设备,以及生成和格式化根文件系统镜像。在过程中可能会遇到动态库不全导致的启动问题。
426

被折叠的 条评论
为什么被折叠?



