「 Linux 基础 | 青训营笔记 」

166 阅读11分钟

Linux 基础

logo.jpg

课程介绍

学习 Linux 的价值

  • Linux 是现代化应用程序交付的首选平台,无论是部署在裸机、虚拟化还是容器化环境
  • 公司内部服务(TCE、FaaS、SCM)统一使用 Debian Linux 系统
  • 熟悉 Linux 基础指令,熟练运维前端常用服务(Nginx,Node.js)
  • 加深对操作系统概念和实现的理解,夯实基础知识

课前准备

一台安装 Debian Linux 系统的计算机

计算机硬件

计算机由五大基本单元组成

  • 控制器:协调和指挥计算机中各个部件进行按需作业
  • 运算器:算术与逻辑运算的处理
  • 存储器单元:主要分为内存和外存,磁盘光驱等都是外存
  • 输入单元:比如鼠标、键盘等
  • 输出单元:比如显示器、音箱等

从输入设备输入指令,经过控制器、运算器、存储器之间的处理,最终输出结果到输出设备展示给用户。

image (18).png

计算机操作系统

操作系统

操作系统(Operating System,OS):管理和控制计算机系统中的硬件和软件资源,用于在用户与系统硬件之间传递信息。

目前主流的系统:Mac、Linux、Windows、Android、HarmonyOS

操作系统主要提供了两个方面的能力,一个是管理计算机资源,包括处理器管理、存储管理、设备管理、文件管理等,另外一个能力是提供各种的用户接口,包括命令接口、图形用户接口、程序调用接口,实现外部程序与操作系统内核的交互。

操作系统.png

操作系统启动流程

操作系统启动流程.png

操作系统的启动流程分为传统模式,也就是基于 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版本.png

查看 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基本组成.png

Linux 体系结构

  • 内核是硬件与软件之间的中间层
  • 内核是一个资源管理程序
  • 内核提供一组面向系统的命令

 Linux体系结构.png

内核漫画

image (23).png

进程管理

  • 进程是正在执行的一个程序或命令
  • 进程有自己的地址空间,占用一定的系统资源
  • 一个 CPU 核同一时间只能运行一个进程
  • 进程由它的进程 ID (PID)和它父进程的进程ID (PPID)唯一识别

image (24).png

查看进程信息

# 查看启动的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 进行运行的过程。

进程调度.png

  • 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):应用程序运行的空间

当进程运行在内核空间时就处于内核态,而进程运行在用户空间时则处于用户态。

进程的系统调用.png

文件系统

文件系统负责管理持久化数据的子系统,负责把用户的文件存到磁盘硬件中。

Linux文件.png

Linux 文件系统是采用树状的目录结构,最上层是/(根)目录。

Linux文件系统的目录结构.png

  • /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)

  • 对应用层提供一个标准的文件操作接口
  • 对文件系统提供一个标准的文件接入接口

虚拟文件系统.png

查看文件系统类型

# 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

文件读取流程

文件读取流程.png

用户权限

用户账户

  • 用户账户
    • 普通用户账户:在系统中进行普通作业
    • 超级用户账户:在系统中对普通用户和整个系统进行管理
  • 用户组
    • 标准组:可以容纳多个用户
    • 私有组:只用用户自己

文件权限

文件权限关于用户有三个概念:

所有者:文件的所有者

所在组:文件的所有者所在的组

其他人:除文件所有者及所在组外的其他人

每个用户对于文件都有不同权限,包括读(R)、写(W)、执行(X)

文件权限.png

查看用户信息

# 查看当前登录用户信息
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.debdpkgapt,apt-get
Ubuntu.debdpkgapt,apt-get
CentOS.rpmrpmyum
Fedora.rpmrpmdnf
openSUSE.rpmrpmzypper

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