用busybox制作文件系统

来源:互联网 发布:mysql source 路径 编辑:程序博客网 时间:2024/04/30 00:10

宿主机:Fedora13
目标机:s3c2440
交叉编译器:arm-linux-gcc-3.4.1
交叉编译器路径:/usr/local/arm/3.4.1

busybox版本:1.17.2

一、准备工作

1、配置交叉编译环境

从http://www.handhelds.org/download/projects/toolchain/下 载arm-linux-gcc-3.4.1.tar.bz2

解压:

将交叉编译工具装到/usr/local下

2、从http://www.busybox.net/downloads/下载最新的busybox1.17.2版本

二、配置

1、修改Makefile

进入busybox的解压目录,

vim Makefile,将

ARCH ?= $(SUBARCH) 改为

ARCH ?= arm

CROSS_COMPILE ?=改为

CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-(根据你自己的路径定义)

2、配置busybox的相关工具

执行 make menuconfig,进入配置菜

[cpp] view plaincopyprint?
  1. Busybox Settings ---> 
  2.      Build Options ---> 
  3.           [*] Build BusyBox as a static binary (no shared libs)//这里编译为静态库 
  4.           [ ] Build with Large File Support //这里要去掉这一项 
  5.           () Cross Compiler perfix //设置交叉编译器路径 
  6.      Installation Options ---> 
  7.           [*] Don't use /usr //不安装到系统的usr目录下,以解压目录下的_install来代替 
  8. Linux System Utilities ---> 
  9.      [ ] mkfs_ext2 
  10.      [ ] mkfs_vfat  //这两项不选,否则编译会报错 
  11. 别的选项工具自己需要进行选择 
  12. Miscellaneous Utilities ---> 
  13.      [ ] ionice //去掉,否则编译报错 
  14. 其他选项根据个人需要 
  15. Networking Utilities ---> 
  16.      可以去除一些不必要的选项 

3、编译

下面进行编译:make ARCH=arm CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-linux-

这里,我们会发现出错了,错误信息如下:

networking/interface.c:807: error: `ARPHRD_INFINIBAND' undeclared here (not in a function)

通过查看内核源代码目录中的“include/linux/ifarp.h”文件可得知“ARPHRDINFINIBAND”的值为“32”,然后 修改“networking/interface.c”文件,在其中添加:

#define ARPHRD_INFINIBAND 32 /* InfiniBand */

继续编译,发现还是有错误:

networking/libiproute/ipaddress.c:167: error: `IFLA_OPERSTATE' undeclared (first use in this function)

这个错误其实是busybox的一个bug,一直未解决,我们对代码做如下修改:

networking/libiproute/ipaddress.c

[cpp] view plaincopyprint?
  1.       
  2. 164 164                 printf("master %s ", ll_idx_n2a(*(int*)RTA_DATA(tb[IFLA_MASTER]), b1));  
  3. 165 165         }  
  4. 166 166 #endif  
  5.     167 #ifdef IFLA_OPERSTATE  
  6. 167 168         if (tb[IFLA_OPERSTATE]) {  
  7. 168 169                 staticconst char operstate_labels[] ALIGN1 =  
  8. 169 170                         "UNKNOWN/0""NOTPRESENT/0""DOWN/0""LOWERLAYERDOWN/0"  
  9. …   …     
  10. 171 172                 printf("state %s ", nth_string(operstate_labels,  
  11. 172 173                                         *(uint8_t *)RTA_DATA(tb[IFLA_OPERSTATE])));  
  12. 173 174         }  
  13.     175 #endif  
  14. 174 176         if (G_filter.showqueue)  
  15. 175 177                 print_queuelen((char*)RTA_DATA(tb[IFLA_IFNAME]));  
  16. 176 178   

networking/libiproute/iplink.c

