使用busybox制作linux根文件系统

时间:2022-06-16 09:00:58

内核版本:

Linux-2.6.34.10

交叉编译器版本:

arm-linux-gcc  3.4.1

操作系统平台:

Linux   Fedora 12

开发板平台:

飞凌  OKIII2440

使用的工具:

Busybox-1.15.2.tar.bz2

使用busybox定制一个很小的文件系统。

 

步骤为:

一、       准备制作

建立根目录,该目录就要我们要移植到目标板上的目录,对于嵌入式的文件系统,根目录下必要的目录包括bin,dev,etc,usr,lib,sbin。

cd /home/rock/rootfs

cd rootfs

用shell脚本创建根文件系统的目录结构

首先 touch build_fs.sh

然后进行编辑,用vim,键入以下内容:

#!/bin/sh

echo "------Create rootfsdirectons......"

mkdir rootfs

cd rootfs

echo "--------Createroot,dev......"

mkdir root dev etc bin sbin mnt sys proclib home tmp var usr

mkdir usr/sbin usr/bin usr/lib usr/modules

mkdir mnt/usb mnt/nfs mnt/etcmnt/etc/init.d

mkdir lib/modules

chmod 1777 tmp

cd ..

echo "-------make directiondone---------"

二、       编译busybox

把Busybox-1.15.2.tar.bz2拷贝到home/rock/

下载解压

BusyBox下载地址:http://www.busybox.net/

lingd@ubuntu:~/arm2410s$ tar xjvfbusy-1.15.2.tar.bz2

lingd@ubuntu:~/arm2410s$ cd busybox-1.15.2

lingd@ubuntu:~/arm2410s/busybox-1.15.2$ viMakefile

首先修改 Makefile ,将以下两项改为

CROSS_COMPILE = arm-linux-

ARCH     = arm

配置busybox,修改以下选项(其他选项默认就可以了,或者根据需要再裁减一下):

lingd@ubuntu:~/arm2410s/busybox-1.15.2$make menuconfig

Busybox Settings  --->

Build Options  --->

    [*] Build BusyBox as a static binary (no shared libs)

    [ ] Build with Large File Support (for accessing files > 2 GB)

Installation Options  --->

    [*] Don't use /usr        #这项必选选上,否则BusyBox默认安装路径是/usr,原/usr下的东西可能会被覆盖了

       Applets links (as soft-links) --->

    (./_install) BusyBox installation prefix

Busybox Library Tuning  --->

    [*] Command line editing

    (1024) Maximum length of input                

    [*]   vi-style line editingcommands            

    (15)  History size                 

    [*]   History saving                                   

    [*]   Tab completion                                   

    [*]     Username completion                            

    [*]   Fancy shell prompts

这两项必须选上,不然BusyBox将无法识别环境变量PS1里的参数。

Linux Module Utilities  --->

    [*] insmod                                                       

    [*]   Enable load map (-m)option                                

    [*]     Symbols in load map                                       

    [*] rmmod                                                        

    [*] lsmod                                           

    [*]   Pretty output for 2.6.xLinux kernels                   

    [*] modprobe

    [ ]   Multiple optionsparsing                                

    [ ]   Fancy alias parsing                                         

    [ ]   Blacklist support                                      

    ---   Options common to multiplemodutils                 

    [ ] Support tainted module checking with new kernels          

    [ ] Support version 2.2.x to 2.4.x Linux kernels             

    [*] Support version 2.6.x Linux kernels                

    (/lib/modules) Default directory containing modules           

    (modules.dep) Default name of modules.dep

保存退出 Busybox

lingd@ubuntu:~/arm2410s/busybox-1.15.2$make

lingd@ubuntu:~/arm2410s/busybox-1.15.2$make install

编译BusyBox时,可能会出现以下错误:

1.       inotifyd出错

交叉编译busybox-1.15.2时,出现以下错误:

CC     miscutils/inotifyd.o

miscutils/inotifyd.c:31:27:linux/inotify.h: No such file or directory

miscutils/inotifyd.c: In function`inotifyd_main':

miscutils/inotifyd.c:61: error:`IN_ALL_EVENTS' undeclared (first use in this function)

miscutils/inotifyd.c:61: error: (Eachundeclared identifier is reported only once

miscutils/inotifyd.c:61: error: for eachfunction it appears in.)

miscutils/inotifyd.c:129: error:dereferencing pointer to incomplete type

miscutils/inotifyd.c:139: error:dereferencing pointer to incomplete type

miscutils/inotifyd.c:140: error:dereferencing pointer to incomplete type

miscutils/inotifyd.c:140: error:dereferencing pointer to incomplete type

miscutils/inotifyd.c:143: error: invalidapplication of `sizeof' to incomplete type `inotify_event'

miscutils/inotifyd.c:143: error:dereferencing pointer to incomplete type

make[1]: *** [miscutils/inotifyd.o] Error 1

make: *** [miscutils] Error 2

网上说这是busybox的一个bug,解决方法:去掉对inotifyed的支持,具体步骤如下:

# make menuconfig

Miscellaneous Utilities  --->

    []inotifyd

还有另一个bug是taskset,也要将它去掉,不然编译时又会出错。

