Linux基础 | 青训营笔记

70 阅读12分钟

Linux基础

课程介绍

学习 Linux 的价值

1 Linux 是现代化应用程序交付的首选平台,无论是部署在裸机、虚拟化还是容器化环境

2 公司内部服务(TCE、FaaS、SCM)统一使用 Debian Linux 系统

3 熟悉 Linux 基础指令,熟练运维前端常用服务(Nginx,Node.js)

4 加深对操作系统概念和实现的理解,夯实基础知识

课前准备

一台安装 Debian Linux 系统的计算机

01_计算机硬件

在一个完整的冯诺依曼计算体系中,计算机由五大基本单元组成,分别是:

  • 控制器:协调和指挥计算机中的其他部件进行工作
  • 运算器:进行算术和逻辑运算。(常规意义上,可以认为控制器和计算器共同组成CPU单元)
  • 存储器单元:包含内存和外存(外存例如磁盘和光驱)
  • 输入单元:例如键盘、鼠标
  • 输出单元:例如显示器、音箱 image.png

流程: 用户通过输入设备向系统输入一些指令,而操作系统通过调用存储器、运算器、控制器三者的配合,输出给输出设备呈现给用户。

02_计算机操作系统

操作系统 (Operating System,OS):管理和控制计算机系统中的硬件和软件资源,用于在用户与系统硬件之间传递信息

有承上启下的作用,乘上指在操作系统之上,可以运行应用程序;启下指可以通过操作系统与硬件进行交互

操作系统功能有如下: image.png

常见的操作系统: Mac、Linux、Windows、Android、HarmonyOS image.png

问题思考

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

答:操作系统启动流程如下:

image.png

操作系统的启动流程分为传统模式,也就是基于 bios 的启动流程,另一种是当前的主流模式,就是于 UEFI 的启动流程流程。BI0S 或者 UEFI 其实就是一段固化在主板上的程序,让计算机开机的时候就能去执行和解析这段程序,程序会进行初始化的动作,然后寻找Bootloader这段程序,就可以加载和运行操作系统。

UEFI和BIOS区别可以理解为:

UEFI 是 BIOS流程的升级版本,解决优化了 BI0S Bootloader 也就是操作系统引导程序,然后通过引导成初始化操作系统,序运行动中的一些问题,比如优化了 BIOS 自检流程,然后 BI0S 启动会配合MBR分区,无法引导启动超过 2.2T 的磁盘。而 UEFI 一般配合 GPT 分区,支持引导超过 2.2T 的磁盘。

03_Linux系统概述

3.1 Linux发展简史

image.png

3.2 Linux版本

image.png

3.3 查看linux系统内核版本

  1. uname -a
  2. cat /proc/version

查看linux系统发行版本 cat /etc/os-release

3.4 linux主要应用领域

image.png

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

  • 内核:提供操作系统的底层能力:内存管理、进程管理、文件系统管理、硬件资源管理
  • shell:命令解释器。通过shell输入一些指令来实现和linux内核的交互,从而达到管理和使用linux里的资源
  • 文件系统:负责管理持久数据的子系统,即负责把用户的文件存在磁盘硬件里
  • 应用程序(在Linux之上运行的一些程序,例VsCode)

image.png

3.5 Linux体系结构

linux体系结构主要分为用户空间和内核空间,分类的目的一是安全角度上,二者是隔离的,即使用户空间崩溃了也不会对内核空间产生影响;二是权限角度上,内核程序运行于内核空间,拥有最高级的权限,例如访问硬件的所有权限以及对所有系统资源管理的权限。应用程序运行于用户空间,拥有较低级的权限,只能看到允许他们使用的部分资源,不能直接访问内存和应用设备。

所以linux通过权限的划分,来把握资源分配及权利的可控,以达到稳定和可靠。

应用程序与硬件设备进行通信(系统调用过程):程序在用户态发起IO请求,转为内核态即可拥有与硬件设备通信的的能力。调用完成后,程序从内核态切换回用户态。

