🐇明明跟你说过:个人主页
🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅
🔖行路有良友,便是天堂🔖
目录
一、引言
1、Linux的起源与发展
1991年,芬兰赫尔辛基大学的学生林纳斯·托瓦兹(Linus Torvalds)开始编写一个新的操作系统内核,这个内核最初被称为“Freax”。他的初衷只是想学习操作系统内核的开发,并为自己的个人计算机编写一个操作系统。然而,当他将这个内核发布在Internet上并开放源代码后,全球各地的程序员开始参与到这个项目中来,共同完善这个内核。最终,这个内核被命名为Linux,这个名字是由Linus Torvalds的名字和Unix操作系统的名字组合而成的。
Linux从一开始就坚持源代码的公开和免费使用,任何人都可以对其进行修改和分发。这种开放性和自由性吸引了大量的开发者和用户,使得Linux逐渐成长并成熟起来。如今,Linux已经发展成为一个性能稳定、功能强大的多用户网络操作系统,支持32位和64位硬件,能运行主要的Unix工具软件、应用程序和网络协议。同时,Linux也有上百种不同的发行版,如基于社区开发的Debian、ArchLinux,以及基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。
2、Linux的特点
- 开放源代码和自由性:Linux的源代码是公开可查的,任何人都可以获取、修改和分发。这种开放源代码的特性使得Linux成为自由软件运动的代表,促进了软件的创新和发展。
- 多用户、多任务:Linux支持多用户同时使用系统,每个用户都可以在自己的权限范围内执行操作,而不会相互干扰。同时,Linux也支持多任务处理,可以同时运行多个程序,提高了系统的使用效率。
- 良好的稳定性和安全性:Linux内核设计精良,经过长期的发展和优化,使得Linux系统具有出色的稳定性和安全性。Linux能够有效地防止各种网络攻击和恶意软件的侵入,保护用户数据的安全。
- 强大的网络功能:Linux内置了强大的网络协议栈和工具,支持各种网络服务和应用。这使得Linux成为构建服务器、网络设备和云计算平台的理想选择。
- 可移植性和兼容性:Linux可以在各种硬件平台上运行,从桌面计算机到服务器,从嵌入式设备到大型数据中心,都能找到适合的Linux发行版。此外,Linux还支持多种编程语言和开发工具,方便开发者进行各种应用开发和部署。
- 高效的内存管理和文件系统:Linux采用了先进的内存管理和文件系统技术,能够高效地利用系统资源,提高运行速度和响应能力。
- 强大的社区支持:Linux拥有庞大的用户社区和开发者社区,这些社区提供了丰富的文档、教程、软件资源和技术支持,使得用户可以轻松地使用Linux并解决遇到的问题。
3、Linux启动流程概览
- 硬件检测
- 初始化硬件
- 加载固件设置
- 读取MBR信息
- 启动Boot Loader
- 选择启动项
- 加载内核
- 加载初始化RAM磁盘(initrd)
- 内核初始化
- 挂载根文件系统
- 启动init进程
- 启动系统服务
- 建立终端
- 显示登录提示
二、BIOS/UEFI阶段
1、BIOS与UEFI的区别与联系
BIOS(基本输入输出系统,Basic Input Output System)与UEFI(统一可扩展固件接口,Unified Extensible Firmware Interface)在计算机启动过程中都扮演着关键角色,但它们在功能、特性以及实现方式上存在显著的区别。
区别
1. 设计理念和架构
- BIOS:基于较老的架构,功能相对固定且不易扩展。它是计算机启动过程中的第一个软件,主要负责在计算机启动时进行一系列的初始化过程,包括硬件检测、配置、启动顺序等。
- UEFI:作为BIOS的现代替代品,UEFI采用模块化设计,允许更灵活地添加新功能和更新固件,支持更多的现代操作系统特性。它提供了一个更快、更有效率的启动方式,并在安全性、图形界面等方面进行了显著改进。
2. 启动速度和效率
- BIOS:采用顺序初始化设备的方式,启动速度相对较慢。
- UEFI:通过预加载启动加载程序的方式,可以并行初始化多个设备,从而显著减少启动时间。UEFI的启动速度通常比BIOS快得多。
3. 支持的硬件和文件系统
- BIOS:主要支持传统的硬件设备和FAT16、FAT32等文件系统,且对硬盘容量的支持有限(通常最大2.1TB)。
- UEFI:支持更多的硬件设备和文件系统,包括NTFS等,且没有硬盘容量限制,可以更好地适应现代计算机系统的需求。
4. 安全性
- BIOS:不包含内置的安全措施,如安全启动(Secure Boot),容易受到恶意软件的攻击。
- UEFI:支持Secure Boot功能,可以确保系统启动时只加载由认证机构签名的操作系统和引导加载程序,从而增强系统的安全性。
5. 用户界面
- BIOS:通常提供简单的文本菜单界面,选项有限,且不支持鼠标操作。
- UEFI:提供更为高级的图形化用户界面(GUI),配置选项更多样化和直观,支持鼠标和键盘操作,用户体验更好。
6. 兼容性和扩展性
- BIOS:功能相对固定,不易扩展,且主要支持32位操作系统。
- UEFI:具有更高的兼容性和扩展性,支持64位操作系统,并允许固件开发者增加新的接口和服务。
联系
- 作用相同:BIOS和UEFI都是计算机启动过程中的固件系统,负责在操作系统加载前初始化硬件、建立基本环境以及引导操作系统。它们都是连接硬件和操作系统的桥梁。
- 位于同一层级:两者都位于操作系统之上、硬件之下的层级,是计算机启动过程中不可或缺的一部分。
- 发展关系:UEFI是在EFI(可扩展固件接口)的基础上发展而来的,旨在解决传统BIOS在功能、性能以及安全性等方面的局限性。随着计算机技术的不断发展和进步,UEFI将逐渐取代BIOS成为计算机启动的主流方式。
2、BIOS/UEFI的启动过程
BIOS 的启动过程:
- 上电自检(POST): 计算机通电后,BIOS 进行 Power-On Self Test(上电自检),检查和初始化系统硬件,如内存、处理器、显卡等。
- 引导设备查找: 完成自检后,BIOS 根据设置的启动顺序查找可引导设备(硬盘、CD/DVD、USB 等)。
- MBR 引导: 如果找到引导设备,BIOS 读取主引导记录(MBR),并将控制权交给 MBR 中的引导程序。
- 操作系统加载: MBR 引导程序加载操作系统的引导加载程序,进一步加载操作系统内核,并启动操作系统。
UEFI 的启动过程:
- 上电自检(POST): 计算机通电后,UEFI 固件进行 Power-On Self Test,检查和初始化系统硬件。
- UEFI 引导: 完成自检后,UEFI 固件根据启动配置和引导管理器查找引导设备。
- EFI 系统分区(ESP): 查找 EFI 系统分区,该分区包含操作系统引导加载程序和 UEFI 应用程序。
- 引导加载程序启动: 加载并执行 EFI 系统分区中的引导加载程序,启动操作系统。
三、GRUB引导加载程序
1、GRUB的基本概念
GRUB(GRand Unified Bootloader)是一个广泛使用的引导加载程序,主要用于 Linux 和其他 Unix 系统。它能够在系统启动时选择和加载操作系统内核。
GRUB 的基本概念
1. 引导加载程序:
- GRUB 是一种引导加载程序,它的主要作用是在系统启动时,选择并加载操作系统的内核。GRUB 可以引导多种不同的操作系统,使得用户可以在同一台计算机上安装和启动多个操作系统。
2. 多阶段加载:
GRUB 通常分为多个阶段:
- 阶段1(Stage 1): 位于主引导记录(MBR)或分区引导记录(PBR)中。其任务是加载阶段1.5或阶段2。
- 阶段1.5(Stage 1.5): 位于 MBR 和第一个分区之间的空闲扇区中,用于加载必要的文件系统驱动程序。
- 阶段2(Stage 2): 位于文件系统中,包含完整的 GRUB 功能,如用户界面、配置文件解析、内核加载等。
3. 配置文件:
- GRUB 的配置文件通常位于 /boot/grub/grub.cfg(GRUB 2)或 /boot/grub/menu.lst(GRUB Legacy)。该文件包含了可启动的操作系统列表、内核参数、启动选项等。
4. 菜单界面:
- GRUB 提供一个菜单界面,用户可以在此选择要启动的操作系统或内核。该菜单可以是图形界面(通过图形终端支持)或文本界面。
5. 内核加载:
- GRUB 负责加载选定的操作系统内核,并将控制权交给内核。它还可以传递启动参数给内核,以影响内核的启动过程。
2、GRUB 的启动过程
1. POST(Power-On Self Test):
- 计算机通电后,BIOS/UEFI 进行自检和硬件初始化。
2. 加载 GRUB 阶段1:
- BIOS/UEFI 查找并加载位于 MBR 或 PBR 的 GRUB 阶段1代码。
3. 加载 GRUB 阶段1.5:
- 阶段1代码加载 GRUB 阶段1.5(如果存在),以便读取文件系统。
4. 加载 GRUB 阶段2:
- 阶段1.5或阶段1代码加载 GRUB 阶段2,提供完整的 GRUB 功能。
5. 显示 GRUB 菜单:
- 阶段2代码读取配置文件,显示启动菜单供用户选择操作系统。
6. 加载内核:
- 用户选择操作系统后,GRUB 加载相应的内核和初始化内存盘(initrd)。
7. 启动操作系统:
- GRUB 将控制权交给操作系统内核,启动操作系统。
四、内核初始化阶段
1、Linux内核概述
- 定义:Linux内核是一个开源的操作系统内核,由芬兰计算机科学家Linus Torvalds于1991年首次发布。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。
- 特性:Linux内核具有稳定性、安全性和可靠性等优势,是当今最受欢迎的操作系统内核之一。它支持多任务处理、虚拟内存管理、文件系统、网络协议栈和设备驱动等核心功能。
2、初始化内核
Linux启动流程中的内核初始化阶段是操作系统启动的关键步骤之一。这个阶段从内核开始执行到启动第一个用户空间进程(通常是init进程)结束。
1. 启动代码执行
- 当引导加载程序(如GRUB)加载并解压内核后,内核的启动代码开始执行。这段代码通常位于架构特定的启动文件中,如arch/x86/boot。
2. 进入保护模式和设置分页
- 在x86架构上,内核启动代码会切换到保护模式,并启用分页。分页启用后,内核开始使用虚拟地址。
3. 设置内核堆栈
- 内核设置一个初始堆栈,用于启动过程中的临时数据存储。这个堆栈会在内核启动后期被替换为进程特定的堆栈。
4. 调用start_kernel函数
- 内核初始化的核心函数是start_kernel,它位于init/main.c文件中。这个函数调用一系列的初始化函数,完成内核的初始化工作。
5. 初始化控制台
- 内核初始化控制台,用于输出启动过程中的调试信息。这通常包括设置串行端口或VGA文本模式控制台。
6. 初始化内核子系统
start_kernel函数依次调用多个内核子系统的初始化函数,包括但不限于:
- 内存管理子系统(Memory Management Subsystem):
- 初始化物理内存和虚拟内存管理,设置页表,启用高端内存支持。
- 中断子系统(Interrupt Subsystem):
- 初始化中断描述符表(IDT),设置中断处理函数。
- 定时器子系统(Timer Subsystem):
- 初始化定时器和时钟中断,用于时间管理和进程调度。
- 进程管理子系统(Process Management Subsystem):
- 初始化进程调度器,创建第一个内核线程(idle进程)。
7. 初始化设备驱动
- 内核初始化设备驱动,检测并配置硬件设备。这包括初始化PCI总线、USB控制器、网络接口等。
8. 挂载根文件系统
- 内核挂载根文件系统,这通常是一个只读的文件系统映像,包含启动所需的基本文件和目录。
9. 启动第一个用户空间进程
- 初始化完成后,内核会启动第一个用户空间进程。通常,这个进程是/sbin/init,但在某些系统上也可能是/bin/sh或其他初始化程序。这个进程负责进一步的系统初始化,包括启动其他系统服务和应用程序。
10. 进入用户空间
- 内核切换到用户模式,开始执行用户空间的进程。从此时起,内核主要作为系统调用接口和硬件管理者,而用户空间进程负责实际的应用逻辑和服务。
五、用户空间初始化
Linux启动流程中的用户空间初始化是操作系统启动过程的最后阶段,它从内核启动第一个用户空间进程(通常是/sbin/init或其替代品)开始,直到所有用户空间服务和应用程序启动完成。
1. 启动/sbin/init
内核初始化完成后,启动第一个用户空间进程。传统上,这个进程是/sbin/init,也可能是/bin/sh(在某些简化系统上)或其他初始化程序。
2. 读取初始化配置文件
/sbin/init进程读取配置文件,确定系统启动需要进行的各种初始化任务。这些配置文件通常包括:
- /etc/inittab:SysVinit系统使用的配置文件,定义了运行级别和启动脚本。
- /etc/init/目录:Upstart系统使用的配置文件目录,定义了各种事件驱动的启动任务。
- /etc/systemd/目录:Systemd系统使用的配置文件目录,定义了启动目标和单元文件。
3. 执行系统初始化脚本
根据配置文件,/sbin/init进程执行一系列的初始化脚本,这些脚本完成以下任务:
- 设置主机名:通过读取配置文件(如/etc/hostname)设置系统的主机名。
- 挂载文件系统:根据/etc/fstab文件的配置,挂载必要的文件系统(如/, /proc, /sys等)。
- 加载内核模块:加载所需的内核模块,以支持特定的硬件或文件系统。
- 配置网络:启动网络接口,配置IP地址和路由表。
- 启动系统日志服务:启动系统日志守护进程,如rsyslog或journald。
4. 切换到目标运行级别或启动目标
根据系统配置,/sbin/init进程切换到指定的运行级别或启动目标。不同的运行级别或启动目标定义了不同的系统状态和服务集合:
- SysVinit:运行级别通常包括0(关机)、1(单用户模式)、3(多用户模式,无图形界面)、5(多用户模式,有图形界面)等。
- Systemd:启动目标包括default.target(默认启动目标)、graphical.target(图形界面)、multi-user.target(多用户模式)等。
5. 启动守护进程和服务
在目标运行级别或启动目标中,系统会启动一系列的守护进程和服务。这些服务通常包括:
- 网络服务:如NetworkManager或systemd-networkd。
- 系统日志服务:如rsyslog或journald。
- 时间同步服务:如ntpd或systemd-timesyncd。
- 图形界面服务:如gdm、lightdm或其他图形登录管理器。
- 其他系统服务:如cron、sshd等。
6. 用户登录界面
初始化脚本和服务启动完成后,系统提供用户登录界面。这可以是命令行登录提示符(通过getty和login)或图形登录界面(通过gdm、lightdm等)。
7. 用户会话启动
用户成功登录后,启动用户会话。用户会话可能包括启动shell(如bash)和用户配置的各种应用程序和窗口管理器(如GNOME、KDE等)。
通过以上步骤,Linux系统完成了从内核初始化到用户空间的全面初始化,系统准备好处理用户的交互和运行应用程序。这一过程确保了系统服务和资源被正确配置和管理,为用户提供一个稳定和高效的工作环境。