本文参与青训营笔记创作活动
学习Linux的价值
- Linux是现代化应用程序交付的首选平台,无论是部署在裸机、虚拟化还是容器化环境
- 公司内部服务(TCE、FaaS、SCM)统一使用Debian Linux系统
- 熟悉Linux基础指令,熟悉运维前端常用服务(Nginx,Node.js)
- 加深对操作系统概念和实现的理解。
计算机硬件
计算机由五大基本单元组成:
- 控制器:协调和指挥计算器中其他部件工作
- 运算器:进行算数和逻辑运算,和控制器共同组成
CPU单元 - 存储器单元:分为内存和外存(磁盘、光盘等)
- 输入单元:鼠标、键盘等
- 输出单元:显示器、音响等
计算机操作系统
操作系统的定义:
操作系统(Operating System,OS)是管理和控制计算机系统中的硬件和软件资源,用于在用户和系统硬件之间传递信息,简单来说就是一个承上启下的中间人作用
操作系统的作用:
主流操作系统:
问题:程序启动必须由操作系统执行,那么操作系统本身也是一个程序,它是如何在开机时被执行的?
操作系统执行流程:
其中,BIOS和UEFI都是固化在主板上的一段程序,它们的作用都是在计算机启动时运行,进行一系列初始化操作,然后去寻找Bootloader操作系统引导程序并执行,从而加载OS程序。
UEFI是BIOS的优化,是现在主流的模式
Linux系统概览
Linux发展简史
- 1969年,Unix诞生于贝尔实验室
- 1984年,贝尔实验室将Unix商业化
- 1984年,Tanenbaum开发Minix操作系统用于教学并开放源码
- 1984年,Richard M.Stallman发起自由软件(FSF)与GNU项目,起草GPL(通用公共许可协议)
- 1991年,Linus Torvalds受Minux影响实现初版Linux内核
- 1992年,Linux内核以GPL协议发行V1.0
Linux发行版本
- 分为内核版本和发行版本,发行版本其实就是内核+常用软件
- 查看Linux系统内核版本
#方法一
uname -a
#方法二
cat /proc/version
- 查看Linux系统版本
cat /etc/os-release
Linux系统应用领域
- IT服务器(操作系统、虚拟化和云计算)
- 嵌入式和智能设备
- 个人办公桌面
- 学术研究和软件研发
Linux系统结构
Linux基本组成
Linux系统一般有四个主要部分
- 内核:提供操作系统的一些底层能力,如内存管理、进程管理、文件系统管理、应急资源管理等。
- shell:命令解释器,可以通过输入一些指令与内核进行交互,从而达到管理和使用内核中一些资源
- 文件系统:负责管理和请求数据的子系统,负责把用户文件存到磁盘中
- 应用程序:在Linux上运行的一些程序。
Linux体系结构
- 内核是软硬件之间的
中间层 - 内核是一个
资源管理程序 - 内核提供一组
面向系统的命令
Linux进程管理
- 进程是正在执行的
一个程序或命令 - 进程有自己的地址空间,占用一定的系统资源
- 一个CPU核同一时间只能运行一个进程
- 一个进程由它的进程ID(
PID)和它父进程的进程ID(PPID)唯一识别
因为创建进程的时候是由它的父进程为模板创建的,而不是通过程序直接创建进程,pid0是初始化进程
查看进程信息
问题:系统中运行的程序远远大于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而言进程调度使用轮询的方式进行,当轮询完成则回到第一个进程反复
- 进程执行消耗时间和进程量成正比
进程系统调用流程
进程会反复在用户态和内核态之间进行切换
Linux文件系统
文件系统是负责管理持久化数据的子系统,负责把用户的文件存到磁盘硬件中。
其中,Linux文件系统是采用自上而下的树状目录结构进行文件管理,最上层是根目录
- /bin:bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。
- /boot:这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。
- /dev :dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。
- /etc:etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。
- /home:用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
- /lib:lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 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有这么多不同的文件系统,如何实现对用户提供统一调用接口的?
回答:Linux在中间做了一层抽象——虚拟文件系统VFS
虚拟文件系统VFS
- 对应用层提供一个标准的文件操作接口
- 对文件系统提供一个标准的文件接入接口
查看文件系统类型
文件基本操作
ls //查看文件夹下内容
mkdir demo //创建文件夹
mv demo /home //移动demo文件夹到/home
rm -r demo //删除demo文件夹
touch file.txt //创建空文件
cp file.txt file_bak.txt //复制文件
文件读取流程
以Nginx为例,当接收到用户请求的时候,首先Nginx进程会去用户缓冲区进行寻找,也就是看看以前是否有命中过相关的文件,如果有的话之直接调用;没有的话发起一次系统调用(系统IO),Nginx进程从用户态切换到内核态,从内核缓冲区查看以前是否有相关文件,有的话从内核缓冲区通过CPU拷贝到用户缓冲区;如果还没有的话通过DMA到磁盘中读取
写的流程类似
- DMA可以直接和磁盘交互,将磁盘中的数据从硬件客空间写到内核缓冲区
- 有多层缓冲区的意义就是为了不频繁调度资源
Linux用户权限
用户账户
- 用户账户
- 普通用户账户:在系统中进行普通作业
- 超级用户账户:在系统中对普通用户和整个系统进行管理
- 用户组
- 标准组:可以容纳多个用户
- 私有组:只有用户自己
查看用户信息
文件权限
文件权限关于用户有三个概念:
- 所有者: 文件的所有者
- 所在组: 文件的所有者所在的组
- 其他人: 除文件所有者及所在组外的其他人
每个用户对于文件都有不同权限,包括读(R)、写(W)、执行(X),比如在下图可以看到所有者拥有读写执行权限,而所在组只有读和执行的权限
用户权限操作
#在根目录创建一个文件夹,查看当前用户拥有文件夹的权限
cd / && mkdir demo && 1s -1d demo
// drwxr-Xr-x 2 root root 4096 Nov 28 15:55 demo
sudo useradd ceshi #创建一个用户,并赋予可写操作
sudo passwd ceshi #设置用户密码
su ceshi#切换ceshi用户登录
cd demo #进入demo文件夹
touch index.js #创建index.js文件,提示无权限,需要给ceshi用户demo文件夹的权限
sudo chmod o+r ./ demo # demo文件夹写权限赋予其他人
su ceshi #切换ceshi用户登录
cd demo #进入demo文件夹
touch index.js #创建index.js文件成功
Linux软件包的管理
- 软件包:通常指的是一个应用程序,它可以是一个GUI应用程序、命令行工具或(其他软件程序需要的)软件库
- 软件包管理
- 底层工具:主要用来处理安装和删除软件包文件等任务,DPKG,RPM
- 上层工具:主要用于数据的搜索任务和依赖解析任务,APT,YUM,DNF
常见的软件包管理工具
- RPM (Red Hat Package Manager):为 Red hat操作系统的包管理系统
- DPKG (Debian package):为Debian 操作系统的包管理系统
Debain 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
Debain配置软件源
通常Debain系的Linux软件源配置文件:/etc/apt/sources.list
镜像地址:mirrors.aliyun.com/debian/
/dists:查看系统代号
/pool:查看软件分支
nginx安装
#更新包缓存
apt update
#安装nginx包
apt insta17 nginx
#查找nginx路径,/etc/nginx配置文件路径,/usr/sbin/nginx可执行文件
whereis nginx
#访问nginx部署的默认站点
curl http://1ocalhost: 80
#关闭ng
sudo /usr/sbin/nginx -s stop
#启动ng
sudo /usr/sbin/nginx
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 re1oad
#访问nginx部署的默认站点
curl http: //locaThost: 8080