zoukankan      html  css  js  c++  java
  • 嵌入式linux启动时运行的inittab文件(zz)

    简介:这是嵌入式linux启动时运行的inittab文件(zz)的详细页面,介绍了和linux,有关的知识、技巧、经验,和一些linux源码等。
        嵌入式系统下的linux启动配置文件,不同与普通的pc linux启动配置,启动相关文件与文件的内容也要少得多。嵌入式系统下的linux启动过程一般是:
        1 在bootloader中制定各种要求传给linux内核的参数,制作ramdisk或ramfs文件系统,并在开机后首先mount上,该文件系统主要负责包含启动运行的配置文件,嵌入式系统主要是/etc/inittab和/etc/rc文件;
        2 在init进程启动后,进程首先执行/etc/inittab文件,该文件语法下面介绍,一般包括三项内容就可以启动。其中主要的一项内容就是::sysinit:/etc/rc,目的是制定初始化要执行的脚本配置文件,在/etc/rc中则主要是配置系统;另一项内容是::respawn:-/usr/sbin/xxx,xxx一般为Shell,最后一个重要的项是::shutdown:/bin/umount -a -r
        接下来的部分为转载http://blog.csdn.net/kernel_32/archive/2009/02/03/3860756.aspx

    首先介绍点背景知识,关于inittab的:

    init进程是系统中所有进程的父进程,init进程繁衍出完成通常操作所需的子进程,这些操作包括:设置机器名、检查和安装磁盘及文件系统、启动系统日志、配置网络接口并启动网络和邮件服务,启动打印服务等。solaris中init进程的主要任务是按照inittab文件所提供的信息创建进程,由于进行系统初始化的那些进程都由init创建,所以init进程也称为系统初始化进程。
           下面具体说明inittab文件的格式。
      inittab文件中每一记录都从新的一行开始,每个记录项最多可有512个字符,每一项的格式通常如下:id:rstate:action:process,下面分别解释。
      1.id字段是最多4个字符的字符串,用来唯一标志表项。
      2.rstate(run state)字段定义该记录项被调用时的运行级别,rstate可以由一个或多个运行级别构成,也可以是空,空则代表运行级别0~6。当请求init改变运行级别时,那些rstate字段中不包括新运行级别的进程将收到sigterm警告信号,并且最后被杀死;只有a、b、c启动的命令外(a、b、c不是真正的运行级别)
      3.action字段告诉init执行的动作,即如何处理process字段指定的进程,action字段允许的值及对应的动作分别为:
             1)respawn:如果process字段指定的进程不存在,则启动该进程,init不等待处理结束,而是继续扫描inittab文件中的后续进程,当这样的进程终止时,init会重新启动它,如果这样的进程已存在,则什么也不做。
             2)wait:启动process字段指定的进程,并等到处理结束才去处理inittab中的下一记录项。
             3)once:启动process字段指定的进程,不等待处理结束就去处理下一记录项。当这样的进程终止时,也不再重新启动它,在进入新的运行级别时,如果这样的进程仍在运行,init也不重新启动它。
             4)boot:只有在系统启动时,init才处理这样的记录项,启动相应进程,并不等待处理结束就去处理下一个记录项。当这样的进程终止时,系统也不重启它。
             5)bootwait:系统启动后,当第一次从单用户模式进入多用户模式时处理这样的记录项,init启动这样的进程,并且等待它的处理结束,然后再进行下一个记录项的处理,当这样的进程终止时,系统也不重启它。
             6)powerfail:当init接到断电的信号(sigpwr)时,处理指定的进程。
             7)powerwait:当init接到断电的信号(sigpwr)时,处理指定的进程,并且等到处理结束才去检查其他的记录项。
             8)off:如果指定的进程正在运行,init就给它发sigterm警告信号,在向它发出信号sigkill强制其结束之前等待5秒,如果这样的进程不存在,则忽略这一项。
             9)ondemand:功能通respawn,不同的是,与具体的运行级别无关,只用于rstate字段是a、b、c的那些记录项。
                10)sysinit:指定的进程在访问控制台之前执行,这样的记录项仅用于对某些设备的初始化,目的是为了使init在这样的设备上向用户提问有关运行级别的问题,init需要等待进程运行结束后才继续。
             11)initdefault:指定一个默认的运行级别,只有当init一开始被调用时才扫描这一项,如果rstate字段指定了多个运行级别,其中最大的数字是默认的运行级别,如果rstate字段是空的,init认为字段是0123456,于是进入级别6,这样便陷入了一个循环,如果 inittab文件中没有包含initdefault的记录项,则在系统启动时请求用户为它指定一个初始运行级别
      4.process字段中进程可以是任意的守候进程、可执行脚本或程序。
      另外:在任何时候,可以在文件inittab中添加新的记录项,级别q/q不改变当前的运行级别,重新检查inittab文件,可以通过命令init q或init q使init进程立即重新读取并处理文件inittab

    以上这些都是介绍的标准的linux system v的标准,所以对嵌入式来讲有些东西并不见得有用!这里介绍点针对嵌入式的,也就是针对busybox init的:

    busybox的init

       除了基本的命令之外,busybox还支持init功能,如同其它的init一样,busybox的init也是完成系统的初始化工作,关机前的工作等等,我们知道在linux的内核被载入之后,机器就把控制权转交给内核,linux的内核启动之后,做了一些工作,然后找到根文件系统里面的init程序,并执行它,busybox的init进程会依次进行以下工作:(参考<<构建嵌入式linux系统>> p201)

    1.       为init设置信号处理过程

    2.       初始化控制台

    3.       剖析/etc/inittab文件

    4.       执行系统初始化命令行,缺省情况下会使用/etc/init.d/rcs

    5.       执行所有导致init暂停的inittab命令(动作类型:wait)

    6.       执行所有仅执行一次的inittab(动作类型:once)

    一旦完成以上工作,init进程便会循环执行以下进程:

           1.  执行所有终止时必须重新启动的inittab命令(动作类型:once)

           2.  执行所有终止时必须重新启动但启动前必须询问用户的inittab命令(动作类型:askfirst)

           初始化控制台之后,busybox会检查/etc/inittab文件是否存在,如果此文件不存在,busybox会使用缺省的inittab配置,它主要为系统重引导,系统挂起以及init重启动设置缺省的动作,此外它还会为四个虚拟控制台(tty1到tty4)设置启动Shell的动作。如果未建立这些设备文件,busybox会报错。

           inittab文件中每一行的格式如下所示:(busybox的根目录下的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字段,所以空着它就行了,你也许会问既然没用保留着它干吗,我想大概是为了和传统的sytem v init保持一致的格式吧。process字段用来指定所执行程式的路径,包括命令行选项。action字段用来指定下面表中8个可应用到process的动作之一。

    动作
     结果
     
    sysinit
     为init提供初始化命令行的路径
     
    respawn
     每当相应的进程终止执行便会重新启动
     
    askfirst
     类似respawn,不过它的主要用途是减少系统上执行的终端应用程序的数量。它将会促使init在控制台上显示“please press enter to active this console”的信息,并在重新启动之前等待用户按下enter键
     
    wait
     告诉init必须等到相应的进程完成之后才能继续执行
     
    once
     仅执行相应的进程一次,而且不会等待它完成
     
    ctratldel
     当按下ctrl+alt+delete组合键时,执行相应的进程
     
    shutdown
     当系统关机时,执行相应的进程
     
    restart
     当init重新启动时,执行相应的进程,通常此处所执行的进程就是init本身
     

    以下是我的usblinux的inittab文件

    ::sysinit:/etc/init.d/rcs

    ::respawn:/sbin/getty  115200  tty1

    tty2::askfirst:-/bin/sh

    tty3::askfirst:-/bin/sh

    ::restart:/sbin/init

    ::ctrlaltdel:/bin/umount -a -r

    这个inittab执行下列动作

    1.       将/etc/init.d/rcs设置成系统的初始化文件

    2.       在115200 bps的虚拟终端tty1上启动一个登陆会话 (注意getty的用法)

    3.       在虚拟终端tty2和tty3上启动askfirst动作的shell

    4.       如果init重新启动,将/sbin/init设置成它会执行的程序

    5.       告诉init,在系统关机的时候执行umount命令卸载所有文件系统,并且在卸载失败时用只读模式冲新安装以保护文件系统。

    1、busybox的inittab与pc使用的inittab不同,第一id并不是随便取名字的,这个名字要与/dev/目录下是否有对应的文件对应

    对应错误

    can't open /dev/0: no such file or directory

    process '-/bin/sh' (pid 789) exited. scheduling for restart.

    can't open /dev/0: no such file or directory

    process '-/bin/sh' (pid 793) exited. scheduling for restart.

    2、出现下面这种错误:

    process '-/bin/sh' (pid 789) exited. scheduling for restart.

    process '-/bin/sh' (pid 794) exited. scheduling for restart.

    process '-/bin/sh' (pid 796) exited. scheduling for restart.

    process '-/bin/sh' (pid 798) exited. scheduling for restart.

    对应的inittab文件中有

    ttys0::askfirst:-/bin/sh

    虽然在/dev/目录下有ttys0设备,但是这个设备显然不可用,所以才会出现上面的错误

    3、当在inittab中同时定义的两个在同一个串口终端登陆的语句时

    ::askfirst:-/bin/sh

    s3c2410_serial0:23456:respawn:/sbin/getty -l s3c2410_serial0 115200 vt100

    出现的情况就是被抢占,不能接收任何串口输入

    4、bad inittab entry

    多半时因为非法字符造成的。

    5、busybox中的字段runleve也没有运行时的运行级别的概念

    6、分析一下启动的过程

    1.       为init设置信号处理过程

    2.       初始化控制台

    3.       剖析/etc/inittab文件

    4.       执行系统初始化命令行,缺省情况下会使用/etc/init.d/rcs

    5.       执行所有导致init暂停的inittab命令(动作类型:wait)

    6.       执行所有仅执行一次的inittab(动作类型:once)

    一旦完成以上工作,init进程便会循环执行以下进程:

           1.  执行所有终止时必须重新启动的inittab命令(动作类型:once)

           2.  执行所有终止时必须重新启动但启动前必须询问用户的inittab命令(动作类型:askfirst)

           初始化控制台之后,busybox会检查/etc/inittab文件是否存在,如果此文件不存在,busybox会使用缺省的inittab配置,它主要为系统重引导,系统挂起以及init重启动设置缺省的动作,此外它还会为四个虚拟控制台(tty1到tty4)设置启动shell的动作。如果未建立这些设备文件,busybox会报错。

    7、网上有人问“-”的作用

    我很纳闷:
    :: respawn:-/bin/sh
    这个-是干什么的,为什么有的时候有有的时候没有???
    还有啊,我从网上看到一个例程,如下,节选:
    ::respawn:-/bin/sh
    tty2::askfirst:-/bin/sh
    我搞不清两个的区别,这样控制台就启动了,是第一句启动的还是第二句,那我内核启动参数里面的console=ttys0会自动来找这个控制台???

    原帖由 wavezone 于 2008-8-22 16:34 发表 
    我很纳闷:
    :: respawn:-/bin/sh
    这个-是干什么的,为什么有的时候有有的时候没有???
    还有啊,我从网上看到一个例程,如下,节选:
    ::respawn:-/bin/sh
    tty2::askfirst:-/bin/sh
    我搞不清两个的区别 ...

    测试的时候是这样的,加上”-”的语句会在登陆终端之后调用/etc/目录下的profile文件,而不加”-”的不会执行这个脚本。

    其实登陆终端的命令有几种方便,但是标准的还是使用getty来登陆,但是直接使用如上的语句也是可以的,并且兼容性强一点,因为它不需要指定对应的串口设备。

    ::askfirst:-/bin/sh

    s3c2410_serial0::askfirst:-/bin/sh

    ::askfirst:-/bin/sh

    s3c2410_serial0:23456:respawn:/sbin/getty -l s3c2410_serial0 115200 vt100

    都是可用的。


    8./bin/sh: xxx not found
    arm-linux-readelf -d xxx
    查看你的以用程序依赖哪些库
    一般是因为缺少libc.so.6造成的,实际还是根文件系统的问题,没有将常用的库文件拷贝到/lib目录下
    常用的库:

    [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/ld* .

    [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libc-2.3.2.so .

    [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libc.so.6 .

    [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libm * .

    [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libcrypt* .

    9、错误insmod: chdir(2.6.26.6): no such file or directory

    网上有人提出这种解决方法:

    需要注意的是insmod等模块加载命令需要从lib/modules/2.6.26.6

    的目录下加载模块,所以必须先建立此目录,然后将模块放到此目录下面,否则将出现以下两种情况:

    一是没有建立lib/modules/2.6.26.6目录,取决于内核版本号,将出现insmod: chdir(2.6.26.6): no such file or directory的错误

    二是只将模块简单地放在根目录或其它文件夹,没有将其拷贝到指定的lib/modules/2.6.26.6目录,将出现

    insmod: module 'gpio_driver' not found错误

    不过这种方法不是很奏效

    根本原因是insmod的问题,在busybox编译的时候参考下面的选项,不要使用

    linux module utilities --->

      [ ] simplified modutils

    //该选项不要选择

    [*] support version 2.6.x linux kernels 

    //此选项选上

    参考如下:


     

    10、不能执行”-h”命令

    在执行xxx –h时没有任何反应。是在lib目录下缺少常见的库文件

    参考如下:

    [root@vm-dev rootfs]# ls lib/

    ld-2.3.6.so               libc-2.3.6.so      libgcc_s.so      libnsl.so.1             libnss_files.so.2        libnss_nis.so.2     librt-2.3.6.so       libthread_db.so.1

    ld-linux.so.2             libcrypt-2.3.6.so  libgcc_s.so.1    libnss_compat-2.3.6.so  libnss_hesiod-2.3.6.so   libpcprofile.so     librt.so.1           libutil-2.3.6.so

    libanl-2.3.6.so           libcrypt.so.1      libm-2.3.6.so    libnss_compat.so.2      libnss_hesiod.so.2       libpthread-0.10.so  libsegfault.so       libutil.so.1

    libanl.so.1               libc.so.6          libmemusage.so   libnss_dns-2.3.6.so     libnss_nis-2.3.6.so      libpthread.so.0     libtermcap.so.2      modules

    libbrokenlocale-2.3.6.so  libdl-2.3.6.so     libm.so.6        libnss_dns.so.2         libnss_nisplus-2.3.6.so  libresolv-2.3.6.so  libtermcap.so.2.0.8

    libbrokenlocale.so.1      libdl.so.2         libnsl-2.3.6.so  libnss_files-2.3.6.so   libnss_nisplus.so.2      libresolv.so.2      libthread_db-1.0.so

    [root@vm-dev rootfs]#

  • 相关阅读:
    237. Delete Node in a Linked List
    430. Flatten a Multilevel Doubly Linked List
    707. Design Linked List
    83. Remove Duplicates from Sorted List
    160. Intersection of Two Linked Lists
    426. Convert Binary Search Tree to Sorted Doubly Linked List
    142. Linked List Cycle II
    类之间的关系
    初始化块
    明确类和对象
  • 原文地址:https://www.cnblogs.com/dolphi/p/2643054.html
Copyright © 2011-2022 走看看