专栏首页7DGroupLinux不为人知的启动过程

Linux不为人知的启动过程

一、绪论

Linux系统在日常工作中已经是我们朝夕相处的亲密伴侣,每次当我们按下可爱的电源键那一刻起直到出现熟悉的登陆界面。这短短的一瞬间它都经历什么那??

二、Linux启动过程

对于一台安装了Linux系统的主机来说,当我们按下开机按钮时一共要经历这几个阶段。

其中,每个过程都执行了自己该做的初始化部分的事情,有些过程又可分为好几个子过程。接下来,我们就对每个阶段做一个详细分析和讲解。

三、BIOS自检那些事

稍有计算机基础的人都应该听过BIOS(Basic Input / Output System),又称基本输入输出系统,可以视为是一个永久地记录在ROM中的一个软件,是操作系统输入输出管理系统的一部分。早期的BIOS芯片确实是"只读"的,里面的内容是用一种烧录器写入的,一旦写入就不能更改,除非更换芯片。现在的主机板都使用一种叫Flash EPROM的芯片来存储系统BIOS,里面的内容可通过使用主板厂商提供的擦写程序擦除后重新写入,这样就给用户升级BIOS提供了极大的方便。

BIOS的功能由两部分组成,分别是POST码和Runtime服务。POST阶段完成后它将从存储器中被清除,而Runtime服务会被一直保留,用于目标操作系统的启动。

BIOS两个阶段所做的详细工作如下:

步骤1:上电自检POST(Power-on self test),主要负责检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)是否正常。例如,最常见的是内存松动的情况,BIOS自检阶段会报错,系统就无法启动起来;

步骤2:步骤1成功后,便会执行一段小程序用来枚举本地设备并对其初始化。这一步主要是根据我们在BIOS中设置的系统启动顺序来搜索用于启动系统的驱动器,如硬盘、光盘、U盘、软盘和网络等。我们以硬盘启动为例,BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码。至此,BIOS的任务就完成了,此后将系统启动的控制权移交到MBR部分的代码。

四、系统引导

我们首先来了解一下MBR,它是Master Boot Record的缩写。硬盘的0柱面、0磁头、1扇区称为主引导扇区。它由三个部分组成,主引导程序(Bootloader)、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA),其结构图如下所示:

磁盘分区表包含以下三部分:

  1. Partition ID (5:延申 82:Swap 83:Linux 8e:LVM fd:RAID)
  2. Partition起始磁柱
  3. Partition的磁柱数量

通常情况下,诸如lilo、grub这些常见的引导程序都直接安装在MBR中。

我们以grub为例来分析这个引导过程

grub有两个作用:

  • 加载扇区
  • 加载内核

首先加载 /boot/grub

  1. grub加载第一个文件是stage1,此时只能识别ext3系统文件。
  1. 加载完stage1后才能加载stage1.5,stage1.5有很多文件格式,当加载完stage1.5后能够识别其他的文件格式。
  2. grub 加载stage2就可以看到开机画面。
  3. grub加载完tage2开始加载内核,首先加载kenal
  4. 内核都是模块化内核的路径是 /lib/modules/

6.Grub在加载内核的同时也在加载驱动文件。只有加载完驱动后才能识别硬盘.

五、加载第一个程序

加载第一个程序 /sbin/init 加载这个程序会运行 /etc/inittab 配置文件这里主要设置了启动默认进入的级别。

一共有7个运行级别路径为 /etc/rc.d

  • 0-----关机
  • 1------单用户模式
  • 2----单用户不能用nfs
  • 3-----字符模式
  • 4------未定义
  • 5------图形界面
  • 6-----重启

我们预览下init脚本主要是加载各种存储介质相关的设备驱动程序。当所需的驱动程序加载完后,会创建一个根设备,然后将根文件系统rootfs以只读的方式挂载。这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,执行系统的1号进程。此后系统的控制权就全权交给/sbin/init进程了。

六、初始化系统

到这里就是就快要看到曙光啦,接下来就是最后一步初始化系统。

