联系: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(图形界面和字符界面)