根文件系统熟悉根文件系统构建过程记录

Posted lztutumo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根文件系统熟悉根文件系统构建过程记录相关的知识,希望对你有一定的参考价值。

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

  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

 

  

以上是关于根文件系统熟悉根文件系统构建过程记录的主要内容,如果未能解决你的问题,请参考以下文章

Linux之搭建自己的根文件系统

正点原子I.MX6U-MINI移植篇Ubuntu-base根文件系统移植构建过程详解

正点原子I.MX6U-MINI移植篇Ubuntu-base根文件系统移植构建过程详解

构建根文件系统之根文件系统

根文件系统构建

根文件系统构建(Buildroot 方式)