11.2和12c RAC的ohasd守护进程在不同Linux版本的演变

联系:QQ(5163721)

标题:11.2和12c RAC的ohasd守护进程在不同Linux版本的演变

作者:Lunar©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]

前面我们已经讲解过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 </dev/null
[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 如果要让系统启动时不启动crs,那么就不能包含上述行。当然这个方法是Oracle不支持的,Oracle建议使用crsctl disable has来禁止开机启动HAS。
(注意,如果rac环境,使用crsctl disable crs命令)

/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, <miquels@drinkel.nl.mugnet.org>
#               Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS are:
#   0 – halt (Do NOT set initdefault to this)
#   1 – Single user mode
#   2 – Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 – Full multiuser mode
#   4 – unused
#   5 – X11
#   6 – reboot (Do NOT set initdefault to this)
# 
id:5:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.  
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# 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

# Run xdm in runlevel 5
x:3:respawn:/etc/X11/prefdm -nodaemon


h1:35:respawn:/etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null
[root@lunarnew1 grid]# 

到了Linux 6中,init只负责读取配置文件,处理各种服务和应用程序的依赖关系,根据事件来启动这些功能和服务,并动态的进行管理。
而事件在Linux 6中是由“Upstart 事件管理器”来管理的,并且这些事件使用initctl工具来控制,initctl的作用类似于Linux5中的chkconfig工具。
我这里的一套在Linux 6.6环境安装的11.2.0.4 单机ASM环境(Standalone),可以看到其中并没有Linux 5中那样/etc/inittab.orig文件:

[root@lunarlib rootwork]# ll /etc/inittab.orig
ls: cannot access /etc/inittab.orig: No such file or directory
[root@lunarlib rootwork]# 

也就是说,到了Linux 6版本,Oracle不再将/etc/init.d/init.ohasd的启动不再写入/etc/inittab文件(不由/sbin/init进程根据inittab来启动ohasd的脚本):

[root@lunarlib rootwork]# ll /etc/inittab*
-rw-r-----. 1 root root 884 Apr  6  2015 /etc/inittab
[root@lunarlib rootwork]# 
[root@lunarlib rootwork]# tail /etc/inittab
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:
[root@lunarlib rootwork]# 

那么在Linux 6中Oracle RAC的这个守护进程如何启动的呢?
因为从Linux 6开始系统采用upstart事件引导机制(好像是Linux 6特有的),根据/etc/init/目录下的事件管理配置文件来决定系统在启动时运行哪些服务:

[root@lunarlib init.d]# cat /etc/init/oracle-ohasd.conf
# Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. 
#
# Oracle OHASD startup

start on runlevel [35]
stop  on runlevel [!35]
respawn
exec /etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null
[root@lunarlib init.d]# 

因此,Oracle也采用了这种方式。安装GI时,oracle会为/etc/init.d/init.ohasd引导进程配置一个相应的配置文件,也就是/etc/init/oracle-ohasd.conf配置文件。
也就是说,在Linux 6中使用/etc/init目录下的oracle-ohasd.conf配置文件的启动方式,取代了Linux5中的配置使用/etc/inittab启动的方式。
这个就是Oracle顺应Linux的发展,根据系统启动时的引导和启动服务的机制在Linux中不同版本的变化而变化。

[root@lunarlib rootwork]# ll /etc/init
total 72
-rw-r--r--. 1 root root  412 Jul 22  2014 control-alt-delete.conf
-rw-r--r--. 1 root root  130 Mar 12  2014 init-system-dbus.conf
-rw-r--r--. 1 root root  463 Jul 22  2014 kexec-disable.conf
-rw-r--r--  1 root root  220 Oct 11 01:30 oracle-ohasd.conf
-rw-r--r--. 1 root root  560 Jul 22  2014 plymouth-shutdown.conf
-rw-r--r--. 1 root root  357 Jul 22  2014 prefdm.conf
-rw-r--r--. 1 root root  505 Jul 22  2014 quit-plymouth.conf
-rw-r--r--. 1 root root  417 Jul 22  2014 rc.conf
-rw-r--r--. 1 root root 1046 Jul 22  2014 rcS.conf
-rw-r--r--. 1 root root  430 Jul 22  2014 rcS-emergency.conf
-rw-r--r--. 1 root root  725 Jul 22  2014 rcS-sulogin.conf
-rw-r--r--. 1 root root 2915 Nov 21  2013 readahead-collector.conf
-rw-r--r--. 1 root root 1559 Nov 21  2013 readahead.conf
-rw-r--r--. 1 root root  726 Nov 21  2013 readahead-disable-services.conf
-rw-r--r--. 1 root root 1302 Jul 22  2014 serial.conf
-rw-r--r--. 1 root root  791 Jul 22  2014 splash-manager.conf
-rw-r--r--. 1 root root  473 Jul 22  2014 start-ttys.conf
-rw-r--r--. 1 root root  335 Jul 22  2014 tty.conf
[root@lunarlib rootwork]# 
[root@lunarlib rootwork]# ls -l /etc/init/oracle-ohasd.conf
-rw-r--r-- 1 root root 220 Oct 11 01:30 /etc/init/oracle-ohasd.conf
[root@lunarlib rootwork]# 

在Linux 6中,可以使用/sbin/initctl工具(类似于Linux5的chkconfig工具)来管理/etc/init.d/init.ohasd的启动。
(注意,Linux5中不能使用chkconfig管理/etc/init.d/init.ohasd进程)

[root@lunarlib rootwork]# initctl list
rc stop/waiting
tty (/dev/tty3) start/running, process 4353
tty (/dev/tty2) start/running, process 4349
tty (/dev/tty1) start/running, process 4347
tty (/dev/tty6) start/running, process 4365
tty (/dev/tty5) start/running, process 4361
tty (/dev/tty4) start/running, process 4359
plymouth-shutdown stop/waiting
control-alt-delete stop/waiting
rcS-emergency stop/waiting
readahead-collector stop/waiting
kexec-disable stop/waiting
quit-plymouth stop/waiting
rcS stop/waiting
prefdm stop/waiting
init-system-dbus stop/waiting
readahead stop/waiting
splash-manager stop/waiting
start-ttys stop/waiting
readahead-disable-services stop/waiting
rcS-sulogin stop/waiting
serial stop/waiting
oracle-ohasd start/running, process 12661
[root@lunarlib rootwork]# 

查看oracle-ohasd服务的信息:

[root@lunarlib rootwork]# /sbin/initctl list |grep oracle-ohasd
oracle-ohasd start/running, process 2897
[root@lunarlib rootwork]# 
[root@lunarlib rootwork]# ps -ef|grep ohasd
root      2897     1  0 06:05 ?        00:00:01 /bin/sh /etc/init.d/init.ohasd run
root      6651  6336  0 07:52 pts/0    00:00:00 grep ohasd
[root@lunarlib rootwork]# 

到了Linux 7,由于系统的引导方式又变化了,系统采用systemd机制,使用 socket 和 D-Bus 来并行启动服务的模式,提供基于守护进程的按需启动策略,已经没有运行级别的概念(但是完全兼容sysvinit)。
哪些需要启动的服务的配置文件放在 /lib/systemd/system/ 目录下,以 *.service命名,类似如下:
在Linux7中,系统启动加载Oracle RAC使用的ohasd单元需要如下配置(安装时,执行root.sh就会配置ohasd服务单元,如果没有配置好,自己手工配置就可以了):

[root@lunar system]# ll /etc/systemd/system/|grep ohasd
-rw-r--r--  1 root root  361 Oct  9 12:29 oracle-ohasd.service
[root@lunar system]# 
[root@lunar system]# systemctl list-units -t service|grep ohasd
ohasd.service                      loaded active exited  ohasd.service
oracle-ohasd.service               loaded active running Oracle High Availability Services
[root@lunar system]# 

事实上,在Linux 7(当前的版本只有Linux 7.1和7.2)上安装,Oracle 11.2.0.4(在11.2的版本中,只有11.2.0.4支持Linux 7,其余11.2支持Linux 7以下的版本)和12c(当前的是12.1和12.2beta版本)RAC时,有bug,该文件是不能被root.sh创建的,需要自己手工创建。
具体看下服务定义文件的格式:

[root@lunar system]# cat /etc/systemd/system/oracle-ohasd.service
# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
#
# Oracle OHASD startup

[Unit]
Description=Oracle High Availability Services
After=syslog.target network.target remote-fs.target

[Service]
ExecStart=/etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null
Type=simple
Restart=always

[Install]
WantedBy=multi-user.target graphical.target
[root@lunar system]# 

systemd的单元定义中,如果指定了“After=”,那么就表示这个服务依赖于After指定的服务。如果没有After,就表示这个服务可以跟其他的并行启动。
这里定义了oracle-ohasd.service在syslog.target network.target remote-fs.target这三个单元启动后开始启动
执行命令为:/etc/init.d/init.ohasd run >/dev/null 2>&1 启动类型为:simple
最后,我们查看系统当前加载的所有单元:

[root@lunar system]# ll /etc/systemd/system/
total 16
drwxr-xr-x. 2 root root   30 Oct  8 07:17 basic.target.wants
drwxr-xr-x. 2 root root   30 Oct  7 23:08 bluetooth.target.wants
lrwxrwxrwx. 1 root root   41 Oct  7 23:08 dbus-org.bluez.service -> /usr/lib/systemd/system/bluetooth.service
lrwxrwxrwx. 1 root root   44 Oct  7 23:10 dbus-org.freedesktop.ModemManager1.service -> /usr/lib/systemd/system/ModemManager.service
lrwxrwxrwx. 1 root root   46 Oct  7 23:04 dbus-org.freedesktop.NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service
lrwxrwxrwx. 1 root root   57 Oct  7 23:04 dbus-org.freedesktop.nm-dispatcher.service -> /usr/lib/systemd/system/NetworkManager-dispatcher.service
lrwxrwxrwx  1 root root   41 Oct  8 16:51 default.target -> /usr/lib/systemd/system/multi-user.target
drwxr-xr-x. 2 root root   85 Oct  7 23:02 default.target.wants
lrwxrwxrwx. 1 root root   35 Oct  7 23:08 display-manager.service -> /usr/lib/systemd/system/gdm.service
drwxr-xr-x. 2 root root   31 Oct  7 23:02 getty.target.wants
drwxr-xr-x. 2 root root   90 Oct  9 12:29 graphical.target.wants
drwxr-xr-x. 2 root root 4096 Oct  9 12:29 multi-user.target.wants
lrwxrwxrwx. 1 root root   38 Oct  7 23:04 mysql.service -> /usr/lib/systemd/system/mysqld.service
-rw-r--r--  1 root root  361 Oct  9 12:29 oracle-ohasd.service
drwxr-xr-x. 2 root root   25 Oct  7 23:05 printer.target.wants
drwxr-xr-x. 2 root root 4096 Oct  8 07:32 sockets.target.wants
drwxr-xr-x. 2 root root   35 Oct  7 23:10 spice-vdagentd.target.wants
drwxr-xr-x. 2 root root 4096 Oct  8 22:19 sysinit.target.wants
drwxr-xr-x. 2 root root   83 Oct  7 23:05 system-update.target.wants
[root@lunar system]# 
[root@lunar system]# ps -ef|grep ohasd
root      1132     1  0 04:26 ?        00:00:00 /bin/sh /etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null
grid      4017     1  0 04:27 ?        00:00:59 /u01/app/12.1.0.2/grid/bin/ohasd.bin reboot
root     11362  8874  0 09:50 pts/1    00:00:00 grep --color=auto ohasd
[root@lunar system]# 
此条目发表在 Database, Linux, RAC 分类目录,贴了 , , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>