Linux 基础
课程介绍
学习 Linux 的价值
- Linux 是现代化应用程序交付的首选平台,无论是部署在裸机、虚拟化还是容器化环境
- 公司内部服务(TCE、FaaS、SCM)统一使用 Debian Linux 系统
- 熟悉 Linux 基础指令,熟练运维前端常用服务(Nginx,Node.js)
- 加深对操作系统概念和实现的理解,夯实基础知识
课前准备
一台安装 Debian Linux 系统的计算机
计算机硬件
计算机由五大基本单元组成
- 控制器:协调和指挥计算机中各个部件进行按需作业
- 运算器:算术与逻辑运算的处理
- 存储器单元:主要分为内存和外存,磁盘光驱等都是外存
- 输入单元:比如鼠标、键盘等
- 输出单元:比如显示器、音箱等
从输入设备输入指令,经过控制器、运算器、存储器之间的处理,最终输出结果到输出设备展示给用户。
计算机操作系统
操作系统
操作系统(Operating System,OS):管理和控制计算机系统中的硬件和软件资源,用于在用户与系统硬件之间传递信息。
目前主流的系统:Mac、Linux、Windows、Android、HarmonyOS
操作系统主要提供了两个方面的能力,一个是管理计算机资源,包括处理器管理、存储管理、设备管理、文件管理等,另外一个能力是提供各种的用户接口,包括命令接口、图形用户接口、程序调用接口,实现外部程序与操作系统内核的交互。
操作系统启动流程
操作系统的启动流程分为传统模式,也就是基于 BIOS 的启动流程,另一种是当前的主流模式,就是基于 UEFI 的启动流程。不管 BIOS 或者 UEFI,其实就是一段固化在主板上的程序,计算机启动时会默认运行这段程序,然后通过这段程序去运行主板引导项。
可以将 UEFI 理解为是 BIOS 流程的升级版本,解决优化了 BIOS 启动 Bootloader 也就是操作系统引导程序,然后通过引导程序初始化操作系统。启动运行中的一些问题,比如优化了 BIOS 自检流程,然后 BIOS 启动会配合 MBR 分区,无法引导启动超过 2.2T 的磁盘。而 UEFI 启动配合 GPT 分区,支持引导超过 2.2T 的磁盘。
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 发行版本
查看 Linux 系统内核版本
# 方法1
uname -a
# 方法2
cat /proc/version
Linux xxxxx-84496b6849-7nzg6 4.14.81.bm.30-amd64 #1 SMP Debian 4.14.81.bm.30 Thu May 6 03:23:40 UTC 2021 x86_64 GNU/Linux
查看 Linux 系统版本
cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
Linux 系统应用领域
- IT 服务器(操作系统、虚拟化和云计算)
- 嵌入式和智能设备
- 个人办公桌面
- 学术研究与软件研发
Linux 系统结构
Linux 基本组成
Linux 系统一般有 4 个主要部分
- 内核
- shell
- 文件系统
- 应用程序
Linux 体系结构
- 内核是硬件与软件之间的中间层
- 内核是一个资源管理程序
- 内核提供一组面向系统的命令
内核漫画
进程管理
- 进程是正在执行的一个程序或命令
- 进程有自己的地址空间,占用一定的系统资源
- 一个 CPU 核同一时间只能运行一个进程
- 进程由它的进程 ID (PID)和它父进程的进程ID (PPID)唯一识别
查看进程信息
# 查看启动的nginx进程
ps -ef grep nginx
root 93824 1 0 16:42 ? 00:00:00 nginx: master process /user/sbin/nginx
# 查看某个进程
top -p 93824
PID USER PR NI VIRT RES SHR S %CPU %MEN TIME+ COMMAND
1 root 20 0 32632 5248 4572 S 0.0 0.0 0:00.02 nginx
# 关闭指定的进程
kill 93824
# 全部进程动态实时视图
top
进程调度
进程调度是指操作系统按某种策略或规则选择进程占用 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 调度和进程切换,上下文也会出现切换情况。
进程的系统调用
-
内核空间(Kernal Space):系统内核运行的空间
-
用户空间(User Space):应用程序运行的空间
当进程运行在内核空间时就处于内核态,而进程运行在用户空间时则处于用户态。
文件系统
文件系统负责管理持久化数据的子系统,负责把用户的文件存到磁盘硬件中。
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:poc是 Processes(进程)的缩写,/proc是一种伪文件系统(即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们门可以通过直接访问这个目录来获取系统信息。/root:该目录为系统管理员,也称作超级权限者的用户主目录。/sbin:s 就是 Super User 的意思,是 Superuser Binaries(超级用户的二进制文件)的缩写,这里存放的是系统管理员使用的系统管理程序。/usr:usr 是 unix shared resources(共享资源)的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的program files 目录。
虚拟文件系统(VFS)
- 对应用层提供一个标准的文件操作接口
- 对文件系统提供一个标准的文件接入接口
查看文件系统类型
# df命令报告文件系统磁盘空间利用率
df -T
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 ext4 19G 12G 6.3G 65% /
tmpfs tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 ext4 190M 65M 116M 36% /boot
# mount命令是挂载文件系统用的,不带任何参数运行,会打印包含文件系统类型在内的磁盘分区的信息
mount
/dev/sda2 on /type ext4 (rw)
proc on /proc type proc (rw)
文件基本操作
# 查看文件夹下的内容
ls
# 创建文件夹
mkdir demo
# 移动demo文件夹到/home
mv demo /home
# 删除demo文件夹
rm -r demo
# 创建空文件
touch file.txt
# 复制文件
cp file.txt file_bak.txt
文件读取流程
用户权限
用户账户
- 用户账户
- 普通用户账户:在系统中进行普通作业
- 超级用户账户:在系统中对普通用户和整个系统进行管理
- 用户组
- 标准组:可以容纳多个用户
- 私有组:只用用户自己
文件权限
文件权限关于用户有三个概念:
所有者:文件的所有者
所在组:文件的所有者所在的组
其他人:除文件所有者及所在组外的其他人
每个用户对于文件都有不同权限,包括读(R)、写(W)、执行(X)
查看用户信息
# 查看当前登录用户信息
w
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
xxxx pts/0 fdbd:ff1:ce00:11 14:57 2.00s 0.11s 0.00s w
# 查看当前用户所属的组
groups
xxxx tiger admin
# 查看用户的uid信息
id xxxx
uid=1001(xxxx) gid=1001(xxxx) groups=1001(xxxx),1000(tiger),2001(admin)
用户权限操作
# 在根目录创建一个文件夹,查看当前用户拥有文件夹的权限
cd / && mkdir demo && ls -ld demo
drwxr-xr-x 2 root root 4096 Nov 28 15:55 demo
# 创建一个用户,并赋予可写操作
sudo useradd ceshi
# 设置用户密码
sudo passwd ceshi
# 切换ceshi用户
su ceshi
# 进入demo文件夹
cd demo
# 创建index.js,提示无权限,需要给ceshi用户demo文件夹的权限
touch index.js
# demo文件夹写权限赋予其他人
sudo chmod o+r ./demo
# 切换ceshi用户登录
su ceshi
# 进入demo文件夹
cd demo
# 创建index.js文件成功
touch index.js
Linux 系统软件包管理器
软件包
软件包:通常指的是一个应用程序,它可以是一个 GUI 应用程序、命令行工具或(其他软件程序需要的)软件库。
软件包管理
- 底层工具:主要用来处理安装和删除软件包文件等任务,DPKG,RPM
- 上层工具:主要用于数据的搜索任务和依赖解析任务,APT,YUM,DNF
yum 可以自动下载并安装所有需要的依赖项,但 rpm 会告诉你安装一个依赖项列表,然后必须手动安装。
软件包管理工具
- PRM (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 |
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
deb http://mirrors.aliyun.com/debian buster main contrib non-free
# 二进制可执行软件源:deb
# 镜像地址:http://mirrors.aliyun.com/debian
# /dists:查看系统代号
# /pool:查看软件分支
# 系统代号/水平划分:buster
# 软件分支/垂直划分:main contrib non-free
nginx 安装
# 更新包缓存
apt update
# 安装nginx包
apt install nginx
# 查找nginx路径,/etc/nginx配置文件路径,/usr/sbin/nginx可执行文件
whereis nginx
# 访问nginx部署的默认站点
curl http://localhost:80
# 关闭nginx
sudo /usr/sbin/nginx -s stop
# 启动nginx
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 reload
# 访问nginx部署的默认站点
curl http://localhost:8080