这里以RHEL 6 64bit为例,开机的大致流程;
- 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置;
- 读取并执行第一个开机装置内 MBR 的 boot Loader (亦即是 grub等程序);
- 依据 boot loader 的设定加载 Kernel ,Kernel 会开始侦测硬件与加载驱动程序;
- 在硬件驱动成功后,Kernel 会去自动调用 init 程序,而 init 会取得 run-level 信息;
- init 执行 /etc/rc.d/rc.sysinit 档案来准备软件执行的作业环境 (如网络、时区等);
- init 执行 run-level 的各个服务之启动 (script 脚本);
- init 执行 /etc/rc.d/rc.local 档案;
- init 执行终端机仿真程序 mingetty 来启动login 程序,最后就等待用户登入啦;
加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置
开机首先会去加载BIOS(Basic Input Output System),并透过BIOS程序去加载CMOS的信息,并且CMOS内设定的信息取得主机的各项硬件配置。(e.g. CPU与接口的沟通频率),取得了这些信息之后,BIOS还会进行开机自我检测(Power-On Self Test, POST)。然后开始执行硬件侦测的初始化,之后再定义可开机的装置顺序
读取并执行第一个开机装置内 MBR 的 boot Loader (亦即是 grub等程序)
BIOS会指定开机的装置让我们可以读取磁盘中的操作系统核心档案。由于不同OS有不同的文件系统格式,因此我们必须要以一个开机管理程序来处理核心档案加载(load)的问题,开机因此这个程序就被称Boot Loader了。这个Boot Loader在开机装置的第一个扇区内(MBR Master Boot Record)。BIOS是透过硬件的INT 13中断功能来读取MBR的,也就是说BIOS能够侦测到你的磁盘,它就可以通过硬件INT 13号中断来读取该磁盘的第一个扇区内的MBR
一个电脑上装多重操作系统,为什么要先装Windows OS,因为装多重操作系统的时候,每一个系统都会保留一块启动扇区(boot sector)以便到时候启动操作系统,而且还会把启动程序(boot loader)放到系统的MBR,每一块硬盘就只有一个MBR,装第二个操作系统的时候会覆盖第一个操作系统放到系统的MBR的值,Windows系统的Loader预设不具有控制权的转交功能
boot loader的主要功能;
-
提供选单:用户可以选择不同的开机项目,在这个是多重引导的重要功能。
-
载入核心档案:直接指向可开机的程序区段来启动操作系统。
-
转交其他Loader: 将开机管理功能转交给其他的Loader来负责。
boot loader最终功能就是加载kernel文件。
依据 boot loader 的设定加载 Kernel ,Kernel 会开始侦测硬件与加载驱动程序
通过boot loader的管理而开始读取内核文件后,接下来,Linux就会将内核解压缩到内存中,并且利用内核的功能,开始测试和驱动周边设备。此时Linux内核会以自己的功能重新检测一次硬件,而不一定会使用BIOS检测到的硬件信息。内核此时才开始接管BIOS后的工作了。内核文件一般会放置在/boot里面,并且取名为/boot/vmlinuz
在硬件驱动成功后,Kernel 会去自动调用 init 程序,而 init 会取得 run-level 信息
在内核加载完毕进行完硬件检测与驱动程序加载后,此时主机硬件就准备就绪了,此时内核会主动调用第一个进程,就是/sbin/init。/sbin/init最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设置、语系处理、文件系统格式及其他服务的启动。配置文件为/etc/inittab。而inittab内还有一个很重要的设置选项,就是默认的run level(启动执行等级)。
执行等级:Linux通过设置run level来规定系统使用不同的服务来启动,让Linux的使用环境不同。依据有无网络与有无X Window而将run level分为7个等级
-
0 - halt 系统直接关机
-
1 - single user mode 单用户维护模式,用在系统出问题是的维护
-
2 - Multi-user, without NFS 类似下面的runlevel3,但无NFS服务
-
3 - Full multi -user mode 完整含有网络功能的纯文本模式
-
4 - Unused 系统保留功能
-
5 - X11 与runlevel3类似,但加载使用X Window
-
6 - reboot 重新启动
由于runlevel 0/4/6不是关机、重新启动就是系统保留的,所以不能将默认的run level设置成这三个值,否则系统就会不断自动关机或者自动重启
/etc/inittab语法
[设置选项]:[run level]:[init的操作行为]:[命令选项]
-
设置选项:最多四个字符,代表init的主要工作项目,只是一个简单的说明
-
run level:该项目在哪些run level进行的意思。如果是35则代表runlevel3与5都会执行
-
init的操作行为:主要可以进行的动作项目意义有
init设定值 | 意义说明 |
---|---|
initdefault | 代码预设的run level设定值 |
sysinit | 代表系统初始化的动作项目 |
ctrlaltdel | 代表[ctrl]+[alt]+[del]三个按键是否可以重新启动的设定 |
wait | 代表后面字段设定的指令项目必须要执行完毕才能继续底下其他的动作 |
respawn | 代表后面字段的指令可以无限制的再生(重新启动)。举例来说,tty1的mingetty产生的可登入得画面,在你注销而结束后,系统会再开一个新的可登入画面等待下一个登入 |
更多的设置可以参考man inittab的说明
init处理系统初始化流程(/etc/rc.d/rc.sysinit)
这个脚本主要是设定系统的环境
启动系统服务与相关的启动配置文件(/etc/rc.d/rc & /etc/sysconfig)
用户自定义开机启动程序(/etc/rc.d/rc.local)
参考来自鸟哥私房菜第三版