《嵌入式linux下inittab详解》由会员分享,可在线阅读,更多相关《嵌入式linux下inittab详解(10页珍藏版)》请在金锄头文库上搜索。
1、嵌入式 linux 启动时运行的 inittab 文件嵌入式系统下的 linux 启动配置文件,不同与普通的 PC linux 启动配置,启动相关文件与文件的内容也要少得多。嵌入式系统下的 linux 启动过程一般是:1 在 bootloader 中制定各种要求传给 linux 内核的参数,制作 ramdisk 或 ramfs文件系统,并在开机后首先 mount 上,该文件系统主要负责包含启动运行的配置文件, 嵌入式系统主要是/etc/inittab 和/etc/rc 文件;2 在 init 进程启动后,进程首先执行/etc/inittab 文件,该文件语法下面介绍,一般包括三项内容就可以启动
2、。其中主要的一项内容就 是:sysinit:/etc/rc,目的是制定初始化要执行的脚本配置文件,在/etc/rc 中则主要是配置系统;另一项内容是:respawn:-/usr/sbin/xxx,xxx 一般为 shell,最后一个重要的项是:shutdown:/bin/umount -a -r接下来的部分为转载首先介绍点背景知识,关于 inittab 的:init 进程是系统中所有进程的父进程,init 进程繁衍出完成通常操作所需的子进程,这些操作包括:设置机器名、检查和安装磁盘及文件系统、启动系统日志、配置网络接口并启动网络和邮件服务,启动打印服务等。Solaris 中init 进程的主要
3、任务是按照inittab 文件所提供的信息创建进程,由于进行系统初 始化的那些进程都由 init 创建,所以 init 进程也称为系统初始化进程。下面具体说明 inittab 文件的格式。inittab 文件中每一记录都从新的一行开始,每个记录项最多可有512 个字符,每一项的格式通常如下:id:rstate:action:process,下面分别解释。1. id 字段是最多 4 个字符的字符串,用来唯一标志表项。2. rstate(run state)字段定义该记录项被调用时的运行级别,rstate 可以由一个或多个运行级别构成,也可以是空,空则代表运行级别06。当请求init 改变 运行级
4、别时,那些 rstate 字段中不包括新运行级别的进程将收到 SIGTERM 警告信号,并且最后被杀死;只有 a、b、c 启动的命令外(a、b、c 不是 真正的运行级别)3. action 字段告诉 init 执行的动作,即如何处理 process 字段指定的进程,action字段允许的值及对应的动作分别为:1) respawn:如果 process 字段指定的进程不存在,则启动该进程,init 不等待处理结束,而是继续扫描 inittab 文件中的后续进程,当这样的进程终止时,init 会重新启动它,如果这样的进程已存在,则什么也不做。2) wait:启动 process 字段指定的进程,并
5、等到处理结束才去处理 inittab中的下一记录项。3) once:启动 process 字段指定的进程,不等待处理结束就去处理下一记录项。当这样的进程终止时,也不再重新启动它,在进入新的运行级别时,如果这样的进程仍在运行,init 也不重新启动它。4) boot:只有在系统启动时,init 才处理这样的记录项,启动相应进程,并不等待处理结束就去处理下一个记录项。当这样的进程终止时,系统也不重启它。5) bootwait:系统启动后,当第一次从单用户模式进入多用户模式时处理这样的记录项,init 启动这样的进程,并且等待它的处理结束,然后再进行下一个记录项的处理,当这样的进程终止时,系统也不重
6、启它。6) powerfail:当 init 接到断电的信号(SIGPWR)时,处理指定的进程。7)powerwait:当 init 接到断电的信号(SIGPWR)时,处理指定的进程,并且等到处理结束才去检查其他的记录项。8) off:如果指定的进程正在运行,init 就给它发 SIGTERM 警告信号,在向它发出信号 SIGKILL 强制其结束之前等待 5 秒,如果这样的进程不存在,则忽略这一项。9) ondemand:功能通 respawn,不同的是,与具体的运行级别无关,只用于 rstate 字段是a、b、c 的那些记录项。10) sysinit:指定的进程在访问控制台之前执行,这样的记
7、录项仅用于对某些设备的初始化,目的是为了使 init 在这样的设备上向用户提问有关运行级别的问题, init 需要等待进程运行结束后才继续。11) initdefault:指定一个默认的运行级别,只有当 init 一开始被调用时才扫描这一项,如果 rstate 字段指定了多个运行级别,其中最大 的数字是默认的运行级别, 如果 rstate 字段是空的,init 认为字段是 0123456,于是进入级别 6,这样便陷入了一个循环,如果 inittab 文件中没有包含 initdefault 的记录项,则在系统启动时请求用户为它指定一个初始运行级别4. Process 字段中进程可以是任意的守候进
8、程、可执行脚本或程序。另外:在任何时候,可以在文件 inittab 中添加新的记录项,级别 Q/q 不改变当前的运行级别,重新检查 inittab 文件,可以通过命令 init Q 或 init q 使 init 进程立即重新读取并处理文件 inittab以上这些都是介绍的标准的 linux System V的标准,所以对嵌入式来讲有些东西并不见得有用!这里介绍点针对嵌入式的,也就是针对busybox init 的:busybox 的 init除了基本的命令之外,BusyBox 还支持 init 功能,如同其它的init 一样,busybox 的 init 也是完成系统的初始化工作,关机前的工
9、作等 等,我们知道在 Linux 的内核被载入之后,机器就把控制权转交给内核,linux 的内核启动之后,做了一些工作,然后找到根文件系统里面的 init 程 序,并执行它,BusyBox 的 init 进程会依次进行以下工作:(参考 p201)1.为 init 设置信号处理过程2.初始化控制台3. 剖析/etc/inittab 文件4. 执行系统初始化命令行,缺省情况下会使用/etc/init.d/rcS5. 执行所有导致 init 暂停的 inittab 命令(动作类型:wait)6.执行所有仅执行一次的 inittab(动作类型:once)一旦完成以上工作,init 进程便会循环执行以下
10、进程:1. 执行所有终止时必须重新启动的 inittab 命令(动作类型:once)2. 执行所有终止时必须重新启动但启动前必须询问用户的 inittab 命令(动作类型:askfirst)初始化控制台之后,BusyBox 会检查/etc/inittab 文件是否存在,如果此文件不存在,BusyBox 会使用缺省的 inittab 配置,它主 要为系统重引导,系统挂起以及 init 重启动设置缺省的动作,此外它还会为四个虚拟控制台(tty1 到 tty4)设置启动shell的动作。如果未建立这 些设备文件,BusyBox 会报错。inittab 文件中每一行的格式如下所示:(busybox 的
11、根目录下的 example 文件夹下有详尽的 inittab 文件范例)id:runlevel:action:process尽 管此格式与传统的 Sytem V init类似,但是,id 在 BusyBox 的 init 中具有不同的意义。对 BusyBox 而言,id 用来指定启动进程的控制 tty。如果所启动的进程并不 是可以交互的 shell,例如 BusyBox 的 sh(ash),应该会有个控制 tty,如果控制 tty 不存在,Busybox 的 sh 会报错。 BusyBox 将会完全忽略 runlevel 字段,所以空着它就行了,你也许会问既然没用保留着它干吗,我想大概是为了和
12、传统的 Sytem V init 保持一致的格式吧。process 字段用来指定所执行程式的路径,包括命令行选项。action字段用来指定下面表中 8 个可应用到 process 的动作之一。动作结果sysinit为 init 提供初始化命令行的路径respawn每当相应的进程终止执行便会重新启动askfirst类似 respawn,不过它的主要用途是减少系统上执行的终端应用程序的数量。它将会促使 init 在控制台上显示“Please press Enter to active this consol的e”信息,并在重新启动之前等待用户按下 enter 键wait告诉 init 必须等到相应
13、的进程完成之后才能继续执行once仅执行相应的进程一次,而且不会等待它完成ctratldel当按下 Ctrl+Alt+Delete 组合键时,执行相应的进程shutdown当系统关机时,执行相应的进程restart当 init 重新启动时,执行相应的进程,通常此处所执行的进程就是 init 本身以下是我的 usblinux 的 inittab 文件:sysinit:/etc/init.d/rcS:respawn:/sbin/getty 115200 tty1tty2:askfirst:-/bin/shtty3:askfirst:-/bin/sh:restart:/sbin/init:ctrla
14、ltdel:/bin/umount -a -r这个 inittab 执行下列动作1.将/etc/init.d/rcS 设置成系统的初始化文件2. 在 115200 bps 的虚拟终端 tty1 上启动一个登陆会话 (注意 getty 的用法)3. 在虚拟终端 tty2 和 tty3 上启动 askfirst 动作的 shell4.如果 init 重新启动,将/sbin/init 设置成它会执行的程序5.告诉 init,在系统关机的时候执行 umount 命令卸载所有文件系统,并且在卸载失败时用只读模式冲新安装以保护文件系统。1、busybox 的 inittab 与 pc 使用的 initta
15、b 不同,第一 ID 并不是随便取名字的,这个名字要与/dev/目录下是否有对应的文件对应对应错误cant open /dev/0: No such file or directoryprocess -/bin/sh (pid 789) exited. Scheduling for restart.cant open /dev/0: No such file or directoryprocess -/bin/sh (pid 793) exited. Scheduling for restart.2、出现下面这种错误:process -/bin/sh (pid 789) exited. Sched