zoukankan      html  css  js  c++  java
  • Yaffs2根文件系统制作

    Yaffs2根文件系统制作

     环境:

     交叉编译环境:4.4.6

     开发平台:s3c2416

     

      1,编译busybox

     

         获取busybox源码busybox-1.17.2.tar (http://www.busybox.net/downloads/)

     置于目录/opt/embed下

     #tar jxvf busybox-1.17.2.tar.bz2

     #cd busybox-1.17.2

     #vim Makefile

    将164行改为CROSS_COMPILE = arm-linux- 将190行改为ARCH = arm

     保存推出进入配置菜单

     #make men onfig    采用默认配置保存推出

     #make

     #make install

     在busybox-1.17.2的根目录下出现了一个_install目录在该目录下又有三个目录文件bin sbin usr 和一个链接文件 linuxrc 

     2,创建根文件系统必要的目录

          回到/opt/embed目录下创建根文件系统必要的目录

     #mkdir root_fs

     #cd root_fs

     将刚才生成的三个目录bin sbin usr和一个链接文件linuxrc考到目录root_fs下

    #cp -rf ../busybox-1.17.2/_install/* ./ 

     #mkdir dev etc home lib mnt opt proc root sys tmp var

     创建几个必要的二级目录

    #mkdir usr/lib usr/share

    #mkdir etc/rc.d

     #mkdir var/lib var/lock var/run var/tmp

     3,创建必要文件

     (1), 获取库文件 (我的交叉编译工具链放在目录 /opt/EmbedSky/下的)

     #cp -rf /opt/EmbedSky/4.3.3/arm-none-linux-gn?i/libc/armv4t/lib/*so* lib -a

     (2),将主机 etc 目录下的passwd、group、shadow文件拷贝到 root_fs/etc目录下

     #cp -f /etc/passwd /etc/group /etc/shadow etc

     将目录/opt/embed/busybox-1.17.2/examples/bootfloppy/etc下的所有文件拷贝到

     root_fs/etc下。在这个目录下有三个文件fstab, inittab, profile和一个目录init.d,

     目录init.d中有一个文件rcS。

     #cp -rf ../busybox-1.17.2/examples/bootfloppy/etc/* etc

     在目录etc下创建文件mdev.conf。mdev是?v的一个简化版本,我们可以通过文件mdev.conf自定义一些设备节点的名称或链接来满足特定的需要,但在此处让它为空。

     #to h etc/mdev.conf

     (3)创建两个设备文件dev/console dev/null。

         在linux内核源码文件init/main.c中有打开设备文件dev/console的操作如下:

     static noinline int init_post(void)

     __releases(kernel_lock)

     {

     ………………………………

     if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)

     printk(KERN_WARNING "Warning: unable to open an initial console. ");

     ………………………………

     }

     内核启动执行到这里时mdev还没有构建dev目录,如果没有创建设备文件dev/console就将会打印警告Warning: unable to open an initial console。

          在内核启动的过程中要将产生的一些垃圾信息丢弃就需要空设备dev/null。

     #mknod dev/console c 5 1

     #mknod dev/null c 1 3

     4,几个必要文件的修改

          在启动过程中bootloader会传递参数init=/linuxrc给内核的 main( )函数,所以在文件系统被挂在后,运行的第一个程序是linuxrc,而linuxrc是一个指向/bin/busybox的链接文件,也就是说文件系统被挂在后运行的第一个程序是busybox。Busybox首先会解析文件/etc/inittab,这个文件中存放的是系统的配置信息,这些配置信息指明了接下来将要启动那些程序。

     (1),修改文件etc/inittab如下

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

     tq2440_serial0::askfirst:-/bin/sh

    ::ctrlaltdel:/sbin/reboot

     ::shutdown:/bin/umount -a -r

    /etc/inittab 文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下

    :::

     :表示这个进程要使用的控制台(即标准输入、标准输出、标准错误设备)。如果省略,则使用与init进程一样的控制台。

    :对于Busybox init程序,这个字段滑意义,可以省略。

    :表示init程序如何控制这个子进程,

    : 要执行的程序,它可以是可执行程序,也可以是脚本

     文件etc/inittab配置条目说明如下:

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

     启动系统初始化文件/etc/init.d/rcS。字段sysinit表明文件/etc/init.d/rcS在系统启动后最先执行,并且只执行一次,init进程等待它结束才继续执行其它动作。

     (脚本文件名一般为rc,后缀S代表单用户运行级别脚本)

     tq2440_serial0::askfirst:-/bin/sh

    在串口tq2440_serial0上启动askfirst动作的shell。 S3C2410的串口名在/dev下是s3c2410_serialx。此时还没有移植自己的内核,用天嵌科技的内核所以串口名为 tq2440_serial0。askfirst表明init进程先输出 “Please press Enter to actvie this console”,等用户输入回车键之后才启动-/bin/sh。

     ::ctrlaltdel:/sbin/reboot

          当按下Ctrl+Alt+Delete组合键时,init重启执行程序。字段ctrlaltdel表明当按下Ctrl+Alt+Delete组合键时,执行相应的进程。

     ::shutdown:/bin/umount -a -r

         告诉init在关机时运行umount命令卸载所有的文件系统,如果卸载失败,试图以只读方式重新挂载。字段shutdown表明在重启关闭系统命令时执行相应进程。

     (2),当解析完文件etc/inittab后就将启动这些进程,首先要执行的是启动脚本etc/init.d/rcS。

     

    修改文件etc/init.d/rcS如下:

     #! /bin/sh

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

     runlevel=S

     prevlevel=N

     umask 022

     export PATH runlevel prevlevel

     /bin/hostname cyembed

     echo "----------mount all----------"

     /bin/mount -a

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

     mdev -s

     echo "**************************************"

     echo "**************************************"

     echo "Kernel version:linux-2.6.30.4"

     echo "Date:2010.09.16"

     echo "**************************************"

     说明如下:

     

    #! /bin/sh  用busybox的shell

     PATH=/sbin:/bin:/usr/sbin:/usr/bin  //shell命令的搜索路径

     runlevel=S  //运行在单用户模式

     prevlevel=N //前一个级别为n表示没有前一个级别

     umask 022  //权限位掩码

     export PATH runlevel prevlevel //将设置的变量导出到环境中

     /bin/hostname cyembed //主机名,cyembed将出现在shell提示符中[root@cyembed/]#

     /bin/mount -a  //将文件etc/fstab中指明的文件系统挂载到对应挂载点上

     echo /sbin/mdev>/proc/sys/kernel/hotplug  //用mdev来处理内核的热插拔事件。

    当有热插拔事件产生时, 内核就会调用位于/sbin目录的 mdev。 这时 mdev通过环境变量中的 ACTION 和 DEVPATH, (这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys 中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为 这个设备在/dev 下创建设备节点文件。

     

     

     

    mdev -s //建立dev目录。以‘-s’为参数调用位于/sbin 目录写的 mdev(其实是个链接,作用是传递参数给/bin目录下的busybox 程序并调用它) ,mdev扫描 /sys/class 和/sys /block中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则 mdev 就利用这些信息为这个设备在/dev下创建设备节点文件。一般只在启动时才执行一次  “mdev -s” 。

    (3),修改文件etc/fstab如下:

     #device    mount-point     type      option     dump   fsck   order

    proc          /proc        proc     defaults         

     none          /tmp        ramfs    defaults         

    sysfs         /sys          sysfs    defaults         

     mdev          /dev        ramfs    defaults         

         在系统启动初始化文件/etc/init.d/rcS中有执行挂载命令/bin/mount -a ,这便是

     将文件etc/fstab中指定的文件系统挂载到对应的挂载点上。这些文件系统的挂在是执行

    mdev -s命令建立dev目录的前提。

     (4),在启动脚本etc/init.d/rcS执行完后将在串口tq2440_serial0启动一个shell。Shell启动过程中会根据文件/etc/profile配置登陆环境。

     文件/etc/profile修改如下:

    USER=" 'id -un' " 

     LOGNAME=$USER 

     PS1='[u@h W]#' 

     PATH=$PATH 

     HOSTNAME='/bin/hostname' 

     export USER LOGNAME PS1 PATH

     具体说明:

     USER="id -un"  //获取用户名id-un与whoami命令有相同的功能

    PS1='[u@h W]#'  //PS1指定sh提示符的格式在本环境下将是[root@cyembed /]#

     export USER LOGNAME PS1 PATH 将这些变量导出到环境。

     (5),在用户登录时将在/etc下寻找三个文件passwd ,shadow, group匹配相关信息。

     

    这三个文件修改如下:

     /etc/passwd

     root:x:0:0:root:/root:/bin/bash

     bin:x:1:1:bin:/bin:/sbin/nologin

     daemon:x:2:2:daemon:/sbin:/sbin/nologin

     ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

     nobody:x:99:99:Nobody:/:/sbin/nologin

     

     /etc/group

     root:x:0:root

     bin:x:1:root,bin,daemon

     daemon:x:2:root,bin,daemon

     ftp:x:50:

     nobody:x:99:

     

     /etc/shadow

     root:$6$hnswPTgxzFaZHlLl$WMMV0Av6O6c4RA4pwpVSgcKSiURhUlP5dxF3/MKEZlGzNXhoWMQeZA1rdf1z7VQbrrmOZe7YHw1rIQmAc8BNK/:14819:0:99999:7:::

     bin:*:14715:0:99999:7:::

     daemon:*:14715:0:99999:7:::

     ftp:*:14715:0:99999:7:::

     nobody:*:14715:0:99999:7:::

     5,制作yaffs2根文件系统镜像

          用天嵌科技提供的yaffs2文件系统镜像制作工具mkyaffs2image,制作根文件系统镜像。

     #mkyaffs2image 0 root_fs root_fs.img

  • 相关阅读:
    Linux 下的类似Windows下Everything的搜索工具
    windows和linux环境下制作U盘启动盘
    程序调试手段之gdb, vxworks shell
    LeetCode 1021. Remove Outermost Parentheses (删除最外层的括号)
    LeetCode 1047. Remove All Adjacent Duplicates In String (删除字符串中的所有相邻重复项)
    LeetCode 844. Backspace String Compare (比较含退格的字符串)
    LeetCode 860. Lemonade Change (柠檬水找零)
    LeetCode 1221. Split a String in Balanced Strings (分割平衡字符串)
    LeetCode 1046. Last Stone Weight (最后一块石头的重量 )
    LeetCode 746. Min Cost Climbing Stairs (使用最小花费爬楼梯)
  • 原文地址:https://www.cnblogs.com/songfeixiang/p/3733790.html
Copyright © 2011-2022 走看看