网站搜索

LFCS:管理系统启动流程和服务(SysVinit、Systemd 和 Upstart)- 第 7 部分


几个月前,Linux 基金会宣布了 LFCSLinux 基金会认证系统管理员)认证,这是一项令人兴奋的新计划,其目标是让来自世界各地的个人能够获得在 Linux 系统上执行基本到中级系统管理任务的认证。这包括支持已经运行的系统和服务,以及第一手的问题发现和分析,以及决定何时向工程团队提出问题的能力。

以下视频简要介绍了 Linux 基金会认证计划。

这篇文章是 10 个教程系列中的第 7 部分,在这一部分中,我们将解释如何管理 LFCS 认证考试所需的 Linux 系统启动进程和服务。

管理Linux启动过程

Linux 系统的引导过程由几个阶段组成,每个阶段由不同的组件表示。下图简要总结了启动过程并显示了涉及的所有主要组件。

当您按下机器上的电源按钮时,存储在主板EEPROM芯片中的固件会初始化POST开机自检)来检查系统硬件资源的状态。当POST完成后,固件会搜索并加载位于MBREFI中的第一阶段引导加载程序 第一个可用磁盘的分区,并对其进行控制。

膜生物反应器法

MBR 位于磁盘的第一个扇区,在 BIOS 设置中标记为可引导,大小为 512 字节。

  1. 前 446 字节:引导加载程序包含可执行代码和错误消息文本。
  2. 接下来的 64 字节:分区表包含四个分区(主分区或扩展分区)中每一个的记录。除此之外,每条记录还指示每个分区的状态(活动/非活动)、大小以及起始/结束扇区。
  3. 最后 2 个字节:幻数用作 MBR 的验证检查。

以下命令执行 MBR 的备份(在此示例中,/dev/sda 是第一个硬盘)。如果分区表损坏(例如导致系统无法启动),生成的文件 mbr.bkp 可以派上用场。

当然,为了以后需要时使用它,我们需要保存它并将其存储在其他地方(例如 USB 驱动器)。该文件将帮助我们恢复 MBR,并且当且仅当我们同时不更改硬盘驱动器布局时,它才会让我们再次前进。

备份主引导记录
dd if=/dev/sda of=mbr.bkp bs=512 count=1

恢复主引导记录
dd if=mbr.bkp of=/dev/sda bs=512 count=1

EFI/UEFI方式

对于使用 EFI/UEFI 方法的系统,UEFI 固件会读取其设置来确定要启动哪个 UEFI 应用程序以及从何处启动(即在哪个磁盘和分区中) EFI分区所在)。

接下来,加载并运行第二阶段引导加载程序(又名引导管理器)。 GRUB [GRand Unified Boot] 是 Linux 中最常用的引导管理器。在当今使用的大多数系统上都可以找到两个不同版本之一。

  1. GRUB 旧版配置文件:/boot/grub/menu.lst(较旧的发行版,EFI/UEFI 固件不支持)。
  2. GRUB2 配置文件:最有可能的是 /etc/default/grub。

尽管 LFCS 考试的目标没有明确要求了解有关 GRUB 内部结构的知识,但如果您足够勇敢并且有能力搞乱您的系统(您可能想尝试一下)首先在虚拟机上,以防万一),您需要运行。

update-grub

在修改 GRUB 的配置后以 root 身份应用更改。

基本上,GRUB 加载默认的内核initrdinitramfs 映像。简而言之,initrd 或 initramfs 有助于执行安装真实根文件系统所需的硬件检测、内核模块加载和设备发现。

一旦真正的根文件系统启动,内核就会执行系统和服务管理器(initsystemd,其进程标识或PID始终为1)以开始正常的用户-空间启动过程以呈现用户界面。

initsystemd 都是管理其他守护进程的守护进程(后台进程),作为第一个启动的服务(在启动期间)和最后一个终止的服务(在关闭期间)。

启动服务(SysVinit)

Linux 中运行级别的概念通过控制正在运行的服务来指定使用系统的不同方式。换句话说,运行级别控制在当前执行状态=运行级别下可以完成哪些任务(以及不能完成哪些任务)。

传统上,此启动过程是根据源自 System V UNIX 的约定执行的,系统会传递执行脚本集合,这些脚本集合会在计算机进入特定运行级别(换句话说,即启动和停止服务)时启动和停止服务。 ,是运行系统的不同模式)。

在每个运行级别中,可以将各个服务设置为运行,或者在运行时关闭。一些主要发行版的最新版本正在放弃 System V 标准,转而采用名为 systemd (代表系统守护进程)的相当新的服务和系统管理器,但通常出于兼容性目的,支持 sysv 命令。这意味着您可以在基于 systemd 的发行版中运行大多数著名的 sysv 初始化工具。

另请阅读:为什么在 Linux 中‘systemd’取代‘init’

