前面我们已经讲解过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]#