busybox的init分析-相当经典,清晰

本文转载,地址:http://blog.csdn.net/chinazcw/archive/2008/12/09/3482174.aspx,版权问题,马上删除。

 

5.5.3  busyboxinit

   除了基本的命令之外,BusyBox还支持init功能,如同其它的init一样,busyboxinit也是完成系统的初始化工作,关机前的工作等等,我们知道在Linux的内核被载入之后,机器就把控制权转交给内核,linux的内核启动之后,做了一些工作,然后找到根文件系统里面的init程序,并执行它,BusyBoxinit进程会依次进行以下工作:(参考<<构建嵌入式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重启动设置缺省的动作,此外它还会为四个虚拟控制台(tty1tty4)设置启动shell的动作。如果未建立这些设备文件,BusyBox会报错。

       inittab文件中每一行的格式如下所示:(busybox的根目录下的example文件夹下有详尽的inittab文件范例)     

       id:runlevel:action:process

尽管此格式与传统的Sytem V init类似,但是,idBusyBoxinit中具有不同的意义。对BusyBox而言,id用来指定启动进程的控制tty。如果所启动的进程并不是可以交互的shell,例如BusyBoxshash),应该会有个控制tty,如果控制tty不存在,Busyboxsh会报错。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就会不成问题。

5.6.5. /etc/ld.so.conf 与 /etc/ld.so.cache

这两个文件是与lib库有关的,它们用来指定应用程序寻找lib库的路径。

我的ld.so.conf文件内容如下。

/lib

 

/usr/lib

 

/usr/local/lib

 

ld.so.cache里面的内容是由是ldconfig命令生成的,ldconfig根据ld.so.conf配置文件生成ld.so.cache里面的内容,应用程序读取的是ld.so.cache文件,因此如果变动了ld.so.conf文件,需要运行一次ldconfig才能是新的配置生效,另外如果新加了lib库文件,也需要ldconfig。

5.6.6   /etc/passwd,/etc/shadow,/etc/group

group里面存放的是用户组的信息。

我的group文件内容如下:

root:x:0:root

 

ftp:x:50:

 

passwd里面存放的是用户的信息

我的passwd文件内容如下:

root:x:0:0:root:/root:/bin/sh

 

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

 

sshd:x:74:74:piviledge-separated SSH:/var/empty/sshd:/sbin/nologin

 

注意,group和passwd里面的每一行都不是多余的。

shadow文件是pam认证用到的密码存放文件

5.6.7.   /etc/services

网络应用程序用到的标准服务端口映射表

我的services文件如下:

tcpmux    1/tcp

 

tcpmux    1/udp

 

ftp-data  20/tcp

 

ftp       21/tcp

 

ssh      22/tcp

 

ssh      22/udp

 

telnet    23/tcp

 

nameserver  42/tcp   name

 

 syslog    514/udp

 

auth      113/tcp  authentication  tap ident

 

因为我需要开启sshd,syslogd服务,同时会使用ftp,ssh,telnet应用程序。所以就会加上上面的东西,但是注意并不是所有的网络应用程序都会依赖与services文件,比如telnet,但是也许telnetd需要。

5.6.8.   /etc/nsswitch.conf

这个文件的作用很大,没有它很多程序都不能正常运行,关于它的具体作用还是用man  nsswitch.conf看看吧。

我的nsswitch.conf文件内容如下:

passwd:     files

 

shadow:     files

 

group:      files

 

hosts:      files dns

 

ethers:     files

 

netmasks:   files

 

networks:   files

 

protocols:  files

 

services:   files

 

netgroup:   files

 

publickey:  files

 

automount:  files

 

aliases:    files

 

注意hosts这一行一定要加上dns,不然即使有resolv.conf文件,域名也不能解析,注意nsswitch.conf是对应一组lib库的,这里我们用了files,dns,因此需要拷贝相应的lib库到/lib目录下.

#cd  /mnt/rootfs

#cp -dpR  /lib/libnss_files*   ./lib

#cp -dpR  /lib/libnss_dns*   ./lib

5.6.9 .  /etc/hosts,/etc/ host.conf, /etc/resolv.conf

       我的hosts文件内容如下,不用说也应该清楚什么意思了,不清楚的man hosts

       127.0.0.1   localhost:localdomain   localhost

 

       host.conf和resolv.conf是域名解析的时候用到的配置文件,其中resolv.conf里面是域名服务器的ip地址,host.conf里面放的是主机的查找规则。不了解的还是man host.conf和man  resolv.conf

我的host.conf与resolv.conf文件内容分别如下:

#cat  /mnt/rootfs/etc/host.conf

 

order hosts,bind

 

#cat  /mnt/rootfs/etc/resolv.conf

 

nameserver 202.112.20.131

 

5.6.10.  /etc/syslog.conf

syslogd服务程序读取的配置文件。

我的文件内容如下:

# Log all kernel messages to the console.

 

# Logging much else clutters up the screen.

 

#kern.*                                                 /dev/console

 


 


# Log anything (except mail) of level info or higher.

 

# Don't log private authentication messages!

 

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

 


 


# The authpriv file has restricted access.

 

authpriv.*                                              /var/log/secure

 


 

 

 


# Save boot messages also to boot.log

 

local7.*                                                /var/log/boot.log

 

已标记关键词 清除标记
相关推荐
程序员的必经之路! 【限时优惠】 现在下单,还享四重好礼: 1、教学课件免费下载 2、课程案例代码免费下载 3、专属VIP学员群免费答疑 4、下单还送800元编程大礼包 【超实用课程内容】  根据《2019-2020年中国开发者调查报告》显示,超83%的开发者都在使用MySQL数据库。使用量大同时,掌握MySQL早已是运维、DBA的必备技能,甚至部分IT开发岗位也要求对数据库使用和原理有深入的了解和掌握。 学习编程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺的技能!   套餐中一共包含2门MySQL数据库必学的核心课程(共98课时)   课程1:《MySQL数据库从入门到实战应用》   课程2:《高性能MySQL实战课》   【哪些人适合学习这门课程?】  1)平时只接触了语言基础,并未学习任何数据库知识的人;  2)对MySQL掌握程度薄弱的人,课程可以让你更好发挥MySQL最佳性能; 3)想修炼更好的MySQL内功,工作中遇到高并发场景可以游刃有余; 4)被面试官打破沙锅问到底的问题问到怀疑人生的应聘者。 【课程主要讲哪些内容?】 课程一:《MySQL数据库从入门到实战应用》 主要从基础篇,SQL语言篇、MySQL进阶篇三个角度展开讲解,帮助大家更加高效的管理MySQL数据库。 课程二:《高性能MySQL实战课》主要从高可用篇、MySQL8.0新特性篇,性能优化篇,面试篇四个角度展开讲解,帮助大家发挥MySQL的最佳性能的优化方法,掌握如何处理海量业务数据和高并发请求 【你能收获到什么?】  1.基础再提高,针对MySQL核心知识点学透,用对; 2.能力再提高,日常工作中的代码换新貌,不怕问题; 3.面试再加分,巴不得面试官打破沙锅问到底,竞争力MAX。 【课程如何观看?】  1、登录CSDN学院 APP 在我的课程中进行学习; 2、移动端:CSDN 学院APP(注意不是CSDN APP哦)  本课程为录播课,课程永久有效观看时长 【资料开放】 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化。  下载方式:电脑登录课程观看页面,点击右侧课件,可进行课程资料的打包下载。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页