• Jffs2根文件系统制作[转]


    Jffs2根文件系统制作

    一.     建立目录

    [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程序都不能运行,原因是他们链接的时候用了动态库。





  • 相关阅读:
    html5游戏开发1Aptana 3 eclipse 插件安装
    HTML5 game Development Summary
    前端开发必备的工具
    前端优化方案
    JavaScript 事件冒泡简介及应用(转)
    标准W3C盒子模型和IE盒子模型CSS布局经典盒子模型(转)
    理解.NET中的异常(二)
    异常处理准则
    C#通讯编程
    C#读写文件总结
  • 原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124721.html
Copyright © 2020-2023  润新知