Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列–3-systemd(d.bin和ohasd守护进程)

联系:QQ(5163721)

标题:Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列–3-systemd(d.bin和ohasd守护进程)

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

Linux的系统启动大致有3种主要模式:
(1)Linux5和以前的版本:SystemV style的runlevel式启动
(2)Linux6中:以upstart(例如,在ubuntu中)代表的event-based启动方式
(3)Linux7中:以systemd模式并行启动的模式
.
前面两种启动模式的大致都有如下过程:
1,内核引导(内核被载入内存并运行,初始化所有的设备驱动程序和数据结构等)
2,启动/sbin/init,它是一个由内核启动的用户级进程
3,由/sbin/init启动其他用户级的进程或服务(这些进程大多数是各种daemon进程,即各种服务进程),最终完成系统启动的全部过程
所以,init始终是第一个进程,其PID始终为1,它是系统所有进程的父进程.
.
第三种方式就是Linux7中采用的sytemd的方式,systemd不通过init脚本来启动,而是采用一种并行启动服务的机制(用缓存机制解决服务的依赖关系)。
这种方式的特点是与 sysvinit 完全兼容、更清晰的服务依赖关系、开机系统初始化服务并行启动、更少的shell开销。
systemd使用 socket 和 D-Bus 来开启服务,提供基于守护进程的按需启动策略
每个服务就是一个 unit,对应于运行级别,systemd有一个 target (multi-user.target)。
.
在Linux4和5中:

[root@lunar1 init.d]# ps -ef|grep init|grep -v grep
root         1     0  0 08:24 ?        00:00:00 init [3]                             
root      3549     1  0 08:28 ?        00:00:00 /bin/sh /etc/init.d/init.evmd run
root      3550     1  0 08:28 ?        00:00:01 /bin/sh /etc/init.d/init.cssd fatal
root      3731     1  0 08:28 ?        00:00:00 /bin/sh /etc/init.d/init.crsd run
root      4827  3550  0 08:28 ?        00:00:00 /bin/sh /etc/init.d/init.cssd oprocd
root      4853  3550  0 08:28 ?        00:00:00 /bin/sh /etc/init.d/init.cssd oclsomon
root      4877  3550  0 08:28 ?        00:00:00 /bin/sh /etc/init.d/init.cssd daemon
[root@lunar1 init.d]# 

在Linux6中:

[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]# 

在Linux7中已经不适用init进程启动了:

[root@lunar ~]# ps -ef|grep init|grep -v grep
root       734     1  0 04:26 ?        00:00:00 /usr/sbin/alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00main rdaemon
root      1132     1  0 04:26 ?        00:00:00 /bin/sh /etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null
grid      2107  1621  0 04:26 ?        00:00:00 /usr/bin/ssh-agent /etc/X11/xinit/Xclients
root      2108  1626  0 04:26 ?        00:00:00 /usr/bin/ssh-agent /etc/X11/xinit/Xclients
oracle    2109  1622  0 04:26 ?        00:00:00 /usr/bin/ssh-agent /etc/X11/xinit/Xclients
[root@lunar ~]# 

这里面的3个“/usr/bin/ssh-agent /etc/X11”进程是Linux7中配置了自动启动VNC。
.
这3种模式的不同在于:
1,SystemV style的runlevel式启动
在Linux5和以前的版本,init进程会读取/etc/inittab的内容,/etc/inittab中包含了很多启动其他用户进程和服务的指令。
因此,/etc/inittab的内容就决定系统进入哪一个runlevel,然后去/etc/rcN.d/(N代表runlevel的数字表示)去找相应的启动脚本。
即: /sbin/init => /etc/inittab => runlevel rc script [/etc/rcN.d]
这么设计的原因是服务之间有依赖关系,先启动哪些需要设置好,否则会造成所依赖的服务没启动导致的服务本身不能启动的问题。
不难看出,这是一种脚本式的串行的启动方式,因此启动效率很低。
例如:

[root@lunar1 init.d]# 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:3: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
。。。。。。。。。(省略部分)
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
h1:35:respawn:/etc/init.d/init.evmd run >/dev/null 2>&1 </dev/null
h2:35:respawn:/etc/init.d/init.cssd fatal >/dev/null 2>&1 </dev/null
h3:35:respawn:/etc/init.d/init.crsd run >/dev/null 2>&1 </dev/null
[root@lunar1 init.d]# 

