02 Linux基础 | 青训营笔记

100 阅读15分钟

Linux 基础

学习 Linux 的价值

  • Linux 是现代化应用程序交付的首选平台,无论是部署在裸机、虚拟化还是容器化环境
  • 公司内部服务(TCE、FaaS、SCM)统一使用 Debian Linux 系统
  • 熟悉 Linux 基础指令,熟练运维前端常用服务(Nginx,Node.js)
  • 加深对操作系统概念和实现的理解,夯实基础知识

计算机硬件

计算机由五大基本单元组成:

page7_image2.png

  • 控制器

    计算机控制器是计算机的神经中枢,指挥全机中各个部件自动协调工作。在控制器的控制下,计算机能够自动按照程序设定的步骤进行一系列操作,以完成特定任务。

  • 运算器

    运算器:arithmetic unit,计算机中执行各种算术和逻辑运算操作的部件。运算器的基本操作包括加、减、乘、除四则运算,与、或、非、异或等逻辑操作,以及移位、比较和传送等操作,亦称算术逻辑部件(ALU)。

  • 存储器单元

    存储器单元实际上是时序逻辑电路的一种。按存储器的使用类型可分为只读存储器 (ROM) 和随机存取存储器 (RAM),两者的功能有较大的区别,因此在描述上也有所不同。

  • 输入单元

    输入设备和输出设备都是进行人机互动的关键设备。

  • 输出单元

    输出设备也是计算机人机互动的关键设备,它的特点是可以将计算机的信息以画面的形式展现出来,具有很好的直观性。

总结:
image.png

计算机操作系统

操作系统(Operating System, OS)

操作系统是用于管理和控制计算机系统中的硬件和软件资源,用于在用户与系统之间传递信息。

操作系统主要提供了两个方面的能力,一个是管理计算机资源,包括处理器管理、存储管理、设备管理、文件管理等,另一个能力是提供各种用户接口,包括命令接口、图形用户接口、程序调用接口,实现外部程序与操作系统内核的交互。

page9_image7.png

思考:程序启动必须有操作系统来执行,那操作系统本身也是一个程序,那么是如何在开机时被执行的呢?

操作系统启动流程

操作系统的启动过程大致可以分为以下几步:

  1. 启动 BIOS。进行硬件自检和初始化。
  2. 系统引导。找到操作系统。
  3. 启动系统。
  4. 初始化系统。

1 启动 BIOS

BIOS,Basic Input/Output System,基本输入输出系统。

早期的 BIOS 存储在内存的 ROM 中,不会断电消失;现在大多存储在内存的闪存(Flash Memory)中。

BIOS 程序执行过程有以下几步:

1.1 供电初始化

按下电源开关后,电源就开始给主板和其他设备供电,CPU 会把所有寄存器的值都设为默认值,即恢复初始状态。随后 CPU 会执行初始位置的指令,跳转到 BIOS 启动代码位置,开始启动 BIOS。

1.2 POST 硬件自检

BIOS 首先进行 POST(Power On Self Test,硬件自检),检查计算机硬件是否满足运行的基本条件,并完成相应的初始化工作。如果发现了问题,主板会发出不同的蜂鸣声表示不同的问题。

1.3 搜索可引导的存储设备

BIOS 按照启动顺序开始搜索可引导的存储设备,找到后,会将存储设备中的引导扇区读入物理内存,并执行引导扇区中的程序,开始系统引导。

BIOS 是按照顺序依次搜索可引导的存储设备的,这个顺序就叫启动顺序(Boot Sequence),可以在 BIOS 中进行查看和修改。

至此,BIOS 的工作就完成了。BIOS 所实现的功能可以简单地概括为以下几点:

  • 检测硬件设备并完成相应的初始化
  • 读入存储设备中的引导扇区,准备开始引导工作。

接下来以最常见的硬盘启动为例进行说明。

2 系统引导

2.1 读取 MBR

读取并执行硬盘的第一个扇区,即 MBR(Master Boot Record,主引导记录,大小为 512 字节)。其作用为告诉计算机到硬盘的哪一个位置去找操作系统。MBR 的结构如下:

  • 第1-446 字节:调用操作系统的机器码,可以被 CPU 直接执行。
  • 第 447-510 字节:分区表(Partition Table),将硬盘分为了若干个分区。
  • 第 511-512 字节:记录签名(0x55 和 0xAA),表示设备可以用于启动。

2.2 查找活动分区

搜索 MBR 中的分区表,找到唯一的活动分区(Active Partition),并将活动分区的第一个扇区中的引导扇区(称为“卷引导记录”,Volume Boot Record,VBR)读入内存,就能找到操作系统在这个分区中的位置。然后,计算机就会开始加载操作系统了。

分区表的长度只有 64 个字节,里面又分成四项,每项 16 个字节。所以,一个硬盘最多只能分四个主分区,但是可以将一个主分区作为扩展分区(扩展分区最多只有一个),并扩展成多个逻辑分区。一个主分区可以安装一个操作系统,像常见的 Windows 系统,C盘、D盘就是对应的一个个分区,而操作系统默认就是安装在 C 盘的。

