当init启动后,它通过执行各种启动事务来继续引导进程(检查并监视文件系统,启动后台程序daemons,等等),直至完成用户所有操作环境的设置工作。这里主要涉及4个程序:init、getty(agetty)、login和shell程序。
init进程的主要任务是根据/etc/rc文件中设置的信息,执行其中设置的命令,然后根据/etc/inittab文件中的信息,为每一个允许登录的终端设备使用fork()创建一个子进程,并在每个新创建的子进程中运行agetty (getty)程序。而init进程则调用wait(),进入等待子进程结束状态。每当它的一个子进程结束退出,它就会根据wait()返回的pid号知道是哪个对应终端的子进程结束了,因此就会为相应终端设备再创建一个新的子进程,并在该子进程中重新执行agetty程序。这样,每个被允许的终端设备都始终有一个对应的进程为其等待处理。
在正常的操作下,init确定agetty正在工作着以允许用户登录,并且收取孤立进程。孤立进程是指那些其父辈进程已结束的进程;在Linux中所有的进程必须属于单棵进程树,所以孤立进程必须被收取。当系统关闭时,init负责杀死所有其它的进程,卸载所有的文件系统以及停止处理器的工作,以及任何它被配置成要做的工作。
getty程序的主要任务是设置终端类型、属性、速度和线路规程。它打开并初始化一个tty端口,显示提示信息,并等待用户键入用户名。该程序只能由超级用户执行。通常,若/etc/issue文本文件存在,则getty会首先显示其中的文本信息,然后显示登录提示信息(例如:plinux login: ),读取用户键入的登录名,并执行login程序。
为了能让init程序运行getty,/etc/inittab文件中必须含有getty(agetty)命令。/etc/inittab文件中有关agetty的内容例子见如下所示。
列表 3.1 poeigl-1.2中的inittab文件
# inittab for linux, poeigl 1.2
# format:
# ttyline:termcap-entry:getty-command
tty1:con80x60:/bin/agetty 9600 tty1
tty2:con80x60:/bin/agetty 9600 tty2
tty3:con80x60:/bin/agetty 9600 tty3
tty4:con80x60:/bin/agetty 9600 tty4
# tty5:con80x60:/bin/agetty 9600 tty5
# tty64:dumb:/bin/agetty 9600 tty64
# tty65:dumb:/bin/agetty -m -t60 2400 tty65
每个终端都有自己的getty命令。其中列出了tty1—tty4对应的登录项信息。以’#’开始的是注释行。第1列是所用终端设备名称,第2列是指定终端的类型,这里指定了终端类型是con80x60。第3列是所执行的命令及其参数。最后两行中的tty64和tty65对应连接在串行端口上的终端。
对于使用串行端口与主机直接相连的终端以及通过modem拨号连接的终端,Linux的agetty程序还有其它一些属性。如在读取登录名时自动调整tty的设置信息,例如奇偶校验位、檫除字符、行结束字符以及上档键字符等。可选择地从链接的Hayes兼容modem信息中检测出传输波特率。
/dev/inittab中每一项的参数格式与具体使用哪一种getty程序有关。目前一般常用的getty程序有如下几种:
1.agetty(有时直接称为getty):容易设置,无须配置文件。适用于直接连接的终端;
2.getty(getty_ps的一部分):适用于直接连接的终端;
3.mgetty:最适合于通过modem连接,也可用于直连;
4.uugetty:仅用于通过modem连接终端,是getty_ps软件包的部分;
5.mingetty:简单的getty。适用于控制台终端或虚拟终端;
6.fbgetty:适用于控制台或虚拟终端。
RedHat 9系统默认配置中带有mingetty和agetty两个程序。控制台或虚拟终端使用的是mingetty。对于实际的字符终端则一般使用agetty。因此在Redhat 9系统的/etc/inittab文件中会看到以下的信息。
关于Linux下/sbin/init程序的执行过程
内容版权声明:除非注明,否则皆为本站原创文章。