/sbin/init进程是系统其他所有进程的父进程,当它接管了系统的控制权之后,它首先会去读取/etc/inittab文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等。主要包括以下工作:

  1. 执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统算是基本运行起来了,后面需要进行运行级别的确定及相应服务的启动。
  2. 执行/etc/rc.d/rc脚本。该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rc*.d(*=0~6)目录下,所有的文件均是指向/etc/init.d下相应文件的符号链接。rc.sysinit通过分析/etc/inittab文件来确定系统的启动级别,然后才去执行/etc/rc.d/rc*.d下的文件。 /etc/init.d-> /etc/rc.d/init.d /etc/rc ->/etc/rc.d/rc /etc/rc*.d ->/etc/rc.d/rc*.d /etc/rc.local-> /etc/rc.d/rc.local /etc/rc.sysinit-> /etc/rc.d/rc.sysinit

也就是说,/etc目录下的init.d、rc、rc*.d、rc.local和rc.sysinit均是指向/etc/rc.d目录下相应文件和文件夹的符号链接。

执行用户自定义引导程序/etc/rc.d/rc.local。执行/etc/rc.d/rc3.d/S99local时,它就是在执行/etc/rc.d/rc.local。S99local是指向rc.local的符号链接。就是一般来说,自定义的程序不需要执行上面所说的繁琐的建立shell增加链接文件的步骤,只需要将命令放在rc.local里面就可以了,这个shell脚本就是保留给用户自定义启动内容的。

3.完成了系统所有的启动任务后,linux会启动终端或X-Window来等待用户登录。tty1,tty2,tty3...这表示在运行等级1,2,3,4的时候,都会执行"/sbin/mingetty",而且执行了6个,所以linux会有6个纯文本终端,mingetty就是启动终端的命令。

除了这6个之外还会执行"/etc/X11/prefdm-nodaemon"这个主要启动X-Window

至此,系统就启动完毕了。

本文分享自微信公众号 - 7DGroup(Zee_7DGroup),作者:BruceLong

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 性能工具之linux常见日志统计分析命令

    在上文中性能工具之linux三剑客awk、grep、sed详解,我们已经详细介绍 linux 三剑客的基本使用,接下来我们看看具体在性能测试领域的运用,本文主要...

    高楼Zee
  • 性能环境之Jenkins+Maven自动化部署SpringBoot压测环境(实战篇)

    Jenkins是目前最流行的开源CI(持续集成)工具,广泛用于项目开发,部署和自动化等。 本文将带着大家一起完成在阿里云Centos 7服务器间完成 Jenki...

    高楼Zee
  • 性能基础之大型网站架构演化(整理篇)

    本文整理自《大型网站技术架构 核心原理与案例分析》一书,这本书应该算一本很强的内功秘籍,虽然没有实战教学,但是基础理论扎实了是很重要的,书中观点明确,设计的问题...

    高楼Zee
  • Linux不为人知的启动过程

    Linux系统在日常工作中已经是我们朝夕相处的亲密伴侣,每次当我们按下可爱的电源键那一刻起直到出现熟悉的登陆界面。这短短的一瞬间它都经历什么那??

    Criss@陈磊
  • 返璞归真:RAC环境下不同实例的参数文件选择与设置

    ? 杨廷琨(yangtingkun) 云和恩墨 CTO 高级咨询顾问,Oracle ACE 总监,ITPUB Oracle 数据库管理版版主 参数文件是Or...

    数据和云
  • 1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛

    题目描述 Description You are a mouse that lives in a cage in a large laboratory. 你是一...

    attack
  • 妙用Spring Request Bean实现分布式会话管理

    十毛
  • 使用Github的WebHooks实现生产环境代码自动更新

    一般公司的项目都会使用 Git 或者 SVN 进行版本控制,在本地开发之后push上去,然后再使用ssh连接线上服务器去手动拉取代码。甚至于有些公司还在使用传统...

    沈唁
  • kubernetes 客户端KubeClient使用及常用api

    KubeClient是kubernetes 的C#语言客户端简单易用,KubeClient是.NET Core(目标netstandard1.4)的可扩展Kub...

    张善友
  • 小白必看:神经网络入门指南

    你是否想知道大家都在谈论的神经网络到底是什么,但你又不敢去问?哈哈,别再害怕了!读了这篇文章,你将能够走进任何一个会议,用你新获得的流行词在午餐桌上大放异彩!

    AI研习社

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动