Linux启动流程
Linux启动流程
流程简介
操作系统启动过程分四阶段:
- BIOS启动。CPU通电后PC计数器初始化为一个特定的内存地址,指向ROM中BIOS的起始地址,由BIOS执行硬件的基本初始化,最先找到的设备的最开始的几个扇区将被加载到内存,BIOS执行其中的初始化代码并将系统控制权转交引导加载程序。
- 引导加载程序。由BIOS启动,负责将系统内核映像和initrd映像加载到内存并转交控制权。
- initrd 或 initramfs 系统。在内存中运行系统内核和根文件系统,init 程序是内存中的根文件系统上执行的第一个程序,这个程序在用户空间把内核初始化,并把控制权交给下一阶段。
- 实际系统。根文件系统将由内存切换到实际的硬盘文件系统上,init 程序是系统执行的第一个程序(PID=1),它启动其它各种程序以完成主引导流程。
相关知识
initrd 映像是根文件系统映像:
- initrd是指一个临时文件系统,它在启动阶段被Linux内核调用
- initrd主要用于当“根”文件系统被挂载之前,进行准备工作
initramfs是initrd的替代品:
- initrd是一个被加载的块设备,内部有ext2一类文件系统的存在,于是由于Linux内核的缓存机制,其中的内容还会被缓存到内存上,造成一定的内存空间浪费
- initramfs本身就是一个tmpfs的RAM disk,拥有最小化的设计,绕过了缓存机制,也消除了多余的内存占用。initramfs的生成方式也远比initrd简单。
PC上运行的Linux系统,它启动后从BIOS开始,进入bootloader,有bootloader加载内核,进入内核初始化。内核启动的最后一步就是创建一个pid为1的init进程。这是系统的第一个进程,它负责生产其他所有用户进程。
init程序流派:
- SysV:shell脚本控制
- systemd:目前主流,但饱受争议
- openrc:容易上手
- upstart
- busybox:嵌入式系统上使用
initramfs里有init
rootfs里也有init
initrd、initramfs用来初始化 /dev/proc/sys
类似chroot前三大步骤,格式不同
内核中有三种 chroot
- 切换root目录
- chroot:换一个用户空间,实际没有切换根目录
- 切换进程根目录
switch_chroot是initramfs的最后一个步骤
initramfs和initrd都是在切换根目录