Linux启动流程
Linux系统从启动到提供服务的过程是这样,先是机器加电,然后通过MBR或者UEFI加载GRUB,再启动内核,内核启动服务,然后开始对外服务。
- BIOS
写入到主板上的一个软件程序,开机时计算机主动执行;功能:加载CMOS的信息,并通过CMOS内的设置值取得主机的各项硬件配置,然后进行开机自检,开始执行硬件检测的初始化,并配置PnP设备,并且根据用户的设置去取得能够开机的存储设备,读取并执行里面的第一个扇区的MBR位置。 - MBR
每块硬盘的第一个扇区内含有446B的MBR区域,称为主引导分区,内含引导加载程序。 - boot loader
a)提供菜单:用户可以选择不同的启动选项,这也是多重引导的重要功能。
b)加载内核文件:直接指向可启动的程序区段来开始操作系统。
c)转交其他loader:将引导装载功能转交给其他loader负责。 - Loader
最主要的功能是要认识操作系统的文件格式并据以加载内核到内存中去执行,由于每种操作系统的文件格式不一致,因此每种操作系统都有自己的boot loader,只有使用自己的loader才能够加载属于自己的操作系统内核。每个文件系统都会保留一块引导扇区(boot sector)提供操作系统安装boot loader,而通常操作系统默认会安装一份loader到它根目录所在的文件系统的boot sector上。 - 加载内核检测硬件
Linux会将内核解压缩到内存当中,并且利用内核的功能,开始测试与驱动各个周边设备(包括存储设备网卡声卡等)。 - run level
上述主机硬件准备就绪后,内核会调用第一个进程,即/sbin/init,PID为1,最主要的功能是准备软件执行的环境,包括系统主机名、网络设置等。所有
操作都通过
init的配置文件—/etc/inittab 来规划,其中一个很重要的设置选项就是默认的run - level(启动执行等级)。
Linux通过设置run level来规定系统使用不同的服务来启动,让Linux的使用环境不同,基本上依据有无网络与有无X Window将run level分为7个等级,具体不细说了。一般我们默认都是3—完整含有网络功能的纯文本模式 或者5—与3类似加载使用X Window来作为run level的。Linux中启动脚本都被放在/etc/rc.d/中,rc—runlevel control,将名称设置为.d结尾是Linux系统的一种习惯,使得我们一看就知道是一个目录文件。 - /etc/rc.d/rc.sysinit
主要功能是设置系统功能,包括设定网络配置、测试挂载内存设备/proc、设置系统时间、启动swap分区、用户自定义模块的加载等。在这个文件中进行的许多工作的默认配置文件,或者说启动过程会用到的配置文件都在/etc/sysconfig/当中。 - /etc/rc.d/rc N
在系统模块和相关硬件信息的初始化后,我们还需要启动系统所需要的各项服务,这样主机才能提供给我们相关的网络或者是主机功能。依据 /etc/inittab/ 里面提到的run level设置值。 - /etc/rc.d/rc.local
有任何想要在启动时就进行的工作时,直接将它写入/etc/rc.d/rc.local,那么该工作就会在启动的时候自动被加载。 - run level的切换
要每次启动都执行某个默认的run level,则需要修改/etc/inittab 内的设
置选项,即是“id:5:initdafault:”里头的数字。如果仅是暂时更改系统的run level时,则使用 init[0-6] 来进行run level的更改,但下次启动时依旧是以/etc/inittab 内的设置为准。