除了启动系统进程之外,init 还会查找 /etc/inittab 文件来决定必须输入的运行级别。

Runlevel

描述

0

停止系统。运行级别0是一种特殊的过渡状态,用于快速关闭系统。

1

该运行级别也别名为 s 或 S,有时称为维护模式。在此运行级别启动哪些服务(如果有)因发行版而异。它通常用于可能因正常系统操作而受到损害的低级系统维护。

2

多用户。在 Debian 系统和衍生系统上,这是默认的运行级别,并且包括(如果可用)图形登录。在基于 Red Hat 的系统上,这是没有网络的多用户模式。

3

在基于 Red-Hat 的系统上,这是默认的多用户模式,它运行除图形环境之外的所有内容。此运行级别以及级别 4 和 5 通常不用于基于 Debian 的系统。

4

通常默认情况下未使用,因此可进行自定义。

5

在基于 Red Hat 的系统上,使用 GUI 登录的完整多用户模式。此运行级别类似于级别 3,但可以使用 GUI 登录。

6

重新启动系统。

要在运行级别之间切换,我们可以简单地使用 init 命令发出运行级别更改:init N(其中 N 是上面列出的运行级别之一)。请注意,这不是将正在运行的系统带到不同运行级别的推荐方法,因为它不会向现有登录用户发出警告(从而导致他们丢失工作和进程异常终止)。

相反,应该使用 shutdown 命令重新启动系统(它首先向所有登录的用户发送警告消息并阻止任何进一步的登录;然后它向 init 发出信号以切换运行级别);但是,必须首先在 /etc/inittab 文件中编辑默认运行级别(系统将引导到的运行级别)。

因此,请按照以下步骤在运行级别之间正确切换,以 root 身份在 /etc/inittab 中查找以下行。

id:2:initdefault:

并使用您喜欢的文本编辑器(例如 vim)更改所需运行级别的数字 2(如如何在 Linux 中使用 vi/vim 编辑器 - 本系列的第 2 部分中所述)。

接下来,以 root 身份运行。

shutdown -r now

last 命令将重新启动系统,使其在下次引导期间以指定的运行级别启动,并将运行位于 /etc/rc[runlevel].d 目录,以便决定哪些服务应该启动,哪些服务不应该启动。例如,对于以下系统中的运行级别 2。

使用 chkconfig 管理服务

要在启动时启用或禁用系统服务,我们将在 CentOS/openSUSE 中使用 chkconfig 命令,在 Debian 及其衍生版本中使用 sysv-rc-conf。该工具还可以向我们展示特定运行级别的服务的预配置状态。

另请阅读:如何在 Linux 中停止和禁用不需要的服务

列出服务的运行级别配置。

chkconfig --list [service name]
chkconfig --list postfix
chkconfig --list mysqld

在上图中我们可以看到postfix被设置为在系统进入运行级别25时启动,而mysqld 将默认在运行级别 24 下运行。现在假设这不是预期的行为。

例如,我们还需要为运行级别 5 打开 mysqld,并为运行级别 4 和 5 关闭 postfix。 以下是我们在每种情况下都会执行的操作(运行以 root 身份执行以下命令)。

为特定运行级别启用服务
chkconfig --level [level(s)] service on
chkconfig --level 5 mysqld on
禁用特定运行级别的服务
chkconfig --level [level(s)] service off
chkconfig --level 45 postfix off

我们现在将使用 sysv-rc-conf基于 Debian 的系统中执行类似的任务。

使用 sysv-rc-conf 管理服务

将服务配置为在特定运行级别上自动启动,并阻止其在所有其他运行级别上启动。

1. 让我们使用以下命令来查看 mdadm 配置为启动的运行级别。

ls -l /etc/rc[0-6].d | grep -E 'rc[0-6]|mdadm'

2. 我们将使用 sysv-rc-conf 来阻止 mdadm 在除 2 之外的所有运行级别上启动。只需根据需要选中或取消选中(使用空格键)即可(您可以使用箭头键向上、向下、向左、向右移动)。

sysv-rc-conf

然后按q退出。

3.我们将重新启动系统并再次运行第1步中的命令。

ls -l /etc/rc[0-6].d | grep -E 'rc[0-6]|mdadm'

在上图中,我们可以看到 mdadm 配置为仅在运行级别 2 上启动。

那么 systemd 呢?

systemd 是另一个服务和系统管理器,已被多个主要 Linux 发行版采用。它的目的是允许在系统启动期间并行完成更多处理(与 sysvinit 不同,后者总是比较慢,因为它一次启动一个进程,检查一个进程是否依赖于另一个进程,然后等待启动守护进程,以便可以启动更多服务),并充当正在运行的系统的动态资源管理。

因此,服务在需要时启动(以避免消耗系统资源),而不是在引导期间没有充分理由启动服务。

要查看系统上运行的所有进程(包括 systemd 本机和 SysV 服务)的状态,请运行以下命令。

