Linux开机程序内幕(1)

  由于操作系统正在变得越来越复杂所以开机引导和关机下电的过程也越来越智能化从简单的DOS系统转移到Windows NT系统人们已经亲身感受到了这些变化——这已不仅仅是核心操作系统的启动引导和关闭了还包括必须要同时启动或者关闭相当数量的服务项目类似于Windows NTLinux系统启动过程需要打开的服务项目也是数量极大的

  这里我们假设大家已经熟悉其它操作系统的引导过程了解硬件的自检引导步骤就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始介绍Linux开机引导的步骤

  加载内核

  LILO启动之后如果你选择了Linux作为准备引导的操作系统第一个被加载的东西就是内核请记住此时的计算机内存中还不存在任何操作系统PC(因为它们天然的设计缺陷)也还没有办法存取机器上全部的内存因此内核就必须完整地加载到可用RAM的第一个兆字节之内为了实现这个目的内核是被压缩了的这个文件的头部包含着必要的代码先设置CPU进入安全模式(以此解除内存限制)再对内核的剩余部分进行解压缩

  执行内核

  内核在内存中解压缩之后就可以开始运行了此时的内核只知道它本身内建的各种功能也就是说被编译为模块的内核部分还不能使用最基本的是内核必须有足够的代码设置自己的虚拟内存子系统和根文件系统(通常就是ext文件系统)一旦内核启动运行对硬件的检测就会决定需要对哪些设备驱动程序进行初始化从这里开始内核就能够挂装根文件系统(这个过程类似于Windows识别并存取C盘的过程)内核挂装了根文件系统之后将启动并运行一个叫做init的程序

  注意在这里我们故意略去了Linux内核启动的许多细节这些细节只有内核开发人员才感兴趣如果你好奇的话可以访问http//wwwredhatcom:地址处的 Kernel Hackers Guide

  init进程

  init进程是非内核进程中第一个被启动运行的因此它的进程编号PID的值总是init读它的配置文件/etc/inittab决定需要启动的运行级别(Runlevel)从根本上说运行级别规定了整个系统的行为每个级别(分别由到的整数表示)满足特定的目的如果定义了initdefault级别这个值就直接被选中否则需要由用户输入一个代表运行级别的数值

  输入代表运行级别的数字之后init根据/etc/inittab文件中的定义执行一个命令脚本程序缺省的运行级别取决于安装阶段对登录程序的选择是使用基于文本的还是使用基于XWindow的登录程序

  rc命令脚本程序

  我们已经知道当运行级别发生改变时将由/etc/inittab文件定义需要运行哪一个命令脚本程序这些命令脚本程序负责启动或者停止该运行级别特定的各种服务由于需要管理的服务数量很多因此需要使用rc命令脚本程序其中最主要的一个是/etc/rcd/rc它负责为每一个运行级别按照正确的顺序调用相应的命令脚本程序我们可以想象这样一个命令脚本程序很容易变得难以控制!为了防止这类事件的发生需要使用精心设计的方案

  对每一个运行级别来说在/etc/rcd子目录中都有一个对应的下级目录这些运行级别的下级子目录的命名方法是rcXd其中的X就是代表运行级别的数字比如说运行级别的全部命令脚本程序都保存在/etc/rcd/rcd子目录中

  在各个运行级别的子目录中都建立有到/etc/rcd/initd子目录中命令脚本程序的符号链接但是这些符号链接并不使用命令脚本程序在/etc/rcd/initd子目录中原来的名字如果命令脚本程序是用来启动一个服务的其符号链接的名字就以字母S打头如果命令脚本程序是用来关闭一个服务的其符号链接的名字就以字母K打头

  许多情况下这些命令脚本程序的执行顺序都很重要如果没有先配置网络接口就没有办法使用DNS服务解析主机名!为了安排它们的执行顺序在字母S或者K的后面紧跟着一个两位数字数值小的在数值大的前面执行比如/etc/rcd/rcd/Sinet就会在/etc/rcd/rcd/Snamed之前执行(Sinet配置网络设置Snamed启动DNS服务器)

  存放在/etc/rcd/initd子目录中的被符号链接上的命令脚本程序是真正的实干家是它们完成了启动或者停止各种服务的操作过程当/etc/rcd/rc运行通过每个特定的运行级别子目录的时候它会根据数字的顺序依次调用各个命令脚本程序执行它先运行以字母K打头的命令脚本程序然后再运行以字母S打头的命令脚本程序对以字母K打头的命令脚本程序来说会传递Stop参数类似地对以字母S打头的命令脚本程序来说会传递Start参数

总有一天,我会丢下我所有的疲倦和理想,

Linux开机程序内幕(1)

相关文章:

你感兴趣的文章:

标签云: