系统启动
在百度Linux服务器操作系统 V5.0系统使用中,启动异常是用户比较常遇到的问题,由于还未进入系统,可供用户使用的分析工具并不多,最直接的方法就是查询系统打印的日志。对于普通用户,要具备从系统日志定位问题的能力,就需要对操作系统启动的过程有一定的了解。本小节从百度Linux服务器操作系统 V5.0系统的启动过程开始讲起,接着介绍启动日志的查阅方法,最后通过几个实际案例的解析,为用户定位系统启动问题提供通用的思路方法。
启动流程
百度Linux服务器操作系统 V5.0 使用 grub2 作为启动引导程序,支持以下两种启动方式:
- BIOS + MBR
- UEFI + GPT
在 x86 架构 下,系统同时支持上述两种启动方式;而在 aarch64 架构 下,仅支持 UEFI + GPT 启动,启动流程如下图所示:

BIOS(Basic Input Output System,基本输入输出系统)是机器上电后运行的第一个程序,主要作用是系统自检、初始配置、加载操作系统。在BIOS设置中可以看到"legacy support"选项,表示支持传统BIOS启动引导方式。Legacy就是传统的BIOS启动,和MBR分区模式相互依存,可以进行MBR分区系统的安装,兼容性强,但是MBR 分区无法支持超过2T的硬盘,并且效率底下,因此后面发展出了新一代的UEFI BIOS,简称为UEFI。
UEFI(Unified Extensible Firmware Interface,统一的可扩展固件接口)是现在新式增强的BIOS启动引导模式,仅支持GPT(GUID)分区结构,UEFI最主要的功能和 BIOS是一样的,UEFI的优势在于启动引导可加快启动速度、支持图像界面、支持鼠标等。在通常的语境中,一般不区分BIOS和UEFI BIOS,统一称为BIOS。
百度Linux服务器操作系统 V5.0在Legacy+grub2启动模式下,boot.img是grub启动的第一个img文件,大小为512B,被写入到磁盘的MBR分区,因为空间的大小限制了boot.img程序的功能,所以它不能识别文件系统。greub2-install会把core.img的位置硬编码到boot.img中,这样它就可以载入core.img的第一个扇区,然后将控制权转交给core.img。因此如果移动了core.img在磁盘上的位置而没有重新生成boot.img,操作系统启动就会失败。core.img主要包含三部分内容:
- 第一个部分是与启动方式有关的程序,可分为磁盘启动(diskboot.img),光盘启动(cdboot.img)和pxe启动(pxeboot.img)。diskboot.img和cdboot.img的主要功能为读取core.img中剩余的部分到内存中,并将程序控制权移交到kernel.img中。此时因为还不能读取到文件系统,所以此时kernel.img中所有的位 置以block列表的方式编码并供程序读取。
- kernel.img中包含了grub基本运行时环境,包括设备框架、文件句柄、环境变 量、救援模式等,此时的kernel.img并不是系统内核,而是用于运行grub命令行的基础环境。
- modules中保存了各种功能模块,因为GRUB2大量使用了动态功能模块,所以core.img中只保存了部分功能模块,例如文件系统读取,其他大部分功能模块均 存储于存储介质上。
当kernel.img加载了相应的文件系统模块(如xfs.mod)后,就能够识别文件系统了,接着会从磁盘中找到grub.cfg文件,解析并加载内核以及initrd,开启内核引导过程。

百度Linux服务器操作系统 V5.0在uefi+grub2启动模式下,启动程序efi文件单独保存在独立的EFI System Partition分区中,相对于MBR需要安装在首个磁盘分区前,UEFI的安装方式更加安全可靠并且单独的分区移除了对引导程序大小的限制,所以efi程序可以做的相对于core.img大很多。在BIOS关闭安全启动的情况下,从EFI/BOOT/BOOTX64.EFI(BOOTX64.EFI)启动,在开启安全启动的情况下,从EFI/百度Linux服务器操作系统 V5.0/shimx64.efi(shimx64.efi)启动,然后执行EFI/百度Linux服务器操作系统 V5.0/grubx64.efi(grubx64.efi),这里加载grub.cfg文件,解析并加载内核以及initrd,开启内核引导过程。这些文件,可以在目录/boot/efi/EFI下看到,如下图所示:

内核引导后,会进行一系列的初始化工作,并依次启动各个内核子系统,最后启动init 进程。在百度Linux服务器操作系统 V5.0中,init进程是systemd。systemd在启动的过程中主要有几个大目标,每个目标以.target表示,systemd的target主要作用是对多个任务进行分组,比如basic.target中,可能包含了很多任务。
- sysinit.target
sysinit.target主要目的是读系统运行环境做初始化,初始化完成后进入下一个大 目标。
- basic.target
basic.target的作用主要是在环境初始化完成后执行一些基本任务,算是做一些早 期的开机自启动任务,basic.target完成后进入第三个大目标。
-
default.target运行级别 default.target是一个软链接,链接到不同的target表示进入不同的『运行级 别』,运行级别阶段的目的是为最终的登录做准备:
- 如果是内核启动过程中(内核启动时调用了集成在initramfs中的systemd就处于这个过程),那么大目标是initrd.target,该target的目标是为后续虚根切换 到实根做初始化准备,比如检查并挂载根文件系统,最终虚根切换实根,并进入真正的用户空间,也即完成了内核启动或内核已经成功登录
- 如果不是内核启动过程中,可能会选择不同的『运行级别』,通常是图形终端的graphical.target,或者多用户的运行级别multi-user.target,它们的目标 都是完成系统启动,并准备让用户登录系统。

