linux开机过程

当你按下电源开关后,计算机硬件会主动读取BIOS来加载硬件信息及进行硬件系统的自我测试,之后系统会主动去读取第一个可开机的装置(由BIOS设定),此时就可以读入开机管理程序了。开机管理程序可以指定使用哪个核心档案来开机,并加载核心到内存当中解压与执行,此时核心就能够开始在内存内活动,并侦测所有的硬件信息与加载适当的驱动程序来使整个主机开始运行,等到核心侦测硬件与加载驱动程序完毕后,一个操作西欧汤尼盖就开始在你的PC上跑起来了。主机系统开始运作后,此时linux才会呼叫外部程序开始准备软件执行的环境,并且实际的加载所有系统运行所需要的软件程序,最后系统就会开始等待你的登入与操作,。系统开机的经过可以汇整成以下流程:

1 加载BIOS的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置;

2 读取并执行第一个开机装置内MBR的bootloader(也就是grub,spfdisk等程序);

3 依据boot loader的设定加载kernel,kernel会开始侦测硬件与加载驱动程序;

4 在硬件驱动成功之后,kernel会主动呼叫init程序,而init会取得run_level信息;

5 init执行/etc/rc.d/rc.sysinit档案来准备软件执行的作业环境(如网络,时区等);

6 init执行run-level的各个服务的启动(script方式);

7 init执行etc/rc.d/rc.local档案;

8 init执行终端机仿真程序mingett来启动login程序,等待用户登入。

BIOS,开机自我测试与MBR

要想启动整个系统首先就得让系统考取加载BIOS,并通过BIOS去加载CMOS的信息,借由CMOS内的设定值取得与主机的各项硬件配置,例如CPU与接口设备沟通频率,开机装置的搜索顺序,硬盘的大小与类型,系统时间,各个接口IO地址,等等。在取得这些信息后,OS还会进行开机自我测试,然后执行硬件侦测的初始化,并设定PnP装置,之后再定义出可开机的装置顺序,接下来就会开始进行开机装置数据读取了(MBR相关任务的开始)

由于我们的系统软件大都是放在硬盘中,所有BIOS会指定开机的装置好让我们可以读取磁盘中的操作系统核心档案,但由于不同操作系统的文件系统格式不同,我们必须要以一个开机管理程序来处理核心加载load的问题,因此这个开机管理程序被叫做boot loader。而这个boot loader安装在开机装置的第一个扇区内,也就是我们常说的MBR(master boot record,主要启动记录区)。

而核心档案需要loader来读取,那每个操作系统的loader都不相同,那么bios又是如何读取MBR内的loader呢?其实BIOS是通过硬件的INT 13中断来读取MBR,也就是说,只要BIOS能够侦测到你的磁盘(无论IDE还是SATA接口),那他就有办法投过INT13 这个信道来读取该磁盘的第一个扇区MBR,这样boot loader那就能够被执行了。

BOOT loader

loader的功能就是要认识操作系统的文件格式并据此加载核心到主存储器中去执行,由于不同操作系统的文件格式不一样,因此每种操作系统都有自己的boot loader,用自己的loader才能加载核心档案。那么,我们有多重操作系统,那么有多个loader,但MBR之后一个,怎么实现多重操作系统呢?

其实,每个文件系统(或者partition)都会保留一块启动扇区(boot sector)提供操作系统安装boot loader,而通常操作系统默认都会安装一份loader到他根目录所在的文件系统的boot sector,如果我们在一部主机上面安装windows与linux后,该boot sector,boot loader与MBR如下:

linux开机过程_第1张图片

如图,每个OS默认都会安装一套boot loader到他自己文件系统的boot sector中与linux的boot sector都有一份boot loader,而windows 在安装时候,他是预设就将MBR与boot loader默认都装上一份boot loader,所以装多重系统时候,你的MBR常常会被不同OS的boot loader覆盖。

那么MBR只有一个,那么怎么让OS可以透过自己的bootloader加载核心呢。这就是bootloader的功能了:

(1)提供选单

(2)载入核心档案:直接执行可开机的程序区段来开始OS

(3)转交其他loader: 将开机管理功能转交给其他loader负责。

但是windows的loader预设不具有控制权转交的功能,因此不能使用windows的loader来加载linux的loader,这也是强调得先装windows再装linux的原因。

linux开机过程_第2张图片

如图,MBR使用linux的grub这个开机管理程序,并且里边假设已经有了三个选单,一个选单可以直接执行linux的核心档案直接加载核心;另一个选单可以将开机管理控制权交个windows,这时候windows的loader会接管开机程序,启动windows,第三个选单是使用linux在boot sector内的开机管理程序,这时候会跳出另一个grub。

而最终boot loader就是加载核心。

当boot loader开始读取核心档案后,,linux就会将核心加压缩到主存中,并且利用核心的功能,开始测试与驱动各个周边装置,包括存储装置,CPU,网卡,声卡等,这时linux核心以自己的功能从新侦测一次硬件而不一定使用BIOS侦测到的硬件信息,也就是说,核心此时开始接管工作。那么核心在哪里呢?一般都放在/boot里边,且取名/boot/vmlinuz*

