揭秘linux系统启动流程,面试官问起来再也不怕了

简介: 揭秘linux系统启动流程,面试官问起来再也不怕了

image.png一台linux系统的电脑,从按下开关到登录到系统上整个过程,经历了什么,这是我们这次要讨论的问题。

其实一共有四个阶段

  1. BIOS启动引导阶段
  2. GRUB启动引导阶段;
  3. 内核阶段;
  4. init初始化阶段。


1. BIOS启动引导阶段


在通电的瞬间,ROM只读芯片中的开机程序被触发,这个程序开始监测各个硬件的健康状态,监测通过才进行下一步。


这个只读开机程序就叫做"基本输入输出系統"(Basic Input/Output System),简称为BIOS。


健康检查的过程叫做"硬件自检"(Power-On Self-Test),缩写为POST。


上个世纪70年代初,“只读内存”(read-only memory,缩写为ROM)发明,开机程序被刷入ROM芯片,计算机通电后,第一件事就是读取它。这块芯片里的程序就叫做"基本输入输出系統"(Basic Input/Output System),简称为BIOS。

BIOS主要干了些什么呢?


硬件自检


系统上电开机后,BIOS程序首先检查,计算机硬件(如:CPU、内存、显卡、I/O、键盘鼠标等)能否满足运行的基本条件,这叫做"硬件自检"(Power-On Self-Test),缩写为POST。


寻找启动设备


当硬件检测通过后,BIOS把控制权转交给下一阶段的启动程序。

下一阶段的启动程序放在哪个设备上呢?

BIOS已经设置好了启动顺序表,如图


aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzIwMjAvMDIvMjUvMkUwNjhCQUE0RjRCNDU2MzhBRkRBNUVBMTkzMTRCNkMuanBn.png


按照这个顺序,扫描是否有这些设备插入(比如硬盘、U盘等),如果有而且这些设备也是启动设备,那就把控制权交出去。


那么我们是怎么知道他是个启动设备?以及操作系统的位置在哪呢?


引导启动的两个阶段

MBR


BIOS按照"启动顺序",把控制权转交给排在第一位的储存设备。


这时,计算机读取该设备的0柱面0磁道1扇区,也就是读取最前面的512个字节。


如果这512个字节的最后两个字节是0x55和0xAA(主引导记录签名),表明这个设备就是启动设备。


如果不是,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备。


这最前面的512个字节,就叫做"主引导记录"(Master boot record,缩写为MBR)。


MBR里面存储了系统预启动信息、分区表和主引导记录签名。


MBR上有一个指针,存了下一个引导程序的位置,CPU到该指针所指向的地址读取Boot Loader(引导加载程序)。


Boot Loader(引导加载程序)


对应于Linux系统,就是GRUB,它本身可以看作一个小型操作系统,内置了简单的文件系统,可以读取分区。


所以 grub 启动之后首先用到/boot目录,读取/boot/grub/grub.conf显示启动菜单。


aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzIwMjAvMDIvMjUvNTE3Q0I0MTE3OEYyNEY5NzlGMEUxRDg1QjgxQzlEREUuanBn.png


所以GRUB系统的具体作用是

A.提供一块硬盘上所有安装的系统的选择菜单;

B.载入操作linux系统内核,移交控制权给内核;

C.将控制权移交给其他系统的boot loader


也就是说在grub启动,在屏幕上呈现出操作系统的选择菜单,如果你并没有选择linux,而是选择了windows那么grub就会把控制权交给ntldr,进而启动windows操作系统。


内核阶段


在启动菜单选择了内核以后,GRUB会负责解压和装载内核镜像,并且将initrd装载到内存中,最后GRUB初始化内核启动代码,完成之后后续的引导权,被移交给内核。


简单介绍下initrd,initrd是一个被压缩过的小型根目录,这个目录中包含了启动阶段中必须的驱动模块,可执行文件和启动脚本。


操作系统的核心是放在文件系统中的,要想正确加载核心就必须提前识别文件系统。核心文件一般会放在/boot/vmlinuz。


