原文网址:http://www.linuxidc.com/Linux/2011-03/33728.htm

在内核初始化完成后,嵌入式linux 文件系统的启动过程主要包含以下几个步骤:

1. 执行/sbin/init 文件

2. 执行/etc/inittab 文件

3. 执行/etc/init.d/rcS 文件

4. 执行挂载文件系统脚本

5. 执行内核模块脚本

6. 执行网络初始化脚本

7. 执行应用程序启动等脚本,如qtopia 的启动

系统启动流程图:

1. 内核启动init

内核启动的最后一步就是启动init 进程,init 进程是由内核启动的第一个(也是唯一一个和)用户进程(进程ID 为1 ),它根据配置文件决定启动哪些程序,比如某些脚本, 启动shell ,运行用户指定的程序等,,那么init 进程又是怎么启动的呢---是由内核调用/sbin/init 文件而启动的,那有人就有人想知道内核是如何找到需要执行的init 文件呢。下面看一下内核代码中init/main.c ,如下所示:

static int noinline init_post(void)

{

free_initmem(); /* 释放初始化内存*/

unlock_kernel();

mark_rodate_ro();

system_state=SYSTEM_RUNNING;

numa_default_policy();

/* 打开控制设备hanle=0=>stdin*/

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

printk(KERN_WARNING “Waring :unable to open an initial console.\n”);

/* 复制控制台设备到handle 1,2=>stout,stderr*/

(void)sys_dup(0);

(void)sys_dup(0);

/* 尝试执行ramdisk_execute_command 指定的程序*/

if(ramdisk_execute_command) {

run_init_process(ramdisk_execute_command);

printk(KERN_WARNING “Failed to execute %s\n”,ramdisk_execute_command);

}

/* 尝试执行execute_command 指定的程序*/

if(execute_command) {

run_init_process(execute_command);

printk(KERN_WARNING “Failed to execute %s\n”,execute_command);

}

/* 依次尝试执行四个外部程序*/

run_init_process(“/sbin/init”);

run_init_process(“/etc/init”);

run_init_process(“/bin/init”);

run_init_process(“/bin/sh”);

panic(“No init found . Try passing init=option to kernel.”);

内核启动init 进程的过程如下:

先打开控制台设备/dev/console ,并复制了两个handle, 这样stdout,stdin,stderr 都指向/dev/console, 这样就打开了标准设备输入,输出,标准错误设备,然后执行几个外部程序。由ramdisk_execute_command指定的外部程序,即在u-boot启动时设置的内核启动参数"init=XXX"指定的

程序由execute_command指定的外部程序,即内核启动参数“init=XXX”指定的程序

/sbin/init

/etc/init

/bin/init

/bin/sh

这几个程序中任何一个加载成功就进入了用户态,内核启动就宣告结束。而启动的init也就是系统启动后的第一个进程。但如果以上都没有,则linux打印panic("No init found. Try passing init = option to kernel.")

2. 执行/etc/inittab 文件

当init 启动成功后,需要做的就是分析/etc/inittab 文件并执行它。对于inittab文件,如果使用busybox的init文件,inittab文件内容与传统的是有区别的:

传统的init:主要应用于PC环境,支持运行级别

busybox的inittab:由于主要用于嵌入式,所以没有运行级别的概念。

(1)传统init对应inittab文件:

# 设置默认运行级别为5

id:5:initdefault:

# 系统开机需要运行的第一个脚本

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

# 运行级

#0 挂起系统,6 重新引导,1 单用户模式,2-5多用户模式

I0:0:wait:/etc/init.d/rc 0

I1:1:wait:/etc/init.d/rc 1

I2:2:wait:/etc/init.d/rc 2

I3:3:wait:/etc/init.d/rc 3

I4:4:wait:/etc/init.d/rc 4

I5:5:wait:/etc/init.d/rc 5

I6:6:wait:/etc/init.d/rc 6

# 登录系统

S:2345:respawn:/etc/init.d/login 115200 ttyS2

(2)busybox的init对应的inittab文件:

# /etc/inittab

# 系统开机需要运行的第一个脚本

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

# 自动作为root账户登录

::respawn:-/bin/login -f root

# 系统关机运行的脚本

::shutdown:/etc/init.d/rcK

# 系统重新启动运行程序或脚本

::restart:/sbin/init

# 启动shell 以/dev/ttySAC0 作为控制台

ttySAC0::askfirst:-/bin/sh

# 按下ctrl+alt+del 之后执行的程序,不过在串口控制台中无法输入ctrl+alt+del 组合键

::ctrlaltdel:/sbin/reboot

# 重启关机前执行的程序

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

3. 执行/etc/init.d/rcS 文件

执行/etc/init.d/rcS文件时在inittab文件中做的,第二步已经看到了。在此,我们以busybox的init的无运行级别方式来说明。

#!/bin/sh

#运行执行/etc/init.d目录中以S开头的文件

for s in /etc/init.d/S*;do

  if [ -x $s]; then

    $s start

  fi

done

目前执行脚本大概有:

/etc/init.d/S00mountvirtfs

/etc/init.d/S05hotplut

......

这是一个脚本文件,可以在里面添加想自动运行的命令。内容如下:

#! /bin/sh

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

runlevel=S

prevlevel=N

umask 022

export PATH runlevel prevlevel

# 网络配置脚本

. /etc/init.d/network.sh

# load zlg_fs

insmod /bin/zlg_fs.ko

insmod /bin/zlg_ffs.ko

mknod /dev/zlg_fsa b 125 0

mknod /dev/zlg_fsa1 b 125 1

mknod /dev/zlg_fsa2 b 125 2

mount -t vfat /dev/zlg_fsa /usr

mount -a

4. 执行/etc/fstab( 挂载文件系统脚本)

在文件 /etc/init.d/rcS 中执行 mount –a 时,就会按照文件 /etc/fstab 内容挂载相应的文件系统 .

#device mount-point type options dump fsck order

none /proc proc defaults 0 0

none /dev/pts devpts mode=0622 0 0

tmpfs /dev/shm tmpfs defaults 0 0

(1)device : 要挂接的设备,如 /dev/hda2

mount-point: 挂接点

type: 文件系统类型,如 pro,jffs2,nfs

options: 挂接参数,以逗号隔开

dump 和 fsck order :用来决定控制 dump,fsck 程序的行为。

5. 接着就会执行一些内核模块和网络俄配置脚本,最后执行应用程序启动等脚本,如 qtopia 的启动。

【转】嵌入式Linux文件系统启动脚本及分析的更多相关文章

  1. linux文件系统启动流程、启动脚本

    linux文件系统启动流程.启动脚本 下面是一张Linux启动流程图: 在了解启动流程之前,我们应该先知道系统的几个重要脚本和配置文件,他们对应的路径为: 1. /sbin/init 2. /etc/ ...

  2. Linux文件/proc/net/tcp分析

    本文转载自Linux文件/proc/net/tcp分析 导语 /proc/net/tcp文件提供了tcp的连接信息,是由net/ipv4/tcp_ipv4.c中的tcp4_seq_show()实现信息 ...

  3. Linux文件系统启动过程及login的实现

    1. busybox简介 busybox是一个集成了一百多个最常用linux命令和工具的软件,它将许多常用的LINUX命令和工具结合到了一个单独的可执行程序中.虽然与相应的GNU工具比较起来,busy ...

  4. Linux文件拷贝脚本

    在工作中,我们经常遇到要从Linux服务器拷贝日志至本地或者定期清理日志的需求,在服务器上,大型系统的日志是按模块存储的,这就导致日志的文件目录较多且层级不统一.我们从众多的目录手工筛选要下载或者删除 ...

  5. linux文件分发脚本

    1.说明 此脚本可分发两类文件,1.固定内容文件,2.(每台被分发主机)内容不同的文件 ppp.sh为拨号脚本,每台被分发主机内容不同 根据分发文件名字不同(ppp.sh和其他文件)自动选择分发方式 ...

  6. linux文件归档脚本

    #!/bin/bash range= dir="/app/xx/logs" bak_dir="/app/xx/logs_archive" cd $dir $ra ...

  7. 为什么要有uboot?带你全面分析嵌入式linux系统启动过程中uboot的作用

    1.为什么要有uboot 1.1.计算机系统的主要部件 (1)计算机系统就是以CPU为核心来运行的系统.典型的计算机系统有:PC机(台式机+笔记本).嵌入式设备(手机.平板电脑.游戏机).单片机(家用 ...

  8. 从ramdisk根文件系统启动Linux成功,及使用initramfs启动linux

    下面两篇文章是ARM9论坛上的讲解ramdisk文件系统的很不错的文章 今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下. 其中涉及的内容较多,很多东西不再详述 ...

  9. 从ramdisk根文件系统启动Linux 二

    今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下.其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆). 开发环境:Fedo ...

随机推荐

  1. js中fn()和return fn()的区别

    参考文章:http://www.jb51.net/article/87977.htm 这文章中没有讲明白,其实只要把文章里的代码加和不加return调试一下就知道是怎么回事了. var i = 0; ...

  2. 20155201 2016-2017-2 《Java程序设计》第四周学习总结

    20155201 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 - 第六章要点: 继承:面向对象中,子类继承父类,避免重复的行为定义.继承基本上就是避免多个 ...

  3. 2017-2018-1 JaWorld 第四、五周作业

    2017-2018-1 JaWorld 第四.五周作业 两周工作内容 小组讨论并确定最终的app雏形 合作完成需求说明书 工作分工 成员 分工 比例 陈是奇 1.引言 8% 马平川 2.1-2.5 产 ...

  4. HDU1510 White rectangles( 乱搞 O(n^3) )题解

    思路: 友谊赛的时候一直想到了,但是没想出来怎么遍历才能找到所有矩阵,卡住了. 这里讲一下完整思路:我们用一个num[i][j]表示第i行第j列每一列连续的白色格子数量,然后我们定义一个MIN,并且每 ...

  5. [微信开发] - weixin4j获取网页授权后的code进而获取用户信息

    weixin4j封装好的SnsComponent组件中的方法可以执行该步骤 WeixinUserInfoController : package com.baigehuidi.demo.control ...

  6. k8s 学习笔记 etcd

    1. Etcd Etcd是Kubernetes集群中的一个十分重要的组件,用于保存集群所有的网络配置和对象的状态信息.在后面具体的安装环境中,我们安装的etcd的版本是v3.1.5,整个kuberne ...

  7. 【异常记录(六)】vs文件乱码:文件加载,使用Unicode(UTF-8)编码加载文件xxx时,有些字节已用Unicode替换字符替换。保存该文件将不会保留原始文件内容。

    VS2013偶遇这种情况,页面汉字编码出现乱码.  .... 按照网上查到的:   工具>选项>文本编辑器> 勾选了  然并卵,还是乱码... 其实炒鸡简单 用记事本打开另存为,选择 ...

  8. 理解flex布局

    我们传统的布局方式是基于在盒子模型下的,依赖于display属性的,position属性的或者是float属性的,但是在传统的布局上面并不好布局; 比如我们想让某个元素垂直居中的话,我们常见的会让其元 ...

  9. 使用SpringMVC自带的@Scheduled完成定时任务

    首先在xml配置文件头中添加以下几行: xmlns:task="http://www.springframework.org/schema/task"   http://www.s ...

  10. m_Orchestrate learning system---二十九、什么情况下用数据库做配置字段,什么情况下用配置文件做配置

    m_Orchestrate learning system---二十九.什么情况下用数据库做配置字段,什么情况下用配置文件做配置 一.总结 一句话总结: 配置文件 开发人员 重置 数据库 非开发人员 ...