Linux-引导过程与服务控制

一、Linux操作系统引导过程

  系统引导是操作系统运行的开始,在用户能够正常登录到系统之前,Linux 操作系统的引导过程将完成一系列的初始化任务,并加载必要的程序和命令终端,为用户登录做好准备。

1.1、引导过程总览

1.开机自检

  服务器主机开机以后,将根据主板 BIOS 中的设置对 CPU(Central Processing Unit,中央处理器)、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权,大多时候会移交给本机硬盘。

2.MBR引导

  当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中 MBR(Master Boot Record,主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据MBR 记录中的引导信息调用启动菜单(如 GRUB)。

3.GRUB菜单

  对于 Linux 操作系统来说,GRUB(GRand Unified Bootloader,统一启动加载器)是使用最为广泛的多系统引导器程序。系统控制权传递给 GRUB 以后,将会显示启动菜单给用户选择,并根据所选项(或采用默认值)加载 Linux 内核文件,然后将系统控制权转交给内核。需要注意的是,CentOS 7 采用的是 GRUB2 启动引导器。

4.记载Linux内核

  Linux 内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间,负责资源分配与调度。内核接过系统控制权以后,将完全掌控整个 Linux 操作系统的运行过程。在 CentOS 系统中,默认的内核文件位于“/boot/vmlinuz-3.10.0-514.el7.x86_64”。

5.init进程初始化

  为了完成进一步的系统引导过程,Linux 内核首先将系统中的“/sbin/init”程序加载到内存中运行(运行中的程序称为进程),init 进程负责完成一系列的系统初始化过程,最后等待用户进行登录。

1.2、系统初始化进程

1. init进程

①由Linux内核加载运行/sbin/init程序

②init进程是系统中第一个进程

③init进程的PID(进程标记)号永远为1

2. Systemd(守护进程,管理其它进程的开关运行)

①Systemd是Linux操作系统的一种init软件

②CentOS7中采用全新的Systemd启动方式,取代传统的SysVinit

③CentOS7中运行的第一个init进程是/lib/systemd/systemd

3、Systemd单元类型

4、运行级别所对应的Systemd目标

二、排除系统启动类故障

故障原因

①病毒、木马等造成的破坏

②不正确的分区操作、磁盘读写误操作

故障现象

①找不到引导程序,启动中断

②无法加载操作系统,开机后黑屏

解决思路

①应提前做好备份文件

②以安装光盘引导进入急救模式

③从备份文件中恢复

2.1、修复MBR扇区故障

1.备份MBR扇区数据

例如,将第一块硬盘(sda)的 MBR 扇区备份到第二块硬盘的 sdb1 分区中(挂载到/backup 目录)。

2.模拟MBR扇区故障

使用 dd 命令,人为地将 MBR 扇区的记录覆盖,以便模拟出 MBR 扇区被破坏的故障情况(切记要先做好备份,并且将备份文件存放到其他硬盘)。例如,将设备文件 zero 中读取 512 字节的数据,并将其覆盖到第一块硬盘(sda),从而破坏 MBR 扇区中的数据:

  完成上述操作后重启系统,将会出现“Operating system not found”的提示信息,表示无法找到可用的操作系统,因此无法启动主机。

3.从备份文件中恢复MBR扇区数据

  由于 MBR 扇区被破坏以后,就无法再从该硬盘启动系统,所以需要使用其他硬盘中的操作系统进行引导,或者直接使用 CentOS 系统的安装光盘进行引导。不管使用哪种方式,目的都是相同的——获得一个可以执行命令的 Shell 环境,以便从备份文件中恢复 MBR 扇区中的数据。

  以使用 CentOS 安装光盘引导为例,当出现安装向导界面时,选择“Troubleshooting” 选项,进入修复故障页面:

再选择“Rescue a CentOS Linux system”选项,将以“救援模式”引导Linux操作系统:

然后系统会自动查找硬盘中的 Linux 分区并尝试将其挂载到/mnt/sysimage 目录(选择“1”确认并按 Enter 键继续)。接下来会出现 rescue 字符界面:

  最后,按 Enter 键后将进入带“sh-4.2#”提示符的 Bash Shell 环境,只要执行相应的命令挂载保存有备份文件的硬盘分区(sdb1),并将数据恢复到硬盘“/dev/sda” 中即可,需要注意的是,当前使用的系统环境是光盘中的 Linux 目录结构:

完成恢复操作以后,执行“exit”命令退出临时 Shell 环境,系统将会自动重启。

2.2、GRUB引导故障

  GRUB 是大多数 Linux 操作系统默认使用的引导程序,可以通过启动菜单的方式选择进入不同的操作系统(如果有)。当配置文件/boot/grub2/grub.cfg 丢失,或者关键配置出现错误,或者 MBR 中的引导程序遭到破坏时,Linux 主机启动后可能只出现“grub>”的提示符,无法完成进一步的系统启动过程:

  若在该提示符后可以进行编辑,则通过输入对应的引导命令(可参考其他相同版本CentOS 中/boot/grub2/grub.cfg 文件的引导语句),然后执行“boot”命令即可正常引导 Linux操作系统,具体操作如下:

  之后的启动过程与正常启动 CentOS 系统的过程是一样的。登录进入操作系统以后,需要找到配置文件/boot/grub2/grub.cfg,并修复其中的错误,或者直接重建该文件。具体内容可以参考其他正常主机中的同名文件。

在 CentOS 系统中,执行以下操作可以查看 GRUB 配置文件 grub.cfg 的默认内容:

  grub.cfg 文件中包含很多内容,如加载 grubenv 中变量、设置默认引导项等。CentOS 7默认有两个启动项:CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core)与 CentOS Linux(0-rescue-b15df1eb8205483f9f70c79709810abc) 7 (Core)。无论是哪个启动项,都需要设置如下所示的几个主要配置项:

 menuentry:指定在启动菜单中显示的操作系统名称。

 set root:指定包含内核等引导文件的/boot 分区所在的位置。

 insmod:加载指定的模块到内核。

 linux16:指定内核文件所在的位置,内核加载时权限为只读“ro”,并通过“root=”指定根分区的设备文件位置。

 initrd16:指定启动内核所使用的临时系统镜像文件所在的位置。

  由于在“grub>”环境中使用的命令较为复杂,因此用户可以采用另一种修复办法,同样使用 CentOS 的安装光盘引导进入急救模式(参考上一小节)。若分区表未被破坏,则急救模式将会找到硬盘中的 Linux 根分区,并将其挂载到光盘目录结构的/mnt/sysimage/文件夹中。

   进入“bash-4.2#”的 Shell 环境以后,重写(或通过之前备份的文件恢复)grub.cfg 配置文件即可。重写完 grub.cfg 配置文件后,需要使用 grub2-mkconfig 工具更新 grub.cfg 配置文件:

  在上例中,若未执行“chroot /mnt/sysimage”命令,则重新建立的 grub.cfg 配置文件应该位于/mnt/sysimage/boot/grub2/grub.cfg。

  如果是 MBR 扇区中的引导程序出现损坏,则在重建 grub.cfg 配置文件后仍然可能无法成功启动系统,这时可以通过 CentOS 救援模式的 Shell 环境重新安装 grub 引导程序。切换到待修复的 Linux 操作系统根环境,执行“grub2-install /dev/sda”命令可以重新将 grub 引导程序安装到第一块硬盘(sda)的 MRB 扇区:

  上述方法同样适用于在 Linux 主机中重装 Windows 操作系统(不覆盖 Linux 操作系统)后导致 Linux 操作系统无法启动的情况。因为对于使用双操作系统的主机,后安装的Windows 操作系统将使用自己的引导数据覆盖 MBR 扇区中的记录,导致开机后不再出现GRUB 菜单从而无法进入 Linux 操作系统。如果后安装 Linux 操作系统,GRUB 程序将自动识别硬盘中的 Windows 操作系统并将其加载到 GRUB 菜单配置中。

  注意:执行“dd if=/dev/zero of=/dev/sda bs=446 count=1”命令可以模拟出对 MBR 扇区中 GRUB 引导程序的破坏(注意先做好备份),但并不会破坏分区表(实际上分区表保存在MBR 扇区中的第 447~510 字节中,MBR 总共 512 字节,前 446 字节是主引导记录,从第447 字节开始后的 64 字节,每 16 字节为一组,是硬盘分区表)。

