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

Linux操作系统中/sbin/init程序的执行过程

阅读更多

当init启动后,它通过执行各种启动事务来继续引导进程(检查并监视文件系统,启动后台程序daemons,等等),直至完成用户所有操作环境的设置工作。这里主要涉及4个程序:init、getty(agetty)、login和shell程序。这4个程序之间的关系见下图所示。

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文件中会看到以下的信息。

列表 3.2 RedHat 9系统的/etc/inittab文件中有关getty的信息

# Run gettys in standard runlevels

1:2345:respawn:/sbin/mingetty tty1

2:2345:respawn:/sbin/mingetty tty2

3:2345:respawn:/sbin/mingetty tty3

4:2345:respawn:/sbin/mingetty tty4

5:2345:respawn:/sbin/mingetty tty5

6:2345:respawn:/sbin/mingetty tty6

其中第1列表示名称tty后的数字,2345表示该mingetty的运行层。respawn表示如果该mingetty被终止,则mingetty将再次自动执行。/sbin/mingetty是命令。ttyn代表/dev/ttyn(n表示数字1—5)。

在登录到Linux系统中之后,你会发现(使用”top”或”ps –ax”命令)自己终端原来的getty进程已经找不到了。因为getty进程执行了login程序,被替换成了login进程,并且最后被替换成你的登录shell进程。

当你在”login: “提示符下键入了你的用户名后,getty会读取用户名并且去执行login程序,也把用户名信息传给了它。因此getty进程被替换成了login进程。此时login进程会接着要求你输入口令。在口令检查通过后就会去执行/etc/passwd文件中对应你用户名项中记录的程序。通常这个程序是bash shell程序。因此原来的getty进程最终被替换成了bash进程,对应的这三个程序也就都具有相同的进程ID。

当注销登录(log out)时,则该终端上的所有进程都会被终止(killed),包括登录shell进程bash。因此,对于在/etc/inittab文件中列出的getty程序,一旦其被替换执行的bash程序被终止或退出,init进程就会为对应终端重新创建一个getty进程。

login程序则主要用于要求登录用户输入密码。根据用户输入的用户名,它从口令文件passwd中取得对应用户的登录项,然后调用getpass()以显示”password:”提示信息,读取用户键入的密码,然后使用加密算法对键入的密码进行加密处理,并与口令文件中该用户项中pw_passwd字段作比较。如果用户几次键入的密码均无效,则login程序会以出错码1退出执行,表示此次登录过程失败。此时父进程(进程init)的wait()会返回该退出进程的pid,因此会根据记录下来的信息再次创建一个子进程,并在该子进程中针对该终端设备再次执行agetty程序,重复上述过程。

login程序也可以被用户在运行过程中在shell下当作一个命令执行。此时它可以被用随时从一个用户切换成另一个用户。如果执行时没有给出参数,则login就会显示输入用户名的提示信息。如果用户不是超级用户(root),并且/etc/目录下存在一个名为nologin的文件,那么该文件中的信息就会被显示出来,此次登录过程也随即被终止。

如果在/etc/usertty文件中对该用户指定了特殊的访问限制,那么这些限制要求必须满足。如果是一个超级用户,那么所使用的登录tty设备必须是在/etc/securetty文件中指定的。

在所有这些条件满足之后,login同样也会要求用户输入密码并对其进行检查。如果.hushlogin存在的话,login就会执行一个“安静”的登录过程,也即不检查是否有邮件,也不显示上次登录时间和motd文件中的信息。否则如果/var/log/lastlog文件存在的话,就会显示其中的最后登录时间。

如果用户键入的密码正确,则login就会把当前工作目录(Currend Work Directory)修改成口令文件中指定的该用户的起始工作目录。并把对该终端设备的访问权限修改成用户读/写和组写,设置进程的组ID。然后利用所得到的信息初始化环境变量信息,例如起始目录(HOME=)、使用的shell程序(SHELL=)、用户名(USER=和LOGNAME=)和系统执行程序的默认路径序列(PATH=)。接着显示/etc/motd文件(message-of-the-day)中的文本信息,并检查并显示该用户是否有邮件的信息。最后login程序改变成登录用户的用户ID并执行口令文件中该用户项中指定的shell程序,如bash或csh等。