linux核心可以动态加载核心模块(想成驱动程序就好)。这些模块都在/lib/modules/内由于模块放在磁盘根目录内,因此在开机过程中核心必须要挂在根目录这样才能读取核心模块加载驱动。

目前USB,SATA,SCSI等磁盘装置的驱动程序通常都以模块方式存在,假设你的linux是安装在SATA盘上,你可以通过BIOS的INT13取得boot loader与kernel档案来开机,然后kernel接管系统并侦测硬件及尝试挂载根目录来取得驱动程序,但是问题是核心根本不认识SATA磁盘,需要加载SATA磁盘的驱动程序才能挂载根目录。这时候,一般是通过虚拟文件系统来处理这个问题。

虚拟文件系统 (Initial RAM Disk) 一般使用的档名为 /boot/initrd ,这个档案的特色是,他也能够透过 boot loader 来加载到内存中, 然后这个档案会被解压缩并在内存中仿真成一个根目录,且此仿真在内存当中的文件系统能够提供一支可执行的程序,透过该程序来加载开机过程中所最需要的核心模

块, 通常这些模块就是 USB, RAID, LVM, SCSI 等文件系统不磁盘接口的驱动程序了!等载入完成后,会帮核心重新呼唤 /sbin/init 来开始后续的正常开机流程。

boot loader 可以加载 kernel 及 initrd ,然后在内存中让 initrd 解压缩成为根目录, kernel 就能够藉此加载适当的驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统, 就能够开始后续的正常开机流程。

第一支程序 init 及配置文件 /etc/inittab 与 runlevel

在加载核心完毕后,进行完硬件侦测与驱动程序加载后,此时主机硬件就准备就绪了,此时核心会呼叫第一支程序/sbin/init. 。 /sbin/init 最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语系处理、文件系统格式及其他服务的启动等。而所有的启作都会透过 init 的配置文件 /etc/inittab 来规划,而 inittab 内还有一个非常重要的设定项目,那就是runlevel (开机执行等级) 。

runlevel有七个等级:

0-halt(系统直接关机)

1 - single user mode (单人维护模式,用在系统出问题时的维护)

2 - Multi-user, without NFS (类似底下的 runlevel 3,但无 NFS 服务)

3 - Full multi-user mode (完整的有网络功能的纯文本模式)

4 - unused (系统保留功能)

5 - X11 (不 runlevel 3 类似,但加载使用 X Window)

6 - reboot (重新启动)

init 处理系统初始化流程 (/etc/rc.d/rc.sysinit)

 /etc/inittab 里头有这一句『si::sysinit:/etc/rc.d/rc.sysinit 』吧? 这表示:开始加载各项系统服务前,得先做好整个系统环境,我主要利/etc/rc.d/rc.sysinit这个 shellscript 来设定好我的系统环境的。

如果你使用 vim 去查阅过 /etc/rc.d/rc.sysinit 的话,那么可以发现他主要的工作大抵有这几项:

1.  取得网络环境不主机类型: 读取网络配置文件 /etc/sysconfig/network ,取得主机名与默通讯闸 (gateway) 等网络环境。

2.  测试不挂载内存装置 /proc 及 USB 装置 /sys:

除挂载内存装置 /proc 外,还会主劢侦测系统上是否具有 usb 的装置, 若有则会主动加载 usb 的驱动程序,并尝试挂载usb 的文件系统。

3.  决定是否启动 SELinux :

4.  启动系统的随机数生成器

随机数生成器可以帮系统进行一些密码加密演算的功能,在此需要启动两次随机数生成器。

5.  设定终端机 (console) 字形:

6.  设定显示开机过程中的欢迎画面 (text banner);

7.  设定系统时间 (clock) 与时区设定:需读入 /etc/sysconfig/clock 值

8.  接口设备的侦测与 Plug and Play (PnP) 参数的测试

9.  用户自定义模块的加载:使用者可以在/etc/sysconfig/modules/*.modules 加入自定义的模块,则此时会被加载到系统当中

10. 加载核心的相关设定:

系统会主动去读取 /etc/sysctl.conf 这个档案的设定值,使核心功能成为我们想要的样子。

11. 设定主机名不初始化电源管理模块 (ACPI)

12. 初始化软件磁盘阵列:主要是透过 /etc/mdadm.conf 来设定好的。

13. 初始化 LVM 的文件系统功能

14. 以 fsck 检验磁盘文件系统:会进行 filesystem check 

15. 迚行磁盘配额 quota 的转换 (非必要):

16. 重新以可擦写模块挂载系统磁盘:

17. 启动 quota 功能:所以我们并需要自定义 quotaon 的动作

18. 启动系统虚拟随机数生成器(pseudo-random):

19. 清除开机过程当中的临时文件:

20. 将开机相关信息加载/var/log/dmesg 档案中。

如果你想要知道到底开机的过程中发生了什么事情呢?那么就执行『 dmesg』吧。整个开机的过程当中,老是读取的一些朋务的相关配置文件都是记录在 /etc/sysconfig 目录下,所以可以好好看看。

以上就是整个开机过程了。

你可能感兴趣的:(Linux基础)