systemctl

LOAD 列显示单元定义(请参阅 UNIT 列,该列显示服务或由 systemd 维护的任何内容)是否已正确加载,而 ACTIVESUB 列显示该单元的当前状态。

显示有关服务当前状态的信息

ACTIVE列指示某个单元的状态不是活动时,我们可以使用以下命令检查发生了什么。

systemctl status [unit]

例如,在上图中,media-samba.mount 处于失败状态。我们跑吧。

systemctl status media-samba.mount

我们可以看到 media-samba.mount 失败,因为主机 dev1 上的挂载进程无法找到位于 //192.168.0.10/gacanepa 的网络共享.

启动或停止服务

一旦网络共享 //192.168.0.10/gacanepa 可用,我们就尝试启动、停止、最后重新启动设备 media-samba.mount。执行每个操作后,让我们运行 systemctl status media-samba.mount 来检查其状态。

systemctl start media-samba.mount
systemctl status media-samba.mount
systemctl stop media-samba.mount
systemctl restart media-samba.mount
systemctl status media-samba.mount

启用或禁用在引导期间启动的服务

systemd 下,您可以在启动时启用或禁用服务。

systemctl enable [service] 		# enable a service 
systemctl disable [service] 		# prevent a service from starting at boot

启用或禁用服务在启动时自动启动的过程包括添加或删除 /etc/systemd/system/multi-user.target.wants 目录中的符号链接。

或者,您可以使用命令查找服务的当前状态(启用或禁用)。

systemctl is-enabled [service]

例如,

systemctl is-enabled postfix.service

此外,您还可以使用以下命令重新启动或关闭系统。

systemctl reboot
systemctl shutdown

暴发户

Upstart/sbin/init 守护进程的基于事件的替代品,其诞生是为了仅在需要时启动服务(同时在服务启动时对其进行监督)正在运行),并在事件发生时对其进行处理,从而超越了经典的基于依赖关系的 sysvinit 系统。

它最初是为 Ubuntu 发行版开发的,但用于 Red Hat Enterprise Linux 6.0。尽管它的目的是适合在所有 Linux 发行版中部署,作为 sysvinit 的替代品,但最终它被 systemd 掩盖了。 2014 年 2 月 14 日,Mark Shuttleworth(Canonical Ltd. 创始人)宣布,Ubuntu 的未来版本将使用 systemd 作为默认的 init 守护进程。

由于SysV系统启动脚本已经非常普遍,所以大量的软件包都包含了SysV启动脚本。为了适应此类软件包,Upstart 提供了一种兼容模式:它在通常的位置(/etc/rc.d/rc?.d/etc/init.d/ 运行 SysV 启动脚本) rc?.d/etc/rc?.d 或类似位置)。因此,如果我们安装的软件包尚未包含 Upstart 配置脚本,它仍应以通常的方式启动。

此外,如果我们安装了 chkconfig 等实用程序,您应该能够使用它们来管理基于 SysV 的服务,就像我们在基于 sysvinit 的系统上一样。

Upstart 脚本还支持基于比 SysV 启动脚本更广泛的操作来启动或停止服务;例如,只要连接特定硬件设备,Upstart 就可以启动服务。

使用 Upstart 及其本机脚本的系统专门用 .conf 替换 /etc/inittab 文件和特定于运行级别的 SysV 启动脚本目录/etc/init 目录中的脚本。

这些 *.conf 脚本(也称为作业定义)通常包含以下内容:

    1. 过程描述。
    2. 流程应运行的运行级别或应触发流程的事件。
    3. 应停止进程的运行级别或应停止进程的事件。
    4. 选项。
    5. 启动进程的命令。

例如,

My test service - Upstart script demo description "Here goes the description of 'My test service'" author "Dave Null <[email >"
Stanzas

#
Stanzas define when and how a process is started and stopped
See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas#respawn
When to start the service
start on runlevel [2345]
When to stop the service
stop on runlevel [016]
Automatically restart process in case of crash
respawn
Specify working directory
chdir /home/dave/myfiles
Specify the process/command (add arguments if needed) to run
exec bash backup.sh arg1 arg2

要应用更改,您需要告诉 upstart 重新加载其配置。

initctl reload-configuration

然后通过键入以下命令开始您的工作。

sudo start yourjobname

其中 yourjobname 是之前使用 yourjobname.conf 脚本添加的作业的名称。

更完整、更详细的 Upstart 参考指南可在该项目网站的“Cookbook”菜单下找到。

概括

了解 Linux 启动过程对于帮助您解决任务以及根据您的需求调整计算机的性能和运行服务是必要的。

在本文中,我们分析了从按下电源开关打开机器直到获得完全可操作的用户界面时发生的情况。我希望你在阅读它时能像我在整理它时一样学到很多东西。请随时在下面留下您的意见或问题。我们始终期待收到读者的来信!