前面我们已经讲解过11.2 RAC的启动过程,可以注意到,RAC的根守护进程是/etc/init.d/init.ohasd,那么不同版本的Linux中/etc/init.d/init.ohasd是如何启动的呢?
注意:12.1的非Flex Cluster启动过程跟11.2 RAC一致。但是从12.2beta版 RAC的测试结果来看,从12.2开始OUI安装很可能只有Flex Cluster了,没有了11.2的那种普通RAC了。
.
Linux4和Linux5中,在完成核内引导(内核被载入内存并运行,初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序/sbin/init的方式来启动其他用户级的进程或服务。
所以,init始终是第一个进程,其PID始终为1(ps -aux | less),它是系统所有进程的父进程.
[root@lunarnew1 grid]# ps -ef|grep init|grep -v grep
root 1 0 0 Jan14 ? 00:00:00 init [5]
root 2987 1 0 Jan14 ? 00:00:00 /bin/sh /etc/init.d/init.ohasd run
[root@lunarnew1 grid]#
[root@lunarnew1 grid]# which init
/sbin/init
[root@lunarnew1 grid]#
接下来/sbin/init会读取/etc/inittab的内容,/etc/inittab中包含了很多启动其他用户进程和服务的指令:
其格式如下:
identifier : run_level : action : process
因此,开机自动启动/etc/init.d/init.ohasd的脚本也配置在/etc/inittab中。
我的环境是Linux5.10,看一下ohasd的启动脚本的具体信息:
[root@lunarnew1 grid]# cat /etc/issue
Oracle Linux Server release 5.10
Kernel \r on an \m
[root@lunarnew1 grid]#
[root@lunarnew1 grid]# ll /etc/inittab.orig
ls: /etc/inittab.orig: No such file or directory
[root@lunarnew1 grid]# ll /etc/inittab*
-rw-r--r-- 1 root root 1671 Mar 21 2015 /etc/inittab.no_crs
-rw-r--r-- 1 root root 1740 Mar 21 2015 /etc/inittab.crs
-rw-r--r-- 1 root root 1740 Mar 21 2015 /etc/inittab
[root@lunarnew1 grid]#
我们看一下这三个文件哪里不同:
[root@lunarnew1 grid]# diff /etc/inittab.crs /etc/inittab
[root@lunarnew1 grid]# diff /etc/inittab.no_crs /etc/inittab
58a59,60
>
> h1:35:respawn:/etc/init.d/init.ohasd run >/dev/null 2>&1
[root@lunarnew1 grid]#
可以看出,/etc/inittab.no_crs的内容就是在没安装GI以前的/etc/inittab备份文件,而/etc/inittab.crs的内容就是安装GI以后/etc/inittab 备份文件
也就是说,在Linux 5中,安装完RAC(10.2或者11.2)后,该脚本就会增加上面一行启动ohasd守护进程的脚本,如果要在系统启动时启动crs,那么就需要让/etc/inittab中包含下面的一行启动命令:
h1:35:respawn:/etc/init.d/init.ohasd run >/dev/null 2>&1
/etc/inittab的全部内容如下(注意,只有Linux 5 和Linux5以下的版本是这样的):
[root@lunarnew1 grid]# cat /etc/inittab
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg,
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runlevels used by RHS