CentOS系统的启动过程是一个复杂而有序的流程,涉及多个关键组件的协同工作,init进程和GRUB引导加载程序扮演着至关重要的角色,理解它们的工作原理,对于系统管理和故障排查具有重要意义。

开机启动的第一步是BIOS或UEFI固件的执行,当计算机加电后,BIOS/UEFI会进行硬件自检(POST),确保核心组件如CPU、内存、硬盘等正常工作,随后,它会根据预设的启动顺序查找引导设备,在CentOS系统中,这通常是安装了操作系统的硬盘,BIOS/UEFI会读取该硬盘的第一个扇区,即主引导记录(MBR)或GUID分区表(GPT)中的引导代码,然后将控制权交给GRUB。
GRUB(Grand Unified Bootloader)是Linux系统中最常用的引导加载程序之一,在CentOS中,默认使用的是GRUB 2,GRUB的主要职责是加载Linux内核,并将控制权移交给内核,从而启动操作系统,GRUB的工作流程可以分为几个阶段,第一阶段(Stage 1)位于MBR或GPT引导扇区,其功能非常简单,即加载第二阶段的引导代码,第一阶段半(Stage 1.5)则位于MBR之后的扇区,它包含了必要的文件系统驱动程序,使得GRUB能够访问位于特定分区中的第二阶段文件,第二阶段(Stage 2)是GRUB的核心,它负责读取配置文件(通常是/boot/grub2/grub.cfg),显示启动菜单,并允许用户选择要启动的操作系统或内核版本。grub.cfg文件包含了启动菜单项、内核参数、initramfs(初始内存盘)的位置等信息,这个文件通常由grub2-mkconfig命令根据/etc/default/grub文件和其他配置文件自动生成。
当用户从GRUB菜单中选择一个启动项后,GRUB会加载指定的Linux内核文件(通常位于/boot目录下,如vmlinuz)和initramfs镜像文件,initramfs是一个临时的根文件系统,它在真正的根文件系统挂载之前被加载到内存中,它包含了驱动程序、必要的二进制文件和脚本,用于初始化硬件设备,尤其是存储设备,以便系统能够访问并挂载真正的根文件系统,内核被加载后,会进行初始化,包括检测硬件、加载驱动程序等,完成内核初始化后,内核会尝试挂载根文件系统,如果根文件系统位于需要特殊驱动的设备上(如LVM、RAID或SATA控制器),initramfs就至关重要,因为它提供了这些驱动。
挂载根文件系统之后,内核会将控制权交给系统的第一个进程,即init进程,在早期的Linux发行版中,init进程通常是SysVinit,它基于/etc/inittab文件来管理系统服务,在现代CentOS系统中(从CentOS 7开始),默认使用的是systemd作为init系统,systemd采用了更高效的并行启动机制,并使用单元(unit)文件来管理系统服务和资源。
systemd的入口点是/usr/lib/systemd/systemd进程,其进程ID(PID)始终为1,当内核启动systemd后,systemd会执行一系列初始化任务,它会执行initrd.target目标,完成initramfs中遗留的设备初始化和根文件系统检查,随后,systemd会读取/etc/machine-id或/etc/machine-info等文件来识别系统身份,并挂载必要的文件系统,如/proc、/sys、/dev等,systemd会启动基本的目标单元(target unit),如basic.target,该目标会启动基本的设备、交换空间和文件系统挂载点。

在基本目标启动后,systemd会根据默认的目标(通常是multi-user.target或graphical.target)来启动相应的服务。multi-user.target对应的是命令行多用户模式,而graphical.target则会额外启动图形界面服务,每个服务都由一个.service单元文件定义,systemd会根据依赖关系图并行启动服务,大大提高了启动速度,网络服务可能在某些服务启动之前就需要就绪,systemd还负责激活交换分区、设置主机名、加载内核模块等任务。
与传统的SysVinit相比,systemd的优势在于其并行处理能力、依赖关系管理、日志系统(journald)以及对资源控制的精细化管理,systemd的目标是成为系统和服务管理的核心,提供更快速、更可靠的启动体验,在CentOS系统中,可以通过systemctl命令来管理服务、目标单元以及查看系统状态。systemctl start nginx.service用于启动nginx服务,systemctl enable nginx.service用于设置开机自启,systemctl get-default用于查看默认启动目标,systemctl set-default multi-user.target用于更改默认启动目标。
小编总结CentOS的开机流程,从BIOS/UEFI的引导开始,到GRUB加载内核和initramfs,再到内核初始化并启动systemd init进程,最后systemd根据配置启动相应的服务和目标,形成一个完整的启动链,每个环节都紧密相连,任何一个环节出现问题都可能导致系统启动失败,了解GRUB配置文件的修改、内核参数的调整以及systemd目标和服务的管理,对于解决启动问题和优化系统性能至关重要,对于系统管理员而言,掌握这些知识是高效管理和维护CentOS系统的基础。
相关问答FAQs
问题1:如何修改GRUB的默认启动项和启动等待时间?

解答:修改GRUB的默认启动项和启动等待时间,主要编辑/etc/default/grub文件,使用文本编辑器(如vim或nano)打开该文件,找到GRUB_DEFAULT和GRUB_TIMEOUT这两行。GRUB_DEFAULT用于设置默认启动项,可以设置为菜单项的索引(从0开始)或菜单项的名称(如”CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)”)。GRUB_TIMEOUT用于设置启动菜单显示的等待时间,单位为秒,修改完成后,保存文件并运行grub2-mkconfig -o /boot/grub2/grub.cfg命令生成新的GRUB配置文件,使修改生效,重启系统后,新的设置就会起作用。
问题2:CentOS系统启动失败,如何通过GRUB命令行进入救援模式?
解答:当系统无法正常启动时,可以在GRUB启动菜单出现时,选中要启动的项,按e键进入编辑模式,在找到以linux16或linuxefi开头的行(这行包含了内核和initramfs的路径以及内核参数),在该行的末尾添加rd.break或systemd.unit=rescue.target参数,然后按Ctrl + x或F10启动系统,系统会进入救援模式,在救援模式下,根文件系统会被挂载在/sysroot目录下,可以使用chroot /sysroot命令切换到系统的根环境,然后进行必要的故障排查和修复,例如检查文件系统、修复配置文件或重置密码,修复完成后,执行exit退出chroot环境,然后输入reboot重启系统。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复