AM335X之inittab

   

 前面我已经熟悉了整个系统的启动过程,参见:http://blog.csdn.net/hudaweikevin/article/details/10376585,下面我需要知道内核的一个启动过程。
 内核启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式来启动其他用户级的进程或服务。所以,init始终是第一个进程(其PID始终为1)。
 内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init.如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
 init进程作为所有进程的起点,它会读取inittab的配置。下面我们来分析一下inittab吧

 \etc\inittab  (我查看的是TI原厂的base-rootfs-am335x-evm.tar.gz解压出来的rootfs)
 
 首先分析一下inittab的格式:
 inittab文件中的值都是如下格式:
  label:runlevel:action:process
  label是1~4个字符的标签,用来标示输入的值。一些系统只支持2个字符的标签。鉴于此原因,多数人都将标签字符的个数限制在2个以内。该标签可以是任意字符构成的字符串,但实际上,某些特定的标签是常用的,在Red Hat Linux中使用的标签是:
  代码:
  id 用来定义缺省的init运行的级别
  si 是系统初始化的进程
  ln 其中的n从1~6,指明该进程可以使用的runlevel的级别
  ud 是升级进程
  ca 指明当按下Ctrl+Alt+Del时运行的进程
  pf 指当UPS表明断电时运行的进程
  pr 是在系统真正关闭之前,UPS发出电源恢复的信号时需要运行的进程
  x 是将系统转入X终端时需要运行的进程

  runlevel字段指定runlevel的级别。可以指定多个runlevel级别,也可以不为runlevel字段指定特定的值。
  Runlevel 0 是让init关闭所有进程并终止系统。
  Runlevel 1 是用来将系统转到单用户模式,单用户模式只能有系统管理员进入,在该模式下处理那些在有登录用户的情况下不能进行更改的文件,改runlevel的编号1也可以用S代替。
  Runlevel 2 是允许系统进入多用户的模式,但并不支持文件共享,这种模式很少应用。
  Runlevel 3 是最常用的运行模式,主要用来提供真正的多用户模式,也是多数服务器的缺省模式。
  Runlevel 4 一般不被系统使用,用户可以设计自己的系统状态并将其应用到runlevel 4阶段,尽管很少使用,但使用该系统可以实现一些特定的登录请求。
  Runlevel 5 是将系统初始化为专用的X Window终端。对功能强大的Linux系统来说,这并不是好的选择,但用户如果需要这样,也可以通过在runlevel启动来实现该方案。
  Runlevel 6 是关闭所有运行的进程并重新启动系统。

 

  action字段定义了该进程应该运行在何种状态下:
  boot 在系统启动时运行,忽略runlevel
  bootwait 在系统启动时运行,init等待进程完成。忽略runlevel
  ctrlaltdel 当Ctrl+Alt+Del三个键同时按下时运行,把SIGINT信号发送给init。忽略runlevel
  initdefault 不要执行这个进程,它用于设置默认runlevel
  kbrequest 当init从键盘中收到信号时运行。这里要求键盘组合符合KeyBoardSigral(参见/usr/share/doc/kbd-*关于键盘组合的文档)
  off 禁止进入,因此该进程不运行
  once 每一个runlevel级别运行一次
  ondemand 当系统指定特定的运行级别A、B、C时运行
  powerfail 当init收到SIGPWR信号时运行
  powerokwait 当收到SIGPWD信号且/etc/文件中的电源状态包含OK时运行
  powerwait 当收到SIGPWD信号,并且init等待进程结束时运行
  respawn 不管何时终止都重新启动进程
  sysinit 在运行boot或bootwait进程之前运行
  wait 运行进程等待输入运行模式

  process字段包含init执行的进程,该进程采用的格式与在命令行下运行该进程的格式一样,因此process字段都以该进程的名字开头,紧跟着是 运行时,紧跟着是运行时要传递给该进程的参数。比如/sbin/shutdown -t3 -r now,该进程在按下Ctrl+Alt+Del时执行,在命令行下也可以直接输入来重新启动系统。

 

 第一段:
   # The default runlevel
   id:5:initdefault:
 个人分析:
      process为空表示不启动任何进程,这应该就是内核刚起来不执行任何进程,仅仅只设置一个默认的运行级别为图形界面
     
 第二段:
   # Boot-time system configuration/initialization script.
   # This is run first except when booting in emergency (-b) mode.
   si::sysinit:/etc/init.d/rcS
 个人分析:
   根据注释已经很明白的说明这里是运行系统配置或初始化的一些脚本
   
 第三段:
   # What to do in single-user mode.
   ~~:S:wait:/sbin/sulogin
 个人分析:
   等待管理员用户登录进行下一步的操作

 第四段:
   l0:0:wait:/etc/rc.d/rc 0
     l1:1:wait:/etc/rc.d/rc 1
     l2:2:wait:/etc/rc.d/rc 2
     l3:3:wait:/etc/rc.d/rc 3
     l4:4:wait:/etc/rc.d/rc 4
     l5:5:wait:/etc/rc.d/rc 5
     l6:6:wait:/etc/rc.d/rc 6
 个人分析:
   进入对应的运行级别来执行对应目录下面的脚本
   
 第五段:
   # Normally not reached, but fallthrough in case of emergency.
   z6:6:respawn:/sbin/sulogin
 个人分析:可以不用管,用不上
 
 第六段:
   S:2345:respawn:/sbin/getty 115200 ttyO0
   the "ID " field must be the same as the last characters of the device(after "tty")
 个人分析:
   根据注释,S与这段命令的最后一个字符必须一致
   还原命令应该为:0:2345:respawn:/sbin/getty 115200 tty0
   其实就是在2,3,4,5的运行级别下都会打开串口0,波特率为115200

   (这里我还没理解好,今天才理解到这里还启用了终端服务,是以串口的形式访问的)
 
 第7段的分析同上
 
 总结:init过程就是根据initab表进入对应的运行模式就干对应的事情,至于具体干啥事,在什么时候干,用户都可以设置的。

 

 

 

你可能感兴趣的:(AM335x,Linux)