当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运行rc,linuxrc详解相关推荐

  1. init.d,rc.d详解 Linux运行时详解

    Linux 启动时需要哪些步骤呢?本文将详细描述不同的运行级在启动中的作用. 对于那些在DOS/Win9x/NT 平台下的高级用户而言,Linux 似乎是一个怪物.没有config.sys ,没有 a ...

  2. Linux系统7个运行级别图文详解

    Linux系统7个运行级别图文详解 当安装linux操作系统时将选择下列那一个操作 ______ A.选择 "图形登录方式" 设定系统开始运行级为4 B.选择 "文本登录 ...

  3. Linux中etc目录详解

    Linux中etc目录详解 /etc目录 包含很多文件.许多网络配置文件也在/etc 中. /etc/rc   or/etc/rc.d   or/etc/rc*.d   启动.或改变运行级时运行的sc ...

  4. Linux开启动过程详解

    Linux开启动过程详解 Linux启动过程 前言: Linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布.在加上用户空间的应用程序之后 ...

  5. linux ps命令使用详解

    PS是LINUX下最常用的也是非常强大的进程查看命令 1. ps简介 前面介绍的两个命令都是用于查看当前系统用户的情况,下面就来看看进程的情况,这也是本章的主题. 要对进程进行监测和控制,首先必须要了 ...

  6. linux系统设置服务开机启动3种方法,Linux开机启动程序详解

    linux系统设置服务开机启动 方法1:.利用ntsysv伪图形进行设置,利用root登陆 终端命令下输入ntsysv 回车:如下图 方法2:利用命令行chkconfig命令进行设置 简要说明一下ch ...

  7. Linux下的时间详解【转】

    Linux下的时间详解 [转载]http://www.fangshanzi.com/linux-time-function-detail/ 1.首先来总结一下hwclock,这个容易晕: 1)/etc ...

  8. linux开机启动服务详解

    http://blog.163.com/sjt_linux/blog/static/19931031920126295452884/ linux开机启动服务详解(转) 2012-07-29 17:45 ...

  9. linux下crontab命令的用法,linux 定时任务crontab用法详解

    linux 定时任务crontab用法详解 linux中crontab命令用于设置周期性被执行的指令,该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读 ...

最新文章

  1. OpenCV代码提取:flip函数的实现
  2. 在linux下的使用复制命令cp,不让出现“overwrite”(文件覆盖)提示的方法。
  3. MyAdapter Andriod
  4. setGeometry
  5. linux下Qt cannot find -lGL错误的解决方法
  6. 隐藏java_Java方法隐藏
  7. Salesforce Ventures为云初创公司Vlocity注资5000万美元
  8. 计算机一级天文小知识,不得了,天文知识增加了! | 第20期
  9. Java进阶:The driver is automatically registered via the SPI and manual loading of the driver class is
  10. Django-----模板嵌套
  11. ubuntu播放文件需要MPEG-4 AAC解码器
  12. SPI操作flash MX25L64读写数据
  13. 甘超波:NLP理解层次
  14. python 伯努利分布
  15. 2000坐标系xy坐标几位_详解| 带你认识新一代坐标系——2000国家大地坐标系
  16. Jetson Xavier NX系统安装至 nvme 硬盘
  17. android 模拟自动点击,自动点击模拟器app
  18. 儿童节到了!让 GitHub 上这几个小游戏帮你找回童真吧!
  19. PMSM FOC 滑膜观测器 SMO 算法
  20. 让自由软件的风暴来的更猛烈吧!

热门文章

  1. pyqtgraph基础入门(三):同一个widget绘制多个坐标轴
  2. Consul 命令(CLI)
  3. 图像图片处理_深度学习
  4. 达梦数据库关键字冲突问题解决及常用SQL语句整理
  5. 2步搞定Linux中搭建nginx文件服务器
  6. python 取字符串的最后一位_python如何截取字符串最后的几位数字
  7. 防止.class被反编译 的方法
  8. 你的3D渲染图像看起很假?检查一下是否有这个5个原因
  9. 【Unity植物大战僵尸】关卡管理器开发(中)(二十)
  10. 机器学习偏差、方差、泛化误差的完整总结