在系统启动的控制权移交给kernel后,Kernel会立即初始化系统中各设备并做相关配置工作,其中包括CPU、I/O、存储设备等。


配置过程中进行设备驱动加载的时候,一部分设备的驱动编入Linux Kernel中,Kernel会调用这部分驱动初始化相关设备;另外有一部分设备驱动并没有编入Kernel,而是作为模块形式放在initrd中。


initrd是一种基于内存的文件系统,启动过程中,系统在访问真正的根文件系统时,会先访问initrd文件系统。


将initrd中的内容打开来看,会发现有bin、dev、etc、lib、proc、sys、sysroot、init等文件(包含目录)。


initrd中的内容释放到rootfs(根文件系统)中后,Kernel会执行其中的init文件。


这个时候内核的控制权移交给init文件处理。


驱动加载后,会创建一个根设备,然后将根文件系统以只读的方式挂载。


这步结束后释放未使用内存并执行switch root,转换到真正的根上面去,同时运行/sbin/init程序,开启系统的1号进程,此后系统启动的控制权移交给 init 进程。


当这些完成时,用户空间的第一个程序(init)开始执行,这样就开始顶层系统初始化开始了。


Init初始化阶段


在核心加载完成之后,系统就准备好了,等待程序的执行。整个linux系统中,第一个执行的程序就是“/sbin/init”。


执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了;通过读取配置文件/etc/inittab确定启动后进入的运行级别,在选定运行级别后进入相应的“/etc/rc.d/rcX.d”目录中运行相应的服务内容,该目录下的内容全部都是以S或K开头的链接文件,这些链接文件都链接到“/etc/rc.d/init.d”目录下的各种shell脚本,通过执行这些shell脚本,完成了系统所有的启动任务,linux会启动终端或X-Window来等待用户登录。


QA


RAM与ROM都是半导体存储介质


RAM是随机存取存储器(random access memory),是计算机内部存储器中的一种,也是其中最重要的,计算机和手机中一般把其叫做(运行)内存,它的速度要比硬盘快得多,所以用运行程序在RAM中,而存放运行时不用的数据则在硬盘中,什么时候需要数据,便把数据从硬盘中拿到内存,但同时RAM断电会丢失数据,所以我们电脑如果断电了就会丢失原来正在运行的数据。所以,手机中的RAM和电脑中的RAM的概念是相同的,RAM即内存越大,能同时在内存中执行的程序就越多,性能一般是越好的。


ROM是只读存储器(Read-Only Memory),也是计算机内部存储器中的一种,而硬盘是外部存储器。早期的ROM因为技术不成熟所以无法擦写,出厂后就只能读数据,所以叫只读存储器,BIOS就是写在ROM中的。后来随着技术的发展,在ROM的基础上出现了新的半导体存储介质EPROM和EEPROM,这两种可擦写,这就不符合ROM的命名,但是由于是在ROM的技术上衍变出来的,所以延用了一部分原来的叫法,此时非易失的半导体存储介质开始得以广泛应用,被大量用于电脑主板的bios和嵌入式存储,而后来在这两种技术的发展上又发展出了NAND FLASH闪存。


硬盘分为两种,一种是机械硬盘(即磁盘HDD),一种是固态硬盘(SSD),磁盘和ROM没什么关系,但是固态硬盘就不一样了,固态硬盘用到的颗粒也是基于NAND FLASH技术,和u盘以及手机存储有点相似,所以说硬盘和ROM还是有关系的,固态硬盘是ROM技术发展的产物,但不能说ROM就是硬盘。

相关文章
|
7月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
650 3
Linux系统禁用swap
|
7月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
1202 3
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
749 3
Linux系统初始化脚本
|
8月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
571 18
|
7月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
897 1
|
7月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1269 1
|
8月前
|
存储 Linux
Linux环境下删除大文件后磁盘空间未释放问题诊断流程。
以上诊断流程涉及Linux底层机制与高级管理技能结合之处,并需要管理员根据实际环境灵活调整诊断策略与解决方案。
607 8
|
8月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
2222 10
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?