Jffs2根文件系统制作【转】

时间:2021-01-14 09:02:17

来自:http://blog.csdn.net/qiaoliang328/article/details/4881647

一.     建立目录

[root@qljt1 /]# mkdir /jffs2 /jffs2/rootfs /jffs2/rootfs_build

[root@qljt1 /]# cd /jffs2/rootfs

[root@qljt1 rootfs]# mkdir {bin,dev,etc,usr,lib,sbin,proc,sys,tmp}

[root@qljt1 rootfs]# mkdir  usr/{bin,sbin,lib}

二.     拷贝动态链接库

[root@qljt1 rootfs]#cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib

[root@qljt1 lib]# cp -arfv * /jffs2/rootfs/lib/

三.     编译busybox

把busybox-1.15.2.tar.ba2 放到 /jffs2/rootfs_build目录下,转到该目录

[root@qljt1 rootfs_build]# tar -xjvf busybox-1.15.2.tar.bz2

[root@qljt1 rootfs_build]# cd busybox-1.15.2

[root@qljt1 busybox-1.15.2]# vi Makefile

修改下面两行

ARCH ?= arm

CROSS_COMPILE ?=/usr/local/arm/4.3.2/bin/arm-linux-  (这个视你的交叉编译工具所在路径而定)

[root@qljt1 busybox-1.15.2]# make menuconfig

       Busybox Settings  --->

           Build Options  ---> 

  | +-------------------------------------------------------------------------+ |

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

  | | [ ] Force NOMMU build                                                   | |

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

  | | ()  Cross Compiler prefix                                               | |

  | | ()  Additional CFLAGS

Installation Options  --->

  | | [*] Don't use /usr                                                   |

  | | (./_install) BusyBox installation prefix         (进入这一项)

       填入 /jffs2/rootfs

       这样编译好的busybox,安装以后就会自动保存到 /jffs2/rootfs目录下,不用复制了。

保存退出

[root@qljt1 busybox-1.15.2]# make ;make install

 

四.          编译bash

把bash-3.2.tar.gz 放到 /jffs2/rootfs_build目录下,转到该目录

[root@qljt1 rootfs_build]# tar -xzvf bash-3.2.tar.gz

[root@qljt1 rootfs_build]# cd bash-3.2

[root@qljt1 bash-3.2]# ./configure --host=arm-linux

[root@qljt1 bash-3.2]#make

[root@qljt1 bash-3.2]# arm-linux-strip bash

[root@qljt1 bash-3.2]# cp bash /jffs2/rootfs/bin/

 

五.          建立配置文件

1.       etc/inittab 文件

[root@qljt1 bash-3.2]# cd /jffs2/rootfs

[root@qljt1 rootfs]# vi 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

保存退出

[root@qljt1 rootfs]# chmod 777 etc/inittab

上面的这个inittab文件决定的启动流程是:

    (1) 执行“/etc/init.d/rcS”脚本;

    (2) 执行“/etc/rc.local”脚本;

    (3) 执行“/bin/bash”交互程序,进入交换界面;

2.       etc/init.d/rcS文件

[root@qljt1 rootfs]# mkdir etc/init.d

[root@qljt1 rootfs]# vi etc/init.d/rcS

内容:

#!/bin/sh

 

#mount fs

 

/bin/mount  -t  ramfs  ramfs  /tmp

 

/bin/mount  -t  proc  proc  /proc

 

/bin/mount  -t  sysfs  sysfs  /sys

保存退出

[root@qljt1 rootfs]# chmod 777 etc/init.d/rcS

 

3.       etc/rc.local 文件

内容如下(由于还没有移植网卡驱动,所以暂时全部都注释掉了):

 

#!/bin/sh

# set ip

#/sbin/ifconfig lo 127.0.0.1 up

#/sbin/ifconfig eth0 172.22.60.223 netmask 255.255.0.0 up

#/sbin/route add default gw 172.22.60.1 eth0

保存退出

[root@qljt1 rootfs]# chmod 777 etc/rc.local

4.       .bashrc文件

[root@qljt1 rootfs]# vi .bashrc

#!/bin/bash

# set env

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

export LD_LIBRARY_PATH=/lib:/usr/lib

保存退出

 

5.       添加一个hello world用户程序

[root@qljt1 rootfs]# cd /jffs2/rootfs_build/

[root@qljt1 rootfs_build]# vi hello.c

#include <stdio.h>

int main(void)

{

        printf("hello world!/n");

        return 0;

}

保存退出

[root@qljt1 rootfs_build]# arm-linux-gcc -o hello hello.c

[root@qljt1 rootfs_build]# cp hello /jffs2/rootfs/usr/bin/

 

六.          制作JFFS2根文件系统映像

制作JFFS2根文件系统需要用到MTD工具,其下载地址是:

ftp://ftp.infradead.org/pub/mtd-utils/mtd-utils-1.0.0.tar.gz

编译后会生成mkfs.jffs2 ,mkfs.jffs2复制到 /sbin目录下。然后:

[root@qljt1 rootfs]# cd /jffs2

[root@qljt1 jffs2]# mkfs.jffs2  -r  rootfs  -o  rootfs.jffs2  -p  -l  -n  -e  0x4000

[root@qljt1 jffs2]# ls

rootfs  rootfs_build  rootfs.jffs2

rootfs.jffs2就是可用的jffs2根文件系统镜像。

-r 指定内含根文件系统的目录

-o 指定文件系统映象的输出文件名称

-p  表示在映像的结尾用0x0补全到block

-l  存储格式为小端格式

-n 每个擦除的block中不添加clreanmarker

-e 擦除block的大小

 

Uboot下设置传递给内核的命令行参数:

setenv bootargs root=/dev/mtdblock2 init=/sbin/init console=ttySAC0,115200 rootfstype=jffs2

 

七.          下载运行

VFS: Mounted root (jffs2 filesystem) on device 31:2.

Freeing init memory: 120K

Warning: unable to open an initial console. 到这里停止,不能进控制台,修改如下:

[root@qljt1 jffs2]# cd /jffs2/rootfs/dev/

[root@qljt1 dev]# mknod -m 660 console c 5 1

[root@qljt1 dev]# mknod -m 660 null c 3 0

[root@qljt1 dev]# cd /jffs2

重新生成 rootfs.jffs2 下载运行。

 

VFS: Mounted root (jffs2 filesystem) on device 31:2.

Freeing init memory: 120K到这里停止,不能进控制台,估计是bash暂时没有启动,修改如下:

[root@qljt1 jffs2]# cd /jffs2/rootfs/etc/init.d/

[root@qljt1 init.d]# vi rcS

加上如下内容:

/bin/sh

保存退出,重新生成 rootfs.jffs2 下载运行。

drivers/rtc/hctosys.c: unable to open rtc device (rtc0)

VFS: Mounted root (jffs2 filesystem) on device 31:2.

Freeing init memory: 120K

/bin/sh: can't access tty; job control turned off

#

虽然还有小小错误,以后慢慢再改,但总算能够出控制台了。

 

但是hello和bash程序都不能运行,原因是他们链接的时候用了动态库。