Linux开机启动程序详解

技术文档网 2021-06-08

加电自检-->根据BIOS中的设置从指定的设备启动-->找到设备MBR中的bootloader引导启动系统-->启动kernel-->启动init进程

什么是引导加载程序?

引导加载程序之争:了解 LILO 和 GRUB BIOS

1 加载内核

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

2 执行内核

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

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

3 init进程

init进程是非内核进程中第一个被启动运行的,因此它的进程编号PID的值总是1。init读它的配置文件/etc/inittab(以前),决定需要启动的运行级别(Runlevel)。

Linux的运行级别

 0:表示关机
 1:表示单用户模式,在这个模式中,用户登录不需要密码,默认网卡驱动是不被加载,一些服务不能用。
 2:表示多用户模式,NFS服务不开启
 3,表示命令行模式
 4,这个模式保留未用
 5,表示图形用户模式
 6,表示重启系统

从根本上说,运行级别规定了整个系统的行为,每个级别(分别由0到6的整数表示)满足特定的目的。如果定义了initdefault级别,这个值就直接被选中,否则需要由用户输入一个代表运行级别的数值。 输入代表运行级别的数字之后,init根据/etc/inittab文件中的定义执行一个命令脚本程序。缺省的运行级别取决于安装阶段对登录程序的选择:是使用基于文本的,还是使用基于X-Window的登录程序。由于需要管理的服务数量很多,因此需要使用rc命令脚本程序。其中,最主要的一个是/etc/rc.d/rc,它负责为每一个运行级别按照正确的顺序调用相应的命令脚本程序。我们可以想象,这样一个命令脚本程序很容易变得难以控制!为了防止这类事件的发生,需要使用精心设计的方案。 对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。这些运行级别的下级子目录的命名方法是rcX.d,其中的X就是代表运行级别的数字。

比如说,运行级别3的全部命令脚本程序都保存在/etc/rc.d/rc3.d子目录中。在各个运行级别的子目录中,都建立有到/etc/rc.d/init.d子目录中命令脚本程序的符号链接,但是,这些符号链接并不使用命令脚本程序在/etc/rc.d/init.d子目录中原来的名字。如果命令脚本程序是用来启动一个服务的,其符号链接的名字就以字母S打头;如果命令脚本程序是用来关闭一个服务的,其符号链接的名字就以字母K打头。 许多情况下,这些命令脚本程序的执行顺序都很重要。如果没有先配置网络接口,就没有办法使用DNS服务解析主机名!为了安排它们的执行顺序,在字母S或者K的后面紧跟着一个两位数字,数值小的在数值大的前面执行。

比如:/etc/rc.d/rc3.d/S50inet就会在/etc/rc.d/rc3.d/S55named之前执行(S50inet配置网络设置,55named启动DNS服务器)。存放在/etc/rc.d/init.d子目录中的、被符号链接上的命令脚本程序是真正的实干家,是它们完成了启动或者停止各种服务的操作过程。当/etc/rc.d/rc运行通过每个特定的运行级别子目录的时候,它会根据数字的顺序依次调用各个命令脚本程序执行。它先运行以字母K打头的命令脚本程序,然后再运行以字母S打头的命令脚本程序。对以字母K打头的命令脚本程序来说,会传递Stop参数;类似地对以字母S打头的命令脚本程序来说,会传递Start参数。

编写自己的rc命令脚本在维护Linux系统运转的日子里,肯定会遇到需要系统管理员对开机或者关机命令脚本进行修改的情况。

有两种方法可以用来实现修改的目的:

第一种方法:编辑/etc/rc.d/rc.local脚本,当然是两种方法中比较简单的。如果想在这个命令脚本程序中添加内容,只需要使用喜欢的编辑器程序打开它,再把打算执行的命令附加到文件的末尾就可以了。这对一两行的修改来说的确很便利。

如果确实需要使用一个命令脚本程序--

第二种方法: 编写一个rc命令脚本程序的过程并不像想象中那么困难。我们下面就给出一个例子,看看它是怎样实现的(顺便说一句,你可以把我们的例子当作范本,按照自己的需要进行修改和添加)。 假设你打算每隔60分钟调用一个特殊的程序来弹出一条消息,提醒自己需要从键盘前面离开休息一会儿,命令脚本程序将包括下面几个部分:

  • 关于这个命令脚本程序功能的说明(这样就不会在一年之后忘记它);
  • 在试图运行它之前验证这个命令脚本程序确实存在;
  • 接受start和stop参数并执行要求的动作。 编写好新的命令脚本程序之后,再从相关的运行级别子目录中加上必要的符号链接,来控制这个命令脚本程序的启动或者停止。在我的印象中,只想让它在运行级别3或者运行级别5中启动,原因是我认为只有这两个运行级别才是日常工作的地方。最后,希望这个命令脚本程序在进入运行级别6(重启动)的时候被关闭。

详解

相关文章

  1. Linux iptables学习笔记

    最近工作需要跟firewall打交道,在这里写下自己的使用心得。 firewall主要的特性有: 1.支持区域设置 2.运行时跟持久化的配置是分离的 3.能够动态管理 iptables 不管是从

  2. Linux vim命令使用教程

    vim使用 参考链接 vim4种模式: 普通模式 插入模式 可视模式 命令行模式 进入vim,按下i或a进入插入模式 按ESC进入普通模式 在该模式下可以使用方向键 h向左 j向下 k向上

  3. 校准linux系统时间

    服务器的时间对于记录请求和数据库操作时间具有重要意义,对于一些如数据库备份的操作,时间尤为重要,需要避开白天业务繁忙时间进行。 修改时区 # cp /etc/localtime /etc/localt

  4. yum与rpm使用说明

    rpm 命令 rpm 命令是 RPM 软件包的管理工具。 语法 rpm (选项)(参数) 选项 -h:安装时列出标记;-i:安装时显示套件的相关信息;-v:安装时显示指令执行过程;-e:卸载已安

  5. service与chkconfig的替代者systemctl

    在安装 redis 时,看到将 redis 配置成 service 系统服务后,采用 service redisd start 命令启动;在安装 mariadb 时,看到利用 systemctl st

随机推荐

  1. Linux iptables学习笔记

    最近工作需要跟firewall打交道,在这里写下自己的使用心得。 firewall主要的特性有: 1.支持区域设置 2.运行时跟持久化的配置是分离的 3.能够动态管理 iptables 不管是从

  2. Linux vim命令使用教程

    vim使用 参考链接 vim4种模式: 普通模式 插入模式 可视模式 命令行模式 进入vim,按下i或a进入插入模式 按ESC进入普通模式 在该模式下可以使用方向键 h向左 j向下 k向上

  3. 校准linux系统时间

    服务器的时间对于记录请求和数据库操作时间具有重要意义,对于一些如数据库备份的操作,时间尤为重要,需要避开白天业务繁忙时间进行。 修改时区 # cp /etc/localtime /etc/localt

  4. yum与rpm使用说明

    rpm 命令 rpm 命令是 RPM 软件包的管理工具。 语法 rpm (选项)(参数) 选项 -h:安装时列出标记;-i:安装时显示套件的相关信息;-v:安装时显示指令执行过程;-e:卸载已安

  5. service与chkconfig的替代者systemctl

    在安装 redis 时,看到将 redis 配置成 service 系统服务后,采用 service redisd start 命令启动;在安装 mariadb 时,看到利用 systemctl st