Linux
为什么要学习Linux? Linux的价值:
- Linux是现代化应用程序交付的首选平台,无论是部署在裸机、虚拟化还是容器化环境
- 公司内部服务(TCE、FaaS、SCM)统一使用Debian Linux系统
TCE:腾讯专有云,Tencent Cloud Enterprise
FaaS:云原生,Function as a Service,功能即服务
SCM:软件配置管理,是一种标识,组织和控制修改的技术
3. 熟悉Linux基础指令,熟练运维前端常用服务(Nginx,Node.js)
4. 加深对操作系统概念和实现的理解,夯实基础知识
Linux选企鹅作为logo,含义表明:开源的Linux,为全人类共同所有,任何公司无权将其私有。
01计算机软件
计算机由五大基本单元组成
- 控制器(协调和指挥计算机中其他部件进行工作)
- 运算器(进行算数和逻辑运算){控制器和运算器共同组成CPU单元}
- 存储器单元(内存和外存(磁盘、光驱等))
- 输入单元(键盘、鼠标)
- 输出单元(显示器)
以上图可以看出五大基本单元如何配合进行工作的:
用户可以通过输入设备,向操作系统输入指令,而操作系统通过调用运算器、控制器和存储器三者进行相互配合,最终输出一个结果,而这个结果最终通过输出设备呈现给用户
02计算机操作系统
---计算机中最大的软件
定义:也叫OS,管理和控制计算机系统中的硬件和软件资源,用于在用户和系统硬件之间传递信息。简单理解:操作系统起到承上启下的作用,呈上--在操作系统之上,运行一些应用程序;启下--通过操作系统,可以直接与硬件进行交互。
计算机操作系统提供两个能力:
一部分能力是管理计算机资源,包括处理器管理、存储器管理、设备管理和文件管理;另一部分能力是提供用户接口:包括命令接口、图形用户接口和程序接口,用户可以通过这些接口直接与操作系统进行通信,从而可以对相关的一些资源进行管理或操作。
主流的操作系统有:
操作系统启动流程
BIOS和UEFI可以理解为固化在主板上的一段程序,主要作用是能够让计算机开机的时候就能够执行和解析这段程序,程序启动以后会进行一系列的初始化的动作,然后去找一个Bootloader(操作系统引导程序),会找到并运行这段程序,Bootloader运行以后,通过Bootloader加载和运行OS,也就是操作系统。通过这个流程就是把操作系统拉起来了。
BIOS和UEFI区别:UEFI是BIOS启动流程的一个优化和升级的版本。BIOS本身会有一些限制和运行上的问题,比如说:BIOS会有一个BIOS自检,就是在开机时对硬件进行检查,会导致启动速度变慢。UEFI是直接优化这个自检的流程,使得加载速度或是启动速度有个明显的提升。
03LInux系统概览
Linux发展简史
- 1969年,Unix诞生于贝尔实验室
- 1984年,贝尔实验室将Unix商业化
- 1984年,Tanenbaum开发Minix操作系统用于教学并开放源码
- 1984年,Richard M,Stallman发起自由软件(FSF)与GNU项目,起草GPL(通用许可证)协议
- 1991年,Linus Torvalds受Minix影响实现初版的Linux内核
- 1992年,Linux内核以GPL协议发行V1.0
Linux版本
- 内核版本:由Linux作者本人去维护的版本,是操作系统的一块核心,提供了包括进程管理、内容管理、文件系统管理及硬件资源管理等一系列底层管理。
- 发行版本:在内核版本的基础上加上很多常用软件组成了Linux发行版本(常规的操作系统)。
Linux发行版本的分支:
Linux命令:
查看Linux系统内核版本
方法一:
uname -a
方法二:
cat /proc/version
查看Linux系统版本
cat /etc/os-release
Linux系统应用领域:
- IT服务器(操作系统、虚拟化和云计算)
- 嵌入式和智能设备(智能设备,比如安卓手机的底层就是Linux系统)
- 个人办公桌面
- 学术研究和软件研发
04Linux系统结构
Linux系统一般有4个主要部分
- 内核
- shell(命令解释器,通过shell输入一些指令来实现跟Linux内核的一些交互,从而达到管理或是使用Linux里面的一些资源)
- 文件系统(负责管理持久数据的子系统,把用户文件存到磁盘硬件当中)
- 应用程序(在Linux之上运行的一些程序)
Linux体系结构
分为用户空间和内核空间。
用户空间主要包含一些应用程序以及GNU C Library--封装好的系统调用库。
内核空间主要分为三块:系统调用层、内核代码和平台架构相关的代码。
内核模块运行于内核空间,应用程序运行于用户空间。一方面从安全的角度讲他们是隔离的,即使是用户程序崩溃了也不会对内核产生影响;另一方面从权限的角度出发,内核程序运行于内核空间,拥有最高级别的权限(对硬件设备的所有权限,以及系统资源管理的权限)。应用程序运行过在用户空间,拥有最低级别的权限(只能看到允许他们使用的部分系统资源,不能直接访问内存和硬件设备)
那应用程序如何与硬件设备进行通信的呢? 应用程序默认运行于用户空间,称之处于用户态,当用户发起IO请求,就是底层C Library发起系统调用,当发起系统调用后,程序会从用户态换到内核态,即内核代表程序运行于内核空间。当程序进入内核态的时候,就是拥有了内核态的最高级别权限,也就有了硬件设备通信的能力。当本次任务完成后,程序有会重新从内核态切换回用户态。这就是一次简单的系统调用过程。
内核总结:
- 内核是硬件与软件之间的中间层(实现硬件和软件之间的交互)
- 内核时一个资源管理程序
- 内核提供一组面向系统的命令(web应用程序通过这组命令与内核进行交互)
进程管理
- 进程是正在执行的一个程序或命令
- 进程有自己的地址空间,占用一定的系统资源
- 一个CPU核同一时间只能运行一个进程
- 进程由它的进程ID(PID)和他的父进程ID(PPID)唯一识别
为什么进程会有PID及PPID唯一识别? 当Linux启动进程的时候是通过父进程来拉起一个子进程,也就是说将父进程作为一个模板,创建一个新的进程,然后将子进程自己的一些系统资源内容映射到一些新建的进程当中,所以并不是直接通过接口创建出来的一个全新的进程。 Linux的结构是树形的结构,给管理进程提供了很大的方便。
如何查看Linux程序对应的是哪个进程呢?
- 查看启动的nginx进程
ps -ef|grep nginx - 查看某个进程
top -p 93824(PID,通过第一个命令得来的,具体还要看具体进程) - 关闭指定的进程
kill 93824 - 全部进程动态实时视图
top
问题思考
系统中运行的程序远远大于CPU的核数,那Linux系统是如何实现同时运行这么多程序的?
Linux系统是通过进程调度这种方式来实现同一时间运行这么多程序的。
进程调度
定义:进程调度是指操作系统按某种策略或规则选择进程占用CPU进行运行的过程。(CPU对运行时间进行了切分)
进程完整的生命周期
进程从被创建开始,创建完成后就会处于一个就绪的状态,等待被调度。当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而言进程调度使用轮询方式执行,当轮询完成啧回到第一个进程反复(保证所有的进程都能被执行到)
- 进程执行消耗时间和进程量成正比
进程的系统调用 内核空间(Kernal Space):系统内核运行的空间 用户空间(User Space):应用程序运行的空间
文件系统(Linux中一切皆文件)
定义:文件系统是操作系统中负责管理持久数据的子系统,负责把用户的文件存到磁盘硬件中,持久化的保存文件。
Linux文件系统是采用树状的目录结构,最上层是/(根)目录。
问题思考:
Linux有这么多不同的文件系统,如何实现对用户提供统一调用接口的?
Linux在中间层做了一层抽象,也就是虚拟文件系统(VFS)
- 对应用层提供一个标准的文件操作接口
- 对文件系统提供一个标准的文件接入接口
查看文件系统类型
- df命令报告文件系统磁盘空间利用率
df -T - mount命令时挂载文件系统用的,不带任何参数运行,会打印包含文件系统类型在内的磁盘分区信息
mount
文件基本操作
- 查看文件夹下的内容
ls - 创建文件夹
mkdir demo - 移动demo文件夹到/home
mv demo /home - 删除demo文件夹
rm -r demo - 创建空文件
touch file.txt - 复制文件
cp file.txt file_bak.txt
文件读取流程
当ngx接收到一个用户请求的时候,会去找请求对应的文件,也就是需要把文件内容读取出来然后返回给用户。首先ngx进程会去用户缓冲区看以前是否有映射过的文件缓存,如果有的话就直接从用户缓冲区读文件,然后进行返回;如果没有命中,就会发起一次系统调用,也就是发起一次系统IO,当IO调用发起的时候,ngx进程就会从用户态切换到内核态,经过内核态以后,首先内核进程会从内核缓冲区去读取以前是否有命中过对应的一些内容,是否有缓存,如果有的话也是直接会从内核缓冲区通过CPU对这些内容数据拷贝到用户缓冲区,然后给用户进程使用,如果没有命中,内核进程就会通过DMA直接访问,向磁盘读取请求,然后DMA会从磁盘读到的文件拷贝到内核缓冲区,当内核缓冲区有数据的时候,就会向CPU发送指令,CPU将数据从内核缓冲区拷贝到用户缓冲区,这样ngx就会读取到用户缓冲区的数据。
用户权限
包括用户账户和组账户
用户账户:
- 普通用户账户:在系统中进行普通作业
- 超级用户账户:在系统中对普通用户和整个系统进行管理
组账户
- 标准组:可以容纳多个用户
- 私有组:只有用户自己
查看用户信息
- 查看当前登录用户信息 w
- 查看当前用户所属组 groups
- 查看用户的uid信息 id xxxx
文件权限关于用户有三个概念
- 所有者:文件的所有者
- 所在组:文件的所有者所在的组
- 其他人:除文件所有者及所在组外的其他人
每个用户对于文件都有不同的权限,包括读(R)、写(W)、执行(X)
用户权限操作
- 在根目录创建一个文件夹,查看当前用户拥有文件夹的权限
cd / && mkdir demo && ls -ld demo - 创建一个用户,并赋予可写操作
sudo useradd ceshi - 设置用户密码
sudo passwd ceshi - 切换ceshi用户登录
su demo - 进入demo文件夹
cd demo - 创建index.js文件成功
touch index.js
软件包
- 软件包
通常是指一个应用程序,它可以是一个GUi应用程序、命令行工具或(其他软件程序需要的)软件库 - 软件包管理
底层工具:主要用来处理安装和删除软件包文件等任务,DPKG,RPM
上层工具:主要用于数据的搜索任务和依赖解析任务,APT,YUM,DNF(帮我们把麻烦的底层依赖项都解决掉了)
Debian APT常用命令
- 列出所有可更新的软件清单命令:apt update
- 安装指定的软件命令:apt install <package_name>
- 安装多个软件包:apt install <packge_1><package_2><package_3>
- 更新指定的软件命令:apt update <package_name>
- 删除软件包命令:apt remove <package_name>
- 查找软件包命令:apt search<keyword》
- 列出所有已安装的包:apt list --install
标题:Linux 基础 - 掘金