嵌入式根文件系统制作一、实验目标用busybox定制一个基本的文件系统,并且运行用户编译的hello(动态链接)。
二、软件包busybox:/downloads/busybox-1.16.0.tar.bz2bash:ftp:///gnu/bash/bash-4.0.tar.gz三、实验步骤3.1、建立工作目录设定工作目录为/root/build_rootfs/,该目录主要用来编译busybox,bash等制造根文件系统的软件,下载busybox,bash到该目录;mkdir/root/build_rootfs3.2、建立根目录该目录就是我们要移植到目标板上的目录,对于嵌入式的文件系统,根目录下必要的目录包括bin,dev,etc,usr,lib,sbin,proc,sys,tmp;这里设定根目录是/root/rootfs;busybox、bash编译之后,安装到该目录下;mkdir/root/rootfsmkdir/root/rootfs/{bin,dev,etc,usr,lib,sbin,proc,sys,tmp}mkdir/root/rootfs/usr/{bin,sbin,lib}创建节点dev目录执行,创建节点(如果使用mdev设备管理工具可忽略此步骤) /root/rootfs/dev以root用户在/root/rootfs/mknod-m666null c13mknod-m600console c513.3、拷贝动态链接库交叉应用程序的开发需要用到交叉编译的链接库,交叉编译的链接库是在交叉工具链的lib目录下;我们在移植应用程序到我们的目标板的时候,需要把交叉编译的链接库也一起移植到目标板上,这里我们用到的交叉工具链的路径是/usr/local/arm/4.1.2/,所以链接库的目录是/usr/local/arm/4.1.2/arm-linux/lib。
#进入链接库目录cd/usr/local/arm/4.1.2/arm-linux/lib#编写一个shell文件,用于copy实际的共享链接库;主修订版本的符合链接;动态连接器及其符号链接到目标板根目录下的lib(/root/rootfs/lib)。
vi cp.sh#内容如下:for file in libc libcrypt libdl libm libpthread libresolv libutil libthread_dbdocp$file*.so/work/rootfs/libcp-d$file.so.*/work/rootfs/libdonecp-d ld*.so*/work/rootfs/libcp-d libstdc++.so*/work/rootfs/libcp-d libz.so*/work/rootfs/libcp-d libjpeg.so*/work/rootfs/libcp-d libgcc_s*/work/rootfs/lib#保存退出#第一个cp命令会复制实际的共享库#第二个cp命令会复制符合链接本身#第三个cp命令会复制动态连接器及其符合链接#执行刚编写的shell。
source cp.sh#这样就把链接库复制到/root/rootfs/lib目录下。
#接着我们还要缩小复制过来的链接库的体积,如下:arm-linux-strip-s/root/rootfs/lib/lib*3.4、交叉编译busyboxBosybox是一个遵循GPL v2协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,使用Busybox可以自动生成根文件系统所需的bin、sbin、usr 目录和linuxrc文件。
busybox的源码可以从/downloads/下载,这里我们下载一个1.16.0版本的源码。
我们在配置busybox的时候是基于默认配置之上来配置的;先make defconfig就是把busybox配置成默认,然后再make menuconfig来配置busybox。
说明:我们在配置一个源代码包之前,可以先阅读源码包目录下的README和INSTALL文件以make menuconfig#配置时,我们基于默认配置,再配置它为静态编译,安装时不要/usr路径,指定一个安装路径,#如下:Busybox Settings--->Build Options--->[*]Build BusyBox as a static binary(no shared libs) Installation Options--->[*]Don't use/usr(/root/rootfs)BusyBox installation prefix输入"/root/rootfs",指定安装路径为/root/rootfs#保存退出,编译安装;make&&make install#安装完成后,busybox会在安装目录上安装linuxrc文件,用户可以根据自身需要进行跟换该文件。
3.5、交叉编译bashBash是一个交互程序,其源码可以从ftp:///gnu/bash/下载;步骤如下:cd/root/build_rootfs解压源码;tar zxvf bash-4.0.tar.gzcd bash-4.0export PATH=/usr/local/arm/4.1.2/bin:$PATH(若该环境变量已经设置成功,可以忽略此步骤) ./configure--host=arm-linuxmakearm-linux-strip-s bash编译的结果得到bash程序,将其拷贝到根目录下;cp bash/root/rootfs/bin3.6、建立系统配置文件3.6.1、/root/rootfs/etc/inittab文件首先inittab文件是系统启动后所访问的第一个脚本文件,后续启动的文件都由它指定。
vi/root/rootfs/etc/inittab添加如下内容#first:run the system script file::sysinit:/etc/init.d/rcS#second:run the local script file::once:/etc/rc.local#third run the bash shell prosecc::respawn:/bin/bash#restart init process::restart:/sbin/init#umount all file system::shutdown:/bin/umount-a-r上面的这个inittab文件决定的启动流程是:1执行“/etc/init.d/rcS”脚本;2执行“/etc/rc.local”脚本;3执行“/bin/bash”交互程序,进入交换界面;3.6.2、/root/rootfs/etc/fstab文件该配置文件为目标系统所支持挂载的文件系统类型列表(可参考PC主机上的配置)vi/root/rootfs/etc/fstab添加如下内容#device mount-point type option dump fsck orderproc/proc proc defaults00none/tmp ramfs defaults00sysfs/sys sysfs defaults00mdev/dev ramfs defaults003.6.3、/root/rootfs/etc/init.d/rcS文件该配置文件主要是挂载跟配置文件系统,建立必要的设备文件或其符号连接;mkdir/root/rootfs/etc/init.dvi/root/rootfs/etc/init.d/rcS内容如下:#!/bin/shexport PATH=/sbin:/bin:/usr/sbin:/usr/binecho"----------munt all----------------"mount-a#实现对/etc/fstab文件中各文件系统的挂载echo/sbin/mdev>/proc/sys/kernel/hotplugmdev-s#使用mdev工具对设备进行动态管理MDEVmdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。
其具有使用简单的特点。
它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件mdev的正常使用需要创建/root/rootfs/etc/mdev.conf文件(可以为空文件,但必须存在,在/root/rootfs/etc/下执行“touch mdev.conf”指令可创建),同时MDEV会改写/dev和/sys两个目录,必须保证这两个目录存在且是可写的(一般会用到sysfs,tmpfs。
所以要重新编译内核)。
执行mdev-s:以‘-s’为参数调用位于/sbin目录写的mdev(其实是个链接,作用是传递参数给/bin目录下的busybox程序并调用它),mdev扫描/sys/class和/sys/block中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点文件。
一般只在启动时才执行一次“mdev-s”。
热插拔事件:由于启动时运行了命令:echo/sbin/mdev>/proc/sys/kernel/hotplug,那么当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev。
这时mdev通过环境变量中的ACTION和DEVPATH,(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys中的那个目录。
接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev下创建设备节点文件。
3.6.4、etc/rc.local文件该配置文件主要是配置IP地址;vi/root/rootfs/etc/rc.local内容如下:#!/bin/sh#set ip/sbin/ifconfig lo127.0.0.1up/sbin/ifconfig eth0172.22.60.223netmask255.255.0.0up/sbin/route add default gw172.22.60.1eth03.6.5、在文件系统目录的根路径下添加.bashrc文件文件系统最后启动的是bash交换程序,进入交换界面;bash程序的启动会读取根目录下的.bashrc脚本文件;vi/root/rootfs/.bashrc.bashrc文件参考:#!/bin/bash#set envexport PATH=/bin:/sbin:/usr/binexport LD_LIBRARY_PATH=/lib:/usr/lib/usr/bin/hello&3.7、添加一个用户程序进入工作目录cd/root/build_rootfs/编辑源文件vi hello.c内容如下#include<stdio.h>main(){printf(“welcome to my rootfs\n”);}保存退出;交叉编译arm-linux-gcc hello.c-o hello复制到目标板的根目录mv hello/root/rootfs/usr/bin注意:完成添加上述的配置文件后,需要将其属性修改为可执行,利用chmod指令修改。