如果口令文件/etc/passwd中该用户项中没有指定使用哪个shell程序,系统则会使用默认的/bin/sh程序。如果口令文件中也没有为该用户指定用户起始目录的话,系统就会使用默认的根目录/。有关login程序的一些执行选项和特殊访问限制的说明,请参见Linux系统中的在线手册页(man -8 login)。

Shell程序是一个复杂的命令行解释程序,是当用户登录系统进行交互操作时执行的程序。它是用户与计算机进行交互操作的地方。它获取用户输入的信息,然后执行命令。用户可以在终端上向shell直接进行交互输入,也可以使用shell脚本文件向shell解释程序输入。在Linux系统中,目前常用的shell有:

Bourne Again Shell,/bin/bash

C shell,/bin/csh(或tcsh)

BSD shell/bin/ash(或bsh)

在登录过程中,系统(login)会从口令文件用户对应登录项的最后一个字段知道应该为用户执行哪个shell程序。

shell程序中实现了一个具有流控制结构的语言,使用相当广泛。目前这些shell程序都朝着与IEEE POSIX 1003.2兼容的方向发展,因此它们各自虽然各自有自己的特点,但基本功能已经越来越相象。本书主要介绍bash的工作原理和实现机制,其它几种shell的实现机制与之类似。

在登录过程中login开始执行shell时,所带参数argv[0]的第一个字符是’-’,表示该shell是作为一个登录shell被执行。此时该shell程序会根据该字符,执行某些与登录过程相应的操作。登录shell会首先从/etc/profile文件以及.profile文件(若存在的话)读取命令并执行。如果在进入shell时设置了ENV环境变量,或者在登录shell的.profile文件中设置了该变量,则shell下一步会从该变量命名的文件中读去命令并执行。因此用户应该把每次登录时都要执行的命令放在.profile文件中,而把每次运行shell都要执行的命令放在ENV变量指定的文件中。设置ENV环境变量的方法是把下列语句放在你起始目录的.profile文件中。

ENV=$HOME/.anyfilename; export ENV

在执行shell时,除了一些指定的可选项以外,如果还指定了命令行参数,则shell会把第一个参数看作是一个脚本文件名并执行其中的命令,而其余的参数则被看作是shell的位置参数($1、$2等)。否则shell程序将从其标准输入中读取命令。

在执行shell程序时可以有很多选项,请参见Linux系统中的有关sh的在线手册页中的说明。

(责任编辑:云子)

分享到:
评论

