Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Linux开机流程整理 #1

Open
MregXN opened this issue Feb 3, 2019 · 0 comments
Open

Linux开机流程整理 #1

MregXN opened this issue Feb 3, 2019 · 0 comments

Comments

@MregXN
Copy link
Owner

MregXN commented Feb 3, 2019

Linux开机流程整理

概述

这篇issue主要是想试图整理一下,一台安装了linux系统的电脑从按下的电源键之后到操作界面显示在屏幕之上,到底经历了多少不为人知的事情

经过一波查询整理,大致需要经历以下几个阶段的准备过程

  • BIOS自检
  • 系统引导
  • 加载内核
  • 启动初始化程序
  • 加载开机启动程序
  • 进入shell

笔记

先问一个问题,"启动"用英语怎么说?

回答是boot。可是,boot原来的意思是靴子,"启动"与靴子有什么关系呢? 原来,这里的boot是bootstrap(鞋带)的缩写,它来自一句谚语:

"pull oneself up by one's bootstraps"

字面意思是"拽着鞋带把自己拉起来",这当然是不可能的事情。最早的时候,工程师们用它来比喻,计算机启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!

早期真的是这样,必须想尽各种办法,把一小段程序装进内存,然后计算机才能正常运行。所以,工程师们把这个过程叫做"拉鞋带",久而久之就简称为boot了。
好了,以下是笔记整理

BIOS自检

所以上面工程师所说的"一小段程序",便是这里的BIOS,即基本输出输入系统(Basic Input/Output System),在上个世纪70年代初,"只读内存"(read-only memory,缩写为ROM)发明,开机程序被刷入ROM芯片,计算机通电后,第一件事就是读取它。

BIOS程序首先检查,计算机硬件能否满足运行的基本条件,这叫做"硬件自检"(Power-On Self-Test),缩写为POST。

如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。

alt text

硬件自检完成后,BIOS把控制权转交给下一阶段的启动程序。

这时,BIOS需要知道,"下一阶段的启动程序"具体存放在哪一个设备。也就是说,BIOS需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做"启动顺序"(Boot Sequence)。

打开BIOS的操作界面,里面有一项就是"设定启动顺序"。

alt text

系统引导

系统读取位列第一的可启动存储设备。计算机先读取该设备的第一个扇区,也就是读取最前面的512个字节。这最前面的512个字节,就叫做 ”主引导记录”(Master boot record,缩写为MBR) 。MBR 只有512字节,放不了太多东西,它主要告诉计算机从该设备的哪一个分区(partition)来装载引导加载程序(boot loader)。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备。

MBR主要由三个部分组成:
1 第1-446字节:调用操作系统的机器码。
2 第447-510字节:分区表(Partition table)。
3 第511-512字节:主引导记录签名(0x55和0xAA)。

Boot Loader 储存有操作系统(OS)的相关信息,比如操作系统名称,操作系统内核(kernel)所在位置等。它的主要功能就是加载内核到内存中去执行。Linux常用的 boot loader 便是 GRUB 。

那我们经常说到的多操作系统是怎么回事呢?其实每个文件系统(或分区)的最前面会保留一个引导扇区(boot selector),这个引导扇区可以安装 boot loader。这样我们在每个 boot loader 中对应不同的操作系统,在读取 MBR 的时候选择我们需要启动的 boot loader 即可。

加载内核

Kernel(内核) 实际上是一个用来操作计算机的程序,它是计算机操作系统的内核,主要的任务是管理计算机的硬件资源,充当软件和硬件的接口。操作系统上的任何操作都要通过 kernel 传达给硬件。

boot loader 会帮助我们加载内核,内核就会开始检测硬件与加载驱动程序。没错,内核会以自己的功能重新检测一遍硬件,而不一定会使用 BIOS 检测到的硬件信息。也就是说,内核此时才开始接管 BIOS 后的工作。

Linux的内核文件一般是在 /boot 目录下,以manjaro为例boot目录下大致有这些文件 ( 手头上只有这个发行版其他的我就不是很晓得了)

➜  /boot ls
grub                                initramfs-4.19-x86_64.img  linux419-x86_64.kver  vmlinuz-4.19-x86_64
initramfs-4.19-x86_64-fallback.img  intel-ucode.img            memtest86+

启动初始化程序

内核文件加载完成以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程。

许多程序需要开机启动。它们在Windows叫做”服务”(service),在 Linux 就叫做”守护进程”(daemon)。init 进程的一大任务,就是去运行这些开机启动的程序。但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动 Apache,用作桌面就不需要。Linux 允许为不同的场合,分配不同的开机启动程序,这就叫做”运行级别”(run level)。也就是说,启动时根据”运行级别”,确定要运行哪些程序。manjaro的默认的 init 程序是systemd-sysvcompat提供的/sbin/init(新安装的系统已经默认使用systemd) 或 sysvinit

Linux预置七种运行级别(0-6)。基本上,依据有无网络与有无 X Window ,Linux 将 run level 划分为7个等级(0-6)。其中0是关机,1是单用户模式,6是重启。而 2-5,一般来说都是多用户模式。

每个运行级别在/etc目录下面,都有一个对应的子目录,指定要加载的程序。即rc0.d到rc6.d目录,其中存放的是该运行级别中需要执行的服务脚本的 软链接文件(即快捷方式)

加载开机启动程序

而真正的脚本文件,都存放在etc/init.d 中(结尾为d,即为direction,与init作为区分 )

这样做的另一个好处,就是如果你要手动关闭或重启某个进程,直接到目录 /etc/init.d 中寻找启动脚本即可。

然而我在manjaro中并没有发现以上两个文件.一查才发现arch系列是有着自己的另一套启动方式,具体是个什么样子我会在下一篇issue当中好好聊聊

进入shell

当操作系统按顺序跑完里头的服务的时候,就可以正式进入用户和计算机交互的环节了.

所谓shell,简单说就是命令行界面,让用户可以直接与操作系统对话。用户登录时打开的shell,就叫做login shell。

输入用户名密码登录成功后,系统会为用户分配一个用户 ID(UID),和一个组 ID(GID)。这两个 ID 就好像身份证一样会一直伴随用户,用于检测用户执行程序时的身份验证。

当用户登录成功后,一个完整的操作系统就展现在用户的面前了。

参考

1.Linux 的启动流程-阮一峰的网络日志

2.计算机是如何启动的?-阮一峰的网络日志

3.Linux开机启动流程-海贼之路飞

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant