💡 Linux凭借其较高的安全性、可移植性、可定制性成为现代化交付的首选平台。熟悉Linux系统基础指令有利于对前端常用服务(Nginx,Node.js)进行运维,有利于加深对操作系统概念和实现的理解,夯实基础知识。
主要内容
1.计算机硬件
在一个完整的冯诺依曼计算机体系中,计算机主要由五大部分组成,即:控制器、运算器、存储器、输入和输出单元组成。
- 存储器用来存放数据和程序;
- 运算器主要运行算数运算和逻辑运算,并将中间结果暂存到运算器中;
- 控制器主要用来控制和指挥程序和数据的输入运行,以及处理运算结果;
- 输入设备用来将人们熟悉的信息形式转换为机器能够识别的信息形式,常见的有键盘,鼠标等;
- 输出设备可以将机器运算结果转换为人们熟悉的信息形式,如打印机输出,显示器输出等。
2.计算机操作系统
2.1 操作系统
在计算机系统中,操作系统是核心系统软件;其他的系统要运行在操作系统基础之上,操作系统是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互关联的系统软件程序。操作系统控制着所有程序运行的基本框架,控制着硬件设备、应用软件、用户界面等。操作系统管理和控制计算机系统中的硬件和软件资源,用于在用户与系统硬件之间传递信息。操作系统主要提供了两个方面的能力,其一是管理计算机资源,包括处理器管理、存储器管理、设备管理、文件管理等,其二是提供用户接口,包括命令接口、图形用户接口、程序接口等。常见的操作系统有mac系统、Linux系统、Windows系统、安卓系统。
2.2 操作系统启动流程
操作系统(OS)也是一个程序,如果在硬件通电后让这个特殊的程序运行起来,以及这个特殊的程序在启动过程中做了什么。操作系统的启动模式分为BIOS启动流程和IEFI启动流程。
BIOS启动流程
BIOS启动流程如下图所示:
硬件初始化-->找到并加载操作系统的内核-->内核初始化-->操作系统运行环境初始化-->登录初始化-->登录成功后的用户初始化(包含图形界面初始化或shell的初始化)-->最终用户成功进入操作系统并开始使用操作系统。
1.按下电源通电。主板通电后,CPU开始工作,它执行固定地址处的一段非常小的硬编码程序:BIOS,于是BIOS掌握了CPU控制权。
2.BIOS程序会进行硬件的上电自检(Power-On Self-Test,POST)以确认有哪些硬件以及这些硬件是否故障。对于我们要探索的操作系统启动流程来说,最重要的是会根据检测到磁盘顺序(除了磁盘,也可以是其它硬件设备,比如U盘、光盘、网卡等),按顺序找到这些磁盘上正确的MBR,于是MBR开始掌握CPU控制权。
3.MBR是引导系统内核启动的第一段代码,它的位置固定处于磁盘的第一个扇区位置处(如果不固定,就不知道怎么找到MBR)。引导内核启动的代码段称为Boot Loader,除MBR外,还需要通过其它引导系统的代码段来一步步引导启动内核,所以要引导一个内核的启动,需要跳转并执行多段BootLoader。根据使用的启动管理工具(如LILIO、GRUB、GRUB2等)不同,这一段段的引导代码段称呼和存放位置都不一样,但第一个引导内核启动的代码段一定称为MBR,也一定处于磁盘的第一个扇区位置,所以MBR才称为主引导记录(Master Boot Record)。
4.当找到内核映像后,将内核映像装载到内存中并解压(如果被压缩的话),内核开始掌握CPU控制权并运行起来,期间内核会做很多工作,包括内核的初始化、挂载真正的根目录并从临时根目录切换到真正的根目录、启动一些重要的进程,例如idle、进程调度器、init进程等。然后开始执行用户空间的第一个进程:init进程,于是init进程掌握了CPU的控制权,也从此开始进入用户空间。
5.init进程开始运行后就表示操作系统真正已经启动成功了,但它仍然需要做系统级别的初始化,比如设置主机名、设置硬件参数、加载硬件驱动、挂载/etc/fstab中的一些文件系统等等。系统级别的运行环境一切初始化完成后,于是提供用户登录的界面,即init启动getty类的进程。
6.getty类的进程启动后,将打开一个终端,并提示用户输入用户名,然后启动一个login进程让用户输入密码并验证密码,密码验证通过后再审核用户是否有权登录,如果允许登录,将根据/etc/passwd中的配置启动该用户对应的shell进程,例如bash进程。
7.shell进程启动后读取该shell对应的配置文件,并按照登录式、交互式的shell运行模式进行初始化,初始化完成后将进入登录式、交互式的shell,也就是命令行下。
8.至此,用户可以通过shell命令行来使用操作系统。
IEFI启动流程
UEFI系统从加电到关机可以分为七个阶段,这七个阶段分别为:
SEC(安全验证)->PEI(EFI前期初始化)->DXE(驱动执行环境)->BDS(启动设备选择)->TSL(操作系统加载前期)->RT(系统系统运行阶段)->AL(系统灾难恢复期或关机)
- SEC阶段 (Security Phase)
UEFI系统开机或重启进入SEC阶段,功能上执行4种任务:
- 处理平台启动及重启信号
- 创建临时存储区域
- 作为可信系统的根
- 传递参数给下一阶段(既PEI Foundation)
- PEI阶段 (Pre-EFI Initialization)
PEI阶段资源依然十分有限,PEI后期才会初始化内存,主要功能就是初始化一些硬件设备,并且给DXE准备执行环境,通过HOB传递给DXE Foundation,最终将控制权交给DXE Foundation。
- 初始化内存
- 准备memory相关的HOB
- 准备FV相关的HOB
- 控制权交给DXE Foundation
PEI阶段主要由PEI Foundation、PEIM Dispatcher来处理上述操作。
- PEI Foundation:负责初始化gPeiServices和流程执行
- PEI Dispatcher:找出系统中所有的PEIM,并根据PEIM之间的依赖关系按顺序执行PEIM,其中CPU/Memory初始化都是由特定的PEIM来完成的,其中DxeIpl来Load DxeCore。
- DXE阶段 (Driver Execution Environment)
与PEI阶段相似,DXE从功能上分为3个部分:
- DXE Foundation:负责初始化一系列服务如BootServices/RuntimeServices/DxeServices,和安装一些ConfigurationTable。
- DXE Dispatcher:负责分发DXE Drivers,包括MM Drivers也是在这个阶段共同分发。
- DXE Drivers:负责初始化一些Protocol及安装Binding Driver为后续使用
- BDS阶段 (Boot Device Selection)
BDS的主要功能是执行启动策略,主要功能包括:
- 初始化控制台设备
- 为设备加载相关的驱动,由Binding Driver来决定怎么加载。
- 为BIOS Setup做准备。
- 根据系统设置加载和启动可启动选项。
- TSL阶段 (Transient System Load)
TSL是操作系统加载器(OS Loader)执行的第一阶段,OS Loader作为一个UEFI应用程序执行,系统资源仍由UEFI内核控制。直到启动服务(BS)的ExitBootServices()服务被调用之后,系统进入RT阶段。
- RT阶段 (Run Time)
进入RT阶段后,系统的控制权从UEFI内核转交到OS Loader手中,UEFI占用的各种资源被回收到OS Loader,仅有UEFI运行时服务(RT)保留给OS Loader和OS使用。
- AL阶段 (After Life)
在RT阶段,如果系统(硬件或软件)遇到灾难性错误,系统固件需要提供错误处理和灾难恢复机制,这种机制运行在AL阶段。UEFI和UEFI PI标准并没有定义该阶段的行为规范。
3.Linux系统概览
3.1 Linux版本
Linux就本质来说,它只是操作系统的核心,负责控制硬件、管理文件系统、程序进程等,并不给用户提供各种工具和应用软件。但是没有常用软件的加持,操作系统就不能发挥其功能。Linux发行版就是Linux内核搭配上常用的软件构成的功能齐全的系统。Linux发行版有四个系列分类,如下图所示:
3.2 查看Linux系统内核版本
- 查看Linux内核版本的指令
uname -a
此命令可以查看电脑以及操作系统内核的相关信息。uname 命令用于查看多个系统信息,包括 Linux 内核体系结构,名称版本和发行版。
cat /proc/version
此命令可以查看正在运行的内核版本信息。/proc目录存储的是当前内核运行状态的一系列特殊文件,包括:内存,CPU内核,已安装文件系统等信息。而正在运行的内核的信息存储在 /proc/version 虚拟文件中,可以使用 cat 命令查看。
- 查看Linux系统发行版本的命令
lsb_release -a
此命令用于查看当前 Linux 系统的完整的版本信息,包括 Linux 系统的名称和对应的版本号,以及该版本的代号。例如在 Debian 8 中将会显示代号jessie。
该命令适用于所有 Linux 发行版,包括:Debian、Ubuntu、CentOS 等。
cat /etc/issue
此命令也可以用于查看 Linux 系统版本信息,但是显示的结果较为简略,只有系统名称和对应版本号。
该命令也适用于所有的 Linux 发行版。
4.Linux系统结构
4.1 Linux基本组成
Linux系统一般有4个部分组成,即:内核、shell、文件系统、应用程序
1、内核,是操作系统的核心,是计算机硬件与其进程之间的核心接口,负责两者之间的通信;
2、shell,是系统的用户界面,提供用户与内核进行交互操作的一种接口;
3、文件系统,是文件存放在磁盘等存储设备上的组织方法;
4、应用程序。
4.2 内核漫画
来看中文注释版
地基(底层)由一排排的文件柜组成,井然有序,文件柜里放置着“文件”——电脑中的文件。左上角,有一只胸前挂着 421 号牌的小企鹅,它表示着 PID(进程 IDProcess ID) 为 421 的进程,它正在查看文件柜中的文件,这代表系统中正有一个进程在访问文件系统。在右下角有一只小狗,它是看门狗watchdog ,这代表对文件系统的监控。中间层,有众多小企鹅在围着着桌子坐着。这个桌子的区域代表进程表。桌子的上方有一个站着的企鹅,好像在指挥这一桌子企鹅,它代表着 Linux 内核中的初始化(init)进程,也就是常说的 PID 为 1 的进程。桌子上坐的小企鹅都在等待状态wait中,等待工作任务。桌子周围有两只狗,它会监控小企鹅的状态(监控进程)。图中有两只企鹅,在一起搬一根管道,一只小企鹅可以把自己手上的东西通过这个管道,传递给后面的小企鹅。cron进程是图中那只冒汗的企鹅,它执行着周期性任务。pid为1341的小企鹅就是大名鼎鼎的apache http服务器进程。它坚守在80端口提供http服务。它头上的羽毛就是apache的标志。52号企鹅看护的是用于SSH服务的22端口,SSH服务常常用于远程登陆,所以它看起来很严肃。端着红酒的411号企鹅就是wine,可以在Linux上运行一些简单的windows程序。最顶层是两只在名为TTY的窗口面前工作的企鹅,一只企鹅在控制台前戳戳点点,另一只在仔细端详程序的输出。tty(终端)是对外沟通的渠道之一,但是,不是每一个进程都需要 tty,某些进程可以直接通过其他途径(比如端口)来和外部进行通信,对外提供服务的,所以,这一层不是完整的一层,只是个跃层。
4.3 进程管理
进程基本概念
进程管理是Linux的一个重要功能。进程是正在运行的程序,Linux系统通常有数百个进程同时运行。每个进程都有自己的地址空间,进程是资源分配的最小单位。一个CPU核同一时刻只能运行一个进程,Linux通过进程调度实现多个进程的运行。进程调度是指操作系统按照某种策略或规则选择进程占用CPU运行的过程。操作系统中进程从创建到结束的工作流程如下图所示。
进程调度原则
每个进程有近乎相同的执行时间。对于逻辑CPU而言,进程调度使用轮询的方式执行,当轮询完成则回到第一个进程反复。进程执行消耗时间和进程量成正比。
进程的系统调用
内核空间:系统内核运行的空间 用户空间:应用程序运行的时间。用户调用系统程序,需要经过用户态到内核态再到用户态,如下图所示:
4.4 文件系统
在LINUX系统中有一个重要的概念:一切都是文件。 Linux文件系统具有以下几个特点:
- 一切皆文件:在 Linux 文件系统中,一切都被视为文件,包括硬件设备、目录、文件、管道等等。这种一切皆文件的思想使得 Linux 文件系统非常灵活。
- 文件系统层次结构:Linux 文件系统使用了一种层次结构,将文件和目录组织成一个树形结构。根目录是整个文件系统的起点,所有的目录和文件都以它为基础,分别存储在不同的目录下。
- 透明的文件名和路径:在 Linux 文件系统中,文件名和路径是透明的,不需要使用特殊的命令或语法来访问它们。文件名是一个字符串,可以包含字母、数字、特殊字符等。路径是一组目录名,使用斜杠(/)分隔。
- 文件权限和所有权:Linux 文件系统通过权限和所有权来控制对文件的访问。每个文件都有一个所有者和一组权限,只有所有者或有相应权限的用户才能访问它。
- 虚拟文件系统:Linux 文件系统使用虚拟文件系统(VFS)层,将不同类型的文件系统抽象为一个通用的文件系统接口,使得用户可以以相同的方式访问不同的文件系统,如下图所示。
Linux文件基本操作
文件读取流程
4.5 用户权限
Linux中一切皆文件,文件权限却有不同。Linux中的用户可以分为三种身份,所有者、所在组、其他人。
- 所有者: 文件的所有者
- 所在组:文件所有者所在的组
- 其他人:除文件所有在及所在组外的其他人
每个用户对于文件的权限是不同的。权限操作有三个 读、写、执行
课程总结
参考链接
bios操作系统启动流程
zhuanlan.zhihu.com/p/547115496
UEFI启动流程概览
zhuanlan.zhihu.com/p/483888207…
UEFI学习0-UEFI系统的启动过程
趣味漫画读懂Linux内核