[cpp] view plaincopyprint?
  1.   274   274         return ipaddr_list_or_flush(argv, 0);  
  2.   275   275 }  
  3.   276   276   
  4.     277 #ifdef IFLA_LINKINFO  
  5.   277   278 #ifndef NLMSG_TAIL  
  6.   278   279 #define NLMSG_TAIL(nmsg) /  
  7.   279   280         ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))  
  8.   …     …     
  9.   360   361                 return 2;  
  10.   361   362         return 0;  
  11.   362   363 }  
  12.     364 #endif  
  13.   363   365   
  14.   364   366 /* Return value becomes exitcode. It's okay to not return at all */  
  15.   365   367 int do_iplink(char **argv)  
  16.   366   368 {  
  17.   367   369         static constchar keywords[] ALIGN1 =  
  18.     370 #ifdef IFLA_LINKINFO  
  19.   368   371                 "add/0""delete/0""set/0""show/0""lst/0""list/0";  
  20.     372 #else  
  21.     373                 "set/0""show/0""lst/0""list/0";  
  22.     374 #endif  
  23.   369   375         if (*argv) {  
  24.   370   376                 smalluint key = index_in_substrings(keywords, *argv);  
  25.   371   377                 if (key > 5)/* invalid argument */  
  26.   372   378                         bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name);  
  27.   373   379                 argv++;  
  28.     380 #ifdef IFLA_LINKINFO  
  29.   374   381                 if (key <= 1)/* add/delete */  
  30.   375   382                         return do_change(argv, key ? RTM_DELLINK : RTM_NEWLINK);  
  31.   376   383                 else if (key == 2) /* set */  
  32.     384 #else  
  33.     385                 if (key == 0)/* set */  
  34.     386 #endif  
  35.   377   387                         return do_set(argv);  
  36.   378   388         }  
  37.   379   389         /* show, lst, list */  

完成后继续编译

执行 make install,终于在_install文件夹下生成了工具包

4、制作文件系统

可以先创建一个工作目录,如myroot,在工作目录下 创建以下目录:bin sbin dev etc lib home root usr var proc mnt tmp sys

执行 mkdirbin sbin dev etc lib home root usr var proc mnt tmp sys

etc下面要写两个文件fstab inittab和一个文件夹init.d

(a) fstab的内容是:

[cpp] view plaincopyprint?
  1. proc /proc proc defaults 0 0 
  2. tmpfs /tmp tmpfs defaults 0 0 
  3. sysfs /sys sysfs defaults 0 0 
  4. tmpfs /dev tmpfs defaults 0 0 

(b) fstab文件的作用

文 件/etc/fstab存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过"mount /directoryname"命令来加载一个文 件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时fsckmountumount的等命令都利用该程序。

inittab的内容是:

[cpp] view plaincopyprint?
  1. #/etc/inittab 
  2. ::sysinit:/etc/init.d/rcS 
  3. ::askfirst:-/bin/sh  
  4. ::ctrlaltdel:/sbin/reboot 
  5. ::shutdown:/bin/umount -a -r 

(c) init.d/rcS文件的内容:

[cpp] view plaincopyprint?
  1. #!/bin/sh 
  2. ifconfig eth0 192.168.1.17 
  3. mount -t tmpfs mdev /dev 
  4. mkdir /dev/pts 
  5. mount -t devpts devpts /dev/pts 
  6. mount -t sysfs sysfs /sys 
  7. mount -a 
  8. echo /sbin/mdev > /proc/sys/kernel/hotplug 
  9. mdev –s 
  10. echo leohui1988_busybox 

(d)在/dev下建立设备节点:Console   null

[cpp] view plaincopyprint?
  1. mknod dev/console c 5 1 
  2. mknod dev/null c 1 3 

(e)将编译busybox生成的/bin和/sbin下的工具拷贝到myroot下的/bin和/sbin下

(f)使用mkyaffs2image制作yaffs文件系统镜像

./mkyaffs2image myroot rootfs.yaffs

将yaffs烧写至开发板,可在终端下看到leohui1988_busybox的输出,最基本的文件系统制作成功!

注意:

如果使用静态编译,那么后面我们移植到开发板的程序也必须静态编译,这样的话就比较占存储空间,为此可以将busybox进行动态编译,使用共享链接库来减小体积,同时也方便后面程序进行编译和移植。

动态编译步骤与以上类似,只是把 [ ] Build BusyBox as a static binary (no shared libs)这一项替换掉。其余步骤一样,完成后将bin和sbin拷贝到文件系统的bin,sbin下,然后将linuxrc这个链接文件也拷入文件系统根目录下,最初我没放linuxrc这个链接文件时,启动显示init错误。之后再将arm-linux交叉编译工具的lib(我的路径是/usr/local/arm/3.4.1/arm-linux/lib)库拷贝到文件系统lib下。制作成镜像烧写至flash,启动成功!

原创粉丝点击