在内核启动阶段,systemd的启动路径主要是:sysinit-->basic-->initrd-->kernel launched这条路线即可。而在用户启动阶段,主要沿着sysinit.target-->basic.target-->default.target-->...-->login进行。
百度Linux服务器操作系统 V5.0在启动过程中的主要过程为BIOS->grub2->kernel-systemd,任何一个阶段出现问题,都可能导致系统启动失败,读者需要对这一流程有大致的了解, 以便在出现问题时可以快速定位。
启动日志分析
上一小节简单介绍了百度Linux服务器操作系统 V5.0启动的流程,实际上我们可以通过相关的日志,查看系统启动的细节。这里主要介绍通过BMC一键收集日志以及串口日志。
- BMC日志
根据机器的IMBC版本选择合适的操作指导。用户可以自行查阅IBMC一键收集日志的方法。导出BMC日志后,文件"OSDump/systemcom.tar"保存了SOL串口信息,包含了系统从BIOS自检到进入百度Linux服务器操作系统 V5.0启动过程的打印信息。详细的日志说明参考官网的说明文档。
- 串口日志
对于虚拟机,可以直接通过命令virsh start vmname --console 或者 virsh console vmname连接到虚拟机的串口,虚拟机启动日志通过串口打印到终端。

对于物理机,可以通过登录到iBMC命令行,使用SOL命令查看SOL串口日志。参考IBMC用户指南命令行一节建立SOL会话后,串口日志会实时打印到终端。具体操作如下:
通过ssh连接到iBMC命令行后,执行命令ipmcset -t sol -d activate -v 1 0 即可链接到SOL串口。

启动故障解决方法
解决常见的启动故障,经常需要用到紧急模式、单用户模式和救援模式,用户根据当前问题的严重程度进行选择。
- 紧急模式
紧急模式不是用户可以主动选择进入的模式,是系统在遇到无法忽略、无法解决的错误时进入的一种最小环境,在这个环境里,根文件系统会被挂载为只读,并且不会载入init(systemd)。因此在init档案损毁或者无法使用时,用户仍可以挂载磁盘修复或者备份重要的文件。常见的,在fstab文件中没有使用UUID挂载磁盘而使用设备名称(/dev/sdb)方式挂载磁盘,会出现磁盘顺序变化导致无法启动而进入的如下界面,就是紧急模式。

- 单用户模式
在此模式下和正常启动的系统差别不大,以root身份运行,拥有最高权限可以对所有文件读写,只是不需要输入root密码,所以就可以实现强制更改密码。主要用在配置错误导致系统启动不了,或者root命令忘记时。需要注意,在单用户模式下是没有网络连接的。进入单用户模式的步骤如下:
- 在grub选择系统的界面按“e”,输入用户“root”,密码“openEuler#12”。

- 在linux一行添加“init=/bin/sh”。
输入完成后 按"Ctrl + x"或者"F10"启动。如果是虚拟机,则需要修改console=tty0为console=ttyAMA0,115200,tty0,否则后续的串口信息会不显示。

- 以可读写的方式重新挂载根分区
当前根分区为只读模式,需要执行命令"mount -o remount,rw / "重新挂载。
- 救援模式
救援模式分为两种。第一种是在安装百度Linux服务器操作系统 V5.0时自动安装的。安装程序会安装2个内核,一个是正常使用的内核,另一个则是救援模式的内核。第二种救援模式是从其他介质启动,这个介质可以是安装系统的光盘或U盘,相当于将系统盘作为了一个外挂的磁盘,所以当系统无法恢复时可以用来备份重要文件。如果系统没有第一种救援模式或者第一种救援模式无法启动,通过安装介质进入救援模式的步骤如下:
- 光驱挂载ISO
- 从光驱启动
- 选择从Troubleshooting启动,进入二级菜单。

- 选择从救援模式启动,如下图所示。

- 选择1

启动过程内核引导失败问题
- 问题描述
某客户反应,在安装网卡驱动后机器无法启动,开机后会进入如下界面:

- 定位过程
通过iBM一键收集日志功能,导出bmc日志,文件OSDump->systemcom.tar即为BMC 的SOL串口日志,解压后通过文本编辑器打开systemmcom.dat文件,定位到启动时的位置:

从串口打印的消息可以知道,问题出在了加载内核阶段,因为已经出现了选择内核的界面,说明grub2已经正确加载了grub.cfg文件。此时重启系统选择救援模式,仍出现了同样的问题。在这种情况下只能选择挂载磁盘镜像,进入救援模式查看。
进入/boot目录,通过md5sum命令查看当前镜像的MD5值。在正常启动的百度Linux服务器操作系统 V5.0系统上initramfs的MD5值与当前环境的initramfs的MD5值不一致,说 明initramfs被修改过导致无法引导。
- 解决方案
用光驱挂载ISO救援模式进入系统,然后在boot目录重建initramfs文件,执行如下命令:
1# rm -rf initramfs-`uname -r`.img
2# dracut initramfs-`uname -r`.img `uname -r`

完成后,重启系统,就正常进入系统。
1# reboot
评价此篇文章
