在应急响应时,开机启动项是必查的项,下面梳理一下关于开机启动与服务相关需要排查的点。直接从init开始说。
RHEL5、RHEL6、RHEL7的init系统分别为SysV init、Upstart、Systemd

CentOS 5

启动流程如下:

1)加载BIOS的硬件信息与进行自我测试,并依据设置取得第一个可启动设备;2)读取并执行第一个启动设备内MBR(主引导分区)的Boot Loader(即是gurb等程序);3)依据Boot Loader的设置加载Kernel,Kernel会开始检测硬件与加载驱动程序;4)在硬件驱动成功后,Kernel会主动调用init进程(/sbin/init),init的配置文件/etc/inittab;5)init执行/etc/rc.d/rc.sysinit文件来准备软件的操作环境(如网络、时区等);6)init执行runlevel的各个服务的启动(script方式);7)init执行/etc/rc.d/rc.local文件;8)init执行终端机模拟程序mingetty来启动login程序,最后等待用户登录。

init程序会读取init的配置文件/etc/inittab,并依据此文件来进行初始化工作。/etc/inittab文件主要作用是指定运行级别,执行系统初始化脚本(/etc/rc.d/rc.sysinit),启动相应运行级别下的服务和启动终端。

[root@jianshe_28 admin]# 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.sysinitl0: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:5:respawn:/etc/X11/prefdm -nodaemon

inittab文件中的值都是如下格式:
id:runlevel:action:process

id:
id是指入口标识符,他是个字符串,对于getty、mingetty等,需求id和tty的编号相同,否则getty将不能正常工作。

runlevel:
指定runlevel的级别。能指定多个runlevel级别,也能不为runlevel字段指定特定的值。
运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6,具有不同的功能。不同的运行级定义如下:

# 0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)
# 1 - 单用户模式
# 2 - 多用户,没有 NFS
# 3 - 完全多用户模式(标准的运行级)
# 4 - 系统保留的
# 5 - X11 (x window)
# 6 - 重新启动

action:

定义了该进程应该运行在何种状态下,其中action常用的种类有:

下面看一下具体的配置

id:3:initdefault:

设置runlevel

si::sysinit:/etc/rc.d/rc.sysinit

执行了/etc/rc.d/rc.sysinit,一个shell脚本,他主要是完成一些系统初始化的工作,例如激活交换分区,检查磁盘,加载硬件模块及其他一些需要优先执行任务。

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
/etc/rc.d/rc是个shell脚本,接受runlevel参数,去执行该runlevel目录下的所有的rc启动脚本。以启动级别为3为例,/etc/rc.d/rc3.d/其实都是一些链接文件,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。而这些rc启动脚本有着类似的用法,他们一般能接受start、stop、restart、status等参数。

凡是以Kxx开头的,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。xx是数字、表示的是启动顺序,按xx从小到大来执行。
我们来用chkconfig修改一下试试

另外说明一下应急响应中我们都会检查/etc/rc.local,其实也是在rcN.d中。
/etc/rc.local是软链到了/etc/rc.d/rc.local

Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个

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
init接下来会打开6个终端,以便用户登录系统。

总结一下,针对CentOS5系统,需要排查的点:
1)/etc/inittab
该文件是可以运行process的,这里我们添加一行
0:235:once:/bin/vinc
内容如下

重启

2)/etc/rc.d/rc.sysinit
在最后插入一行/bin/vinc

3)/etc/rc.d/init.d
4)/etc/rc.d/rc.local

CentOS 6

启动流程如下:

