Please enable Javascript to view the contents

Linux基础-开机启动过程说明

 ·  ☕ 9 分钟

相关博客

[Blog-1]: 2024-04-22-Linux基础-服务管理-Systemd原理

[Blog-2]: 2024-04-22-Linux基础-Bash启动文件-profile、bashrc

[Blog-3]: 2024-04-22-Linux基础-Bash交互式Shell

概念说明

开机固件,主要作用:检查硬件、加载OS.

BIOS

基本输入输出系统(Basic Input/Output System),在通电启动阶段执行硬件初始化,为操作系统提供运行时服务的固件。BIOS预安装在个人电脑的主板上,是个人电脑启动时加载的第一个软件。当电脑的电源开启,BIOS就会从主板上的ROM芯片执行,执行加电自检(POST),测试和初始化CPU、RAM、直接存储器访问控制器、芯片组、键盘、软盘、硬盘等设备。当所有的Option ROM被加载后,BIOS就试图从启动设备(如硬盘、软盘、光盘)加载启动程序,由启动程序加载操作系统。BIOS也可从网卡等设备启动。

POST

上电自检\开机自检(Power On Self Test), 主要用于在BIOS加载操作系统之前检查计算机设备硬件是否存在问题,进而保证计算机的正常运行。在设备启动的过程中,自检程序主要检查CPU、内存、I/O设备、主板等对计算机正常运行会产生影响的设备硬件。

UEFI

统一可扩展固件接口(Unified Extensible Firmware Interface),BIOS的替代方案,其目的是将有关设备初始化启动的所有数据存储在一个EFI文件中,该文件保存在磁盘分区:ESP(EFI System Partition,EFI 系统分区) 中。 ESP 还保存着负责启动操作系统的引导加载程序。可扩展固件接口负责加电自检(POST)、联系操作系统以及提供连接操作系统与硬件的接口。

UEFI 是一种不同的启动方式。 对于磁盘启动(或 CD/DVD/USB-disk),它会查看磁盘的格式化分区(GPT 格式化设备),以查找特定的 FAT/MSDOS 分区,该分区具有特殊位,表示它是启动分区。 UEFI 设置并存储了一些变量,用于指示哪个磁盘驱动器、哪个分区(以及查看它们的顺序,以防多余磁盘启动)和 FAT/MSDOS 分区中的哪个 “文件”,以加载未来计算机启动指令。 每个不同步骤都有一个应用程序接口(API)。

MBR/GPT 是一种磁盘存储方案/方法

MBR

主引导记录(Master Boot Record),MBR 通常与 UEFI 无关。 这就是老式的 “传统 BIOS”。MBR 使用前 64 个 512 字节的块来保存引导加载程序(计算机的传统 BIOS 会加载这些信息,然后跳转到它来执行)。

GPT

GUID磁盘分区表(GUID Partition Table)

BootLoader: 引导加载程序

LILO:Linux加载器,已经相当过时,并且很少出现在 现代发行版 中

GRUB2:当今功能最齐全、使用最广泛的引导加载程序, 借助它可处理启动多个OS,具有图形或基于文本的菜单,且为高级用户提供了许多高级选项;

BIOS、UEFI主要区别

UEFI是较新的产品,与传统的BIOS相比,提供更快的启动时间、更好的安全功能(比如,安全启动)
BIOS与UEFI的主要区别在于:磁盘存储方法。

BIOS:与MBR(主引导记录)系统进行关联,MBR将磁盘大小限制为2TB;
UEFI: 使用GPT(GUID分区表),没有磁盘大小限制,并提供了更灵活、现代的解决方案;

BIOSUEFI
磁盘存储方法MBR, 磁盘大小限制为2TBGPT,无限制、更灵活
启动时间(boot time)
安全功能缺少安全启动安全启动

操作系统之前

Power-On –> BIOS –> 引导加载程序(BootLoader) –> OS-Kernel

  1. 按下电源按钮;
  2. BIOS/UEFI会启动运行(作用:让计算机所有 主要部分 做好操作准备,主要部分包括:键盘、屏幕、硬盘等);
  3. 开机自检(POST检查),此检查测试 可确保 在完全打开 所有设备 之前,所有不同的硬件 都正常工作;
  4. BIOS/UEFI查找并载入引导加载程序,启动顺序根据BootMenu(BIOS中)配置进行,通常先检查硬盘,之后再检查USB\CD-ROM;
  5. 引导加载程序(LILO/GRUB2), 关键工作是,在磁盘上找到OS-Kernel,将其加载到计算机内存中,开始运行内核代码
    (因此,一旦GRUB2加载完毕,它就会将Linux内核载入内存,并将控制权 交给 内核,完成启动过程)

BIOS查找GRUB说明·

BIOS在完成开机自检后,会查找并载入引导加载程序。查找顺序根据BootMenu(BIOS中)配置进行,通常先检查硬盘,之后再检查USB\CD-ROM。

在BIOS系统中,引导加载程序代码位于硬盘驱动器的第一个块中,被成为主引导记录(MBR)

BIOS-MBR

UEFI查找GRUB说明

对于UEFI,有一个单独的分区 来存储 .efi引导加载程序文件等文件.

UEFI-GPT

操作系统之后