Miscellaneous Utilities  --->

    []taskset   

2.       未定义ARPHRD_INFINIBAND

错误信息如下:

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

make[1]: *** [networking/interface.o] Error1

make: *** [networking] Error 2

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

#define ARPHRD_INFINIBAND 32  /* InfiniBand */

make ARCH=arm CROSS_COMPIL=arm-linux- CONFIG_PREFIX=/home/rock/rootfsall install

3.       mkfs_vfat.o错误

错误信息

In file included fromutil-linux/mkfs_vfat.c:13:

/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/fd.h:342:error: variable or field `__user' declared void

/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/fd.h:342:error: parse error before '*' token

/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/fd.h:360:error: parse error before '}' token

make[1]: *** [util-linux/mkfs_vfat.o] 错误 1

make: *** [util-linux] 错误 2

解决办法

修改/usr/local/arm/3.4.1/arm-linux/sys-include/linux中fd.h

添加#include <linux/compiler.h> 

 

三、       制作文件系统

在dev目录下,创建两个设备节点:

#mknod console  c  5  1

#mknod null  c  1  3

进入etc  目录,添加文件:

1.       拷贝Busybox-1.15.2/examples/bootfloopy/etc/*  到当前目录下。

  #cp  -r ../../busybox-1.15.2/examples/bootfloopy/etc/*  ./

包括的文件:fstab、init.d、inittab、profile

2.       拷贝/etc/passwd、/etc/group、/etc/shadow到当前目录下。

# cp /etc/passwd  ./

# cp /etc/group  ./

# cp /etc/shadow  ./

  把passwd文件中的第一行:root:x:0:0:root:/root:/bin/bash中的/bin/bash,改成/bin/ash,因为文件

系统的bin目录下没有bash这个命令,而是用ash代替bash,所以在用用户名密码登录的时候(如

telnet),会出现“cannot run/bin/bash: No such fileor directory”的错误。

3.       修改inittab文件:

  内容如下:

console::sysinit:/etc/init.d/rcS

ttyS0::respawn:-/bin/sh

s3c2410_serial0::askfirst:-/bin/sh

::once:/usr/sbin/telnetd  -l /bin/login

::ctrlaltdel:/bin/umount  -a  -r

4.       修改fstab文件,内容如下:

proc   /proc    proc    defaults   0    0

tmpfs  /tmp     tmpfs   defaults   0    0

sysfs   /sys     sysfs    defaults   0    0

tmpfs   /dev    tmpfs    defaults   0    0

var     /dev    tmpfs    defaults   0    0

5.       修改init.d/rcS文件,内容如下:

#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin

runlevel=S

prevlevel=N

umask 022

export PATH  runlevel  prevlevel

mount -a

mkdir /dev/pts

mount -t  devpts  devpts /dev/pts

#echo /sbin/mdev  >  /proc/sys/kernel/hotplug

mdev -s

mkdir -p  /var/lock

/bin/hostname  -F /etc/sysconfig/HOSTNAME

ifconfig eth0 192.168.0.15 up

/sbin/telnetd

6.       修改profile文件,内容如下:

# Ash profile

# vim: syntax=sh

# No core  files  by default

#ulimit -S  -c  0 >  /dev/null  2>&1

USER="`id  -un`"

LOGNAME=$USER

PS1='[\u@\h \W]# '

PATH=$PATH

HOSTNAME=`/bin/hostname`

echo " Processing  /etc/profile..."

echo "Done"

export USER  LOGNAME  PS1 PATH

7.       新建sysconfig文件夹,在里面新建HOSTNAME文件,内容为:OK2440

8.       拷贝库文件:

进入lib目录,拷贝交叉编译器的库文件到lib目录下

写一个cp.sh脚本

#!/bin/sh

cd /usr/local/arm/3.4.1/arm-linux/lib

for file in libc libcrypt libdl libmlibpthread libresolv libutil

do

cp $file-*.so /home/rock/rootfs/lib/

cp -d $file.so.[*0-9] /home/rock/rootfs/lib/

done

cp -d ld*.so* /home/rock/rootfs/lib/

由于交叉编译器的库文件比较多,体积较大,所以需要裁剪一下库文件,只保留常用的库文

件。

arm-linux-strip -s /home/rock/rootfs/lib/lib*

四、       制作调试工具strace

使用strace可以跟踪程序执行时系统调用的相关信息,因此它是一个功能非常强大的调试和分析诊断工具。由于Linux系统中并没有包含程序,所以需要自己移植,整个移植过程非常简单。

1. 从SourceForge上下载strace的代码,http://sourceforge.net/projects/strace/

2. 解压 tar xvjf strace-4.5.20.tar.bz2

3. 配置 ./configure --host=arm-linux CC=arm-linux-gcc LD=arm-linux-ld

4. 编译,直接敲make即可,不用选择“-static”链接选项

5. strip,arm-linux-strip./strace

6.最后使用 file ./strace查看编译结果,编译好的strace程序只有200多K。

最后将strace拷贝到/home/rock/rootfs/usr/sbin目录下,即可使用。

五、       制作文件系统镜像

找一个mkyaffs2image工具

cd  /home/rock

./mkyaffs2image rootfs/ rootfs.yaffs