您的位置:首页 > 运维架构 > Linux

Linux开机流程详解一

2015-02-23 11:48 471 查看
Linux开机启动流程

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

    2.读取并执行官第一开机装置内的MBR的boot Loader(也就是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.loacl文件;

    8.init执行终端仿真进程mingetly来启动login进程,等待用户登录

    


BIOS,开机自我检测与MBR

BIOS(Basic Input Output System)

    BIOS其实固话在ROM中的软件,负责最低级的,最直接的硬件控制,以及计算机原始操作,用来管理机器的启动和系统重要

    硬件的控制和驱动,并未高层软件提供基层调用。

在个人计算机架构下,你要你启动系
4000
统首先就得让系统加载BIOS,并透过BIOS程序去加载CMOS(Complementary Metal Oxide Semiconducto互补金属氧化物半导体存储器,对于CMOS大多数是带电池的RAM),并由CMOS内的参数设定主句各项硬件配置信息,例如CPU与设备的沟通的频率,开机的启动搜寻顺序,硬盘的大小,系统时间、PnP等。取得这些信息后,BIOS还会进行开机自我检测POST(Power-on Self Test),并开始执行硬件侦测的初始化,并设定PnP装置之后再定义出开机的装置顺序,接下来就开始进行开机装置的数据读取。

由于我们系统的软件大多放置在硬盘中,所以BIOS会指定开机装置让我们读取磁盘中操作系统镜像文件。但由于不同的操作系统的文件格式不同,因此我们必须要以一个开机管理程序来处理核心文件的加载,因此这个开机管理程序就被称为Boot Loader,Boot Loader安装在开机装置的第一个扇区(sector)

也就是我们一直谈到的MBR(Master Boot Record).每个操作系统的loader都不同,这样的BIOS是如何MBR内的loader?其实BIOS是透过INT 13,这条通道读取MBR,这样boot loader就可以被执行啦。

Boot Loader的功能

Loader的最主要功能是要认识操作系统的文件格式并据以加载内核到主内存中去运行,由于不同的操作系统的文件格式不一致,因此每种操作系统都有自己的boot loader,用自己的loader才有办法加载内核文件,那么如果一个机子要装多个系统,那么就需要多个loader,但只有一个MBR,不能容下多个loader,那么就需要了解boot loader的功能了:

    .提供菜单:使用者可以选择不同的启动项目,这也是多重启动的重要功能

    .加载内核文件:直接指向可启动的程序区段来开始操作系统

    .转交其他loader:将启动管理功能交给其他loader

如果我们需要装Windows和Linux双系统,而默认Windows默认会把boot Loader装载到MBR,所以我们在装双系统的时候,一定要先装Winodws系统,然后再装Linux系统,当机子加载MBR是通过提供的MBR可以选择启动项目,通过不同的选择启动项目MBR会指向不同的系统的文件系统所在的Loader,然后加载相应的内核。示意图如下:



我的 MBR 使用 Linux 的 grub 这个启动管理程序,并且里面假设已经有了三个菜单, 第一个菜单可以直接指向 Linux 的核心文件并且直接加载核心来启动;第二个菜单可以将启动管理程序控制权交给 Windows 来管理,此时 Windows 的 loader 会接管启动流程,这个时候他就能够启动 windows 了。第三个菜单则是使用Linux 在 boot sector 内的启动管理程序,此时就会跳出另一个 grub 的菜单啦!这样一块硬盘就可以装多个系统,在机子启动的时候选择不同的启动项,
就会加载不同的系统内核。

加载内核侦测硬件与initrd

当我们由boot loader的管理而开始读取内核文件后,Linux会将内核解压到内存中,并且利用内核的功能开始测试与驱动各个周边装置,包括存储装置、CPU、网卡、声卡等等,此时Linux核心会重新侦测一次硬件,而不一定会使用BIOS侦测到的硬件信息,也就是说,此时内核才开始接管BIOS的工作,内核一般放在/boot目录下并且取名/boot/vmlinuz。为了硬件开发商与其他核心功能开发者便利,因此Linux核心是可以透过动态加载核心模块(可以理解为驱动程序),这些modules就放在/lib/modules/目录内。由于放模块放置在磁盘根目录内(切记/lib不可以与/分别放在不同的partition)因此在启动的过程内核必须要挂载根目录,这样才能读取核心模块提供加载驱动程序的功能。而且防止影响到磁盘内的文件系统,因此启动过程中根目录是以只读的方式挂载的。

一般来说,非必要的功能可以编译成核心功能,目前的各个发行版本都会将他编译成模块,因此U盘,SATA,SCSI等等的装置的驱动程序通常都是以模块的方式来存在的。刚刚在上面讲到开机的启动顺序,BOIS的INT13取得boot loader与Kernel文件来启动,然后kernel会开始接管系统并且侦测硬件及尝试挂载目录来取得额外的取得程序。

问题是核心根本不认识SATA磁盘,所以需要家长SATA的驱动程序,否则根本无法挂载跟目录。但是SATA的驱动程序在/lib/modules内,你根本无法加载目录怎么读取,在这种情况下Linux根本无法启动,那么这个问题是如何解决的?

虚拟文件系统(Initial RAM Disk)一般使用的文件名/boot/initrd,这个文件的功能是他能透过boot loader来加载到内存中,然后这个文件会被减压并且在内存这种模拟出一个根目录,且模拟正在内存当中的文件系统弄够提供一只可运行的程序,透过程序来加载启动过程所需的核心模块,加载完后,会帮助核心呼叫/sbin/init来开始后续的正常启动流程。



boot loader 可以加载 kernel 与 initrd ,然后在内存中让 initrd 解压缩成为根目录, kernel 就能够藉此加载适当的驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统,就能够开始后续的正常启动流程。并不是所有情况下都需要initrd,如果Linux系统安装在IDE介质的磁碟上,并且使用默认的ext2/ext3,就不需要initrd,可以直接载入内核,顺利启动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: