`
isiqi
  • 浏览: 16034346 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论
阅读更多

busyboxinit

除了基本的命令之外,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 38400 tty1

tty2::askfirst:-/bin/sh

tty3::askfirst:-/bin/sh

::restart:/sbin/init

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

这个inittab执行下列动作

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

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

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

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

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

5.6 系统的配置文件

5.6.1. /etc/init.d/rcS文件

配置文件一般放在/etc/目录下,5.5.3节说了init初始化命令行的文件是/etc/init.d/rcS,下面是我的rcS文件

#!/bin/sh

/bin/mount -n -t proc /proc /proc

/bin/mount -n -o remount,rw /

/bin/mount -av

/bin/hostname usblinux

/etc/init.d/rc.nic

/etc/init.d/rc.network

/etc/init.d/rc.usb

/etc/init.d/rc.local

1. 安装proc文件系统,但是不写入/etc/mtab文件(mtab文件是df命令读取的文件)

2. 以读写模式重新挂载根文件系统(需要/etc/fstab文件)

3. mount -av 挂载所有在/etc/fstab里面列出的文件系统

4. 主机名命名为usblinux

5. 依次执行rc.nic(自动检测网卡),rc.network(配置网络),rc.usb(加载usb模块),rc.local(执行本地的一些服务)

5.6.2. /etc/fstab

上面使用mount命令的时候已经涉及到了fstab文件,下面是我的fstab文件

/dev/ram0 / ext2 defaults 0 0

proc /proc proc defaults 0 0

关于fstab配置文件的语法可以man fstab

其实rcS里面的mount -av没有必要加上去。

5.6.3. /etc/mtab

这个文件里面的内容是动态变化的,当mount一个文件系统的时候,如果mount 没有加上-n参数,那么安装信息就会写入mtab文件,df命令读取的就是这个文件。

5.6.4. /etc/profile

这个文件是sh用的,当用户获得一个shell后,sh就会根据这个文件配置用户的登陆环境,下面是我的profile文件。

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

PS1='[\u@\h \W]\$ '

HOSTNAME='/bin/hostname'

export PATH HOSTNAME PS1

alias l.='ls -d .[a-zA-Z]* --color=tty'

alias rm='rm -i'

alias cp='cp -i'

alias mv='mv -i'

export PATH=/usr/local/bin:$PATH

export PATH=/usr/local/sbin:$PATH

其中PATH环境变量指定当用户键入一个命令时,sh寻找这个命令的路径。

PS1指定sh提示符的格式

其它的export命令,alias命令不用说了吧,busybox里面的ash和bash非常相似,因此只要熟悉bash就会不成问题。

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

分享到:
评论

相关推荐

    最新版busybox-1.19.4

    用Busybox创建nfs文件系统 1、解压busybox-1.19.4.tar.bz2 修改Makefilez中的ARCH和CROSS_COMPILE与本机的路径一致: CROSS_COMPILE ?= /opt/crosstool/bin/arm-s3c2410-linux-gnu- ... ARCH ?= arm 2、编译...

    Busybox for Android v1.20.2

    hwclock, id, ifconfig, ifdown, ifup, inetd, init, inotifyd, insmod, install, ionice, iostat, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, ...

    嵌入式linux文件系统启动脚本及分析 linuxrc init shell busybox 分析

    1. 执行/sbin/init 文件 2. 执行/etc/inittab 文件 3. 执行/etc/init.d/rcS 文件 4. 执行挂载文件系统脚本 5. 执行内核模块脚本 6. 执行网络初始化脚本 7. 执行应用程序启动等脚本,如qtopia 的启动

    busybox for android(passed in android 2.3)

    busybox for android,编译器要用arm-eabi-4.4.0.tgz。 海天雄的android系统是没有busybox的。 Android并没有采用glibc作为C库,而是采用了Google自己开发的Bionic ...先执行: git init //fanwm 再执行:mm(单独编译模块)

    嵌入式Linux系统开发技术详解.基于ARM.rar

    μ1’ 1 ....................................................................................................................... 1.1 μ 1 ................................................................

    LINUX系统开发技术详解---基于ARM

    9 2.1.2 ARM处理器体系结构........................................................................................ 10 2.1.3 Linux 与ARM处理器...............................................................

    android busybox

    android平台busybox源码,将其解压到/external/busybox/目录下,mm编译,在/system/core/rootdir/init.rc中添加权限

    为你的手机添加init.d 脚本自启

    为手机 添加脚本自启 这个功能就不介绍了 ...为手机安装 busybox 超级终端 将下载的 文件term init sh 放入 SD卡 打开超级终端 输入命令 su 回车 sh sdcard term init sh 回车 reboot 这个命令是重启的

    natick:natick-最小,轻巧的研究型Linux发行版

    natick研究Linux发行版natick是一个研究Linux发行版,它基于最新Linux内核,BusyBox用户群和musl C库。 还将包括vim,util-linux,apache等其他软件包。 natick是一个个人研究项目,源于基于musl C库创建服务器Linux...

    Xperia U Advanced Stock Kernel [版本01]

    [v01 onwards]added support for init.d scripts (/system/etc/init.d) [v01 onwards]added support for userinit scripts: if sd-ext is mounted then it will execute /sd-ext/userinit.sh & shell scripts in /...

    [乐檬k30-t] fly-on v5.0 优化直刷补丁

    特点说明 1)完整的内存管理 2)Linux 内核优化 提升改善电耗和电池寿命 3)Entropy generator 引擎来减小滞后(选择启动) ...内核支持init.d 2.设备已root&lt;busybox&gt; 安装方法 使用第三方recovery直刷

    Embedded Linux Primer.pdf

    The init Thread Section 5.6. Chapter Summary Chapter 6. System Initialization Section 6.1. Root File System Section 6.2. Kernel's Last Boot Steps Section 6.3. The Init Process Section 6.4. Initial ...

    鱼树笔记之第11课_根文件系统2

    1.打开一个设备: 4 1.建立 busybox 源码 SI 工程,加入全部代码 4.从默认的 new_init_action 反推默认的配置文件 5.可见,p

    Micro runlevel-开源

    无尘室实现busybox的runlevel / init.d / SYS V init小程序的实现,旨在达到LSB要求。

    Android文件操作

    android文件架构详解 cache : 是缓存临时文件夹,据说是除了T-mobile的OTA更新外,别无用处。...init.rc :一个初始化脚本,用於将/system/modules和/system/xbin挂载为cramfs,避免系统被无意破坏

    ATMEL9260详细开发流程

    sync) C,启动服务 root@yuanxh-desktop:/# exportfs -ra root@yuanxh-desktop:/# /etc/init.d/portmap restart root@yuanxh-desktop:/# /etc/init.d/nfs-common restart root@yuanxh-desktop:/# /etc/init.d/nfs-...

    《深入理解Android》卷Ⅰ

    1.3.3 Busybox的使用 1.4 本章小结 第2章 深入理解JNI 2.1 JNI概述 2.2 学习JNI的实例:MediaScanner 2.3 Java层的MediaScanner分析 2.3.1 加载JNI库 2.3.2 Java的native函数和总结 2.4 JNI层MediaScanner的分析 ...

    tiny-ec2-bootstrap:使用实例元数据的微型EC2实例引导程序

    实际上,这仅与BusyBox(内置ash和wget内置)和几个用于扩展根文件系统的实用程序一起使用。 所需依赖项的完整列表为: 类似于bash的外壳(例如bash,dash,ash) get 磁盘零件resize2fs支持的功能和环境cloud-init...

    韦东山视频目录+链接整合-1 视频目录

    第11课第2节 构建根文件系统之init进程分析 第11课第3节 构建根文件系统之busybox 第11课第4节 构建根文件系统之构建根文件系统 第12课第1节 字符设备驱动程序之概念介绍 第12课第2.1节 字符设备驱动程序之LED...

    EpicROM-开源

    MODS 中的新(很多)mods 设置 Gapps Pico 预装 Épic OTA 服务添加到设置 OTA 应用程序上的 Epic Mods 音乐应用程序改进了设置重新排序器上的图标 Init.d 支持 Busybox 预装内核调整(对 boot.img 的改动很小) ...

Global site tag (gtag.js) - Google Analytics