image.png

对内核进行总结:

  • 内核是硬件与软件之间的中间层
  • 内核是一个资源管理程序
  • 内核提供一组面向系统的命令:外部应用程序可以通过命令与内部进行交互

内核漫画

image (2).png

04_Linux系统结构

程序以进程的形态驻留在linux中

ef4a18569af2ab392dd26f8095a9e9f.png

4.1进程管理

进程是正在执行的一个程序或命令(动态)

进程有自己的地址空间,占用一定的系统资源(CPU、内存)

一个 CPU 核同一时间只能运行一个进程

进程由它的进程ID(PID)和它父进程的进程ID(PPID)唯一识别 当linux启动一个进程的时候,它是由父进程由拉起一个子进程的,即会将父进程作为一个模板来创建一个新的进程,然后将系统资源映射到新创建的资源当中。

pid0是所有进程的父进程

image (3).png

4.2查看进程信息

b91a91213dc32b922e19725c13fe9b5.png

b91192c52d4b591a0dc7d932c440cfe.png 查看启动的nginx进程

ps -ef | grep nginx

查看某个进程

top -p 93824

关闭指定的进程

kill 93824

全部进程动态实时视图

top

问题思考

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

一个CPU在同一时间只能运行一个进程

答:此时需要进程调度实现多程序运行

4.3进程调度

进程调度是指操作系统按某种策略或规则选择进程占用CPU进行运行的过程

image.png

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),退出状态,进程即将被销毁

4.4进程调度原则

一个CPU核同一时间只能运行一个进程

每个进程有近乎相等的执行时间

对于逻辑 CPU而言进程调度使用轮询的方式执行,当轮询完成则回到第一个进程反复(保证所有进程能被执行到,防止饿死 )

进程执行消耗时间和进程量成正比

4.5进程的系统调用

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

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

系统调用流程如下:

image (4).png

当进程运行在内核空间时就处于内核态,而进程运行在用户空间时则处于用户态

切换到内核态才能与底层硬件进行交互

4.6文件系统

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

Linux 中一切皆文件

image (5).png

在操作这些不同类型的文件时read、write一致,保证操作统一或者接口调用统一。

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

image (6).png

问题思考

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

答:VFS打通不同的文件类型,保证所有操作统一,作为中间层,解决差异

4.7虚拟文件系统(VFS)

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

对文件系统提供一个标准的文件接入接口

image (7).png

4.8查看文件系统类型

df 命令报告文件系统磁盘空间利用率

df -T

mount 命令是挂载文件系统用的,不带任何参数运行,会打印包含文件系统类型在内的磁盘分区的信息

mount

ls # 查看文件夹下内容

mkdir demo # 创建文件夹

mv demo /home # 移动 demo 文件夹到 /home

rm -r demo # 删除 demo 文件夹

touch file.txt # 创建空文件

cp file.txt file_bak.txt # 复制文件

4.9文件读取流程

image.png

举例:nginx接收到一个请求的时候要读取文件内容返回给用户过程:首先去用户缓存区寻找 有无对应缓存文件,有则返回,没有则发起一次系统调用(即系统IO),发起时,nginx就会从用户态切换到内核态,首先内核进程会从内核缓存区中读取以前是否有命中文件,有则从内核缓冲区通过CPU将这些数据拷贝到用户缓冲区给用户进程使用。没有则需要通过DMA向磁盘发起文件读取的请求,然后从内核缓冲区通过CPU将这些数据拷贝到用户缓冲区,nginx就会读取这些数据。写的数据通过CPU拷贝到Socket缓冲区,最终通过DMA将这一部分数据通过网卡拷贝给用户。

相关概念:

DMA:可直接与磁盘进行交互,将磁盘一些数据写到内核缓冲区。

操作系统加入内核缓冲区的作用:减少对系统调用次数,集中数据,提高系统性能。