init会读取配置文件/etc/inittab 和 /etc/init/*.conf。先看一下/etc/inittab

[root@server120 src]# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# 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:

通过注释可以看到,upstart只使用inittab读取默认的runlevel。添加其他的配置都不会生效,其他的配置都移动到了/etc/init/*.conf下。
系统初始化/etc/init/rcS.conf
对应runlevel的服务启动/etc/init/rc.conf
终端配置/etc/init/tty.conf
….

总结一下,针对CentOS6系统,需要排查的点:
1)/etc/init/*.conf
vim tty.conf,添加一行
exec /bin/vinc
内容如下

重启

2)/etc/rc.d/rc.sysinit
3)/etc/rc.d/init.d
4)/etc/rc.d/rc.local

0x03 CentOS7

开机启动流程如下:

1)UEFi或BIOS初始化,运行POST开机自检2)选择启动设备3)引导装载程序, centos7是grub24)加载装载程序的配置文件: /etc/grub.d/   /etc/default/grub    /boot/grub2/grub.cfg5)加载initramfs驱动模块6)加载内核选项7)内核初始化, centos7使用systemd代替init8)执行initrd.target所有单元,包括挂载/etc/fstab9)从initramfs根文件系统切换到磁盘根目录10)systemd执行默认target配置,配置文件/etc/systemd/system/default.target11)systemd执行sysinit.target初始化系统及basic.target准备操作系统12)systemd启动multi-user.target下的本机与服务器服务13)systemd执行multi-user.target下的/etc/rc.d/rc.local14)systemd执行multi-user.target下的getty.target及登入服务15)systemd执行graphical需要的服务

CentOS7使用的是systemd,相较于以前的init有很大的不同。

/etc/inittab是空的

[root@localhost init.d]# cat /etc/inittab | grep -v "^$" | grep -v "^#"[root@localhost init.d]#
也没有/etc/init目录
[root@localhost init.d]# ls -al /etc/initls: cannot access /etc/init: No such file or directory

/etc/rc3.d/和/etc/rc.d/init.d/还存在,所以向后兼容sysv init脚本,在centos5、6系统上/etc/init.d/目录下的服务脚本,systemd也能够对其进行管理

[root@localhost init.d]# ls -al /etc/rc3.d/total 4drwxr-xr-x.  2 root root   81 May 30 14:09 .drwxr-xr-x. 10 root root 4096 May 30 14:31 ..lrwxrwxrwx.  1 root root   20 Nov  7  2016 K50netconsole -> ../init.d/netconsolelrwxrwxrwx.  1 root root   17 Nov  7  2016 S10network -> ../init.d/networklrwxrwxrwx.  1 root root   23 Jan 17  2017 S90zabbix_agentd -> ../init.d/zabbix_agentdlrwxrwxrwx.  1 root root   15 May 30 14:09 S99ossec -> ../init.d/ossec

systemd提供更优秀的框架以表示系统服务间的依赖关系,尽可能启动更少进程,尽可能将更多进程并行启动,尽可能减少对shell脚本的依赖。systemd的核心概念是unit,unit表示不同类型的systemd对象,通过配置文件进行标识和配置,文件中主要包含了系统服务,监听socket,保存的系统快照以及其他与init相关的信息。

查看所有的unit类型:

[root@localhost system]# systemctl -t help       Available unit types:servicesocketbusnametargetsnapshotdevicemountautomountswaptimerpathslicescope

用途如下:

Service unit:文件扩展名.service 用于定义系统服务
Target unit:文件扩展名.target 用于模拟实现运行级别
Device unit: .device 用于定义内核识别的设备
Mount unit: .mount 定义文件系统的挂载点
Socket unit: .socket 用于标识进程间通行用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
Snapshot unit: .snapshot 管理系统快照
Swap unit: .swap 用于标识swap设备
Automount unit: .automount 文件系统的自动挂载点
Path unit: .path 用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如spool目录

配置文件中主要保存在:

/usr/lib/systemd/system/    每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/ /run/systemd/system/    系统执行过程中所产生的服务脚本,比上面目录优先运行/etc/systemd/system/    管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行
[root@localhost system]# ls /usr/lib/systemd/system/abrt-ccpp.service                       psacct.serviceabrtd.service                           quotaon.serviceabrt-oops.service                       rc-local.service...[root@localhost system]# ls /run/systemd/system/session-1006.scope      session-161401.scope    session-24243.scope    session-54837.scopesession-1160.scope      session-162551.scope    session-24243.scope.d  session-54837.scope.d...[root@localhost system]# ls /etc/systemd/system/basic.target.wants                           default.target           sockets.target.wantsdbus-org.fedoraproject.FirewallD1.service    default.target.wants     sysinit.target.wantsdbus-org.freedesktop.NetworkManager.service  getty.target.wants       system-update.target.wantsdbus-org.freedesktop.nm-dispatcher.service   multi-user.target.wants

我们来看下sshd.service

[root@localhost system]# cat sshd.service | grep -v "^$" | grep -v "^#"[Unit]Description=OpenSSH server daemonDocumentation=man:sshd(8) man:sshd_config(5)After=network.target sshd-keygen.serviceWants=sshd-keygen.service[Service]EnvironmentFile=/etc/sysconfig/sshdExecStart=/usr/sbin/sshd -D $OPTIONSExecReload=/bin/kill -HUP $MAINPIDKillMode=processRestart=on-failureRestartSec=42s[Install]WantedBy=multi-user.target

文件包含三部分。

[Unit]:描述信息与依赖关系

[Service]:ExecStartPre 定义启动服务之前应该运行的命令;ExecStart 定义启动服务的具体命令行语法。

[Install]:WangtedBy 表明这个服务是在多用户模式下所需要的。

我们再来看下multi-user.target

[root@localhost system]# cat multi-user.target | grep -v "^$" | grep -v "^#"[Unit]Description=Multi-User SystemDocumentation=man:systemd.special(7)Requires=basic.targetConflicts=rescue.service rescue.targetAfter=basic.target rescue.service rescue.targetAllowIsolate=yes
 

Requires表明 multi-user.target 启动的时候 basic.target 也必须被启动,basic.target 停止的时候,multi-user.target 也必须停止。接着查看 basic.target 文件,会发现它又指定了 sysinit.target 等其他的单元必须随之启动。同样 sysinit.target 也会包含其他的单元。采用这样的层层链接的结构,最终所有需要支持多用户模式的组件服务都会被初始化启动好。

此外在/etc/systemd/system 目录下还可以看到诸如*.wants 的目录

[root@localhost system]# ls multi-user.target.wants/   brandbot.path  plymouth-quit.service           systemd-logind.servicedbus.service   plymouth-quit-wait.service      systemd-update-utmp-runlevel.servicegetty.target   systemd-ask-password-wall.path  systemd-user-sessions.service

放在该目录下的配置单元文件等同于在[Unit]小节中的 wants 关键字,即本单元启动时,还需要启动这些单元。

查看multi-user.target的依赖关系

[root@localhost system]# systemctl list-dependencies multi-user.target     multi-user.target├─abrt-ccpp.service
├─abrt-oops.service
├─abrt-vmcore.service
├─abrt-xorg.service
├─abrtd.service
├─atd.service
├─auditd.service

查看systemd管理的所有单元

[root@localhost system]# systemctl list-unit-filesUNIT FILE                                   STATE  proc-sys-fs-binfmt_misc.automount           static dev-hugepages.mount                         static dev-mqueue.mount                            static

查看服务状态

[root@localhost system]# systemctl list-unit-files --type service     UNIT FILE                                   STATE  abrt-ccpp.service                           enabledabrt-oops.service                           enabled

State的状态如下:

loaded:Unit配置文件已处理active(running):一次或多次持续处理的运行active(exited):成功完成一次性的配置active(waiting):运行中,等待一个事件inactive:不运行enabled:开机启动disabled:开机不启动static:开机不启动,但可被另一个启用的服务激活

使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名(例如 sshd.service),如果无扩展名,systemctl 默认把扩展名当作 .service。

启动httpd服务

[root@localhost system]# systemctl start httpd

停止httpd服务

[root@localhost system]# systemctl stop httpd

查看httpd服务运行状态

[root@localhost system]# systemctl status httpd

在centOS7上由.target来代替运行级别。

查看我们的机器上有多少个target

[root@localhost system]# ls /usr/lib/systemd/system/*.target | head -n 5/usr/lib/systemd/system/basic.target/usr/lib/systemd/system/bluetooth.target/usr/lib/systemd/system/cryptsetup-pre.target/usr/lib/systemd/system/cryptsetup.target/usr/lib/systemd/system/ctrl-alt-del.target

运行级别与target的对照如下:

runlevel0.target -> poweroff.targetrunlevel1.target -> rescue.targetrunlevel2.target -> multi-user.targetrunlevel3.target -> multi-user.targetrunlevel4.target -> multi-user.targetrunlevel5.target -> graphical.targetrunlevel6.target -> reboot.target

运行级别切换

在centOS6上,我们切换级别使用init,在centOS7上来切换用:

systemctl isolate poweroff.target

要想切换运行级别,AllowIsolate=yes才可以。

[root@localhost system]# cat poweroff.target | grep AllowAllowIsolate=yes

修改文件需执行systemctl daemon-reload才能生效。

查看默认运行级别

[root@localhost system]# systemctl get-defaultmulti-user.target

修改默认运行级别

[root@localhost system]# systemctl set-default graphical.targetRemoved symlink /etc/systemd/system/default.target.Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.

查看开机启动程序(相当于chkconfig –list)

ls /etc/systemd/system/multi-user.target.wants/

开机启动(相当于chkconfig httpd on)

[root@localhost system]# systemctl enable httpd.service Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

去除开机启动(相当于chkconfig httpd off)

[root@localhost system]# systemctl disable httpd.service                                Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.

查看服务是否开机启动(相当于chkconfig –list httpd)

[root@localhost system]# systemctl is-enabled httpd.serviceenabled

CentOS7下rc.local文件默认不会在开机执行,我们来看一下rc.local文件的内容

[root@localhost system]# cat /etc/rc.local#!/bin/bash# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES## It is highly advisable to create own systemd services or udev rules# to run scripts during boot instead of using this file.## In contrast to previous versions due to parallel execution during boot# this script will NOT be run after all other services.## Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure# that this script will be executed during boot.

可以看到一段注释,翻译如下:

#这个文件是为了兼容性的问题而添加的。

#强烈建议创建自己的systemd服务或udev规则来在开机时运行脚本而不是使用这个文件。

#与以前的版本引导时的并行执行相比较,这个脚本将不会在其他所有的服务后执行。

#请记住,你必须执行“chmod +x /etc/rc.d/rc.local”来确保确保这个脚本在引导时执行。

然后我们看/usr/lib/systemd/system/rc-local.service

[root@localhost system]# cat /usr/lib/systemd/system/rc-local.service | grep ExecStartExecStart=/etc/rc.d/rc.local start

那我们启动下rc-local.service

[root@localhost system]# chmod u+x /etc/rc.d/rc.local[root@localhost system]# systemctl start rc-local

总结一下,针对CentOS7系统,需要排查的点:

1)排查修改的service

find /usr/lib/systemd/system/ -name "*.service" | xargs ls -alt | head -n 5
find /etc/systemd/system/ -name "*.service" | xargs ls -alt | head -n 5

2)/etc/rc.d/init.d

3)/etc/rc.d/rc.local

不过需要看/etc/rc.d/rc.local是否有x权限。

【应急基础】————2、开机启动项相关推荐

  1. linux 启动rsyslog服务_我的服务器怎么老这么慢,难道说是被挖矿了?linux开机启动项自查...

    黑客技术点击右侧关注,了解黑客的世界! Java开发进阶点击右侧关注,掌握进阶之路! Python开发点击右侧关注,探讨技术话题! 作者丨小熊爱编程 来源丨编程三分钟(coding3min) &quo ...

  2. Win10:添加或者删除开机启动项,在开机启动项中添加在用户自定义的启动文件

    介绍 主要解决问题 添加或者删除开机启动项(在不借助流氓软件的情况下通过自己的设置完成) 在开机启动项中添加在用户自定义的启动文件(开机启动项选项中没有存在的) 方案一 win+R,窗口中输入msco ...

  3. Windows系统下制作一个记事本以语音方式读出你输入的文字 以及放到开机启动项,开机自启动读出语音!

    右键新建一个记事本,输入下面代码: 代码: createobject("SAPI.spvoice").speak"123" 在speak里面输入你想让他读出来的 ...

  4. win7如何启动计算机,win7开机启动项怎么设置 电脑开机启动项在哪里设置

    现在的软件很多安装程序都是默认的开机启动,电脑上如果软件的开机启动项多了就会使得电脑的开机速度很慢,这个时候就需要大家手动来设置开机启动项了,那电脑开机启动项在哪里设置呢?小编的电脑的系统是win7的 ...

  5. win10怎么设置开机启动项目_苹果mac开机启动项怎么设置

    mac系统有没有开机启动项?如何设置呢?有些软件我们不需要开机启动,有些软件我们又想让它开机启动,那么mac系统下要怎么禁止或添加开机启动项呢?下面macdown小编给小伙伴详细的讲解苹果mac开机启 ...

  6. win7关闭开机启动项_电脑开机全是各种广告?来看看我怎么解决的吧

    很多用户都烦恼自己的电脑一开机,就开始弹各种广告出来了. 影响开机速度,还很影响自己使用电脑的心情. 其实这种情况是电脑开机启动项太多,以及一些流氓软件的广告弹窗导致的. 那我们该怎么解决电脑一开机就 ...

  7. linux学习-----开机启动项设置,ntp服务,防火墙服务,rpm服务,cron服务

    Linux自由服务(2) 1.设计主机名: FQDN(全限定域名) 1.临时设计主机名 语法:    hostname 设计的主机名 2.永久设置主机名 方法:    /etc/sysconfig/n ...

  8. win10怎么设置开机启动项目_开机启动项怎么设置呢?禁用自启动程序

    大家好,今天分享一篇来源小白一键重装网(xiaobaixitong.com)关于解答:开机启动项怎么设置呢? 每日壁纸 · 长按保存 开机启动项怎么设置呢?电脑开机速度变慢了很可能是开机启动项太多导致 ...

  9. 计算机关闭开启启动程序,如何设置开机启动项?电脑开机启动项怎么增加与关闭?...

    大家都知道刚买来的电脑开机速度很快,但是随着各种应用的安装,开机速度会变得非常慢,电脑也会变得异常的卡顿,这是因为有很多应用都会默认开机自启动,电脑每次开机都会依次自启动这些应用,可想而知电脑会变得多 ...

最新文章

  1. wxWidgets:wxString概述
  2. 【转】指针和引用的区别
  3. struts-resultType属性
  4. eclipse折叠if语句块_Python学习日志01判断 if 语句
  5. 学成在线--2.CMS前端页面查询开发
  6. mybatis-java代码调用部分
  7. 【BZOJ-2768】冠军调查 最小割
  8. Linux下如何查看JDK安装路径
  9. 阅读笔记-JavaScript学习指南
  10. 服务器无线存储器,教你把无线路由器打造成网络存储器
  11. LabVIEW formula node
  12. 在asp中实现由动态网页转变为静态网页
  13. 工业视觉检测入门——如何设计一个合适的检测方案?(需求分析+光学设计+检测算法+UI交互+后端数据)
  14. 腾讯后端面试题python_腾讯后端开发,一面面试题分享
  15. MyEclipse 注册码分享
  16. SQLite虚表介绍
  17. Effective Modern C++ Item 27 熟悉依万能引用型别进行重载的替代方案
  18. Pjsip加入G729编码的方法
  19. 整钱换零钱问题。把1元换成1分、2分、5分的硬币,共有多少种不同的换法(C语言)
  20. 角度距离计算坐标公式

热门文章

  1. SpringBoot ActiveMQ 整合使用
  2. android6.0 PowerManagerService状态分析
  3. Tanzu学习系列之TKGm 1.4 for vSphere 组件集成(二)
  4. p1633[进制应用]砝码称重
  5. 视频在线发布网站HTML模板分享
  6. LiveData vs EventBus?不,他们其实可以一起
  7. 深入理解Java虚拟机之Java类加载机制,Java类实例化过程详解。
  8. 6、Hello World官网教程(TX2)第一部分
  9. android界面UI美化:沉浸模式、全透明或半透明状态栏及导航栏的实现
  10. CVPR 2020 论文大盘点-图像修复Inpainting篇