2.3、遗忘root用户的密码

  最简便的途径是使用 CentOS 的安装光盘进入急救模式。若使用 CentOS 的安装光盘进入急救模式的 Shell 环境,则只需切换到待修复 Linux 操作系统的根目录环境,直接执行“passwd root”命令重设 root 用户的密码即可;或者修改/etc/shadow 文件,将 root 用户的密码字段清空,重启后以空密码可登录系统。以下操作即为进入急救模式重设 root 用户密码:

三、服务控制及优化启动过程

3.1、系统服务控制

  在 CentOS 系统中,各种系统服务的控制脚本默认放在/usr/lib/systemd 目录下。通过systemctl 命令工具可以实现对指定系统服务的控制,语法格式如下:

                                  systemctl 控制类型 服务名称

对于大多数系统服务来说,常见的几种控制类型如下所述:

 start(启动):运行指定的系统服务程序,实现服务功能。

 stop(停止):终止指定的系统服务程序,关闭相应的功能。

 restart(重启):先退出,再重新运行指定的系统服务程序。

 reload(重载):不退出服务程序,只是刷新配置。在某些服务中与 restart 的操作相同。

 status(查看状态):查看指定的系统服务的运行状态及相关信息。

例如,执行“systemctl start postfix.service”操作可以启动尚未运行的 postfix 服务。

若要查看指定 postfix 服务的运行状态,只需将上述命令中的“start”改为“status”即可。若要停止 postfix 服务,只需将“start”改为“stop”即可:

