Linux基础
课程介绍
学习 Linux 的价值
1 Linux 是现代化应用程序交付的首选平台,无论是部署在裸机、虚拟化还是容器化环境
2 公司内部服务(TCE、FaaS、SCM)统一使用 Debian Linux 系统
3 熟悉 Linux 基础指令,熟练运维前端常用服务(Nginx,Node.js)
4 加深对操作系统概念和实现的理解,夯实基础知识
课前准备
一台安装 Debian Linux 系统的计算机
01_计算机硬件
在一个完整的冯诺依曼计算体系中,计算机由五大基本单元组成,分别是:
- 控制器:协调和指挥计算机中的其他部件进行工作
- 运算器:进行算术和逻辑运算。(常规意义上,可以认为控制器和计算器共同组成CPU单元)
- 存储器单元:包含内存和外存(外存例如磁盘和光驱)
- 输入单元:例如键盘、鼠标
- 输出单元:例如显示器、音箱
流程: 用户通过输入设备向系统输入一些指令,而操作系统通过调用存储器、运算器、控制器三者的配合,输出给输出设备呈现给用户。
02_计算机操作系统
操作系统 (Operating System,OS):管理和控制计算机系统中的硬件和软件资源,用于在用户与系统硬件之间传递信息
有承上启下的作用,乘上指在操作系统之上,可以运行应用程序;启下指可以通过操作系统与硬件进行交互
操作系统功能有如下:
常见的操作系统:
Mac、Linux、Windows、Android、HarmonyOS
问题思考
Q:程序启动必须有操作系统来执行,那操作系统本身也是一个程序,那是如何在开机时被执行的呢?
答:操作系统启动流程如下:
操作系统的启动流程分为传统模式,也就是基于 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发展简史
3.2 Linux版本
3.3 查看linux系统内核版本
- uname -a
- cat /proc/version
查看linux系统发行版本 cat /etc/os-release
3.4 linux主要应用领域
Linux系统一般有4个主要部分:
- 内核:提供操作系统的底层能力:内存管理、进程管理、文件系统管理、硬件资源管理
- shell:命令解释器。通过shell输入一些指令来实现和linux内核的交互,从而达到管理和使用linux里的资源
- 文件系统:负责管理持久数据的子系统,即负责把用户的文件存在磁盘硬件里
- 应用程序(在Linux之上运行的一些程序,例VsCode)
3.5 Linux体系结构
linux体系结构主要分为用户空间和内核空间,分类的目的一是安全角度上,二者是隔离的,即使用户空间崩溃了也不会对内核空间产生影响;二是权限角度上,内核程序运行于内核空间,拥有最高级的权限,例如访问硬件的所有权限以及对所有系统资源管理的权限。应用程序运行于用户空间,拥有较低级的权限,只能看到允许他们使用的部分资源,不能直接访问内存和应用设备。
所以linux通过权限的划分,来把握资源分配及权利的可控,以达到稳定和可靠。
应用程序与硬件设备进行通信(系统调用过程):程序在用户态发起IO请求,转为内核态即可拥有与硬件设备通信的的能力。调用完成后,程序从内核态切换回用户态。
对内核进行总结:
- 内核是硬件与软件之间的中间层
- 内核是一个资源管理程序
- 内核提供一组面向系统的命令:外部应用程序可以通过命令与内部进行交互
内核漫画
04_Linux系统结构
程序以进程的形态驻留在linux中
4.1进程管理
进程是正在执行的一个程序或命令(动态)
进程有自己的地址空间,占用一定的系统资源(CPU、内存)
一个 CPU 核同一时间只能运行一个进程
进程由它的进程ID(PID)和它父进程的进程ID(PPID)唯一识别 当linux启动一个进程的时候,它是由父进程由拉起一个子进程的,即会将父进程作为一个模板来创建一个新的进程,然后将系统资源映射到新创建的资源当中。
pid0是所有进程的父进程
4.2查看进程信息
查看启动的nginx进程
ps -ef | grep nginx
查看某个进程
top -p 93824
关闭指定的进程
kill 93824
全部进程动态实时视图
top
问题思考
系统中运行的程序远远大于CPU 的核数,那 Linux系统是如何实现同时运行这么多程序的?
一个CPU在同一时间只能运行一个进程
答:此时需要进程调度实现多程序运行
4.3进程调度
进程调度是指操作系统按某种策略或规则选择进程占用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),退出状态,进程即将被销毁
4.4进程调度原则
一个CPU核同一时间只能运行一个进程
每个进程有近乎相等的执行时间
对于逻辑 CPU而言进程调度使用轮询的方式执行,当轮询完成则回到第一个进程反复(保证所有进程能被执行到,防止饿死 )
进程执行消耗时间和进程量成正比
4.5进程的系统调用
内核空间(Kernal Space):系统内核运行的空间
用户空间(User Space):应用程序运行的空间
系统调用流程如下:
当进程运行在内核空间时就处于内核态,而进程运行在用户空间时则处于用户态
切换到内核态才能与底层硬件进行交互
4.6文件系统
文件系统是操作系统中负责管理持久数据的子系统,负责把用户的文件存到磁盘硬件中,持久化的保存文件。
Linux 中一切皆文件
在操作这些不同类型的文件时read、write一致,保证操作统一或者接口调用统一。
Linux文件系统是采用树状的目录结构,最上层是/(根)目录
问题思考
Linux 有这么多不同的文件系统,如何实现对用户提供统一调用接口的?
答:VFS打通不同的文件类型,保证所有操作统一,作为中间层,解决差异
4.7虚拟文件系统(VFS)
对应用层提供一个标准的文件操作接口
对文件系统提供一个标准的文件接入接口
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文件读取流程
举例:nginx接收到一个请求的时候要读取文件内容返回给用户过程:首先去用户缓存区寻找 有无对应缓存文件,有则返回,没有则发起一次系统调用(即系统IO),发起时,nginx就会从用户态切换到内核态,首先内核进程会从内核缓存区中读取以前是否有命中文件,有则从内核缓冲区通过CPU将这些数据拷贝到用户缓冲区给用户进程使用。没有则需要通过DMA向磁盘发起文件读取的请求,然后从内核缓冲区通过CPU将这些数据拷贝到用户缓冲区,nginx就会读取这些数据。写的数据通过CPU拷贝到Socket缓冲区,最终通过DMA将这一部分数据通过网卡拷贝给用户。
相关概念:
DMA:可直接与磁盘进行交互,将磁盘一些数据写到内核缓冲区。
操作系统加入内核缓冲区的作用:减少对系统调用次数,集中数据,提高系统性能。
4.10用户权限
用户账户
用户账户
普通用户账户:在系统中进行普通作业
超级用户账户:在系统中对普通用户和整个系统进行管理。
复制代码
组账户group
标准组:可以容纳多个用户
私有组:只有用户自己
复制代码
Linux是一个多用户的系统,我们可以多个用户同时登陆Linux。
查看用户信息
#查看当前登录用户信息
w
#查看当前用户所属的组
groups
查看用户的uid信息
id xxxx
文件权限
文件权限关于用户有三个概念:
所有者:文件的所有者
所在组:文件的所有者所在的组
其他人:除文件所有者及所在组外的其他人
每个用户对于文件都有不同权限,包括读(R)、写(W)、执行(X)
#在根目录创建一个文件夹,查看当前用户拥有文件夹的权限
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 | .deb | dpkg | apt,apt-get |
| Ubuntu | .deb | dpkg | apt,apt-get |
| CentOS | .rpm | rpm | yum |
| Fedora | .rpm | rpm | dnf |
| openSUSE | .rpm | rpm | zypper |
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 配置软件源
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 部署的默认站点
课程总结
个人体会
(1) 大三上学期就学习过计算机网络,目前下学期已经忘记了一些,感谢这门课程让我回顾之前的内容,比如linux命令和安装。同时也学习到了新知识,比如进程调度建立内核缓冲区、使用DMA的过程等等。收获很多。最后的课程总结非常有用!!!我会仔细拜读的。
(2) 这门课需要结合下门课shell脚本和编程一起学习,故而更多心得会体现在下一篇笔记上。