这里看到,最上面的注释就解释了所有的运行界别(runlevel),比如我们常用的3是字符多用户界面,5是图形界面,0是关机,6是重启,1是单用户(我们有时候也成为救援模式)等等
然后接下来就执行rc.sysinit,然后一次执行/etc/rc.d/rc 0~/etc/rc.d/rc 6:
也就是去相应的/etc/rc.d//etc/rc[N].d/目录中运行相应的脚本:
Linux4,5和6中,由于都是通过init来引导的,因此/etc/rc.d/目录内容基本也都一样。
(Linux6和以前的版本,主要是inittab的内容和具体启动配置脚本不同)

[root@lunar1 init.d]# ll /etc/rc.d/
total 108
drwxr-xr-x  2 root root  4096 Oct 24 20:25 init.d
-rwxr-xr-x  1 root root  2352 Mar 17  2004 rc
drwxr-xr-x  2 root root  4096 Oct 26 07:47 rc0.d
drwxr-xr-x  2 root root  4096 Oct 26 07:47 rc1.d
drwxr-xr-x  2 root root  4096 Oct 26 07:47 rc2.d
drwxr-xr-x  2 root root  4096 Oct 26 07:47 rc3.d
drwxr-xr-x  2 root root  4096 Oct 26 07:47 rc4.d
drwxr-xr-x  2 root root  4096 Oct 26 07:47 rc5.d
drwxr-xr-x  2 root root  4096 Oct 26 07:47 rc6.d
-rwxr-xr-x  1 root root   341 Apr 21  2007 rc.local
-rwxr-xr-x  1 root root 27799 Dec 16  2005 rc.sysinit
[root@lunar1 init.d]# 

.
2,event-based启动方式
随着各种新技术和新硬件的发展,这种启动方式已经不能满足要求了,比如 越来越多的各种热插拔设备的出现等,系统启动时间太长等问题。
因此,从Linux6开始就出现了采用一种event-based的init启动方式,这种启动方式致力于改进两个方面的东西:
(1) 更多的开机启动程序是并行启动的(即改进以前的依赖大量shell脚本的串行启动方式,例如 SysV init);
(2)开机自动启动的程序尽量少,尽快进入工作模式
(3)自动处理开机启动服务间的各种依赖关系
在Linux6中,init进程也会读取/etc/inittab,但是该脚本内容缺省只有1行,即启动到字符集面还是图形界面:

[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]# 

正如这里看到的,Linux6的init只负责读取配置文件,处理各种服务和应用程序的依赖关系,根据事件来启动这些功能和服务,并动态的进行管理。
而事件在Linux6中是由“事件管理器”来管理,并使用initctl工具来控制,initctl的作用类似于Linux5中的chkconfig工具:

[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]# 

init进程读取的配置文件为/etc/init目录下的内容:
(注意:/etc/init仅仅在Linux6中有,可以称之为Liunx独有的特点了)

[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]# 

因此,在Linux6上安装11.2 GI时,oracle会为/etc/init.d/init.ohasd引导进程配置一个相应的配置文件,也就是/etc/init/oracle-ohasd.conf
这个就是Oracle顺应Linux的发展,根据系统启动时的引导和启动服务的机制在Linux中不同版本的变化而变化
因此,/etc/init.d/init.ohasd在Linux6中使用/etc/init/oracle-ohasd.conf配置文件启动取代了Linux5中的配置使用/etc/inittab启动的方式。
.
3,systemd模式并行启动的模式
使用 socket 和 D-Bus 来开启服务,提供基于守护进程的按需启动策略。
服务配置文件放在 /lib/systemd/system/ 目录下,以 *.service命名。没有运行级别的概念,但是完全兼容sysvinit。
Linux7中,因为启动机制不同,因此/etc/rc.d/目录缺少了rc,rc.sysinit和rc.local文件:

[root@lunar ~]# ll /etc/rc.d/
total 8
drwxr-xr-x. 2 root root 4096 Oct  9 12:29 init.d
drwxr-xr-x. 2 root root   73 Oct  9 12:29 rc0.d
drwxr-xr-x. 2 root root   73 Oct  9 12:29 rc1.d
drwxr-xr-x. 2 root root   73 Oct  9 12:29 rc2.d
drwxr-xr-x. 2 root root   73 Oct  9 12:29 rc3.d
drwxr-xr-x. 2 root root   73 Oct  9 12:29 rc4.d
drwxr-xr-x. 2 root root   73 Oct  9 12:29 rc5.d
drwxr-xr-x. 2 root root   73 Oct  9 12:29 rc6.d
-rw-r--r--. 1 root root  473 Mar  7  2015 rc.local
[root@lunar ~]# 