控制类型“restart”用在需要释放旧的资源全部从头开始的情况,它会先关闭相应的服务程序,然后重新运行。例如,当在网卡的配置文件中设置了新的 IP 地址以后,为了激活新的 IP 地址,可以重新启动名称为 network 的系统服务:

  对于在实际生产环境中运行的服务器,不要轻易执行 stop 或 restart 操作,以免造成客户端访问中断,带来不必要的损失。若只是要为系统服务启用新的配置,可以采用相对温和一些的“reload”参数重新加载配置,而不是生硬地执行“restart”。例如,对正在为用户提供Web 访问的 httpd 服务,当需要应用新的配置时,建议执行“systemctl reload httpd.service” 命令来重新载入配置,而不是执行“systemctl restart httpd.service”。

3.2、切换运行级别

1.查看系统的target

  明确当前系统所在的, target 将有助于管理员排除一些应用故障。若未能确知当前所处的目标,可以直接执行“runlevel”命令进行查询显示结果中的两个字符分别表示切换前的目标、当前的目标。若之前尚未切换过运行级别,则第 1 列将显示“N”,命令如下:

若用户想查看系统启动时默认运行的 target,可以执行“systemctl get-default”命令以显示系统默认的 target:

2.切换系统的target

  当用户需要将系统转换为其他的 target 时,可以通过传统的 init 程序进行,只要使用与运行级别相对应的数字(0~6)作为命令参数即可,或者使用 systemctl 命令进行目标切换。例如,为了节省系统资源,将系统运行的 target 由图形模式(5)切换为字符模式(3),可以执行“init 3”或“systemctl isolate multi-user.target”命令:

或者

需要再次使用图形桌面时,可以执行“init 5”或者“systemctl isolategraphical.target”命令切换回去。

通过切换 target 的操作,还可以实现两个特殊的功能,那就是关机和重启。运行级别 0、6 分别对应关机、重启这两个特殊模式,因此只要执行“init 0”与“init 6”命令就可以实现相应的关机、重启操作了:

而运行级别 0、6 又分别对应着 systemd 的“poweroff.target”和“reboot.target”目标,因此执行“systemctl poweroff”与“systemctl reboot”命令也可以实现相应的关机、重启操作:

上述内容中的运行级别切换均为临时切换,若要永久切换运行级别,可通过 ln(链接)命令指定当前系统的默认运行级别。例如,将当前系统的开机默认运行级别从 graphical.target 更改为 multi-user.target。其中,-s 选项表示创建软链接;-f 表示强行删除任何已存在的目标文件:

3.3、优化启动过程

1.常见的系统服务

必须强调的是,这些服务到底是选择开启还是关闭,应根据主机的实际功能需求来定,不要生搬硬套。

2.优化开机自动记载的服务

Linux操作系统在每次开机后会进入默认的systemd运行目标(如字符模式或图形模式),并运行该目标中默认设为启动的各种系统服务。若要禁止某些系统服务自动运行,可以使用ntsysv 或者 systemctl 工具进行优化。

(1)使用ntsysv工具

  ntsysv 工具可以在字符模式中运行,为用户提供一个仿图形的交互式操作界面,专门用于集中配置各种系统服务的启动状态。当需要同时设置多个服务的启动状态时,使用 ntsysv 工具会非常方便。

  单独执行“ntsysv”命令时仅用于管理当前运行目标中的服务;通过“--level”选项可以对指定运行目标(级别)中的服务进行管理。例如,执行“ntsysv --level 35”命令可以打开 ntsysv管理程序,如图所示,同时对运行目标 3、5 中的各种系统服务的默认启动状态进行调整:

操作时按↑、↓方向键来选择不同的系统服务,按 Space(空格)键设置服务的默认启动状态(“[*]”表示启动,“[ ]”表示关闭)。如果要查看所选定服务的说明信息,按 F1 键可以获取帮助。

(2)使用systemctl工具

systemctl 工具与 ntsysv 的功能类似,但是 systemctl 不提供交互式的操作界面,它用于查询或设置系统服务的默认启动状态。当需要设置某一个服务在当前运行目标中的默认启动状态时,使用 systemctl 工具会更有效率。使用 systemctl 工具控制服务开机启停的命令格式如下:

systemctl 控制选项 服务名称

常用的选项有三种:

 enable:开机自动启动。

 disable:开机自动关闭。

 is-enable:查看开机启动状态。

设置为开机自动启动时,在/etc/systemd/system/multi-user.target.wants/目录下面会出现一个文件例如,执行以下操作即可配置 apache 服务开机自动启动或关闭,并查看开机启动状态。当 apache 服务名为 httpd.service 的软连接文件。当 apache 服务设置为开机自动关闭时在/etc/systemd/system/multiuser.target.wants/目录下面的 httpd.service 软连接文件就会被删除:

在当前系统下执行“systemctl list-units --type=service”命令可以查看当前系统中所有已激活的系统服务,命令如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值