3 启动系统

由于一台计算机中可以安装多个操作系统,所以启动系统时也会有不同的情况。当有多个操作系统时,会运行启动管理器(Boot Loader),让用户选择启动操作系统;当只有一个操作系统时,就会直接从激活分区中启动操作系统(当然也可以选择将控制权交给启动管理器,boot loader 可以存在 MBR 中,也可以存在主分区的引导扇区中)。

4 初始化系统

操作系统启动后,控制权就从 boot loader 转交给了操作系统,之后,操作系统的内核首先被载入缓存,随后会运行初始化进程进行操作系统的初始化。

至此,整个计算机的启动过程就完成了。

UEFI 像是新一代的 BIOS,要比 BIOS 的功能更强大,启动速度更快,解决优化了 BIOS 自检流程,同时 BIOS 启动会配合 MBR 分区,无法引导启动超过 2.2T 的磁盘,而 UEFI 一般会配合 GPT 分区,支持引导超过 2.2T 的磁盘。UEFI启动流程跳转

Linux 系统概览

Linux 发展简史

Linux 版本

  • 内核版本

    免费的,它只是操作系统的核心,负责控制硬件、管理文件系统、程序进程等,并不给用户提供各种工具和应用软件;

  • 发行版本

    不一定免费,出了操作系统核心外,还包含一套强大的软件,例如:C/C++编译器和库等

Linux 发行版本分支

page14_image2.jpg

查看 Linux 系统版本

内核版本

发行版本

Linux 系统应用领域

  • IT 服务器(操作系统、虚拟化和云计算)
  • 嵌入式和只能设备
  • 个人办公桌面
  • 学术研究与软件研发

Linux 系统结构

基本组成

Linux 系统一般有 4 个主要部分

  • 内核
  • shell
  • 文件系统
  • 应用程序

体系结构

  • 内核是硬件与软件之间的中间层
  • 内核是一个资源管理程序
  • 内核提供一组面向系统的命令

page21_image2 (2).jpg

--进程管理

进程

  • 进程是正在执行的一个程序或命令
  • 进程有自己的地址空间,占用一定的系统资源
  • 一个 CPU 核同一时间只能运行一个进程
  • 进程由它的进程 ID(PID)和它父进程的进程 ID(PPID)唯一识别

如何查看程序对应的是哪个进程呢?

以 nginx 进程为例

系统中运行的程序远远大于 CPU 的核数,那 Linux 系统是如何实现同时运行那么多程序的?

进程调度

所谓进程调度,就是指在处于就绪态的一堆 进/线程 里,按照一定的调度算法,选出一个进/线程并给它分配CPU时间让它运行,从而实现多进程/多线程的并发执行。

  • R (TASK_RUNNING),可执行状态
  • S (TASK_INTERRUPTIBLE),可中断的睡眠状态
  • D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态
  • T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态
  • Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程称为僵尸进程
  • X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁

基本进程状态

运行态:当前正在占有CPU的进/线程;

就绪态:具备运行条件,等待系统分配CPU的进/线程;

阻塞态:不具备运行条件,正在等待某外部事件发生的进/线程。

进程切换的基本流程

  1. 首先用户态必须切换到内核态;
  2. 保存当前进程的状态,包括在其PCB中保存CPU各寄存器值,以便日后重新执行;
  3. 调度算法选定一个新进程;
  4. 新进程的内存地址空间重新装入MMU(内存管理单元);
  5. 新进程开始执行。

内核空间 (Kernal Space):系统内核运行空间

用户空间 (User Space):应用程序运行的空间

page28_image2.png

进程调度算法(跳转)

进程调度原则

  • 一个 CPU 核同一时间只能运行一个进程
  • 每个进程有近乎相等的执行时间
  • 对于逻辑 CPU 而言进程调度使用轮询的方式执行,当轮询完成则回到第一个进程反复
  • 进程执行消耗时间和进程量成正比

--文件系统

文件系统

文件系统是操作系统中负责管理持久数据的子系统,负责把用户的文件存到磁盘硬件中,持久化的保存文件。

Linux 中,一切皆文件

这样做最明显的好处是开发者仅需要使用一套 API 和开发工具即可调取 Linux 系统中绝大部分的资源。

举个简单的例子,Linux 中几乎所有读(读文件、系统状态、socket、PIPE)的操作都可以用 read 函数来进行;几乎所有更改(更改文件、系统参数、写 socket、写 PIPE)的操作都可以用 write 函数来进行。

使用任何硬件设备都必须与根目录下某一目录执行挂载操作。

文件目录

Linux 文件系统是采用 树状 的目录结构,最上层的是 /(根)目录

/bin

bin 是 Binaries(二进制文件)的缩写,这个目录存放着最经常使用的命令

/boot

这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。

/dev