不过具体的启动脚本都还在,比如,在10.2中,CRS开机自动启动的脚本:

[root@lunar1 init.d]# ll /etc/rc.d/rc*.d/*crs*
lrwxrwxrwx  1 root root 20 Oct 26 07:47 /etc/rc.d/rc0.d/K19init.crs -> /etc/init.d/init.crs
lrwxrwxrwx  1 root root 20 Oct 26 07:47 /etc/rc.d/rc1.d/K19init.crs -> /etc/init.d/init.crs
lrwxrwxrwx  1 root root 20 Oct 26 07:47 /etc/rc.d/rc2.d/K19init.crs -> /etc/init.d/init.crs
lrwxrwxrwx  1 root root 20 Oct 26 07:47 /etc/rc.d/rc3.d/S96init.crs -> /etc/init.d/init.crs
lrwxrwxrwx  1 root root 20 Oct 26 07:47 /etc/rc.d/rc4.d/K19init.crs -> /etc/init.d/init.crs
lrwxrwxrwx  1 root root 20 Oct 26 07:47 /etc/rc.d/rc5.d/S96init.crs -> /etc/init.d/init.crs
lrwxrwxrwx  1 root root 20 Oct 26 07:47 /etc/rc.d/rc6.d/K19init.crs -> /etc/init.d/init.crs
[root@lunar1 init.d]# 

在11.2和12.1中,CRS开机自动启动的脚本(Linux6和Linux7中都显示类似如下):

[root@lunarlib crsconfig]# ll /etc/rc.d/rc*.d/*ohasd
lrwxrwxrwx 1 root root 17 Jan 11 17:11 /etc/rc.d/rc0.d/K15ohasd -> /etc/init.d/ohasd
lrwxrwxrwx 1 root root 17 Jan 11 17:11 /etc/rc.d/rc1.d/K15ohasd -> /etc/init.d/ohasd
lrwxrwxrwx 1 root root 17 Jan 11 17:11 /etc/rc.d/rc2.d/K15ohasd -> /etc/init.d/ohasd
lrwxrwxrwx 1 root root 17 Jan 11 17:11 /etc/rc.d/rc3.d/S96ohasd -> /etc/init.d/ohasd
lrwxrwxrwx 1 root root 17 Jan 11 17:11 /etc/rc.d/rc4.d/K15ohasd -> /etc/init.d/ohasd
lrwxrwxrwx 1 root root 17 Jan 11 17:11 /etc/rc.d/rc5.d/S96ohasd -> /etc/init.d/ohasd
lrwxrwxrwx 1 root root 17 Jan 11 17:11 /etc/rc.d/rc6.d/K15ohasd -> /etc/init.d/ohasd
[root@lunarlib crsconfig]# 

在Linux7中,系统启动加载的单元配置如下:

[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]# 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]# 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]# 

具体看下服务定义文件的格式:

[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
看下手册,具体simple是啥含义:

[root@lunar system]# man systemd.service 
。。。。。。。。
       Type=
           Configures the process start-up type for this service unit. One of simple, forking, oneshot, dbus, notify or idle.

           If set to simple (the default value if neither Type= nor BusName= are specified), it is expected that the process configured with ExecStart= is the main process of the service.
           In this mode, if the process offers functionality to other processes on the system, its communication channels should be installed before the daemon is started up (e.g. sockets
           set up by systemd, via socket activation), as systemd will immediately proceed starting follow-up units.
。。。。。。。。
[root@lunar system]# 

没看太明白,大概意思是采用socket方式启动(非fork进程的方式),并且立即启动。
查看一下该进程:

[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]# 

Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列--1-简介
Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列-2-修改主机名和hostnamectl工具的使用
Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列–3-systemd(d.bin和ohasd守护进程)
Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列–4-target(图形界面和字符界面)
Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列–5-防火墙
Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列–6-开机自动启动或者禁用服务
Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列-7-网络管理之添加网
Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列-7-网络管理之修改IP地址
Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列-7-网络管理之修改网络接口名
Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列-8-在Linux7上安装11.2 RAC和12.1 RAC需要禁用哪些服务
Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列-9-Linux 7.2上的virbr0设备
Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列-10-ABRT-系统启动后自动检查和报告错误
Linux7(CentOS,RHEL,OEL)和Oracle RAC环境系列-11-配置VNC和常见问题处理

此条目发表在 Installation and Deinstall, Linux, ORACLE 12C, RAC 分类目录,贴了 , , , , , 标签。将固定链接加入收藏夹。

发表评论

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

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