软件Linux 基础
学习 Linux 的价值
- Linux是现代化应用程序交付的首选平台,无论是部署在裸机、虚拟化还是容器化环境
- 公司内部服务(TCE、FaaS、SCM)统一使用 Debian Linux 系统
- 熟悉 Linux 基础指令,熟练运维前端常用服务(Nginx,Node.js)
- 加深对操作系统概念和实现的理解,夯实基础知识
课前准备
- 一台安装 Debian Linux 系统的计算机
计算机硬件
计算机由五大基本单元组成
- 控制器:用来协调和指挥计算机中其它部件
- 运算器:主要负责运算(算术运算和逻辑运算)
- 存储器单元:内存和外存(磁盘和光驱)
- 输入单元:键盘、鼠标
- 输出单元:显示器、音响
通过上图中所示:用户通过输入设备输入相关的指令,而计算机通过运算器、控制器、存储器三者之间相互配合,从而产生一个结果通过输出设备显示出来
计算机操作系统
操作系统(Operating System,OS)
定义:管理和控制计算机系统中的硬件和软件资源,用于在用户与系统硬件之间传递信息
起到承上启下的作用,承上:可以在操作系统之上运行一些应用程序,启下:可以在操作系统之下跟系统硬件进行交互
管理计算机资源:
- 处理器管理
- 存储器管理
- 设备管理
- 文件管理
提供用户接口:
- 命令接口
- 图形用户接口
- 程序接口
程序启动必须有操作系统来执行,那操作系统本身也是一个程序,那是如何在开机时被执行的呢?
操作系统启动流程
BIOS 和 UEFI 是固化在主板上的一个程序,作用就是让计算机在开机的时候就可以执行和解析这段程序,接着就会开始一系列的初始化动作,找到 BootLoader 操作系统引导程序,并运行这段程序,然后就可以运行 OS
BIOS 和 UEFI 的区别:
- 可以简单理解为 UEFI 是 BIOS 的优化和升级的版本
- BIOS 有一个自检,就是在开机的时候检查计算机硬件是否正常的工作,从而导致系统启动速度变慢
- BIOS 默认是跟 MB 磁盘分区配合,这就导致 BIOS 无法引导启动 2.2 T容量以上的磁盘,而 UEFI 是跟 GBT 磁盘分区配合,这就导致可以引导启动 2.2 T 容量以上的磁盘
Linux 系统概览
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 作者本人进行维护,提供进程管理、内存管理、文件系统管理以及硬件资源管理等一系列的底层能力
- 发行版本
-
如:centos、debian Linux、Ubuntu
-
Linux
-
Debian 系列
- Debian
- Ubuntu
-
Red Hat 系列
- Centos
- Fedora
- RHEL
-
Siackware 系列
- SUSE
-
国产系列
- 龙芯
- 鲲鹏
- 飞腾
-
查看 Linux 系统内核版本
通过 uname -a | cat /proc/version 命令查询 Linux 内核版本
通过 cat /etc/os-release 命令查询 Linux 发行版本
Linux 系统应用领域
- IT 服务器(操作系统、虚拟化和云计算)
- 嵌入式和智能设备
- 个人办公桌面
- 学术研究与软件研发
Linux 系统结构
Linux 基本组成
一般有 4 个主要部分:
- 内核:提供了操作系统的底层操作能力
- shell:命令解释器,我可以通过 shell 输入一些指令,来实现跟 Linux 内核的交互,从而达到管理和使用 Linux 里面的一些资源
- 文件系统:负责管理持久数据的一个子系统,把用户的文件存放到磁盘硬件中
- 应用程序:运行在操作系统之上的一个程序
Linux 体系结构
-
用户空间
- 应用程序
- GNU C Library 也就是封装好的系统标准调用库
-
内核空间
- 系统调用
- 内核
- 平台架构相关的代码
为什么要分为用户空间和内核空间?
- 安全角度:它们两个是隔离的,就算用户空间中的应用程序崩溃了,也不会影响内核空间
- 权限角度:内核程序运行于内核空间,拥有最高级别的权限和访问硬件设备的所有权限以及对系统资源管理的权限
总结:
- 内核是硬件与软件之间的中间层
- 内核是一个资源管理程序
- 内核提供一组面向系统的命令
内核漫画
- 文件系统
- 进程
- tty
Linux 进程管理
- 进程是正在执行的一个程序或命令
- 进程有自己的地址空间,占用一定的系统资源
- 一个 CPU 核同一时间只能运行一个进程
- 进程由它的进程 ID(PID)和它父进程的进程 ID(PPID)唯一识别
- 查看启动的 redis 进程
ps -ef | grep redis
- 查看某个进程
top -p 99852
- 关闭指定的进程
kill 99852 - 全部进程动态实时视图
top
进程调度
系统中运行的程序远远大于 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 而言进程调度使用轮询的方式执行,当轮询完成则回到第一个进程反复
- CPU 会生成一个调度队列,进程会放入这个队列中,当 CPU 开始进程调度的时候,会从第一个开始取,直到队列中所有的进程被取出,CPU 又会从队列的第一个位置开始取出,这样好处保证了每个进程都被调用了,而不会因为优先级的问题,导致低优先级的进程不被调用
-
进程执行消耗时间和进程量成正比
进程的系统调用
内核空间(Kernal Space):系统内核运行的空间
用户空间(User Space):应用程序运行的空间
文件系统
文件系统是操作系统中负责管理持久数据的子系统,负责把用户的文件存到磁盘硬件中,持久化的保存文件
Linux 文件系统是采用树状的目录结构,最上层是 / (根) 目录
虚拟文件系统(VFS)
Linux 有这么多不同的文件系统,如何实现对用户提供统一调用的接口?
- 对应用层提供一个标准的文件操作接口
- 对文件系统提供一个标准的文件接入接口
查看文件系统类型
- 报告文件系统磁盘空间利用率
df
- 挂在文件系统,不带任何参数运行,会打印包含文件系统类型在内的磁盘分区的信息
mount
文件基本操作
- 查看文件夹下内容
ls
- 创建文件夹
mkdir demo
- 移动 demo 文件夹到 /home
mv demo /home
- 删除 demo 文件夹
rm -r demo
- 创建空文件
touch file.txt
- 复制文件
cp file.txt file_bak.txt
文件读取流程
用户权限
用户账户
-
用户账户
- 普通用户账户:在系统中进行普通作业
- 超级用户账户:在系统中对普通用户和整个系统进行管理
-
组账户
- 标准组:可以容纳多个用户
- 私有组:只有用户自己
查看用户信息
- 查看当前登录用户信息
w
- 查看当前用户所属的组
groups
- 查看用户的 uid 信息
id xxxx
uid=xxxx(xxxx) gid=xxxx(xxxx) groups=xxxx(xxxx)
文件权限
文件权限关于用户有三个概念:
- 所有者:文件的所有者
- 所在组:文件的所有者所在的组
- 其他人:除文件所有者及所在组外的其他人
每个用户对于文件都有不同权限,包括读(R)、写(W)、执行(X)
用户权限操作
- 在根目录创建一个文件夹,查看当前用户拥有文件夹的权限
cd / && mkdir demo && ls -d demo
- 创建一个用户,并赋予可写操作
sudo useradd ceshi
这里的命令 cat /etc/passwd | tail -n 10 拆分下 cat /etc/passwd 是查找 passwd 文件内容(所有用户信息),tail -n 10 是返回文件内容中的最后10行
- 设置用户密码
sudo passwd ceshi
- 切换 ceshi 用户登录
su ceshi
- 进入 demo 文件夹
cd demo
- 创建 index.js 文件,提示无权限,需要给 ceshi 用户 demo 文件夹的权限
touch index.js
- demo 文件夹权限给 ceshi 用户
sudo chown -R ceshi:ceshi ./demo
- 切换 ceshi 用户登录
su ceshi
- 进入 demo 文件夹
cd demo
- 创建 index.js 文件成功
touch index.js
Linux 系统软件包管理器
软件包
-
软件包
通常指的是一个应用程序,它可以是一个 GUI 应用程序、命令行工具或(其它软件程序需要的)软件库
-
软件包管理
底层工具:主要用来处理安装和删除软件包文件等任务,DPKG,RPM
上层工具:主要用于数据的搜索任务和依赖解析任务,APT,YUM,DNF
软件包管理工具
- 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 配置软件源
通常 Debian 系的 Linux 软件源配置文件:/etc/apt/sources.list
镜像地址:mirrors.aliyun.com
/dists:查看系统代号
/pool:查看软件分支