dev 是 Device(设备)的缩写,该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。

/etc

etc 是 Etcetera(等等、附加物)的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录

/home

用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。

/lib

lib 是 Librav()的缩写,这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。

/mnt

系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱的内容了。

/opt

opt 是 optional(可选)的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个 ORACLE 数据库就可以放到这个目录下。默认为空。

/proc

proc 是 Processes(进程)的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。

/root

该目录为系统管理员,也称超级权限者的用户主目录。

/sbin

s 就是 Super User 的意思,是 Superuser Binaries(超级用户的二进制文件)的缩写,这里存放的是系统管理员使用的系统管理程序。

/usr

usr 是 unix shared resources(共享资源)的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。

思考:Linux 有这么多不同的文件系统,如何实现对用户提供同一调用接口的?

虚拟文件系统(VFS)

虚拟文件系统使得 Linux 可以存在多个 “实际的文件系统”,VFS 可以作为中间层,用户直接控制 VFS,VFS 再去控制各个文件系统。

  • 对应用层提供一个标准的文件操作接口
  • 对文件系统提供一个标准的文件接入接口

查看文件系统类型

文件基本操作

文件读取流程

当 nginx 接收到一个用户请求时,它会去找请求对应文件(将文件内容读取出),返回给用户。

  1. 首先 nginx 进程会去 用户缓冲区 寻找,查看以前是否有命中过相关文件,若有,则直接从用户缓冲区读文件然后返回;若没命中,则会发起一次系统调用(I/O)。
  2. 当系统调用发起时,进程会从 用户态转为内核态
  3. 内核进程会从 内核缓冲区 中查看以前是否命中过对应的内容,若有,则直接通过 CPU 将数据拷贝到用户缓冲区,给用户进程使用;若没命中,内核进程会通过 DMA(直接存储访问)发起文件读取请求,DMA 会将磁盘中的相关文件拷贝到内核缓冲区,当内核缓冲区有数据,则会 向 CPU 发送指令,CPU 就会 将数据从内核缓冲区拷贝到用户缓冲区
  4. 当用户缓冲区有相关文件时,进程就能读取到相关的数据,之后通过写的流程,将用户缓冲区数据通过 CPU 拷贝到 Socket 缓冲区
  5. 最终通过 DMA 将这部分文件数据 通过网卡返回给用户

--用户权限

用户账户

  • 用户账户

    普通用户账户:在系统中进行普通作业

    超级用户账户:在系统中对普通用户和整个系统进行管理

  • 组账户

    标准组:可以容纳多个用户

    私有组:只用用户自己

查看用户信息

文件权限

文件权限关于用户有三个概念:

所有者:文件的所有者

所在组:文件的所有者所在的组

其他人:除文件所有者及所在组外的其他人

每个用户对于文件都有不同权限,包括读(R)、写(W)、执行(X)

用命令行查询时看到的结果表示的意思:

  • 文件类型

    d:文件夹

    -:普通文件

    l:软链接(类似Windows的快捷方式)

    b:块设备文件(例如硬盘、光驱等)

    p:管道文件

    c:字符设备文件(例如屏幕等串口设备)

    s:套接口文件

  • 对于文件

    r 读(read):具有读取文件内容的权限。

    w 写(write): 具有修改文件内容的权限的权限。

    x 执行(execute):具有执行文件的权限。

  • 对于目录文件

    r 读(read):查看目录下的文件列表的权限。 w 写(write): 具有删除移动目录内文件和创建文件的权限 。 x 执行(execute):具有进入目录的权限。

用户权限操作

软件包

软件包概述

软件包

通常指的是一个应用程序,它可以是一个 GUI 应用程序、命令行该工具或(其他软件程序需要的)软件库。

软件包管理

底层工具:例如 DPKG,RPM,主要用来处理安装和删除软件包文件等任务。

上层工具:例如 APT,YUM,DNF,主要用于数据的搜索任务和依赖解析任务。

用做西红柿炒蛋来类比,则底层工具就相当于西红柿、鸡蛋等食材,上层工具相当于厨师。

tips: yum 可以自动下载并安装所有需要的依赖项,但 rpm 会告诉你安装一个依赖项列表,然后你必须手动安装。

软件包管理工具

  • RPM(Red Hat Package Manager),为 Red hat 操作系统的包管理系统
  • DPKG(Debian package),为 Debian 操作系统的包管理系统

Debian APT 常用命令

  • 列出所有可更新的软件清单命令:apt update
  • 安装指定的软件命令:apt install <package_name>
  • 安装多个软件包:`apt install <package_1> <package_2> <package_3>
  • 更新指定的软件命令:apt update <package_name>
  • 删除软件包命令:apt remove <package_name>
  • 查找软件包命令:apt search <keyword>
  • 列出所有已安装的包:apt list --installed

Debian 配置软件源

镜像地址:mirrors.aliyun.com/

/dists:查看系统代号

/pool:查看软件分支

nginx 安装

nginx 配置修改