基本上Linux的启动过程如图所示,不同版本之间可能有一些细微的差别,后面再做介绍,但总体上就是这样一个流程。
- 从机器上电开始,首先直接将ROM芯片中的BIOS程序加载到内存中运行。BIOS程序首先进行POST(Power On Self Test),即硬件自检,自检通过则按照BIOS中Boot Sequence中定义启动顺序去找相应设备上的0号扇区,尝试寻找其中的BootLoader程序。
- 如果找到了BootLoader程序则将其加载到内存中,将系统控制权交给BootLoader。而BootLoader则会根据其配置文件进行工作,加载内核和伪根文件系统至内存中,同时告诉内核启动时哪个程序作为系统初始化程序。
- 这个时候BootLoader也完成了它的使命,将系统控制权交给内核。内核首先使用伪根文件系统,加载其中的真正的根文件系统的驱动程序。
- 内核以只读方式挂载真正的根文件系统,防止误操作损坏真正的根文件系统。
- 切换至真正的根文件系统,并以读写方式重新挂载根文件系统。
- 启动系统初始化程序,之后的启动工作全部交由系统初始化程序完成,内核退居幕后。只有在需要使用核心系统调用时,才交由内核完成。
这里有几点需要注意的:
1. UEFI作为新一代的标准规范,很好地适应的现代计算机的发展趋势,正在慢慢普及,未来会取代BIOS,但它们的作用本质上是一样的。
2. BootLoader是用来引导操作系统的程序,存在于磁盘0号扇区MBR(主引导记录,512字节)的前446字节中。
- 其实这样描述也不准确,因为446字节的空间对于一个完备的现代操作系统引导程序来说实在是有限,所以现在的BootLoader一般都分为N段式,不过第一段还是存在于这446字节内的。
- MBR由于其空间限制,也难以适应现代计算机标配大容量硬盘的趋势,会逐渐被GPT所取代。不过GPT考虑了兼容性,仍然保留了MBR的那块空间没有改变。
- BootLoader程序有很多。常见有windows的NTLoder,不过它只能用来引导windows;还有LILO,这是早期Linux中非常流行的引导程序;以及现在多数发行版Linux上使用GRUB,它有两个版本:一个是0.x,叫做legacy Grub;另一个是1.x,叫做Grub2,并不是在原来版本上改进来的,而是完全重写的。
3. 伪根文件系统的主要作用是提供真正根文件系统所需的驱动程序。在CentOS-5中的伪根文件系统使用的是ramdisk来实现的,即将一部分内存当做磁盘来用,这存在一个双缓存的问题。因为磁盘在跟内存交换数据时,因为磁盘速率远低于内存,所以磁盘上会划出一部分区域作为缓存,提高IO效率。但ramdisk中如果再划出缓存区域就会使得速度变慢而不是变快了。因此到CentOS-6后就改为了ramfs机制,即在一部分内存中建立文件系统。
4. 最后是系统初始化程序,在CentOS-5中是sysvinit,在CentOS-6中是upstart,在CentOS-7中是systemd。这部分内容就不写了,还是直接看IBM文档库中的权威文章吧。
浅析 Linux 初始化 init 系统,第 1 部分: sysvinit
浅析 Linux 初始化 init 系统,第 2 部分: UpStart
浅析 Linux 初始化 init 系统,第 3 部分: Systemd
时间: 2024-10-21 07:17:45