全部博文(92)
分类: LINUX
2006-08-26 10:56:26
Take command :init
(November 1998)
INIT具有可以让LINUX BOT 极强生命力的驱动能力,同时它也有能力让LINUX BOX 死亡的力量。本文章将介绍INIT为何具有如此大的力量。同时也描述了你怎么样可以让INIT的行为与默认的完全不一样。
什么是INIT?
(parlance说法)在UNIX中有一种说法,INIT不能被认为一个具体的程序,而是一群程序的集合。INIT通常被认为是系统启动后第一个被执行的进程,---的确是第一个在系统启动后被执行的程序,当KERNEL设置硬件设备的时候,它调用了INIT并放弃了对电脑的控制。当挂载完根文件系统之后,INIT将控制一切。。。。。。
最近。存在着很多种选择:你可以用现在比较典型的方式 FROM sysvinit package 或者一个简单的脚本程序。如果你正在配置一个嵌入式系统,你甚至可以仅仅运行一个目标程序如INIT。
无论你选择了什么作为你的INIT,LINUX KERNEL都会执行/sbin/init,/etc/init or /bin/init
因为这些路径名已经被编译进内核中了。如果他们中没有任何一个被执行的话,那么系统将会被打断,内核将会执行一个ROOT SHELL。。。
为了最大化它的灵活性,内核的开发者提供了一种方式为INIT提供一个不一样的路径名。Kernel command line 选项 init=一个具体的路径名。 在启动时,这个选项将被passed
然而你有饿可以用append =一个指示 in /etc/lilo.conf.
如你所想象的,最简单的方法就是让系统运行init=/bin//sh。。。
The task of init
没错,init仅仅是一个通常的名字,现在的问题是一个真正的init是做什么任务的呢?
因为是内核第一个执行的进程,init其实是集聚了可以启动很多的其他的进程的一个程序。这个通常包括各种的守护以及登陆会话。当他们退出的时候,init被期望重新启动一些它的子进程。典型的是提供一个LOGIN会话在文字控制台。一旦你登出了控制台,就会通过getty来启动另一个会话。Init同时也会收集很多僵死的进程,并处理它门。在UNIX中的抽象进程。一个死掉的进程没有报告给它的父进程的话是不可以把它从系统进程表中删除掉的。无论什么时候一个进程挂了,(通过exit著者其他原因),it remains around in the state of a zombie process until someone collects it。Init是所有其他进程的DAD。因此它有能力和义务去收集其他进程退出的任务。如果init没有收集zombies(挂掉的进程),那么那些僵死的进程是很容易消耗系统的资源的。如果填满系统的进程表,就是使系统崩溃。Init最后的任务是处理系统的关机,它必须停止其他的进程并卸载所有其他的文件系统。如我门所看到的,init并不是很难的,一个脚本就很可以展示出一个很好的效果。注意每一个shell都会收集他挂掉的children,因此这个不是主要问题,最关键的是init需要加入一些简单的shell script这个才是关键同时最大的好处是增加了灵活性。
Using /bin/sh as a minimal choice
象我上面建议的。一个shell可以被用做INIT 程序。用一个全裸的shell。Init=/bin/sh,这个仅仅是打开一个shell而没有配置系统。这中最简单的方式用在embedded中或者减少环境。对于emmbedded最经常的方法是运行一个应用程序作为一个init。最常用的INIT是初始化环境变量。。
#!/bin/sh
# avoid typing full pathnames
export PATH=/usr/bin:/bin:/sbin:/usr/sbin
# remount root read-write, and mount all
mount -n -o remount,rw /
mount -a
swapon -a
# system log
syslogd
klogd
# start your lan
modprobe eth0 2> /dev/null
ifconfig eth0 192.168.0.1
route add 192.168.0.0 eth0
route add default gw 192.168.0.254
# start lan services
inetd
sendmail -bd -q30m
# Anything else: crond, named, ...
# And run one getty with a sane path
export PATH=/usr/bin:/bin
/sbin/mingetty tty1
Listing 1
简要说:上面的脚本做了很基本的初始化工作,但它不能处理关机的任务。
Simpleinit ,from util-linux
模式: /etc/initttab+/etc/re.sysinit
The real thing: sysvinit
这个方式就是一般LINUX 发行版本的模式