内核移植和文件系统制作(1):根文件系统制作总结

时间:2022-02-23 09:06:29

因为根文件系统制作是按照别人制作,这里不重复制作过程,只说明其中目录:

推荐一篇友善之臂根根文件系统分析,本人也参考,真心感谢,很详细:

http://www.arm9home.net/read.php?tid-1702.html


1)存在二进制文件:/bin,/sbin,/usr/bin,/usr/sbin 。二进制文件要放在其中哪个目录,这与它在系统中所扮演的角色有很大的关系。如用户和系统管理员必备的二进制文件,就会放在 /bin ;如系统管理员必备、但是一般用户根本不会用到的二进制文件,就会放在 /sbin ;相对而言,如果不是用户必备的二进制文件或者自己制作的文件,则放在 /usr/bin ;如果不是系统管理员必备的工具,多半会放在 /usr/sbin 。
2)存在库文件:/lib, /usr/lib。 系统引导以及执行最基本命令需要的链接库摆在 /lib ;所有其他的链接库则会摆在 /usr/lib 。通常,套件安装时,会在/usr/lib 中产生子目录,以便摆放它自己的链接库。

3)存放配置文件:/etc。启动存放系统启动一些脚本文件。当linux系统启动时候,第一个启动是init进程,首先读取的文件/etc/inittab,根据启动其中的命令行执行,挂载/etc/fstab文件指定项目,之后执行init.d中初始化脚本,初始化网卡等。

下面给出文件/etc/inittab和注释(红色为我写的注释,黑色为内容)

# /etc/inittab 
#
# Copyright (C) 2014 zhouguangfeg<zhouguangfeng@gmail.com>
#
# Note: BusyBox init doesn't support runlevels.  The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id        == tty to run on, or empty for /dev/console. 
#              If specified, then /dev/$id device must exist
# runlevels == ignored, busybox doesn't support it
# action    == one of sysinit, respawn, askfirst, wait, and once
# process   == program to run

# Startup the system
# mount all the file systems specified in /etc/fstab 
::sysinit:/bin/mount -a      

挂载/etc/fstab挂载虚拟文件系统,/proc, /sys,并且在/dev目录上挂载一个ramfs,相当于把原本NAND Flash上的只读的/dev目录覆盖上一块可写的空的SDRAM。这里要注意的是/sys和挂载了ramfs/dev是正确创建设备节点的关键


#Use mdev as hotplug to auto mount USB storage or SD card 
::sysinit:/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug

内核响应热插的设备,如u盘,sd卡。并且将响应权限交给mdev进程,"echo /sbin/mdev > /proc/sys/kernel/hotplug”,之后kernel会在每次设备出现变动时调用上面一句传递进去的用户空间应用程序/sbin/mdev来处理对应的信息,进而mdev应用程序操作/dev目录下的设备,进行添加或删除。


#Use mdev to auto generate the device node in /dev path
::sysinit:/sbin/mdev -s

读取文件系统里/etc/mdev.conf文件,如果不存在,则会按默认配置。在busybox中init/init.c有声明

