相关博客
[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分区表),没有磁盘大小限制,并提供了更灵活、现代的解决方案;
BIOS | UEFI | |
---|---|---|
磁盘存储方法 | MBR, 磁盘大小限制为2TB | GPT,无限制、更灵活 |
启动时间(boot time) | 慢 | 快 |
安全功能 | 缺少安全启动 | 安全启动 |
操作系统之前
Power-On –> BIOS –> 引导加载程序(BootLoader) –> OS-Kernel
- 按下电源按钮;
- BIOS/UEFI会启动运行(作用:让计算机所有 主要部分 做好操作准备,主要部分包括:键盘、屏幕、硬盘等);
- 开机自检(POST检查),此检查测试 可确保 在完全打开 所有设备 之前,所有不同的硬件 都正常工作;
- BIOS/UEFI查找并载入引导加载程序,启动顺序根据BootMenu(BIOS中)配置进行,通常先检查硬盘,之后再检查USB\CD-ROM;
- 引导加载程序(LILO/GRUB2), 关键工作是,在磁盘上找到
OS-Kernel
,将其加载到计算机内存中,开始运行内核代码;
(因此,一旦GRUB2加载完毕,它就会将Linux内核载入内存,并将控制权 交给 内核,完成启动过程)
BIOS查找GRUB说明·
BIOS在完成开机自检后,会查找并载入引导加载程序。查找顺序根据BootMenu(BIOS中)配置进行,通常先检查硬盘,之后再检查USB\CD-ROM。
在BIOS系统中,引导加载程序代码位于硬盘驱动器的第一个块中,被成为主引导记录(MBR)。
UEFI查找GRUB说明
对于UEFI,有一个单独的分区 来存储 .efi引导加载程序文件等文件.
操作系统之后
BootLoader启动
OS-Kernel
后,OS-Kernel
接管计算机资源(硬件),并开始启动所有的后台进程和服务。
OS –> /boot –> init进程 –> 运行级别 –> /etc/init.d –> 用户登录 –> login shell
- 加载内核:
OS-Kernel
,首先读取/boot目录下的内核文件,并将自身(/boot下的内核文件)解压到内存中,检查硬件,并加载设备驱动程序和其他内核模块; - 启动init进程:接下来,运行第一个程序 init初始进程(现代Linux发行版中,该进程通常为Systemd),PID=1,其他所有进程都是他的子进程。
Systemd有大量职责来启动系统,并为 其使用 做准备,它检查是否有任何剩余的硬件驱动需要加载、挂载所有不同的文件系统和磁盘 以便访问、并开始启动所有的后台服务(例如:网络、声音、电源管理等)、一旦出现图形提示,它就会处理用户登录,并会用面板和菜单加载桌面环境.
Systemd使用目标配置文件来决定它应该启动到那种模式,一些基本的模式,例如:多用户纯文本目标(也就是黑屏交互)、图形目标(也就是视窗系统)。这些target
与过去Linux时代的旧运行级别相对应。大多数情况下,只需知道Systemd会在启动Linux时,幕后处理初始化启动的所有内容。 - 加载运行级别: 由init进程根据运行级别(7种
/etc/inittab
),加载相应运行程序/etc/rc[0-6].d/
(K01sysstat|S01cron|S01dbus|S01docker|S01rsync|S01ssh等)。 - 加载服务: 运行级别目录下(例如
/etc/rc2.d
)都是指向/etc/init.d/
下的链接文件2024-04-22-Linux基础-启动流程.md。 - 用户登录:开机启动程序加载后,用户进行登录。命令行登录(init进程调用gtty,让用户输入name+pwd -> init调用login核对密码 –> 从/etc/pwd读取指定shell并启动)、ssh登录(sshd服务取代getty和login)、图形界面登录。
- 打开bash:读入
/etc/profile
(全局),然后依次读取~/.bash_profile
|~/.bash_login
|~/.profile
,只运行找到的第一个配置文件(三个文件都存在时,只有~/.bash_profile
中内容生效)。
init进程在上面2、3、4阶段
用户登录后的配置读取:/etc/profile为系统通用设置;~/.profile为个人且需要被子进程继承的设置;~/.bashrc为个人不需要继承的设置;
登录系统的shell或者在
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
被调用时:
- 如果存在 /etc/profile 文件,它会首先读取并执行该文件中的命令。
- 读取该文件后,它依次查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并读取和执行第一个存在且可读的文件中的命令。
当交互式登录 shell
退出或非交互式登录 shell
执行 exit 内置命令时:
- Bash 会读取并执行 ~/.bash_logout 文件(如果存在)中的命令。
作为交互式非登录 shell 调用 当启动一个交互式非登录 shell 时:
- 如果 ~/.bashrc 文件存在,Bash 会读取并执行该文件中的命令(可以使用 –norc 选项来抑制这种情况;
--rcfile
会强制 Bash 从文件而不是 ~/.bashrc 中读取并执行命令)。
通常情况下,~/.bash_profile
文件中会包含这样一行内容
|
|
当 Bash 以非交互方式启动(例如,运行 shell 脚本)时:
bash会查找环境变量BASH_ENV
,如果存在则将该变量的值作为要读取和执行的文件名。 Bash 的行为就像执行以下命令一样:
|
|
–login 选项调用非交互式 shell,Bash 会尝试从loginShell Startup file
启动文件中读取并执行命令。