BootLoader启动OS-Kernel后,OS-Kernel接管计算机资源(硬件),并开始启动所有的后台进程和服务

OS –> /boot –> init进程 –> 运行级别 –> /etc/init.d –> 用户登录 –> login shell

  1. 加载内核OS-Kernel,首先读取/boot目录下的内核文件,并将自身(/boot下的内核文件)解压到内存中,检查硬件,并加载设备驱动程序其他内核模块
  2. 启动init进程:接下来,运行第一个程序 init初始进程(现代Linux发行版中,该进程通常为Systemd),PID=1,其他所有进程都是他的子进程。
    Systemd有大量职责来启动系统,并为 其使用 做准备,它检查是否有任何剩余的硬件驱动需要加载、挂载所有不同的文件系统和磁盘 以便访问、并开始启动所有的后台服务(例如:网络、声音、电源管理等)、一旦出现图形提示,它就会处理用户登录,并会用面板和菜单加载桌面环境.
    Systemd使用目标配置文件来决定它应该启动到那种模式,一些基本的模式,例如:多用户纯文本目标(也就是黑屏交互)、图形目标(也就是视窗系统)。这些target与过去Linux时代的旧运行级别相对应。大多数情况下,只需知道Systemd会在启动Linux时,幕后处理初始化启动的所有内容。
  3. 加载运行级别: 由init进程根据运行级别(7种/etc/inittab),加载相应运行程序/etc/rc[0-6].d/(K01sysstat|S01cron|S01dbus|S01docker|S01rsync|S01ssh等)。
  4. 加载服务: 运行级别目录下(例如/etc/rc2.d)都是指向/etc/init.d/下的链接文件2024-04-22-Linux基础-启动流程.md
  5. 用户登录:开机启动程序加载后,用户进行登录。命令行登录(init进程调用gtty,让用户输入name+pwd -> init调用login核对密码 –> 从/etc/pwd读取指定shell并启动)、ssh登录(sshd服务取代getty和login)、图形界面登录。
  6. 打开bash:读入/etc/profile(全局),然后依次读取~/.bash_profile|~/.bash_login|~/.profile只运行找到的第一个配置文件(三个文件都存在时,只有~/.bash_profile中内容生效)。

init进程在上面2、3、4阶段
用户登录后的配置读取:/etc/profile为系统通用设置;~/.profile为个人且需要被子进程继承的设置;~/.bashrc为个人不需要继承的设置;
登录系统的shell或者在

Systemd

Systemd-target

loginShell(登录式交互)

系统启动后,用户可选择以下方式登入系统:图形界面登录、控制台直接登录、SSH远程登录。

图形界面登录:在图形界面(如GNOME、KDE、XFCE等)中输入用户名和密码登录。

控制台直接登录:在物理机器或虚拟机的控制台上直接输入用户名和密码登录。

SSH远程登录:通过SSH连接到远程服务器时,输入用户名和密码,这会启动一个LoginShell。

Non-Login Shell(非登录式交互)

顾名思义,Non-Login Shell指不涉及登录过程的shell。

登录后打开新Shell:在已经登录的会话中打开一个新的终端窗口或标签页;在登录后的图形界面唤起Terminal。

执行脚本:执行一个shell脚本,是非登录的,通常也是非交互式的,除非脚本明确要求交互。
后台作业:在后台运行的命令,如使用&将命令放入后台执行。
远程命令执行:如ssh user@host 'command'执行的远程命令,通常不会启动登录shell,除非指定了-t-tt选项来强制分配一个伪终端。

loginShell与Non-loginShell区别
登录shell:会读取特定的启动文件,如/etc/profile和~/.bash_profile,这些文件中通常包含环境设置和别名等。
非登录shell:通常只读取~/.bashrc(如果存在),这个文件通常包含针对非登录shell的设置。

Reference

Bash 如何执行其启动文件。交互式 shell 在 Interactive Shells(交互式 shell)中有描述。

Bash作为交互式登录 shell使用--login选项的非交互式 shell 被调用时:

  1. 如果存在 /etc/profile 文件,它会首先读取并执行该文件中的命令。
  2. 读取该文件后,它依次查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并读取和执行第一个存在且可读的文件中的命令

交互式登录 shell 退出或非交互式登录 shell 执行 exit 内置命令时:

  1. Bash 会读取并执行 ~/.bash_logout 文件(如果存在)中的命令。

作为交互式非登录 shell 调用 当启动一个交互式非登录 shell 时:

  1. 如果 ~/.bashrc 文件存在,Bash 会读取并执行该文件中的命令(可以使用 –norc 选项来抑制这种情况;--rcfile 会强制 Bash 从文件而不是 ~/.bashrc 中读取并执行命令)。

通常情况下,~/.bash_profile 文件中会包含这样一行内容

1
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi

当 Bash 以非交互方式启动(例如,运行 shell 脚本)时:
bash会查找环境变量BASH_ENV,如果存在则将该变量的值作为要读取和执行的文件名。 Bash 的行为就像执行以下命令一样:

1
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

–login 选项调用非交互式 shell,Bash 会尝试从loginShell Startup file 启动文件中读取并执行命令。

Bash Setup Files

分享

Hex
作者
Hex
CloudNative Developer

目录