介绍
在本教程中,自动启动 Linux 服务,我们将退后一步,更详细地解释 init 进程。 你应该很好地了解它们如何控制守护进程的启动行为。
在第一部分本系列教程我们分享使用 MySQL 的如何崩溃或重启后启用的 Linux 服务自动启动一些实际的例子。
我们看到了如何从三个不同的初始化方式做到这一点:System V 的,Upstart,和 systemd。 阅读第一个教程在其上分布在默认情况下使用的 init 系统的复习。
在本教程中,我们将退后一步,解释为什么我们运行命令并编辑我们所做的配置文件。 我们将从 System V init 守护进程开始。 我们还将看到为什么它随着时间的推移被更新的 init 模式所取代。
先决条件
要学习本教程,你需要你创建的三个 DigitalOceanDroplet 之前 。
我们有:
- 运行 MySQL 的 Debian 6 服务器
- 一个运行 MySQL 的 Ubuntu 14.04 服务器
- 运行 MySQL 的 CentOS 7 服务器
我们建议您回到本系列的第 1 部分,先创建 Droplets。
此外,您将需要是 root 用户或在服务器上具有 sudo 权限。 要了解 sudo 的权限是如何工作的看到有关这个 Sudo 教程 DigitalOcean 。
您不应在生产 Linux 服务器上运行本教程中的任何命令,查询或配置。
运行级别
运行级别代表了 Linux 系统的当前状态。
该概念来自 System V init,其中 Linux 系统引导,初始化内核,然后输入一个(且只有一个)运行级别。
例如,运行级可以是 Linux 服务器的关闭状态,单用户模式,重新启动模式等。每个模式将指示什么服务可以在该状态下运行。
某些服务可以在一个或多个运行级别运行,但不能在其他运行级别运行。
运行级别由单个数字表示,它们可以具有介于 0 和 6 之间的值。以下列表显示了这些级别各自的含义:
- 运行级别 0:系统关闭
- 运行级别 1:单用户,救援模式
- 运行级别 2,3,4:多用户,与网络文本模式下启用
- 运行级别 5:多用户,启用网络,图形模式
- 运行级别 6:系统重启
运行级别 2,3 和 4 因分布而异。 例如,一些 Linux 发行版不实现运行级别 4,而其他的。 一些分布在这三个级别之间有明显的区别。 通常,运行级别 2,3 或 4 意味着 Linux 已在多用户,启用网络的文本模式下引导的状态。
当我们启用一个服务自动启动,我们实际上是将它添加到运行级别。 在系统 V 中,OS 将以特定的运行级别开始; 并且,当它启动时,它将尝试启动与该运行级别相关联的所有服务。
运行级别成为 systemd 的目标 ,我们将在 systemd 部分讨论。
Init 和 PID 1
初始化是在计算机启动和内核加载到内存中后,开始在 Linux 系统中的第一个进程。
除此之外,它决定了用户进程或系统服务应该按什么顺序加载,以及是否应该自动启动。
在 Linux 中每个进程都有一个进程 ID(PID)和init有 1. PID 就这么随后产卵系统自带的在线所有其他进程的父。
Init 的历史
随着 Linux 的发展,init 守护进程的行为也发生了变化。 最初,Linux 开始使用 System V init,与 UNIX 中使用的相同。 自那时以来,Linux 已经实施了Upstart的 init 守护进程(被 Ubuntu 创建)现在systemd的 init 守护进程(最初由 Fedora 的实现)。
大多数 Linux 发行版已逐渐从 System V 迁移或逐步淘汰,只保留向后兼容性。 FreeBSD 是 UNIX 的一种变体,它使用 System V 的不同实现,称为 BSD init。 旧版本的 Debian 也使用 SysVinit。
每个版本的 init 守护程序都有不同的管理服务的方式。 这些变化背后的原因是需要一个强大的服务管理工具,不仅处理服务,而且处理设备,端口和其他资源; 这将并行加载资源,这将从崩溃恢复。
系统 V 初始化序列
系统 V 使用了inittab
文件,它像 Upstart 后的 init 方法已经保持向后兼容性。
让我们通过 System V 的启动顺序:
- 在 init 守护进程从二进制文件创建
/sbin/init
- 第一个文件在 init 守护进程是读取
/etc/inittab
- 此文件中的一个条目决定机器应引导到的运行级别。 例如,如果运行级别的值指定为 3,则 Linux 将在启用了联网的多用户文本模式下启动。 (此运行级别称为默认运行级别)
- 接下来,init 守护进程会进一步眺望
/etc/inittab
的文件和在读什么初始化它需要为运行级别的脚本
因此,当 init 守护进程找到它需要为给定的运行级别运行的 init 脚本时,它基本上找出了启动它需要什么服务。 这些 init 脚本是您可以在其中配置单个服务的启动行为,就像我们在第一个教程中对 MySQL 的启动行为一样。
接下来,让我们详细了解 init 脚本。
系统 V 配置文件:Init 脚本
init 脚本是控制系统 V 中的特定服务(如 MySQL 服务器)的脚本。
服务的 Init 脚本由应用程序的供应商提供,或者带有 Linux 发行版(适用于本地服务)。 我们还可以为自定义创建的服务创建自己的 init 脚本。
当一个进程或服务(如 MySQL 服务器)启动时,其二进制程序文件必须加载到内存中。
根据服务的配置,此程序可能必须持续在后台执行(并接受客户端连接)。 启动,停止或重新加载此二进制应用程序的任务由服务的 init 脚本处理。 这就是所谓的初始化脚本,因为它初始化服务。
在 System V 中,init 脚本是 shell 脚本。
初始化脚本也被称为RC(运行命令)的脚本。
目录结构
将/etc
目录是启动脚本的父目录。
init 的 shell 脚本的实际位置是在/etc/init.d
。 这些脚本符号链接到rc
目录。
内/etc
目录下,我们有一些rc
目录,每一个在其名称中的数字。
数字表示不同的运行级别。 因此,我们有/etc/rc0.d
, /etc/rc1.d
, /etc/rc2.d
等等。
然后,每个内rc n .d
目录,我们有一个既具有开始的文件K
或S
在他们的文件名,后面两个数字。 这些是指向实际 init shell 脚本的符号链接文件。 为什么K
和S
? K 表示停止(即停止),“S”表示开始。
两个数字表示脚本的执行顺序。 因此,如果我们有一个名为 K25 some_script文件,它将 K99 another_script之前执行。
启动
让我们回来跟我们的启动顺序。 那么如何调用 init 脚本呢? 谁叫他们?
在 K 和 S 脚本不会由 init 守护程序直接调用,而是由另外一个脚本:在/etc/init.d/rc
脚本。
如果你还记得,在/etc/inittab
的文件通知 init 守护进程的运行级别,系统默认情况下应进入。 对于每一个运行级别,在一条线/etc/inittab
文件调用/etc/init.d/rc
脚本,传递上的运行级别作为参数。 基于此参数,脚本然后调用相应的下的文件/etc/rc n .d
目录。 所以,如果服务器靴子的 runlevel 2,根据脚本/etc/rc2.d
会被调用; 为级别 3,根据脚本/etc/rc3.d
被执行,等等。
在一个rc
目录,首先,所有 K 个脚本都按数字顺序以“一站式”的参数运行,然后所有的 S 脚本都以类似的方式用的参数运行“开始。” 在后台,将分别使用 stop 和 start 参数调用相应的 init shell 脚本。
现在,因为下的文件/etc/rc n .d
目录( K nn
和S nn
文件)符号链接而已,美其名曰意味着调用与站的实际初始化 shell 脚本和启动参数。
总而言之,当 Linux 服务器进入运行级别时,将运行某些脚本以停止某些服务,而其他脚本将运行以启动其他服务。
启动脚本中调用这个也恰好当系统切换到一个新的运行级别:对应/etc/rc
目录的脚本执行。 而且,由于这些钾和硫的文件是什么,但环节,根据实际的 shell 脚本/etc/init.d
目录与相应的启动执行或停止争论。
整个过程确保任何不应该在该运行级别运行的服务被停止,并且所有服务应该在该运行级别运行。
系统 V 自动启动
由于我们使服务在引导时自动启动,我们实际上是修改 init 行为。
因此,例如,当我们在运行级别 3 使能自动启动服务,幕后的过程中会在适当的环节/etc/rc3.d
目录。
如果这听起来很混乱,不要担心 – 我们会在一分钟内看到这一切意味着什么。
系统 V 示例
我们将回到我们的 MySQL 服务示例,这次有更多的理论。
第 1 步 – 登录 Debian Droplet
为了本教程的这一部分,我们将回到我们在第 1 部分中创建的 Debian 6 Droplet。使用 SSH 命令连接到服务器(Windows 用户可以使用像 PuTTy 这样的工具连接)。
ssh sammy@your_server_ip
第 2 步 – 查看 inittab
运行以下命令来查看inittab
文件的内容:
cat /etc/inittab | grep initdefault
输出应该是这样的:
Outputid:2:initdefault:
2 后的 id 字段显示系统被配置为以 runlevel 2 开始。这是默认的运行级别。 在这种情况下,Debian 将 2 指定为多用户文本模式。 如果执行以下命令:
cat /etc/inittab | grep Runlevel
输出确认:
Output# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.
第 3 步 – 查看 rc 目录
运行以下命令列出rc
目录。 你应该看到有以下六个:
ls -ld /etc/rc*.d
Outputdrwxr-xr-x 2 root root 4096 Jul 31 07:09 /etc/rc0.d
drwxr-xr-x 2 root root 4096 Jul 31 07:09 /etc/rc1.d
drwxr-xr-x 2 root root 4096 Jul 31 07:21 /etc/rc2.d
drwxr-xr-x 2 root root 4096 Jul 31 07:21 /etc/rc3.d
drwxr-xr-x 2 root root 4096 Jul 31 07:21 /etc/rc4.d
drwxr-xr-x 2 root root 4096 Jul 31 07:21 /etc/rc5.d
drwxr-xr-x 2 root root 4096 Jul 31 07:09 /etc/rc6.d
drwxr-xr-x 2 root root 4096 Jul 23 2012 /etc/rcS.d
由于在运行级别 2(从 inittab 文件默认的 init)在系统启动时,根据脚本/etc/rc2.d
的目录会在系统启动时执行。
列出此目录的内容:
ls -l /etc/rc2.d
这显示文件只是符号链接,每个指向/etc/init.d 下的脚本文件:
Output. . .
lrwxrwxrwx 1 root root 17 Jul 23 2012 S01rsyslog -> ../init.d/rsyslog
lrwxrwxrwx 1 root root 22 Jul 23 2012 S02acpi-support -> ../init.d/acpi-support
lrwxrwxrwx 1 root root 15 Jul 23 2012 S02acpi