static void parse_inittab(void)
{
#if ENABLE_FEATURE_USE_INITTAB
    char *token[4];
    parser_t *parser = config_open2("/etc/inittab", fopen_for_read);

    if (parser == NULL)
#endif
    {
        /* No inittab file - set up some default behavior */
        /* Reboot on Ctrl-Alt-Del */
        new_init_action(CTRLALTDEL, "reboot", "");
        /* Umount all filesystems on halt/reboot */
        new_init_action(SHUTDOWN, "umount -a -r", "");
        /* Swapoff on halt/reboot */
        if (ENABLE_SWAPONOFF)
            new_init_action(SHUTDOWN, "swapoff -a", "");
        /* Prepare to restart init when a QUIT is received */
        new_init_action(RESTART, "init", "");
        /* Askfirst shell on tty1-4 */

   new_init_action(ASKFIRST, bb_default_login_shell, "");

//TODO: VC_1 instead of ""? "" is console -> ctty problems -> angry users
        new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
        new_init_action(ASKFIRST, bb_default_login_shell, VC_3);
        new_init_action(ASKFIRST, bb_default_login_shell, VC_4);
        /* sysinit */
        new_init_action(SYSINIT, INIT_SCRIPT, "");
        return;
    }

 其中new_init_action(SYSINIT, INIT_SCRIPT, "")最重要,初始化脚本。

#make shm, pts support
::sysinit:/bin/mkdir -p /dev/pts
::sysinit:/bin/mkdir -p /dev/shm
::sysinit:/bin/mount -t devpts devpts /dev/pts

#Mount our apps/info partition
null::wait:/bin/mount -o sync,noatime,ro -t jffs2 /dev/mtdblock6 /apps
null::wait:/bin/mount -o sync,noatime,ro -t jffs2 /dev/mtdblock7 /info

挂载自我创建的两个分区,只读


#'ctrl+alt+detele' to reboot
::ctrlaltdel:/sbin/reboot
设置reboot为 'ctrl+alt+detele' 

#Set hostname 
null::sysinit:/bin/hostname -F /etc/hostname
设置机器名,会读取/etc/hostname


#Enable console logon
null::respawn:/sbin/getty -L ttyS0 115200 vt100

用来开启终端,进行终端的初始化,设置终端。参考:http://blog.sina.com.cn/s/blog_4c4fcd6601016jmh.html


# now run any rc scripts
null::wait:/etc/init.d/rcS

初始化脚本,自我编写在,初始化一些设备.

脚本内容:

#!/bin/sh

for i in /etc/init.d/S??* ; do
                $i
done

这里会执行所有/etc/S??*,就是以S开头文件,似乎“??”表示两个数字吧?有兴趣自己动动手。。。我的目录如下

>: ls

S01_network   S04_dropbear  S99_rcsApp    rcS
>:


# system daemon
null::respawn:/sbin/syslogd -n
null::respawn:/sbin/klogd -n
用于记录内核和应用程序debug信息

# Stuff to do before rebooting
null::shutdown:/bin/umount /apps
null::shutdown:/bin/umount /info
null::shutdown:/bin/killall klogd
null::shutdown:/bin/killall syslogd
null::shutdown:/bin/umount -a -r

关机之前,卸载工作和关闭打开进程


Action类型 描述
sysinit provide init with the path to the initialization script
respawn 程序终止后重新执行
askfirst 同respawn,程序执行前会询问,要求按ENTER建
wait init等待执行的程序后再继续执行
once 只运行程序一次,并且不等待程序运行完就继续执行
ctrlaltdel 当按下Ctrl-Alt-Delete组合键时执行的程序
shutdown 系统关机时执行的程序
restart 系统重新启动时执行的程序,通常是init程序

/etc/inittab命令行为: id:runlevel:action:process 具体参照链接http://blog.csdn.net/lgfeng218/article/details/6818418


3)存储设备文件:/dev。该目录下存放的是设备与设备接口的文件,设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。其中有两个最为重要的字符设备文件/dev/console, /dev/ttyS0,/dev/null。

如,创建设备节点格式:NAME
       mknod - make block or character special files

SYNOPSIS
       mknod [OPTION]... NAME TYPE [MAJOR MINOR]

DESCRIPTION
       Create the special file NAME of the given TYPE.

       Mandatory arguments to long options are mandatory for short options too.

       -m, --mode=MODE
              set file permission bits to MODE, not a=rw - umask

       -Z, --context=CTX
              set the SELinux security context of NAME to CTX

       --help display this help and exit

       --version
              output version information and exit

[zhouguangfeng@localhost rootfs]$ sudo mknod -m666 dev/console c 5 1 

 //m之后为权限666,c代表character设备,5 1代表字符设备的dev/console

[zhouguangfeng@localhost rootfs]$sudo mknod -m666 dev/ttyS0 c 4 64

 //m之后为权限666,c代表character设备,4 64代表字符设备的dev/ttyS0

[zhouguangfeng@localhost rootfs]$ sudo mknod -m666 dev/null c 1 3

//同上

具体在内核内核下Documentation/devices.txt有关于系统设备用途

4)文件临时挂载点:/mnt。光盘,其他临时挂载点,一般在下面建立空文件夹,作为临时挂载点。

5)虚拟文件挂载点:/proc。虚拟文件临时挂载点,文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。

6)/var:存放可变数据     

7)/tmp:用于存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录下,所以/tmp目录必须存在并可 以访问。

8)/root: root用户文件夹,在嵌入式中一般都是单用户,/root是可不选

9)/apps:用于存放自我写的程序

以上为基本框架,具体可按照要求设定。


Copyright (C) 2014 zhouguangfeng<zhouguangfeng@gmail.com>
zhouxiaoxing login: root
>: ls
apps     data     etc      init     linuxrc  proc     sbin     tmp      var
bin      dev      info     lib      mnt      root     sys      usr
>: OK