【转】嵌入式Linux文件系统启动脚本及分析
原文网址: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文件系统启动脚本及分析的更多相关文章
- linux文件系统启动流程、启动脚本
linux文件系统启动流程.启动脚本 下面是一张Linux启动流程图: 在了解启动流程之前,我们应该先知道系统的几个重要脚本和配置文件,他们对应的路径为: 1. /sbin/init 2. /etc/ ...
- Linux文件/proc/net/tcp分析
本文转载自Linux文件/proc/net/tcp分析 导语 /proc/net/tcp文件提供了tcp的连接信息,是由net/ipv4/tcp_ipv4.c中的tcp4_seq_show()实现信息 ...
- Linux文件系统启动过程及login的实现
1. busybox简介 busybox是一个集成了一百多个最常用linux命令和工具的软件,它将许多常用的LINUX命令和工具结合到了一个单独的可执行程序中.虽然与相应的GNU工具比较起来,busy ...
- Linux文件拷贝脚本
在工作中,我们经常遇到要从Linux服务器拷贝日志至本地或者定期清理日志的需求,在服务器上,大型系统的日志是按模块存储的,这就导致日志的文件目录较多且层级不统一.我们从众多的目录手工筛选要下载或者删除 ...
- linux文件分发脚本
1.说明 此脚本可分发两类文件,1.固定内容文件,2.(每台被分发主机)内容不同的文件 ppp.sh为拨号脚本,每台被分发主机内容不同 根据分发文件名字不同(ppp.sh和其他文件)自动选择分发方式 ...
- linux文件归档脚本
#!/bin/bash range= dir="/app/xx/logs" bak_dir="/app/xx/logs_archive" cd $dir $ra ...
- 为什么要有uboot?带你全面分析嵌入式linux系统启动过程中uboot的作用
1.为什么要有uboot 1.1.计算机系统的主要部件 (1)计算机系统就是以CPU为核心来运行的系统.典型的计算机系统有:PC机(台式机+笔记本).嵌入式设备(手机.平板电脑.游戏机).单片机(家用 ...
- 从ramdisk根文件系统启动Linux成功,及使用initramfs启动linux
下面两篇文章是ARM9论坛上的讲解ramdisk文件系统的很不错的文章 今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下. 其中涉及的内容较多,很多东西不再详述 ...
- 从ramdisk根文件系统启动Linux 二
今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下.其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆). 开发环境:Fedo ...
随机推荐
- Python3.x的BeautifulSoup解析html常用函数
Python3.x的BeautifulSoup解析html常用函数 1,初始化: soup = BeautifulSoup(html) # html为html源代码字符串,type(html) == ...
- ngular6开发不完全笔记(三)-- 报错指南
router Uncaught Error: Template parse errors: 'router-outlet' is not a known element: If 'router-out ...
- Java静态内存与动态内存分配的解析
1. 静态内存 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源. 程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用 ...
- 转 已知两点坐标和半径求圆心坐标程序C++
数学思想:利用圆方程和直线方程 已知两点坐标和半径求圆心坐标程序 #include <iostream> #include <fstream> #include <c ...
- Opencv3_Learning
git地址 采用jupyter notebook进行编程,语言为python. 感谢博主--戳 这类东西真的是不是天天打,就是打过就忘.. 有志者事竟成,破釜沉舟,百二秦关终属楚. 苦心人天不负,卧薪 ...
- 几个主流的Java连接池整理
池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对 ...
- 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击
跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击 一.总结 一句话总结:比如用户留言功能,用户留言中写的是网页可执行代码,例如js代码,然后这段代码在可看到这段留言的不同一户的显示上就会 ...
- 将keras模型在django中应用时出现的小问题——ValueError: Tensor Tensor("dense_2/Softmax:0", shape=(?, 8), dtype=float32) is not an element of this graph.
本文原出处(感谢作者提供):https://zhuanlan.zhihu.com/p/27101000 将keras模型在django中应用时出现的小问题 王岳王院长 10 个月前 keras 一个做 ...
- SQL Server 跨服务器 不同数据库之间复制表的数据
不同数据库之间复制表的数据的方法: 当表目标表存在时: insert into 目的数据库..表 select * from 源数据库..表 当目标表不存在时: select * into 目的数据库 ...
- 豆知识扩展:HTML<meta> tag
豆知识: HTML<meta> tag Metadata 是关于数据的信息. The <meta> tag provides metadata关于网页.Metadat不会显示在 ...