目录
8.1 Linux操作系统的引导过程
系统引导是操作系统运行的开始,在用户能够正常登录到系统之前,Linux操作系统的引导过程将完成一系列的初始化任务,并加载必要的程序和命令终端,为用户登录做好准备
8.1.1 引导过程总览
Linux操作系统的引导过程一般包括以下几个阶段:开机自检、MBR引导、GRUP菜单、加载Linux内核、init进程初始化。
-
开机自检
- 服务器主机开机以后,将根据主板 BIOS 中的设置对 CPU(Central Processing Unit,中央处理器)、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权,大多时候会移交给本机硬盘。
-
MBR引导
- 当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中 MBR(Master Boot Record主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据MBR 记录中的引导信息调用启动菜单(如 GRUB)。
-
GRUP菜单
- 对于 Linux 操作系统来说,GRUB(GRand Unified Bootloader,统一启动加载器)是使用最为广泛的多系统引导器程序。系统控制权传递给 GRUB 以后,将会显示启动菜单给用户选择,并根据所选项(或采用默认值)加载Linux内核文件,然后将系统控制权转交给内核。需要注意的是,CentOS7采用的是 GRUB2 启动引导器。
-
加载Linux内核
- Linux 内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间,负责资源分配与调度。内核接过系统控制权以后,将完全掌控整个Linux 操作系统的运行过程。在 CentOS 系统中,默认的内核文件位于“/bootvmlinuz-3.10.0-514.el7.x86 64”
-
init进程初始化
- 为了完成进一步的系统引导过程,Linux内核首先将系统中的“/sbin/init”程序加载到内存中运行(运行中的程序称为进程),init 进程负责完成一系列的系统初始化过程,最后等待用户进行登录。
8.1.2 系统初始化进程及文件
-
init进程
- Linux 操作系统中的进程使用数字进行标记,每个进程的身份标记号称为PID。在引导Linux 操作系统的过程中,“/sbin/init"是内核第一个加载的程序,因此init 进程对应的 PID 号总是为 1。
- init 进程运行以后将陆续执行系统中的其他程序,不断生成新的进程,这些进程称为init进程的子进程。反过来说,init 进程是这些进程的父进程。当然,这些子进程也可以进一步生成各自的子进程,依次不断繁衍下去,最终构成一棵枝繁叶茂的进程树,共同为用户提供服务。
- 从以上描述可以看出,init 进程正是维持整个 Linux 操作系统运行的所有进程的“始祖”,因此init 进程是不允许被轻易终止的。需要切换不同的系统运行状态时,可以向init 进程发送正确的执行参数,由init 自身来完成相关操作。
-
Systemd 概述
- Systemd 是 Linux 操作系统的一种 init 软件,CentOS7系统中采用了全新的 Systemd启动方式,取代了传统的 SysVinit。Systemd启动方式使系统初始化时诸多服务并行启动,大大提高了开机效率。CentOS7 系统中“/sbin/init"是"/lib/systemdlsystemd”的链接文件。换言之,CentOS7系统中运行的第一个init 进程是“/lib/systemd/systemd”。systemd 守护进程负责 Linux 的系统和服务,systemctl 用于控制 Systemd 管理的系统和服务状态。
- Systemd 将其管理的资源组织成各种类型的单元(Unit),表 8-1 中列出了 Systemd 使用的各种单元类型。
Linux 系统服务是指运行在后台并提供特定功能的应用程序,如网站服务、FTP 服务等。Linux 通过将不同的系统服务进行搭配组合来协同满足不同的功能需求。不同的服务组合其实现的功能也各不相同,就好比不同的药方能医治不同的病症一样。
- 早期 Linux 操作系统中的 SysVinit 机制,默认包括七种不同的服务搭配方式,其中每一种搭配方式称为运行级别,类似于 Wndows 系统中的正常启动、安全模式、不带网络连接的安全模式等。这些运行级别分别使用数字0,1,…,6来表示。为了向下兼容 SysVinit系统,Systemd 使用了相应的target(目标)模拟了 SysVinit 的运行级别,表 8-2 中列出了运行级别所对应的 target,并说明了各种 target 的含义及用途。
8.2 排除系统启动类故障
Linux 操作系统的启动过程涉及 MBR(Main Boot Record,主引导记录)、GRUB 启动菜单、系统初始化配置文件等各方面,其中任何一个环节出现故障都可能导致系统启动失常,因此一定要注意做好相关文件的备份工作。
8.2.1 MBR扇区故障
MBR 位于物理硬盘的第一个扇区(512 字节),该扇区又称为主引导扇区(MBR 扇区),除了包含系统引导程序的部分数据外,还包含整个硬盘的分区表记录。当主引导扇区发生故障时,将可能无法进入引导菜单,或者因无法找到正确的分区位置而无法加载系统,通过该硬盘引导主机时很可能进入黑屏状态。
1、备份MBR扇区数据
由于 MBR 扇区中包含了整个硬盘的分区表记录,因此该扇区的备份文件必须存放到其他的存储设备中,否则在恢复时将无法读取到备份文件。例如,执行以下操作可以将第-块硬盘(sda)的 MBR 扇区备份到第二块硬盘的 sdb1 分区中(挂载到/backup 目录)。
2、模拟MBR扇区故障
这里仍然使用 dd 命令,人为地将 MBR 扇区的记录覆盖,以便模拟出 MBR 扇区被破坏的故障情况(切记要先做好备份,并且将备份文件存放到其他硬盘)。例如,执行以下操作可以从设备文件 zero 中读取 512 字节的数据,并将其覆盖到第一块硬盘(sda),从而破坏 MBR 扇区中的数据,
重启系统将会出现“Operating system not found”的提示信息,表示无法找到可用的操作系统,因此无法启动主机。
3、从备份文件中恢复MBR扇区数据
由于 MBR 扇区被破坏以后,就无法再从该硬盘启动系统,所以需要使用其他硬盘中的操作系统进行引导,或者直接使用CentOS 系统的安装光盘进行引导。不管使用哪种方式目的都是相同的--获得一个可以执行命令的 Shel 环境,以便从备份文件中恢复 MBR 扇区中的数据。
下面使用Centos做演示
当出现安装向导的时候,选择”Troubleshooting”选项
再选择“Rescue aCentOS Linux system”选项,将以“救援模式”引导Linux操作系统。
然后系统会自动査找硬盘中的 Linux分区并尝试将其挂载到/mntisysimage 目录(选择“1”确认并按 Enter 键继续)。接下来会出现 rescue 字符界面
最后,按 Enter 键后将进入带“sh-4.2#”提示符的 Bash Shell 环境只要执行相应的命令挂载保存有备份文件的硬盘分区(sdb1),并将数据恢复到硬盘“/devisda中即可,具体操作如下。需要注意的是,当前使用的系统环境是光盘中的Linux 目录结构。
完成恢复操作以后,执行“exit”命令退出临时Shell环境,系统将会重启
8.2.2 GRUB 引导故障
GRUB 是大多数 Linux 操作系统默认使用的引导程序,可以通过启动菜单的方式选择进入不同的操作系统(如果有)。当配置文件/boot/grub2/grub.cfg 丢失,或者关键配置出现错误,或者 MBR 中的引导程序遭到破坏时,Linux 主机启动后可能只出现“grub>”的提示符,无法完成进一步的系统启动过程
若在该提示符后可以进行编辑,则通过输入对应的引导命令(可参考其他相同版本CentOS 中/boot/grub2/grub.cfg 文件的引导语句),然后执行“boot"命令即可正常引导 Linux操作系统
之后的启动过程与正常启动 CentS 系统的过程是一样的。登录进入操作系统以后,需要找到配置文件/bootgrub2/grub.cfg,并修复其中的错误,或者直接重建该文件。具体内容可以参考其他正常主机中的同名文件。
在 CentOS 系统中,执行以下操作可以査看 GRUB 配置文件 grub.cfg 的默认内容。
grub.cfg 文件中包含很多内容,如加载 grubenv 中变量、设置默认引导项等。CentOs7默认有两个启动项: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#”的 Shel 环境以后,重写(或通过之前备份的文件恢复)grub.cfg 配置文件即可。重写完 grub.cfg 配置文件后,需要使用 grub2-mkconfig 工具更新 grub.cfg 配置文件。
在上例中,若未执行“chroot /mntsysimage”命令,则重新建立的 grub.cfg 配置文件应该位于/mnt/sysimage/boot/grub2/grub.cfg。
如果是 MBR 扇区中的引导程序出现损坏,则在重建 grub.cfg 配置文件后仍然可能无法成功启动系统,这时可以通过 CentOS 救援模式的 Shel 环境重新安装 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 字节为一组,是硬盘分区表)。
8.2.3 遗忘root用户的密码
当忘记 root用户的密码时,将无法登录 Linux操作系统执行管理、维护等任务,而只能通过其他用户(普通用户)登录使用一些受限制的功能。当然,如果操作系统中还有其他具有 root 权限的用户(uid 为0),或者拥有修改root账号密码权限的用户,也可以使用这些用户登录操作系统,然后重新设置root用户的密码。
然而,大多数时候 Linux 主机中具有 root 权限的用户只有一个,因此需要通过其他途径来重设 root账号的密码。最简便的途径是使用 CentOS 的安装光盘进入急救模式。
若使用 CentOS 的安装光盘进入急救模式的 Shel 环境,则只需切换到待修复 Linux 操作系统的根目录环境,直接执行“passwd root"命令重设root 用户的密码即可;或者修改/etc/shadow 文件,将 root用户的密码字段清空,重启后以空密码可登录系统。以下操作即为进入急救模式重设 root 用户密码。
8.3 服务控制及优化启动过程
在 Linux 操作系统完成引导以后,如何控制系统服务的运行状态?如何在不同的运行级别之间进行切换?如何优化启动过程,减少系统占用的资源?
8.3.1 系统服务控制
在 CentOS 系统中,各种系统服务的控制脚本默认放在/usr/lib/systemd 目录下。通过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”。
8.3.2 切换运行级别
在前面的章节讲解 Systemd 相关知识的时候,已经介绍过 target 的含义及类型。不同的 target 代表系统不同的运行状态,所启用的服务或程序也不一样。例如,对于互联网中的网站、电子邮件等服务器来说,只需要运行在文本模式就可以了,无须启用图形桌面程序。
1、查看系统的target
明确当前系统所在的 target将有助于管理员排除一些应用故障。若未能确知当前所处的目标,可以直接执行"runleve!"命令进行查询,显示结果中的两个字符分别表示切换前的目标、当前的目标。若之前尚未切换过运行级别,则第1列将显示“N”,命令如下: 若用户想查看系统启动时默认运行的target,可以执行“systemctl get-default”命令以显示系统默认的 target,命令如下:
2、切换系统的target
当用户需要将系统转换为其他的target时,可以通过传统的init 程序进行,只要使用与运行级别相对应的数字(0~6)作为命令参数即可,或者使用svstemctl命令进行目标切换。例如,为了节省系统资源,将系统运行的target由图形模式(5)切换为字符模式(3),可以执行“init 3”或“systemctl isolate multi-user.target”命令,命令如下:
或者
将系统切换到字符模式以后,图形桌面环境不再可用。这时按 Alt+F7 组合键也无法恢复图形桌面环境。需要再次使用图形桌面时,可以执行“init 5"或者“systemctl isolategraphical.target”命令切换回去。
通过切换 target 的操作,还可以实现两个特殊的功能,那就是关机和重启。运行级别 0、6 分别对应关机、重启这两个特殊模式,因此只要执行“init 0”与“init 6”命令就可以实现相应的关机、重启操作了,命令如下:
而运行级别 0、6 又分别对应着 systemd 的“poweroff.target”和“reboot.target”目标,因此执行“systemct poweroff’与“systemct reboot”命令也可以实现相应的关机、重启操作,命令如下: 上述内容中的运行级别切换均为临时切换,若要永久切换运行级别,可通过In(链接)命令指定当前系统的默认运行级别。例如,执行如下命令可将当前系统的开机默认运行级别从 graphical.target 更改为 multi-user.target。其中,-s选项表示创建软链接;-f表示强行删除任何已存在的目标文件。
8.3.3 优化启动过程
1、常见的系统服务
必须强调的是,这些服务到底是选择开启还是关闭,应根据主机的实际功能需求来定,不要生搬硬套。例如,如果当前的 Linux 主机用来向局域网提供文件共享服务,那么 smb服务应开启,而不能关闭。
2、优化开机自动加载的服务
Linux操作系统在每次开机后会进入默认的systemd运行目标(如字符模式或图形模式),并运行该目标中默认设为启动的各种系统服务。若要禁止某些系统服务自动运行,可以使用ntsysv 或者 systemctl 工具进行优化。
(1)使用ntsysv工具
ntsysv 工具可以在字符模式中运行,为用户提供一个仿图形的交互式操作界面,专门用于集中配置各种系统服务的启动状态。当需要同时设置多个服务的启动状态时,使用 ntsysv 工具会非常方便。
单独执行“ntsysv”命令时仅用于管理当前运行目标中的服务;通过“--leve!”选项可以对指定运行目标(级别)中的服务进行管理。例如,执行“ntsysv--level35”命令可以打开 ntsysv管理程序,同时对运行目标 3、5中的各种系统服务的默认启动状态进行调整
操作时按↑、↓方向键来选择不同的系统服务,按Space(空格)键设置服务的默认启动状态(“[*]"表示启动,“[]表示关闭)。如果要查看所选定服务的说明信息,按 F1 键可以获取帮助。
(2)使用systemctl工具
systemctl 工具与 ntsysv的功能类似,但是 systemctl 不提供交互式的操作界面,它用于查询或设置系统服务的默认启动状态。当需要设置某一个服务在当前运行目标中的默认启动状态时,使用 systemctl 工具会更有效率。使用systemctl 工具控制服务开机启停的命令格式如下:
常见的选项有三种:
- enable:开机自启动
- disable:开机自启动关闭
- is-enable:查看开机状态
例如,执行以下操作即可配置 apache 服务开机自动启动或关闭,并查看开机启动状态当 apache 服务设置为开机自动启动时,在/etc/systemd/system/multi-user.target.wants/日录下面会出现一个文件名为 httpd.service 的软连接文件。当 apache 服务设置为开机自动关闭时,在/etc/systemd/system/multi-user.target.wants/日录下面的 htpd.service 软连接文件就会被删除。 在当前系统下执行“systemctl list-units --type=service”命令可以查看当前系统中所有已激活的 系统服务,命令如下: