您的位置:首页 > 运维架构 > Shell

使用busybox-1.15.2制作jffs2文件系统

2009-10-24 22:40 555 查看
使用busybox-1.15.2制作jffs2文件系统

一.编译并生成根文件系统文件
1.解压该包
tar xf busybox-1.15.2.tar.bz2
cd busybox-1.15.2

2.修改Makefile
找到
CROSS_COMPILE ?=
修改为CROSS_COMPILE ?=arm-linux-

找到
ARCH ?= $(SUBARCH)
修改为
ARCH ?= arm

3.进行默认配置
make defconfig

4.对配置信息进行修改
make menuconfig

检查Miscellaneous Utilities--->
    taskset 是否已经去除   (不去除就编译不过的)

同时设置如下:
Busybox Settings --->
        Build Options --->
            [*]Build BusyBox as a static binry (no shared libs)           
        Installation Options --->
            [*]Don't use /usr
             
这几个设置对于之前做过相关工作的人来说是比较熟悉的,都很容易知道为何如此做。
 
#make
#make install
所生成的文件就在当前目录的 _install目录下。
 
二.准备制作jffs2文件系统的所有文件

编译结束后,自己随便找个目录,并在该目录下建立rootfs文件夹
并在其中建立如下路径
1.  #mkdir bin sbin lib etc dev mnt usr/bin usr/sbin usr/lib proc sys -p
2.  把刚才编译busybox生成的在_install目录下的文件全部copy到rootfs/目录下,注意用 cp命令带 –arf 参数

3.加入运行需要的库文件
写了一个脚本,把这个放在/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib/下执行,目的是将一些程序运行时需要的函数库复制到目标文件系统的lib路径下

=========以下是脚本内容===================
#!/bin/bash
#You should put this file cp.sh in $(CROSS-COMPILE)/lib/

ROOTFS_LIB=${PROJECT}/rootfs/rootfs_1.13/lib/

for file in libc libcrypt libdl libm libpthread libresolv libutil
do
cp $file-*.so ${ROOTFS_LIB}
cp -d $file.so.[*0-9] ${ROOTFS_LIB}
done
cp -d ld*.so* ${ROOTFS_LIB}
#end script
=============脚本结束========================

4.在 rootfs/etc/下建立如下文件或者路径
4.1.
vi fstab
内容是:
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
4.2.
vi proflie
内容是:
#!/bin/sh
#You should put this file profile into your $(CONFIG_PREFIX)/etc/
echo "Set seaech library in /etc/profile"
export LD_LIBRARY_PATH=/lib:/usr/lib
echo "Set user path in /etc/profile"
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
alias ll='ls -l'

/sbin/ifconfig eth0 218.192.161.80 netmask 255.255.255.0
/sbin/ifconfig lo 127.0.0.0
echo "Configure net done"
4.3.
mkdir init.d
cd init.d
vi rcS
内容是
#!/bin/sh
/bin/mount –a
/bin/sh  /*这个一定要,不然进不了控制台*/
 
(执行chmod 777 rcS)
 
4.4. 在etc下创建文件inittab,内容如下;
console::sysinit:-/etc/init.d/rcS
 
4.5. 在rootfs/dev下面建立两个节点
#mknod -m 660 console c 5 1
#mknod -m 660 null c 1 3

这样就差不多大功告成了

三. 制作jffs2文件系统
1.       使用mkfs.jffs2
mkfs.jffs2 -r rootfs -o rootfs1.jffs2 -e 0x4000 --pad=0x1000000 -s 0x200 –n
生成的文件rootfs.jffs2就是要烧写的文件系统
注意:--pad=0x1000000 这个值应该跟你文件系统分区的大小一样。
2.       我的linux启动参数 (Boot options):
mem=M root=/dev/mtdblock2 init=linuxrc console=ttySAC0 rootfstype=jffs2

补充说明:
1.在上文第二节的4.2小节中如果rcS缺少了/bin/mount –a那一句,那么启动后,总是出现如下提示
can't open /dev/tty2: No such file or directory
can't open /dev/tty3: No such file or directory
can't open /dev/tty4: No such file or directory

在源码路径下 grep "can't open" * -r
最后发现在init/init.c文件中有问题
经过分析,原因在于如下3句,
694        new_init_action(ASKFIRST,bb_default_login_shell,VC_2);
695        new_init_action(ASKFIRST,bb_default_login_shell,VC_3);
696        new_init_action(ASKFIRST,bb_default_login_shell,VC_4);
这三句会启动三个虚拟终端,如果你觉得你的的板上没这个必要,可以注释掉。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息