首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux之init.d、rc.d文件夹说明

Linux之init.d、rc.d文件夹说明

作者头像
AsiaYe
发布2019-11-06 14:42:27
12.6K1
发布2019-11-06 14:42:27
举报
文章被收录于专栏:DBA随笔DBA随笔
今天是星期三,正常上班,主要研究了一些mysql的安装上面的残留问题,然后学了学consul的部署,还是有些疑问不太清楚的,等到研究清楚了再统一发出来。今天主要补充点Linux方面的知识。

Linux的几个重要文件

rc.d,init.d文件夹的说明

今天在研究mysql的安装的时候,最后一步要创建一个软连接,使得mysql服务可以自启动,代码如下:

ln -s /usr/local/mysql/bin/mysqld /etc/init.d/mysqld

这句Linux命令看着没什么问题,但是在网上搜索的时候,看到了另外一个版本,不同之处在于后面的路径是:

XXXXXXX /etc/rc.d/init.d/mysqld

看到这里,我产生了一点疑问,为什么两个文件夹不一样,却能实现一样的效果呢?之前简单研究过一些Linux开机自启动的东西,但是时间太长了,忘记了,所以又重新把这块儿捋了捋。

首先进入/etc目录下,可以看到这里有两个init相关的目录,分别是init和init.d,如下:

再看看rc相关的目录,可以发现,有11个相关的目录,如下:

不着急,一个一个分析,首先看看init相关的目录。

问题1:init目录和init.d目录有什么区别?

进入init目录观察,如下:

我们可以看到,里面都是一些配置文件,而进入init.d目录,可以看到:

里面都是各种各样的可执行文件,通过ll命令可以看到,init.d目录是rc.d/init.d目录的软连接,也就是说,这个目录和rc.d里面的init.d目录的内容保持一致。

通过将两者对比并查阅相关资料,得到如下结论:

1. /etc/init.d里的shell脚本(SysVinit工具所包含的函数库)能够响应start,stop,restart,reload命令来管理某个具体的应用。这些脚本也可被其他trigger直接激活执行,这些trigger被软连接在/etc/rcN.d/中。

2. /etc/init包含的是Upstart(Sysinit的替代版本)的配置文件,和/etc/init.d的作用几乎差不多。这样似乎/etc/init可以看作/etc/init.d的演化版本。而SysVinit脚本是和新的Upstart兼容的。这就是这两个文件目录的来历和前世今生。.d文件夹主要是为了方便和清楚的逻辑描述而命名成这样。

问题2:etc/init.d目录和etc/rc.d/init.d目录有什么区别?

其实是一样的,init.d是rc.d/init.d的一个软连接,内容都相同。

看完init.d命令,再来看看rc.d目录

问题3:rc.d目录和rc*.d目录有什么区别?

这里先看一张图,这是rc.d文件夹中的内容:

通过上面的图我们可以得到结论,rc0.d,rc1.d等等一系列的文件夹,都在rc.d文件夹里面,而rc.d文件夹外面的rc0.d文件都是软连接,连接的内容也正是rc.d文件夹里面的内容。

问题4:为什么要创建init.d和rc0.d等软连接?

其实他们都是用来放服务脚本的,当Linux启动时,会寻找这些目录中的服务脚本,并根据脚本的run level确定不同的启动级别。

  在制作服务脚本的过程中,使用了Linux的两个版本,CentOS和Ubuntu,需要在两个版本中都可以开机启动服务。但Ubuntu没有 /etc/rc.d/init.d这个目录,所以,为了保持同一种服务在CentOS和Ubuntu使用的统一性,将服务脚本(注:服务脚本在两个不同版本中是不同的)都放在 /etc/init.d 目录下,最终达到的效果是相同的。

  需要说明的是:在CentOS和Ubuntu两个版本中,除了服务脚本放置的目录是相同的,服务脚本的编写及服务配置都是不同的。比如CentOS使用Chkconfig进行配置,而Ubuntu使用sysv-rc-conf进行配置。

问题5:init.d和rc.d等文件夹的作用?

“/etc/rc.d/init.d/目录下的脚本就类似与windows中的注册表,在系统启动的时候某些指定脚本将被执行。“首先通过这句话,让大家多着写文件夹有一个直观的认识。

rc.d的内容如下: init.d/ :各种服务器和程序的二进制文件存放目录。这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。系统在安装时装了好多rpm包,这里面就有很多对应的脚本。执行这些脚本可以用来启动,停止,重启这些服务。 rc*.d/: 各个启动级别的执行程序连接目录。里头的东西都是指向init.d/的一些软连接。如下图:

还有三个脚本:rc.sysinit, rc, rc.local

这些脚本都是在程序启动的时候运行的,具体启动时, redhat的启动方式和执行次序是: 1.加载内核 2.执行init程序 3./etc/rc.d/rc.sysinit # 由init执行的第一个脚本 4./etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式 5./etc/rc.d/rc.local 6./sbin/mingetty # 等待用户登录

上述第3步主要完成的工作有: 1.调入keymap以及系统字体 2.启动swapping 3.设置主机名 4.设置NIS域名 5.检查(fsck)并mount文件系统 6.打开quota 7.装载声卡模块 8.设置系统时钟等等。

上述第4步/etc/rc.d/rc则根据其参数指定的运行模式 (运行级别,下一个问题会讲到)来执行相应目录下的脚本。凡是以Kxx开头的 ,代表kill,即杀死进程,都以stop为参数来调用;凡是以Sxx开头的,代表开始进程,都以start为参数来调用。调用的顺序按xx从小到大来执行。例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调用 /etc/rc.d/rc3.d/下的脚本,值得一提的是,Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个,该脚本是在系统初始化级别脚本运行之后再执行的,因此可以安全地在里面添加你想在系统启动之后执行的脚本。常见的情况是你可以再里面添加nfs挂载/mount脚本。此外,你也可以在里面添加一些调试用的脚本命令。所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。

问题6:什么是运行级别?

Init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。init进程上来首先做的事是去读取/etc/目录下inittab文件中initdefault id值,这个值称为运行级别(run-level)。它决定了系统启动之后运行于什么级别。运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6 ,具有不同的功能。不同的运行级定义如下:   # 0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)   # 1 - 单用户模式   # 2 - 多用户,没有 NFS   # 3 - 完全多用户模式(标准的运行级)   # 4 – 系统保留的   # 5 - X11 (x window)   # 6 - 重新启动 (千万不要把initdefault 设置为6,否则将一直在重启 )

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档