找回密码
 立即注册
Qt开源社区 门户 查看内容

Linux启动流程

2019-10-12 12:15| 发布者: admin| 查看: 294| 评论: 0

摘要: 提要 Linux系统从启动到提供服务的过程是这样,先是机器加电,然后通过MBR或者UEFI加载GRUB,再启动内核,内核启动服务,然后开始对外服务。简要步骤1.加载BIOS的硬件信息与进行自我测试,并依据设置取得第一个 ...
提要

          Linux系统从启动到提供服务的过程是这样,先是机器加电,然后通过MBR或者UEFI加载GRUB,再启动内核,内核启动服务,然后开始对外服务。

简要步骤

1.加载BIOS的硬件信息与进行自我测试,并依据设置取得第一个可启动的设备(比如硬盘);

2.读取并执行第一个开机装置内MBR 的boot Loader (即grub2, 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 执行终端机模拟程序mingetty来启动login进程,最后就等待用户登录。



详细步骤

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的。

PS: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 内的设置为准。

文章转自:小组15级成员--杜肖孟

原文地址:https://blog.csdn.net/Tanswer_/article/details/59488535

(更多详细内容,点击左下角【阅读原文】)





----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:西邮Linux兴趣小组,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了