zoukankan      html  css  js  c++  java
  • 根文件系统熟悉(一)根文件系统构建过程记录

    根文件系统制作过程大致分为两步:

      1)用busybox构建基本的框架

      2)添加必要目录及文件,比如etc目录及目录中的配置文件

    内核挂载根文件系统到进入命令行的过程:

      1)内核找到根文件系统路径后,首先加载运行init参数指定的进程1,如init=/linuxrc,运行根文件系统中的/linuxrc,使得内核转到用户态;

      2)然后linuxrc会解析/etc/inittab文件,inittab文件中是一些条目,这些条目指明了在某种状态下会执行哪些操作,比如一个简单的inttab文件如下,其中sysinit指明系统启动或重新启动时会执行脚本文件/etc/init.d/rcS文件、shutdown指明系统关机时会卸载之前挂载的文件系统

    inittab文件

    #first:run the system script file

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

    ::askfirst:-/bin/sh -->打印Please press Enter to activate this console.

    ::ctrlaltdel:-/sbin/reboot

    #umount all filesystem

    /* 在关机的时候,执行/bin/umount -a -r 也就是关机之前卸载之前挂载的文件系统 */

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

    #restart init process

    ::restart:/sbin/init

      3)linuxrc解析完inittab文件后,会执行sysinit指定的操作,即执行脚本文件/etc/init.d/rcS,如下是一个rcS文件,这个rcS文件大致做的工作是:导出几个环境变量、挂载/etc/fstab文件中所列出的文件系统、获取用户登入名,设置网口ip地址等;

    /etc/init.d/rcS文件

    #!/bin/sh

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

    runlevel=S

    prevlevel=N

    umask 022

    //导出环境变量

    export PATH runlevel prevlevel

    //挂载/etc/fstab文件中所列出的文件系统

    mount -a

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

    mdev -s

    // /etc/sysconfig/HOSTNAME文件中保存了用户登入名

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

    ifconfig eth0 192.168.1.10
    /etc/fstab文件,这个文件指明将具体文件系统挂载在哪个目录下,这些挂载目录需要我们手动创建

    #       <file system>   <mount point>   <type>  <options>       <dump>  <pass>

            proc                   /proc                 proc       defaults           0             0

            sysfs                  /sys                   sysfs      defaults           0             0

            tmpfs                 /var                   tmpfs     defaults           0             0

            tmpfs                 /tmp                  tmpfs     defaults           0             0

            tmpfs                 /dev                   tmpfs    defaults            0             0

    4)登入用户名密码设置

      linuxrc执行完/etc/init.d/rcS脚本文件后,就会去执行inittab文件中respwan和askfirst字段指定的操作,如上inittab文件中askfirst指定的操作是执行/bin/sh(::askfirst:-/bin/sh),这个程序是跳过用户登入步骤,直接进入命令行,因此需要修改/bin/sh为/bin/login或者/sbin/gettty;然后添加/etc/passwd和/etc/shadow,这两个文件可以直接从ubuntu拷贝,在开发板启动后,通过passwd root去修改登入密码;

    5)拷贝用户空间应用程序运行时所需的动态库文件到lib目录下,这些文件在交叉编译工具链目录下/usr/local/arm-2009q3/arm-none-linux-gnueabi/libc/lib。

      至此,一个简单的根文件系统构建完成,可以被内核挂载并启动进入命令行。

    根据挂载根文件系统时的执行过程,大概清楚构建根文件系统大概需要做如下工作:

      1)我们需要用busybox构建出根文件系统的原始模板,内核可以挂载这个原始模板,并运行/linuxrc程序;

      2)创建/etc/inittab文件、/etc/init.d/rcS文件;

      3)创建用户登入所需文件/etc/passwd和/etc/shadow;

      4)创建文件系统挂载目录/proc、/sys、/var、/tmp、/dev;

      5)创建lib目录,从交叉编译工具链目录/usr/local/arm-2009q3/arm-none-linux-gnueabi/libc/lib拷贝动态库文件到lib目录下

    一、用busybox构建根文件系统的原始模板

      具体过程参考https://blog.csdn.net/Jason_416/article/details/105802347博客

      1、需要选择上静态编译,不然内核运行/linuxrc时会报错。

      2、编译busybox

        Make -j4

        如下,busybox编译成功

      3、将编译好的busybox安装到指定的目录(根文件系统目录)

        Make install

        安装后,安装目录内容如下

      4、将busybos的安装目录添加到/etc/exports文件中,以使得开发板内核启动时可以通过nfs挂载这个根文件系统

        添加完后,重启nfs

        /etc/init.d/nfs-kernel-server restart

      5、配置uboot的bootargs,使得kernel启动时到上述安装目录挂载根文件系统

        启动后,效果如下

        出现上述错误,是由于根目录下还没有创建一些必要的文件

      6、在根文件目录下添加必要的目录和文件

        1)创建并完善etc目录

          添加/etc/inittab文件

    #first:run the system script file

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

    #::askfirst:-/bin/sh

    #ttySAC2::sysinit:/bin/login

    ttySAC2::respawn:/sbin/getty -L ttySAC2 115200 vt100

    ::ctrlaltdel:-/sbin/reboot

    #umount all filesystem

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

    #restart init process

    ::restart:/sbin/init

          添加/etc/fstab文件

    #       <file system>   <mount point>   <type>  <options>       <dump>  <pass>

            proc            /proc           proc    defaults        0       0

            sysfs           /sys            sysfs   defaults        0       0

            tmpfs           /var            tmpfs   defaults        0       0

            tmpfs           /tmp            tmpfs   defaults        0       0

            tmpfs           /dev            tmpfs   defaults        0       0

          创建/etc/init.d目录并添加/etc/init.d/rcS文件

    #!/bin/sh

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

    runlevel=S

    prevlevel=N

    umask 022

    export PATH runlevel prevlevel

    mount -a

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

    mdev -s

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

          添加用户名密码相关文件/etc/sysconfig/HOSTNAME,文件中保存用户登入名

          /etc/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='[$USER@$HOSTNAME]# '

    PATH=$PATH

    HOSTNAME=`/bin/hostname`

    export USER LOGNAME PS1 PATH

          /etc/ passwd文件

    root:x:0:0:root:/root:/bin/sh

          /etc/shadow文件

    root:N06xh3ETHkhFE:10957:0:99999:7:::   //加密的密码,明文密码是123456

        2)创建目录/proc、/sys、/var、/tmp、/dev、/lib

        3)从交叉编译工具链拷贝库文件到/lib目录,如下

      至此,可以登入进入命令行


      本文仅是本人在熟悉根文件系统框架过程中的记录,分析总结出来以便自己更好的理解,大家勿喷哈。参考了网上的博客没有一一列出。如有侵权,请联系删除。

    参考博客:

       https://blog.csdn.net/Jason_416/article/details/105802347

      朱有鹏老师视频:http://t.elecfans.com/topic/8.html

      

  • 相关阅读:
    Eclipse出错
    每天学点MVC 【ExecuteStoreCommand SqlParameterCollection 中已包含 SqlParameter】
    ORA12541: TNS: 无监听程序 每天学点Oracle
    每天学点Oracle10gplSql命令
    Access中Sql语句如何运行问题
    如何网络赚钱
    每天学点Oracle10g客户端配置
    存储过程(工作随笔)审核退单
    存储过程(工作随笔)慢性病
    存储过程(工作随笔) 住院情况分析
  • 原文地址:https://www.cnblogs.com/lztutumo/p/13336364.html
Copyright © 2011-2022 走看看