系统的开机流程:
1. 加载BIOS的硬件信息并进行自我检测,依据设定取得第一个可开机的装置
2. 读取并执行第一个开机装置内MBR的boot loader(如grub等)
3. 依据boot loader的设定加载kernel,kernel会开始侦测硬件与加载驱动程序
4. 在硬件驱动成功后,kernel会主动呼叫init程序,而init会取得run level信息
5. init执行/etc/init/rc-sysinit.conf档案来准备软件执行的环境
6. init执行run level的各个服务(以script的方式)
7. init执行/etc/rc.local档案
8. init执行终端机仿真程序来启动login程序,等待用户登录
boot loader是一个开机管理程序,它用来处理核心档案加载(load)的问题,主要功能就是认识操作系统的文件格式并加载核心到主存储器中。boot loader在开机装置的第一个sector内,也就是MBR(Master Boot Record,主引导记录)。每个操作系统的loader都不同,BIOS是通过硬件的INT 13中断功能来读取MBR的,只要BIOS能够侦测到硬盘,就能够通过INT 13来读取磁盘第一个扇区的MBR
每一个文件系统(file system或partition)都会保留一块启动扇区(boot sector)提供操作系统安装boot loader,并且操作系统默认会安装一份boot loader到根目录所在文件系统的boot sector上
boot loader的主要功能如下:
1. 提供选单:用户可以选择不同的开机项目,这也是多重引导的重要功能
2. 载入核心档案:直接指向可开机的程序区段来开始操作系统
3. 转交其他loader:将开机管理功能转交给其他loader负责
当boot loader读取核心档案后,Linux会将核心解压缩到主存储器中,并利用核心的功能开始测试与驱动各个周边装置,此时Linux核心会以自己的功能重新侦测硬件,而不一定会使用BIOS侦测到的硬件信息。Linux核心是可以动态加载核心模块的,核心模块放在/lib/modules/下。由于模块放置到磁盘根目录内(/lib和/必须在同一个partition),因此开机过程中核心必须要挂载根目录,这样才能读取核心模块加载驱动程序。为了保护文件系统,开机过程中根目录是以只读的方式挂载的
一般非必要的功能且可以编译成为模块的核心功能都会被编译成模块(如USB,SATA,SCSI等)。所以如果是利用SATA硬盘启动则需要读取SATA模块以挂载根目录,但SATA的驱动在/lib/modules/之中,不挂载就无法读取,于是陷入了死循环。Linux依靠虚拟文件系统(Initial RAM Disk)来解决这个问题,它一般使用的档名为/boot/initrd。initrd可以将/lib/modules/...内开机过程中必需的模块打包成一个档案,这个档案能够被boot loader加载到内存中,然后通过INT 13硬件功能将其读出并解压,在内存中仿真成为根目录。这个仿真的根目录提供了能够加载开机过程中所需核心模块(如SATA, USB,LVM,RAID等)的程序。载入完成后,会帮助核心重新呼叫/sbin/init来开始后续正常的开机流程
由此可见,如果没有initrd,只要根目录不在特殊的磁盘接口(USB,SATA,SCSI)也没有使用特殊的文件系统(LVM,RAID等),如Linux安装在IDE磁盘上且使用默认的ext2/ext3/ext4文件系统,则依然可以顺利开机。所以一般需要initrd的时刻为:(1)根目录所在磁盘为SATA、USB或SCSI等接口;(2)根目录所在文件系统为LVM、RAID等特殊格式;(3)根目录所在文件系统为非传统的Linux所认识的文件系统;(4)有其他必须要在核心加载时需要的模块
重制initrd档案可以使用mkinitramfs指令
mkinitramfs [-v] -o 输出文件名
-v:显示运作过程
-o:后接输出文件的名称
在硬件检测完成、核心和模块加载完成后,主机硬件已经准备就绪,系统会呼叫第一支程序/sbin/init,它的主要功能是准备软件执行的环境,包括系统的主机名、网络设定、语言设定等其他服务的启动。所有的动作都会通过/etc/init/下init的配置文件来规划,其中一个重要的项目就是run level。Linux是藉由run level来规定系统使用不同的服务来启动而让Linux的使用环境不同。常见distribution的run level有以下7个等级:
0 - halt(关机)
1 - single user mode(单人维护模式,用在系统出问题时进行维护)
2 - multi-user without NFS(类似run level 3,但无NFS服务)
3 - full multi-user mode(完整含有网络功能的纯文本模式)
4 - unused(系统保留功能)