4.10用户权限

用户账户

用户账户

普通用户账户:在系统中进行普通作业
超级用户账户:在系统中对普通用户和整个系统进行管理。
复制代码

组账户group

标准组:可以容纳多个用户
私有组:只有用户自己
复制代码

Linux是一个多用户的系统,我们可以多个用户同时登陆Linux。

查看用户信息

#查看当前登录用户信息

w

#查看当前用户所属的组

groups

查看用户的uid信息

id xxxx

文件权限

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

所有者:文件的所有者

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

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

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

image (8).png

#在根目录创建一个文件夹,查看当前用户拥有文件夹的权限

cd / 88 mkdir demo 88 Is -ld demo

sudo useradd ceshi #创建一个用户,并赋予可写操作

sudo passwd ceshi #设置用户密码

su ceshi #切换 ceshi 用户登录

cd demo #进入 demo 文件夹

touch index.js #创建 index.js 文件,提示无权限,需要给 ceshi 用户 demo 文件夹的权限

sudo chown -R ceshi:ceshi ./demo #demo 文件夹权限给 ceshi 用户

su ceshi #切换 ceshi 用户登录

cd demo #进入 demo 文件夹

touch index.js #创建 index.js 文件成功

05_Linux系统软件包管理器

5.1软件包

软件包

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

软件包管理

底层工具:主要用来处理安装和删除软件包文件等任务,DPKG,RPM 
上层工具:主要用于数据的搜索任务和依赖解析任务,APT,YUM,DNF

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

5.2软件包管理工具

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

DPKG(Debian package),为 Debian 操作系统的包管理系统

操作系统格式软件包管理系统前端工具
Debian.debdpkgapt,apt-get
Ubuntu.debdpkgapt,apt-get
CentOS.rpmrpmyum
Fedora.rpmrpmdnf
openSUSE.rpmrpmzypper
DPKG: Debian package
RPM:redhat package manager
rpm、deb 包,这个就相当于 Windows 中的 exe,yum、apt, 相当于 Windows 中的 360 软件管家

5.3Debian APT 常用命令

列出所有可更新的软件清单命令: apt update

安装指定的软件命令:aptinstall <package_name>

安装多个软件包:aptinstall <package_1> <package_2> <package_3>

更新指定的软件命令:apt update <package_name>

删除软件包命令:apt remove <package_name>

查找软件包命令: apt search <keyword>

列出所有已安装的包: apt list --installed

5.4Debian 配置软件源

image.png

5.5nginx安装

#更新包缓存

apt update #安装 nginx 包

apt install nginx #查找 nginx 路径,/etc/nginx 配置文件路径,/usr/sbin/nginx 可执行文件

whereis nginx

#访问 nginx 部署的默认站点

curl http://localhost:80

#关闭 ng

sudo /usr/sbin/nginx -s stop

#启动 ng

sudo /usr/sbin/nginx

#进入 nginx 配置文件夹

cd /etc/nginx

#打开 nginx 配置文件 nginx.conf,发现默认的站点配置位于 /etc/nginx/sites-enabled

cat nginx.conf

#进入 sites-enabled 文件夹,并对 default 文件进行配置,修改 80 端口为 8080

cd sites-enabled && vim default

#重启 nginx 服务

sudo /usr/sbin/nginx -s reload

#访问 nginx 部署的默认站点

curl http://localhost:8080

课程总结

image (9).png

个人体会

(1) 大三上学期就学习过计算机网络,目前下学期已经忘记了一些,感谢这门课程让我回顾之前的内容,比如linux命令和安装。同时也学习到了新知识,比如进程调度建立内核缓冲区、使用DMA的过程等等。收获很多。最后的课程总结非常有用!!!我会仔细拜读的。

(2) 这门课需要结合下门课shell脚本和编程一起学习,故而更多心得会体现在下一篇笔记上。