分享

AIX启动过程分析

 Jason的书阁 2015-01-13

启动过程

上电自检(power on self test,post)。

ROS加载引导程序

系统只读存储器(system read only storage,ROS)。它是独立于操作系统的,我的理解就是相当于pc中的bios,它的作用就是定位和加载引导代码。引导代码也就是引导程序(initial program loading, IPL)。这段程序做一些准备工作,比如在内存中创建一种名为RAMFS的文件系统等。

引导程序定位BLV

之后就定位、加载并将控制权交给BLV(boot logical volume)。

BLV接管控制权,加载内核。调用3此rc.boot脚本

3次分别传递参数1、2、3完成系统启动。Rc.boot脚本在系统引导完成后的位置在/sbin目录下,若想详细了解3次rc.boot调用的过程可直接查看脚本内容。

三次rc.boot调用

Rc.boot 1

BLV从RAMFS启动init进程,执行启动脚本rc.boot 1。这个过程中的操作有:把ODM中的部分镜像从BLV复制到RAMFS。然后调用cfgmgr -f命令从这个ODM中读取一些基础设备的设置项,并完成这些基础设备的初始化。这些基础设备就是访问rootvg所需的所有的设备,把基础设备初始化从而使2阶段中激活rootvg可以顺利进行。在1阶段最后,还将调用bootinfo -b命令确定最后的启动设备。

Rc.boot 2

激活rootvg文件系统,并检查装载/usr、/var文件系统。

Rc.boot 3

启动/etc/init进程,它将读取/etc/inittab文件。

/etc/inittab中的首先将执行rc.boot 3.。这一过程主要完成装入/tmp文件系统、对rootvg进行同步,调用cfgmgr命令来初始化设备,调用cfgcon命令配置控制台,使用savebase命令同步BLV中的ODM和/根文件系统中的ODM。以及启动sysncd守护进程和errdemon。

之后,init将继续执行inittab文件中的内容,以最终完成系统的初始化。

BLV

BLV中包含的内容可在/usr/lib/boot目录下进行查看,主要包括系统AIX内核、ODM的一个简化版本,以及一些基础设备的配置方法。系统默认BLV=hd5.

Inittab文件

在执行完三次rc.boot后,ODM就已经被加载到内存,设备已初始化完成,文件系统也挂载完毕,操作系统基本的准备工作已经就绪。

之后就是完成操作系统的定制部分,比如启动cron、tcpip等的守护进程。这些之后的操作都是根据inittab文件中的内容进行的。

Inittab文件中每行的格式为:

Identifier:RunLevel:Action:Command

Identifier就是一个标示,就是起个名字,无实质意义。要求在整个inittab文件内唯一。

Runlevel指名该句执行的运行级别,内容为0-9的数字的任意组合。

Action为告诉init程序如何执行该行中的命令。

Command就是要执行的命令内容。

其中action可用的选项及意义有:

respawn:如果进程不存在,则启动该进程。不需要等待它的结束(继续扫描 /etc/inittab 文件)。当进程中止时,重新启动该进程。如果该进程已经存在,则什么也不做,继续扫描 /etc/inittab 文件。

wait当 init 命令进入到与该条目的运行级别相匹配的运行级别时,启动该进程,并等待它的结束。当 init 命令处于相同的运行级别时,所有后续对 /etc/inittab 文件的读取操作都将导致 init 命令忽略这个条目。

once:当 init 命令进入到与该条目的运行级别相匹配的运行级别时,启动该进程,并且不需要等待它的结束。当它中止时,不重新启动该进程。当系统进入一个新的运行级别,并且该进程的运行来自前一个运行级别更改时,不重新启动该程序。

boot仅在系统启动时(即在系统启动的过程中当 init 命令读取 /etc/inittab 文件的时候)处理该条目。启动该进程,不需要等待它的结束,并且当它中止时,不重新启动该进程。为了使得该指令有意义,运行级别应该为缺省值,或者它必须与启动时 init 命令的运行级别相匹配。对于系统硬件重新启动之后的初始化功能来说,这种操作是非常有价值的。

bootwait在系统启动之后,当 init 命令第一次从单用户进入到多用户状态时,处理该条目。启动该进程,等待它的结束;并且当它中止时,不重新启动该进程。如果 initdefault 为 2,那么在启动之后运行该进程。

powerfail:仅当 init 命令接收到电源故障信号 (SIGPWR) 时,才执行与这个条目相关联的进程。

powerwait:仅当 init 命令接收到电源故障信号 (SIGPWR) 时,才执行与这个条目相关联的进程,并且在继续处理 /etc/inittab 文件之前,必须等待它结束。

off:如果与这个条目相关联的进程目前正在运行,那么发送警告信号 (SIGTERM),等待 20 秒钟,然后使用删除信号 (SIGKILL) 终止该进程。如果该进程没有运行,则忽略这个条目。

ondemand:从功能上看,与 respawn 是相同的,但是这个操作适用于 a、b 或者 c 值,而不是运行级别。

initdefault仅在 init 命令最初被调用时,才扫描包含这个操作的条目。init 命令使用这个条目(如果它存在的话)来确定最初要进入的运行级别。通过使用运行级别字段中所指定的最高运行级别,就可以实现这一点,并使用它作为其初始状态。如果运行级别字段为空,那么将其解释为“0123456789”:因此,init 命令将进入运行级别 9。另外,如果 init 命令在 /etc/inittab 文件中没有找到 initdefault 条目,那么将要求用户在启动时指定一个最初的运行级别。

sysinit当 init 命令在登录之前尝试访问控制台时,将执行这种类型的条目。在正常情况下,这个条目仅用于初始化设备(init 命令可能会对这些设备询问有关运行级别的问题)。执行这些条目,并等待它们结束,然后再继续。

若想设置自己的脚本开机自启动,可直接修改此文件,

在此文件中加上一行。不过一般要加在文件的末尾,因为此文件的系统启动部分,有些程序之间有严格的依赖关系,故不能修改顺序。

此外,一般不建议修改此文件。若想把自己的程序设置成开机自启动,可直接在/etc/rc.d/rc2.d目录下,增加一个启动文件。这个目录下以S开头的为开机执行的脚本,并向脚本传递start参数。以K开头的为关机时执行的脚本,并向脚本传递stop参数。

这些脚本在inittab文件中安排的执行顺序为

l2:2:wait:/etc/rc.d/rc 2

即通过向rc脚本传递runlevel参数执行该文件夹下的内容。

一些其他命令

显示当前运行级别

Cat /etc/.init.state

更改当前运行级别(此命令要在终端中执行)

Telinit 3(运行级别的数字)

显示当前可用的启动列表

Bootlist -m normal -o

-m参数为指定模式,有normal、service、both 或者 prevboot。

-o参数为执行了指定改变后,显示启动列表。

更改当前的启动顺序

Bootlist -m normal cd0 hdisk0(后面直接接启动顺序)

修改inittab文件的几个命令

Mkitab增加记录,lsitab列出记录,chitab更改记录,rmitab删除记录。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多