相关推荐

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

    - 在`init/main.c`中可以看到内核尝试执行不同的`init`文件路径,直到成功为止。 - 如果指定的命令或文件无法执行,则会打印警告信息,并尝试下一个路径。 ##### 2. 执行 `/etc/inittab` 文件 - **定义**: `...

    Linux 系统启动过程和系统目录结构

    操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。 2. 运行 init:init 进程是系统所有进程的起点,可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。init 程序首先是需要...

    Linux启动过程-图文细化版.docx

    操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。 二、运行 init init 进程是系统所有进程的起点,可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。init 程序首先需要读取...

    Linux系统加载过程

    - **步骤四:** MBR中的引导加载程序(Boot Loader)负责加载操作系统的核心部分。常见的Boot Loader有GRUB(GRand Unified Bootloader)等。 - **步骤五:** 在GRUB中,用户可以选择启动多个不同的操作系统或不同版本...

    最小的Linux操作系统制作过程详解.doc

    【最小的Linux操作系统制作过程详解】 一、什么是BabyLinux BabyLinux是一个微型的Linux系统,它基于原始的Linux内核源代码和编译工具,结合Busybox的多功能性,构建在一个软盘上。尽管它非常小巧,但却包含了Linux...

    删除 rac 中的crs

    本文档的目的在于指导 DBA 和支持分析师了解如何在不同操作系统环境下(如 Sun Solaris、Linux、HP-UX、HP Tru64、IBM AIX)清除因 Oracle RAC 安装失败而遗留下来的 CRS 配置。 #### 范围与应用 本文档适用于所有...

    Linux的init进程启动过程

    Linux的init进程启动过程是操作系统启动的关键步骤,对于理解Linux系统如何从开机到提供服务有着至关重要的作用。init是Linux中的第一个用户级进程,它的进程ID始终为1,由内核在成功加载并初始化所有必要的硬件和...

    linux,AIX,HP-UNIX彻底删除crs

    本文将详细介绍如何在 Linux、AIX 和 HP-UNIX 等不同操作系统上执行这一操作。 #### 步骤详解 **步骤一:停止 Oracle Clusterware 服务** 在所有节点上停止 CRS 服务。这一步是确保在删除 CRS 文件前 CRS 服务已...

    关于linuxrc详解

    Linuxrc是一个在Linux启动过程中执行的重要脚本,尤其在使用initrd(初始化RAM磁盘)的系统中。initrd是一种临时的文件系统,用于在真正加载根文件系统之前提供必要的驱动和服务。当系统启动时,Linuxrc通常在initrd...

    Linux操作系统简介.pptx

    Linux操作系统的目录结构包括/bin、/usr、/sbin、/etc、/tmp、/lib、/var、/home、/opt、/boot、/bin、/localsrc、/rc.d、/named、/httpd、/ftprc、/3.d、/rc5.d、/init.d等。 Linux操作系统的特点包括: * 开放性...

    crs删除方法

    本文将详细介绍如何在不同操作系统上进行CRS的清理操作。 #### 一、Oracle RAC CRS清理步骤 ### 1. 运行脚本清理 - **第一步**:运行`root delete.sh` 和 `root deinstall.sh` 脚本。 - **路径**:这些脚本位于 `...

    Linux进程init主配置文件etcinittab的解析IT知识

    通过以上对`/etc/inittab`文件的具体解析可以看出,这个文件在Linux系统启动过程中扮演着极其重要的角色。它不仅定义了系统的初始化行为,还规定了在不同运行级别下的启动逻辑,以及如何处理各种特殊情况,如电源...

    Linux操作系统的目录结构一览

    在本文中,我们将详细介绍 Linux 操作系统下的目录结构。 /bin 目录:该目录存放着一百多个 Linux 下常用的命令和工具,如 ls、cp、mkdir 等,这些命令和工具都是 Linux 系统中最基本的组成部分。 /dev 目录:该...

    Linux怎么给一个普通用户关机权限.pdf

    在Linux操作系统中,关机权限是非常重要的一方面。普通用户如何获得关机权限,这对Linux操作系统的日常管理有着非常重要的影响。本文将从操作便捷、安全的角度,分五种情况分析讨论Linux操作系统的关机权限管理问题...

    Android 系统 Linux系统 内核kernel启动流程 init 进程介绍

    - 在此阶段,`/system/bin/init/selinux_setup`被执行,这是启动SELinux(Security Enhanced Linux)的步骤,用于控制系统的访问安全。初始化SELinux,加载规则,并配置相关的日志输出。 3. **第二阶段启动**: -...

    linux文件系统初始化过程(2)---挂载rootfs文件系统1

    挂载rootfs是Linux系统启动过程中的关键步骤,它确保了系统能够执行基本的初始化任务,并为后续的服务和应用程序提供运行环境。理解这个过程对于系统管理员和开发者来说至关重要,因为这有助于排查启动故障,优化...

    farsight构建Linux根文件系统.pdf

    根文件系统是Linux操作系统的核心组成部分,它包含了系统启动所需的所有基础文件、程序和库。通常,根文件系统包含以下几个关键元素: 1. **内核映像文件**:这是系统启动的起点,负责加载硬件驱动和初始化系统环境...

    Linux-init-process-analyse.pdf

    在Linux操作系统中,INIT进程,也称为系统初始化进程,是系统启动后执行的第一个用户级进程,其重要性不言而喻。这个文档“Linux-init-process-analyse.pdf”深入探讨了INIT进程的工作原理,以及相关的代码和配置...

    Linux操作系统基础教程

    五.Linux操作系统上有什么应用?.....................................................................................4 六.在那里可以找到讨论区?..........................................................

Global site tag (gtag.js) - Google Analytics