你要是用过 Linux 系统,肯定知道开机的时候,不是按个电源键,等着屏幕亮起来那么简单。背后的操作可复杂了,就像一场精心安排的大合唱,每个部分都在该出声的时候出声。今天,咱就来好好讲讲 Linux 系统开机到底是咋回事,把它的神秘面纱给揭下来。
一、BIOS/UEFI:开机的开场戏
你一按电脑的电源键,这场开机大戏就开场了。最先出来 “表演” 的是 BIOS(基本输入 / 输出系统)或者 UEFI(统一可扩展固件接口)。以前的老电脑,BIOS 用得比较多,它里面有让键盘、显示屏、磁盘驱动器和串口通信这些设备能正常工作的程序。不过现在技术进步了,UEFI 慢慢变得更常用。
BIOS 和 UEFI 有个很大的不同,就是存磁盘信息的方式不一样。BIOS 用的是主引导记录(MBR),UEFI 用的是 GUID 分区表(GPT)。开机的时候,BIOS 或者 UEFI 会先做个加电自检(POST),这一步可重要了,它得检查硬件和外接设备是不是都没问题,电脑能不能正常工作。要是检查出毛病了,屏幕上就会显示错误提示;要是没检测到内存,电脑还会发出 “滴滴” 的声音。只有顺利通过这个检查,电脑才能进入下一步开机流程。
二、找引导加载程序:打开系统大门的钥匙
自检完了,BIOS 或者 UEFI 会按照电脑的设置,去找能启动系统的设备。一般来说,系统会按默认的顺序找,像硬盘、USB 驱动器、CD 驱动器这些。当然,你也可以自己在 BIOS 或者 UEFI 里设置找设备的顺序。在 BIOS 系统里,引导加载程序在启动设备的第一个扇区,也就是 MBR,占磁盘前面 512 字节的地方;在 UEFI 系统里,所有启动用的数据都存在一个.efi 文件里,这个文件在有引导加载程序的 EFI 系统分区里。
引导加载程序虽然个头不大,但作用可不小。它主要干的事儿,就是找到磁盘上的操作系统内核,把它放到内存里,然后按照设置好的选项运行。在 Linux 系统里,有好几种引导加载程序可以选:
- Lilo:也就是 Linux Loader,以前在 Linux 系统里用得挺多的。但是它不支持同时启动好几个操作系统,也不支持 UEFI,对新的文件系统支持也不太够。它的开发者在 2015 年 12 月就不更新了,现在基本都不用它了。
- Syslinux:这是个能在 FAT 文件系统上运行的 Linux 引导加载程序,一般在第一次装 Linux 系统的时候用,能让安装过程简单点。它能支持好几种常用的文件系统,像 FAT、ext2、ext3、ext4 这些,在一些条件下,也能支持 btrfs 和 xfs 文件系统。
- GRUB2:现在差不多所有的非嵌入式 Linux 系统发行版都用 GRUB(Grand Unified Boot Loader),特别是 GRUB2。它功能特别多,能引导好几个操作系统,既能用图形界面,也能用文本界面,通过串口电缆用起来很方便,还有个很厉害的命令行界面,可以用来交互式设置,还能通过网络实现无盘启动。在开机的时候,GRUB2 从 BIOS 或者 UEFI 手里接过控制权,先把自己加载好,再把 Linux 内核放到内存里,然后把运行的权力交给内核。它默认的配置文件在 /boot/grub 目录下。
三、内核:系统的核心 “发动机” 启动
引导加载程序把内核成功放到内存里之后,内核就开始工作了。内核的镜像文件是压缩过的,加载进来后得先解压,然后放到高端内存里。要是有初始 RAM 磁盘映像,也会一起被加载。内核在启动的时候,会把内存管理、进程调度、设备驱动这些系统资源都设置好。它就像一台特别复杂、特别精密的大机器,把电脑各个部件的工作都协调得好好的,为后面系统正常运行打好基础。
四、init 进程:用户操作界面的 “开荒者”
内核启动完了,就会启动 init 进程,它的进程 ID(PID)是 1。init 进程就像是所有其他进程的 “老祖宗”。在以前的 Linux 系统里,它会按照 /etc/inittab 文件里写的脚本做事,负责把系统初始化好,管理好系统的运行级别。它得设置好键盘、字体,加载各种模块,把网络配置好等等,这些工作都很重要,都是为了让用户能正常操作电脑创造条件。不过现在的 Linux 系统,systemd 慢慢把老的 init 系统给替代了。systemd 的设计思路和以前不一样,它能让很多服务同时启动,大大缩短了开机时间,而且管理服务的功能也更强。
五、系统初始化与登录:走进 Linux 的世界
在 init 进程(或者 systemd)的指挥下,系统会运行一系列初始化脚本,像 /etc/rc.d/rc.sysinit 这些,把系统初始化好。这个过程包括挂载文件系统、启动各种服务等等。等所有初始化工作都做完了,系统就会出现登录界面,等着你输入用户名和密码。到这儿,Linux 系统的开机过程就结束了,你就可以在这个功能强大的操作系统上开始各种操作和探索了。
了解了 Linux 系统开机的整个过程,我们就能看到电脑系统里面各个部分配合得多好,也能更好地了解和维护 Linux 系统。不管是排查开机的时候出的问题,还是想让系统性能更好,这些知识都能帮上大忙。希望这篇文章能让你对 Linux 系统开机有更全面、更深入的认识,让你在 Linux 的世界里用得更顺手。你在使用 Linux 系统的时候,有没有遇到过和开机有关的问题呢?欢迎在评论区说说你的经历和想法。