优化linux 文档
This commit is contained in:
parent
9fd3bb7871
commit
da16bc3b15
@ -1 +0,0 @@
|
|||||||

|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 323 KiB |
BIN
images/.DS_Store
vendored
Normal file
BIN
images/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
开发/.DS_Store
vendored
BIN
开发/.DS_Store
vendored
Binary file not shown.
BIN
开发/后端/.DS_Store
vendored
BIN
开发/后端/.DS_Store
vendored
Binary file not shown.
BIN
开发/后端/Go/.DS_Store
vendored
BIN
开发/后端/Go/.DS_Store
vendored
Binary file not shown.
BIN
开发/后端/Go/课程/.DS_Store
vendored
Normal file
BIN
开发/后端/Go/课程/.DS_Store
vendored
Normal file
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 187 KiB |
@ -1,14 +0,0 @@
|
|||||||

|
|
||||||
|
|
||||||
# 部署清单
|
|
||||||
|
|
||||||
1、tke服务器
|
|
||||||
|
|
||||||
| 服务 | 要求 | 状态 |
|
|
||||||
| ---------- | ---------------- | -------------------- |
|
|
||||||
| jumpserver | 自动化注册服务器 | 已完成部署,未自动化 |
|
|
||||||
| grafana | 对接prometheus | 未完成 |
|
|
||||||
| prometheus | 自动化注册 | 未完成 |
|
|
||||||
| argocd | 对接gitea | 未完成 |
|
|
||||||
|
|
||||||
2、个人服务器
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
配置清单:
|
|
||||||
|
|
||||||
机箱:
|
|
||||||
|
|
||||||
主板:
|
|
||||||
|
|
||||||
CPU:
|
|
||||||
|
|
||||||
内存:
|
|
||||||
|
|
||||||
固态硬盘:
|
|
||||||
|
|
||||||
机械硬盘:
|
|
||||||
|
|
||||||
电源:
|
|
||||||
BIN
网络/.DS_Store
vendored
Normal file
BIN
网络/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
网络/华为材料/HCIA-Datacom V1.0 培训教材.pdf
Normal file
BIN
网络/华为材料/HCIA-Datacom V1.0 培训教材.pdf
Normal file
Binary file not shown.
BIN
运维/.DS_Store
vendored
BIN
运维/.DS_Store
vendored
Binary file not shown.
BIN
运维/云/.DS_Store
vendored
Normal file
BIN
运维/云/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
运维/操作系统/Linux/.DS_Store
vendored
BIN
运维/操作系统/Linux/.DS_Store
vendored
Binary file not shown.
@ -1,38 +1,157 @@
|
|||||||
当前计算机采用二进制,基本单位为bit(位),byte(字节)1byte=8bit
|
计算机底层使用二进制来表示和处理数据。最基本的单位是 bit(位),8 个 bit 组成 1 个 Byte(字节)。
|
||||||
## 1、十进制和二进制转换
|
|
||||||
`bc`命令,也可以做一些计算
|
## 1、常见数据单位
|
||||||
参数: 一定要先输入obase
|
|
||||||
|
- bit:位,二进制中的一位,只能表示 0 或 1
|
||||||
|
- Byte:字节,1 Byte = 8 bit
|
||||||
|
- KB、MB、GB:常见存储单位,通常按 1024 进制换算
|
||||||
|
|
||||||
|
## 2、常见进制
|
||||||
|
|
||||||
|
计算机相关场景中,常见的进制有以下几种:
|
||||||
|
|
||||||
|
- 二进制:逢 2 进 1,只包含 0 和 1
|
||||||
|
- 八进制:逢 8 进 1,包含 0 到 7
|
||||||
|
- 十进制:逢 10 进 1,包含 0 到 9
|
||||||
|
- 十六进制:逢 16 进 1,包含 0 到 9 和 A 到 F
|
||||||
|
|
||||||
|
之所以经常提到二进制,是因为电路天然适合表示高低电平,而 0 和 1 正好对应这种状态。
|
||||||
|
|
||||||
|
## 3、进制转换
|
||||||
|
|
||||||
|
在 Linux 中可以使用 `bc` 命令做进制转换和数学计算。
|
||||||
|
|
||||||
|
### 3.1 `bc` 中常用参数
|
||||||
|
|
||||||
|
- `ibase`:输入数字的进制
|
||||||
|
- `obase`:输出结果的进制
|
||||||
|
|
||||||
|
一般建议**先设置 `obase`,再设置 `ibase`**。
|
||||||
|
因为设置 `ibase` 之后,后面输入的数字会按照新的输入进制解释,如果顺序写反,容易得到错误结果。
|
||||||
|
|
||||||
|
### 3.2 十进制转二进制
|
||||||
|
|
||||||
- obase=10 转化为十进制
|
|
||||||
- ibase=2 将二进制
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]#bc #进入交互模式
|
[root@tencentos ~]# bc
|
||||||
obase=2
|
obase=2
|
||||||
ibase=10
|
ibase=10
|
||||||
100033333 #输入
|
10
|
||||||
101111101100110001100110101 #结果
|
1010
|
||||||
```
|
```
|
||||||
```shell
|
|
||||||
echo "obase=2;ibase=8;777664" | bc #输入
|
|
||||||
111111111110110100 #结果
|
|
||||||
```
|
|
||||||
```shell
|
|
||||||
echo "2^10" | bc #计算2的10次方
|
|
||||||
1024 #结果
|
|
||||||
```
|
|
||||||
## 2、系统位数
|
|
||||||
操作系统目前有32位和64位组成,主要是指计算机中的中央处理器(CPU)在处理数据和内存地址时的最大宽度。这个宽度决定了CPU一次可以处理的数据量和它可以访问的内存大小。
|
|
||||||
|
|
||||||
1. 数据处理能力:64位系统可以一次性处理更多的数据。对于需要处理大量数据的应用(如图形处理、科学计算等),64位系统通常可以提供更好的性能。
|
表示把十进制的 `10` 转换成二进制,结果是 `1010`。
|
||||||
2. 内存寻址能力:32位系统最多只能支持4GB的内存(理论上是4GB,但实际上由于各种硬件和系统的限制,可用的内存通常会少于这个数值)。而64位系统可以支持的内存大小远超过4GB,理论上可以达到18.4亿GB。这使得64位系统可以运行那些需要大量内存的应用。
|
|
||||||
3. 兼容性:64位操作系统通常可以运行为32位系统编写的软件,但反过来则不行。也就是说,如果你有一些只能在32位系统上运行的老旧软件,那么你可能需要继续使用32位系统。
|
### 3.3 二进制转十进制
|
||||||
|
|
||||||
|
```shell
|
||||||
|
[root@tencentos ~]# bc
|
||||||
|
obase=10
|
||||||
|
ibase=2
|
||||||
|
1010
|
||||||
|
10
|
||||||
|
```
|
||||||
|
|
||||||
|
表示把二进制的 `1010` 转换成十进制,结果是 `10`。
|
||||||
|
|
||||||
|
### 3.4 八进制转二进制
|
||||||
|
|
||||||
|
```shell
|
||||||
|
echo "obase=2;ibase=8;17" | bc
|
||||||
|
1111
|
||||||
|
```
|
||||||
|
|
||||||
|
八进制 `17` 转为二进制后是 `1111`。
|
||||||
|
|
||||||
|
### 3.5 计算幂
|
||||||
|
|
||||||
|
```shell
|
||||||
|
echo "2^10" | bc
|
||||||
|
1024
|
||||||
|
```
|
||||||
|
|
||||||
|
这个例子常用于理解存储单位和位数相关计算。
|
||||||
|
|
||||||
|
## 4、什么是 32 位和 64 位
|
||||||
|
|
||||||
|
平时说的 32 位、64 位,通常和以下几个概念有关:
|
||||||
|
|
||||||
|
- CPU 架构位宽
|
||||||
|
- 操作系统位数
|
||||||
|
- 应用程序位数
|
||||||
|
|
||||||
|
它们彼此相关,但**不是完全等价**的概念。
|
||||||
|
|
||||||
|
### 4.1 CPU 位宽
|
||||||
|
|
||||||
|
CPU 位宽通常表示 CPU 一次处理数据的能力,以及它在地址计算上的能力范围。常见的是 32 位和 64 位。
|
||||||
|
|
||||||
|
### 4.2 操作系统位数
|
||||||
|
|
||||||
|
操作系统位数表示当前安装的系统是 32 位还是 64 位。一般来说:
|
||||||
|
|
||||||
|
- 64 位 CPU 可以安装 32 位或 64 位操作系统
|
||||||
|
- 32 位 CPU 通常只能安装 32 位操作系统
|
||||||
|
|
||||||
|
### 4.3 应用程序位数
|
||||||
|
|
||||||
|
在 64 位操作系统上,很多情况下可以运行 32 位应用程序;但在 32 位操作系统上,通常不能运行 64 位应用程序。
|
||||||
|
|
||||||
|
## 5、32 位和 64 位的主要区别
|
||||||
|
|
||||||
|
### 5.1 数据处理能力
|
||||||
|
|
||||||
|
64 位系统一次可以处理更宽的数据,在大数据计算、图形处理、科学计算等场景下通常更有优势。
|
||||||
|
|
||||||
|
### 5.2 内存寻址能力
|
||||||
|
|
||||||
|
32 位系统理论上最多可寻址 \(2^{32}\) 个地址,也就是约 4 GB 内存空间。
|
||||||
|
|
||||||
|
64 位系统的理论寻址范围远大于 32 位系统,能够支持更大的内存空间。不过实际可用内存还会受到硬件、内核和操作系统版本的限制。
|
||||||
|
|
||||||
|
### 5.3 软件兼容性
|
||||||
|
|
||||||
|
- 64 位操作系统通常兼容很多 32 位程序
|
||||||
|
- 32 位操作系统一般不能运行 64 位程序
|
||||||
|
|
||||||
|
## 6、如何查看系统位数
|
||||||
|
|
||||||
|
### 6.1 使用 `arch`
|
||||||
|
|
||||||
**确认操作系统位数**
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# arch
|
[root@tencentos ~]# arch
|
||||||
x86_64
|
x86_64
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`x86_64` 表示当前机器架构是 64 位架构。
|
||||||
|
|
||||||
|
### 6.2 使用 `uname -m`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
[root@tencentos ~]# uname -m
|
||||||
|
x86_64
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令也是查看机器架构时非常常用的方法。
|
||||||
|
|
||||||
|
### 6.3 使用 `getconf LONG_BIT`
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# getconf LONG_BIT
|
[root@tencentos ~]# getconf LONG_BIT
|
||||||
64
|
64
|
||||||
```
|
```
|
||||||
|
|
||||||
|
这个命令更直观,可以直接看到当前用户空间是 32 位还是 64 位。
|
||||||
|
|
||||||
|
## 7、常见误区
|
||||||
|
|
||||||
|
- `arch` 显示 `x86_64`,更准确地说是**机器架构为 64 位**,不一定能单独代表所有应用程序都是 64 位
|
||||||
|
- 64 位系统不一定“绝对更快”,性能还和 CPU、内存、程序本身的实现有关
|
||||||
|
- 32 位系统理论可寻址 4 GB,但实际可用内存通常会更少
|
||||||
|
|
||||||
|
## 8、小结
|
||||||
|
|
||||||
|
- 计算机底层使用二进制处理数据
|
||||||
|
- `bit` 是最小单位,`1 Byte = 8 bit`
|
||||||
|
- `bc` 可以完成常见进制转换和数学计算
|
||||||
|
- 32 位和 64 位需要区分 CPU、操作系统、应用程序三个层面
|
||||||
|
- 查看系统位数时,`arch`、`uname -m`、`getconf LONG_BIT` 都很常用
|
||||||
|
|||||||
@ -1,27 +1,167 @@
|
|||||||
## 1、文本编辑器
|
## 1、文本查看概览
|
||||||
全屏编辑器:nano
|
|
||||||
图形化工具:vi、vim
|
|
||||||
|
|
||||||
## 2、文本查看器
|
Linux 中查看文本内容时,常用命令包括:
|
||||||
##### 2.1 cat
|
|
||||||
-E:输出行结束符
|
|
||||||
-A:显示所有控制符
|
|
||||||
-n:显示编号
|
|
||||||
-b:非空行编号
|
|
||||||
-s:连续空行压缩成1行
|
|
||||||
|
|
||||||
##### 2.2 tac(从后向前显示文本)
|
- `cat`:快速输出全文
|
||||||
|
- `tac`:倒序显示文本
|
||||||
|
- `more`:分页查看
|
||||||
|
- `head`:查看开头部分
|
||||||
|
- `tail`:查看结尾部分或持续追踪
|
||||||
|
- `hexdump`:查看二进制或非文本文件内容
|
||||||
|
|
||||||
##### 2.3 more(分页显示)
|
根据文件大小和使用场景不同,应选择不同工具。
|
||||||
空格:下翻
|
|
||||||
b:上翻
|
|
||||||
|
|
||||||
##### 2.4 head(显示文本前面或者后面的行内容)
|
## 2、`cat`
|
||||||
-c:获取前x字节
|
|
||||||
-n:获取前x行,如果为负数,则取倒数第几行
|
|
||||||
|
|
||||||
##### 2.5 tail(查看文本倒数几行的内容)
|
`cat` 适合查看**较小文本文件**,也常用于拼接文件内容输出到标准输出。
|
||||||
-n x:置顶获取后x行
|
|
||||||
-f:追踪
|
|
||||||
|
|
||||||
##### 2.6 hexdump 查看非文本文件内容
|
### 2.1 常见选项
|
||||||
|
|
||||||
|
- `-E`:显示行尾结束符 `$`
|
||||||
|
- `-A`:显示所有控制字符
|
||||||
|
- `-n`:为所有行编号
|
||||||
|
- `-b`:只给非空行编号
|
||||||
|
- `-s`:将连续空行压缩为一行
|
||||||
|
|
||||||
|
### 2.2 示例
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cat -n /etc/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3、`tac`
|
||||||
|
|
||||||
|
`tac` 是 `cat` 反过来,从最后一行开始向前显示。
|
||||||
|
|
||||||
|
### 3.1 使用场景
|
||||||
|
|
||||||
|
- 倒序查看日志
|
||||||
|
- 想先看文件最后出现的内容时
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
tac access.log
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4、`more`
|
||||||
|
|
||||||
|
`more` 用于分页查看文本,适合中等大小的文件。
|
||||||
|
|
||||||
|
### 4.1 常用操作
|
||||||
|
|
||||||
|
- 空格:向下翻一页
|
||||||
|
- `Enter`:向下翻一行
|
||||||
|
- `b`:向上翻一页
|
||||||
|
- `q`:退出
|
||||||
|
|
||||||
|
### 4.2 使用场景
|
||||||
|
|
||||||
|
- 临时查看长文本
|
||||||
|
- 简单分页阅读
|
||||||
|
|
||||||
|
如果需要更强交互能力,通常更推荐 `less`。
|
||||||
|
|
||||||
|
## 5、`head`
|
||||||
|
|
||||||
|
`head` 默认显示文件前 10 行。
|
||||||
|
|
||||||
|
### 5.1 常见选项
|
||||||
|
|
||||||
|
- `-n`:指定显示前几行
|
||||||
|
- `-c`:指定显示前几个字节
|
||||||
|
|
||||||
|
### 5.2 示例
|
||||||
|
|
||||||
|
```shell
|
||||||
|
head -n 20 /var/log/messages
|
||||||
|
```
|
||||||
|
|
||||||
|
```shell
|
||||||
|
head -c 100 file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6、`tail`
|
||||||
|
|
||||||
|
`tail` 默认显示文件最后 10 行。
|
||||||
|
|
||||||
|
### 6.1 常见选项
|
||||||
|
|
||||||
|
- `-n`:指定显示后几行
|
||||||
|
- `-f`:持续追踪文件追加内容
|
||||||
|
|
||||||
|
### 6.2 示例
|
||||||
|
|
||||||
|
```shell
|
||||||
|
tail -n 50 /var/log/messages
|
||||||
|
```
|
||||||
|
|
||||||
|
```shell
|
||||||
|
tail -f /var/log/messages
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.3 使用场景
|
||||||
|
|
||||||
|
- 查看日志最新内容
|
||||||
|
- 实时追踪日志输出
|
||||||
|
|
||||||
|
## 7、`hexdump`
|
||||||
|
|
||||||
|
`hexdump` 常用于查看二进制文件、不可见字符或非纯文本内容。
|
||||||
|
|
||||||
|
### 7.1 使用场景
|
||||||
|
|
||||||
|
- 检查文件头
|
||||||
|
- 分析乱码或编码问题
|
||||||
|
- 查看二进制数据的十六进制表示
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
hexdump -C file.bin | head
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8、常见使用建议
|
||||||
|
|
||||||
|
### 8.1 小文件
|
||||||
|
|
||||||
|
优先用:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cat
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.2 大文件
|
||||||
|
|
||||||
|
优先用:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
more
|
||||||
|
head
|
||||||
|
tail
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.3 日志文件
|
||||||
|
|
||||||
|
优先用:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
tail -f
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.4 非文本文件
|
||||||
|
|
||||||
|
优先用:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
hexdump -C
|
||||||
|
```
|
||||||
|
|
||||||
|
## 9、小结
|
||||||
|
|
||||||
|
- `cat` 适合快速查看小文件
|
||||||
|
- `tac` 用于倒序显示文本
|
||||||
|
- `more` 用于分页阅读
|
||||||
|
- `head` 和 `tail` 分别查看开头和结尾
|
||||||
|
- `tail -f` 是日志排查高频命令
|
||||||
|
- `hexdump` 适合查看二进制或不可见字符内容
|
||||||
|
|||||||
@ -1,23 +1,130 @@
|
|||||||
##### 1、wc(文本数据统计)
|
## 1、文本分析概览
|
||||||
-l:只统计行数
|
|
||||||
-w:只统计单词数
|
|
||||||
|
|
||||||
##### 2、sort(文本排序,仅输出到STDOUT)
|
Linux 中很多日志分析和数据整理工作,都依赖文本分析命令。常见工具包括:
|
||||||
-R:随机排序
|
|
||||||
-n:按数字大小整理
|
- `wc`:统计文本信息
|
||||||
-h:按人类可读排序
|
- `sort`:排序
|
||||||
-u:合并重复项
|
- `uniq`:去重或统计重复次数
|
||||||
|
- `cut`:按列提取内容
|
||||||
|
|
||||||
|
它们经常和管道一起使用,是文本处理的基础组合。
|
||||||
|
|
||||||
|
## 2、`wc`
|
||||||
|
|
||||||
|
`wc` 用于统计文本的行数、单词数、字节数等。
|
||||||
|
|
||||||
|
### 2.1 常见选项
|
||||||
|
|
||||||
|
- `-l`:统计行数
|
||||||
|
- `-w`:统计单词数
|
||||||
|
- `-c`:统计字节数
|
||||||
|
|
||||||
|
### 2.2 示例
|
||||||
|
|
||||||
##### 3、uniq(文本去重)
|
|
||||||
-c:显示每行重复次数
|
|
||||||
-d:仅显示重复的行
|
|
||||||
-u:仅显示不重复的行
|
|
||||||
范例:统计日志访问量最多的请求
|
|
||||||
```shell
|
```shell
|
||||||
cut -d" " access_log | sort | uniq -c | sort -nr | head -3
|
wc -l access.log
|
||||||
```
|
```
|
||||||
|
|
||||||
##### 4、cut(按列抽取文本)
|
用于统计文件共有多少行。
|
||||||
-d:指定分隔符
|
|
||||||
-c:按字符分隔
|
## 3、`sort`
|
||||||
-f:取第几列,1-6或1,3,5
|
|
||||||
|
`sort` 用于对文本内容进行排序,默认输出到标准输出,不会直接修改原文件。
|
||||||
|
|
||||||
|
### 3.1 常见选项
|
||||||
|
|
||||||
|
- `-R`:随机排序
|
||||||
|
- `-n`:按数值大小排序
|
||||||
|
- `-h`:按人类可读格式排序,例如 `1K`、`2M`
|
||||||
|
- `-u`:排序后去重
|
||||||
|
- `-r`:逆序排序
|
||||||
|
|
||||||
|
### 3.2 示例
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sort -n scores.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sort -h disk_usage.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4、`uniq`
|
||||||
|
|
||||||
|
`uniq` 用于去除**相邻重复行**,因此通常会先配合 `sort` 使用。
|
||||||
|
|
||||||
|
### 4.1 常见选项
|
||||||
|
|
||||||
|
- `-c`:统计每行重复次数
|
||||||
|
- `-d`:只显示重复行
|
||||||
|
- `-u`:只显示不重复行
|
||||||
|
|
||||||
|
### 4.2 示例
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sort access.log | uniq -c | sort -nr | head
|
||||||
|
```
|
||||||
|
|
||||||
|
这个组合常用于统计高频内容。
|
||||||
|
|
||||||
|
## 5、`cut`
|
||||||
|
|
||||||
|
`cut` 用于按列或按字符位置提取文本。
|
||||||
|
|
||||||
|
### 5.1 常见选项
|
||||||
|
|
||||||
|
- `-d`:指定分隔符
|
||||||
|
- `-c`:按字符位置提取
|
||||||
|
- `-f`:按字段提取
|
||||||
|
|
||||||
|
### 5.2 示例
|
||||||
|
|
||||||
|
按冒号分隔提取 `/etc/passwd` 的第一列和第三列:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cut -d: -f1,3 /etc/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6、常见组合用法
|
||||||
|
|
||||||
|
### 6.1 统计访问次数最多的请求来源
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cut -d" " -f1 access_log | sort | uniq -c | sort -nr | head -3
|
||||||
|
```
|
||||||
|
|
||||||
|
这条命令的思路是:
|
||||||
|
|
||||||
|
- 用 `cut` 取出第一列
|
||||||
|
- 用 `sort` 排序
|
||||||
|
- 用 `uniq -c` 统计重复次数
|
||||||
|
- 再按数字逆序排序
|
||||||
|
- 用 `head` 取前 3 条
|
||||||
|
|
||||||
|
### 6.2 统计某个文件有多少行
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wc -l file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.3 查看唯一用户列表
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cut -d: -f1 /etc/passwd | sort -u
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7、实战建议
|
||||||
|
|
||||||
|
- 只做统计:优先考虑 `wc`
|
||||||
|
- 只做排序:优先考虑 `sort`
|
||||||
|
- 去重或重复次数统计:优先考虑 `sort | uniq`
|
||||||
|
- 按列提取:优先考虑 `cut`
|
||||||
|
- 一旦涉及多步分析,优先用管道把几个命令串起来
|
||||||
|
|
||||||
|
## 8、小结
|
||||||
|
|
||||||
|
- `wc` 用于统计
|
||||||
|
- `sort` 用于排序
|
||||||
|
- `uniq` 用于去重和统计重复行
|
||||||
|
- `cut` 用于按列抽取文本
|
||||||
|
- 这几个命令经常组合使用,是日志分析和文本整理的基础工具
|
||||||
|
|||||||
@ -1,35 +1,179 @@
|
|||||||
## 1、命令模式玩法
|
## 1、Vim 概览
|
||||||
- r filename:读文件内容到当前文件中
|
|
||||||
- w filename:另存文件到另外一个文件中
|
|
||||||
- !command:执行命令
|
|
||||||
- r!command:读入命令的输入
|
|
||||||
- d:删除
|
|
||||||
- y:复制
|
|
||||||
- p:粘贴
|
|
||||||
- u:撤回
|
|
||||||
- U:反撤回
|
|
||||||
- set nu:设置行号
|
|
||||||
- set ic:忽略大小写
|
|
||||||
- set noic:认定大小写
|
|
||||||
- set ai:自动缩进
|
|
||||||
- set noai:取消自动缩进
|
|
||||||
- set list:显示换行符
|
|
||||||
- set nolist:不显示换行符
|
|
||||||
- set key=passwd:加密
|
|
||||||
- set key=:禁用加密
|
|
||||||
|
|
||||||
##### 1.1 查找并替换
|
Vim 是 Linux 中最常见的文本编辑器之一,特点是:
|
||||||
**查找:**
|
|
||||||
`/文件`
|
|
||||||
|
|
||||||
- n:向下
|
- 几乎所有 Linux 环境都能遇到
|
||||||
- N:向上
|
- 适合终端内快速编辑文件
|
||||||
|
- 对运维排障、改配置、写脚本都很常用
|
||||||
|
|
||||||
**替换格式:**
|
学习 Vim 的关键,不是死记命令,而是先理解它的**模式切换**。
|
||||||
`s/要查的内容/替换的内容/修饰符`
|
|
||||||
**修饰符:**
|
|
||||||
|
|
||||||
- i:忽略大小写
|
## 2、Vim 的常见模式
|
||||||
- g:全局替换
|
|
||||||
- gc:全局替换,每次替换前询问
|
|
||||||
|
|
||||||
|
### 2.1 普通模式
|
||||||
|
|
||||||
|
打开 Vim 后默认进入普通模式,用于:
|
||||||
|
|
||||||
|
- 移动光标
|
||||||
|
- 删除、复制、粘贴
|
||||||
|
- 查找
|
||||||
|
- 执行命令
|
||||||
|
|
||||||
|
### 2.2 插入模式
|
||||||
|
|
||||||
|
用于输入和编辑文本。
|
||||||
|
|
||||||
|
常见进入方式:
|
||||||
|
|
||||||
|
- `i`:在当前位置前插入
|
||||||
|
- `a`:在当前位置后插入
|
||||||
|
- `o`:在下一行插入
|
||||||
|
|
||||||
|
按 `Esc` 可以回到普通模式。
|
||||||
|
|
||||||
|
### 2.3 命令行模式
|
||||||
|
|
||||||
|
在普通模式下输入 `:` 进入,用于:
|
||||||
|
|
||||||
|
- 保存
|
||||||
|
- 退出
|
||||||
|
- 查找替换
|
||||||
|
- 设置选项
|
||||||
|
- 执行外部命令
|
||||||
|
|
||||||
|
## 3、常用命令操作
|
||||||
|
|
||||||
|
### 3.1 文件读写
|
||||||
|
|
||||||
|
- `:w`:保存文件
|
||||||
|
- `:q`:退出
|
||||||
|
- `:wq`:保存并退出
|
||||||
|
- `:q!`:强制退出不保存
|
||||||
|
- `:w filename`:另存为其他文件
|
||||||
|
- `:r filename`:把另一个文件内容读入当前文件
|
||||||
|
|
||||||
|
### 3.2 调用外部命令
|
||||||
|
|
||||||
|
- `:!command`:执行外部命令
|
||||||
|
- `:r !command`:读取命令输出到当前文件
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
:!ls
|
||||||
|
:r !date
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 删除、复制、粘贴
|
||||||
|
|
||||||
|
- `d`:删除
|
||||||
|
- `dd`:删除当前行
|
||||||
|
- `y`:复制
|
||||||
|
- `yy`:复制当前行
|
||||||
|
- `p`:在后面粘贴
|
||||||
|
- `P`:在前面粘贴
|
||||||
|
|
||||||
|
### 3.4 撤销与恢复
|
||||||
|
|
||||||
|
- `u`:撤销
|
||||||
|
- `Ctrl + r`:恢复撤销的内容
|
||||||
|
- `U`:某些版本中用于撤销当前行的修改,但现代 Vim 更常用 `u`
|
||||||
|
|
||||||
|
## 4、常用设置项
|
||||||
|
|
||||||
|
以下命令通常在命令行模式执行:
|
||||||
|
|
||||||
|
- `:set nu`:显示行号
|
||||||
|
- `:set nonu`:取消行号
|
||||||
|
- `:set ic`:查找时忽略大小写
|
||||||
|
- `:set noic`:查找时区分大小写
|
||||||
|
- `:set ai`:启用自动缩进
|
||||||
|
- `:set noai`:关闭自动缩进
|
||||||
|
- `:set list`:显示不可见字符
|
||||||
|
- `:set nolist`:不显示不可见字符
|
||||||
|
|
||||||
|
### 4.1 加密说明
|
||||||
|
|
||||||
|
```vim
|
||||||
|
:set key=passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
可以为文件设置编辑时的加密口令。
|
||||||
|
|
||||||
|
```vim
|
||||||
|
:set key=
|
||||||
|
```
|
||||||
|
|
||||||
|
取消口令。
|
||||||
|
|
||||||
|
不过这类方式现在并不是最常见的安全手段,实际生产中更常依赖系统权限和加密存储方案。
|
||||||
|
|
||||||
|
## 5、查找与替换
|
||||||
|
|
||||||
|
### 5.1 查找
|
||||||
|
|
||||||
|
在普通模式下输入:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
/关键字
|
||||||
|
```
|
||||||
|
|
||||||
|
然后:
|
||||||
|
|
||||||
|
- `n`:向下查找下一个
|
||||||
|
- `N`:向上查找上一个
|
||||||
|
|
||||||
|
### 5.2 替换
|
||||||
|
|
||||||
|
基本格式:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
:s/旧内容/新内容/修饰符
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.3 常见修饰符
|
||||||
|
|
||||||
|
- `i`:忽略大小写
|
||||||
|
- `g`:一行内全局替换
|
||||||
|
- `gc`:替换前逐个确认
|
||||||
|
|
||||||
|
### 5.4 示例
|
||||||
|
|
||||||
|
替换当前行第一个 `old`:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
:s/old/new/
|
||||||
|
```
|
||||||
|
|
||||||
|
替换当前行全部 `old`:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
:s/old/new/g
|
||||||
|
```
|
||||||
|
|
||||||
|
替换全文所有 `old`:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
:%s/old/new/g
|
||||||
|
```
|
||||||
|
|
||||||
|
替换全文并逐个确认:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
:%s/old/new/gc
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6、日常使用建议
|
||||||
|
|
||||||
|
- 改系统配置文件前,先备份
|
||||||
|
- 编辑大文件时优先用查找和行号定位
|
||||||
|
- 做全局替换时,尽量先用 `gc` 确认,避免误改
|
||||||
|
- 需要长期使用时,可以把常用设置写入 `~/.vimrc`
|
||||||
|
|
||||||
|
## 7、小结
|
||||||
|
|
||||||
|
- Vim 的核心是理解普通模式、插入模式和命令行模式
|
||||||
|
- `:w`、`:q`、`:wq`、`:q!` 是最常用的保存退出命令
|
||||||
|
- `dd`、`yy`、`p`、`u` 是高频编辑命令
|
||||||
|
- `/` 查找和 `:%s///g` 替换是最常用功能
|
||||||
|
- 熟练掌握 Vim 后,终端下改配置文件会高效很多
|
||||||
|
|||||||
@ -1,66 +1,254 @@
|
|||||||
## 1、文件权限管理
|
## 1、文件权限概览
|
||||||
简介:文件权限主要针对文件所属用户、用户组、其他人设置限制,从左到右进行顺序匹配一但匹配权限立即生效,不在查看右边的权限,r,w对root 无效,只要ugo任何一个有执行权限,root就可以执行
|
|
||||||
|
|
||||||
- r:readable 4,可使用文件查看类工具,如cat
|
Linux 文件权限控制的核心对象有三类:
|
||||||
- w:writable 2,可以修改内容
|
|
||||||
- x:excutable 1,可以把此文件提请内核启动为一个进程,及运行此文件
|
|
||||||
|
|
||||||
- u:属主
|
- `u`:属主(user)
|
||||||
- g:属组
|
- `g`:属组(group)
|
||||||
- o:其他人
|
- `o`:其他用户(others)
|
||||||
|
|
||||||
## 2、目录权限
|
对应的基本权限有三种:
|
||||||
|
|
||||||
- r:可以使用ls查看此目录中文件名列表,但是无法看到文件的属性信息,不能查看文件的内容
|
- `r`:读,值为 4
|
||||||
- w:可以在目录中创建文件,也可以删除目录中的文件
|
- `w`:写,值为 2
|
||||||
- x:可以cd进此目录,可以查看文件的元数据
|
- `x`:执行,值为 1
|
||||||
|
|
||||||
|
权限控制是 Linux 安全模型的基础之一,和文件访问、脚本执行、目录操作都直接相关。
|
||||||
|
|
||||||
|
## 2、文件权限与目录权限的区别
|
||||||
|
|
||||||
|
### 2.1 文件权限
|
||||||
|
|
||||||
|
对**普通文件**来说:
|
||||||
|
|
||||||
|
- `r`:可以读取文件内容
|
||||||
|
- `w`:可以修改文件内容
|
||||||
|
- `x`:可以把该文件作为程序执行
|
||||||
|
|
||||||
|
### 2.2 目录权限
|
||||||
|
|
||||||
|
对**目录**来说,权限含义和普通文件不完全一样:
|
||||||
|
|
||||||
|
- `r`:可以查看目录中的文件名列表
|
||||||
|
- `w`:可以在目录中创建、删除、重命名文件
|
||||||
|
- `x`:可以进入目录,也可以访问目录项的元数据
|
||||||
|
|
||||||
|
目录权限是很多初学者最容易搞混的地方。
|
||||||
|
|
||||||
|
## 3、`ls -l` 权限格式
|
||||||
|
|
||||||
##### 2.1 文件权限格式(ls -l)
|
|
||||||
```shell
|
```shell
|
||||||
root@lzc:/var/log# ls -l
|
root@lzc:/var/log# ls -l
|
||||||
-rw-r--r-- 1 root root 0 Dec 5 00:00 alternatives.log
|
-rw-r--r-- 1 root root 0 Dec 5 00:00 alternatives.log
|
||||||
|
|
||||||
-rw-r--r--:权限:属主、属组、其他
|
|
||||||
1:连接数
|
|
||||||
root:属主
|
|
||||||
root:属组
|
|
||||||
0:大小
|
|
||||||
Dec 5 00:00:创建时间
|
|
||||||
alternatives.log:文件名
|
|
||||||
```
|
```
|
||||||
|
|
||||||
##### 2.2 chown修改文件所有者
|
这一行的主要含义:
|
||||||
|
|
||||||
|
- `-`:文件类型,表示普通文件
|
||||||
|
- `rw-`:属主权限
|
||||||
|
- `r--`:属组权限
|
||||||
|
- `r--`:其他用户权限
|
||||||
|
- `1`:硬链接数
|
||||||
|
- `root`:属主
|
||||||
|
- `root`:属组
|
||||||
|
- `0`:文件大小
|
||||||
|
- `Dec 5 00:00`:最近修改时间
|
||||||
|
- `alternatives.log`:文件名
|
||||||
|
|
||||||
|
## 4、修改属主和属组
|
||||||
|
|
||||||
|
### 4.1 `chown`
|
||||||
|
|
||||||
|
用于修改文件属主,也可以同时修改属组。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
chown root:root fileName #修改文件的所有者和所有组为root
|
chown root:root fileName
|
||||||
```
|
```
|
||||||
-R:递归
|
|
||||||
|
|
||||||
##### 2.3 chgrp修改文件属组
|
表示把文件的属主和属组都改为 `root`。
|
||||||
-R:递归
|
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
##### 2.4 chmod修改文件权限
|
- `-R`:递归处理目录及其内部文件
|
||||||
-R:递归
|
|
||||||
数字或者ugo+
|
|
||||||
|
|
||||||
|
### 4.2 `chgrp`
|
||||||
|
|
||||||
##### 2.5 umask默认权限
|
用于单独修改文件属组。
|
||||||
文件:计算方式为666-umask,如果所得结果为存在执行(奇数)权限,则将其权限+1
|
|
||||||
目录:计算方式为777-umask
|
|
||||||
默认值:root:022,其他用户:002
|
|
||||||
|
|
||||||
**修改umask 值,放在profile中永久生效**
|
常见选项:
|
||||||
|
|
||||||
## 3、特殊权限
|
- `-R`:递归处理
|
||||||
SUID(s):作用在二进制可执行文件上,其他用户将继承此程序所有者的权限,比如:passwd(# ls -l /bin/passwd)权限为-rwsr-xr-x,当其他用户执行passwd 的时候,他的权限就变成文件所属主的权限。
|
|
||||||
SGID(s):作用于二进制可执行文件上时,用户将继承次程序所有组的权限,作用于目录上时,此目录新建的文件的所属组将自动从此目录继承
|
|
||||||
STICKY(t):作用于目录上,此目录的文件只能有所有者删除,比如/tmp,rwxrwxrwt,只有设置在目录上才有效,只有文件的所有者或者root才能删除文件
|
|
||||||
|
|
||||||
## 4、特殊属性
|
示例:
|
||||||
chattr(管控root及其他用户)
|
|
||||||
|
|
||||||
- +i:不能删除,改名,更改内容
|
```shell
|
||||||
- +a:只能追加内容,不能删除,改名
|
chgrp devops fileName
|
||||||
|
```
|
||||||
|
|
||||||
lsattr
|
## 5、修改权限 `chmod`
|
||||||
显示特定属性
|
|
||||||
|
`chmod` 用于修改文件或目录权限。
|
||||||
|
|
||||||
|
### 5.1 数字方式
|
||||||
|
|
||||||
|
常见组合:
|
||||||
|
|
||||||
|
- `7` = `rwx`
|
||||||
|
- `6` = `rw-`
|
||||||
|
- `5` = `r-x`
|
||||||
|
- `4` = `r--`
|
||||||
|
|
||||||
|
例如:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
chmod 644 file.txt
|
||||||
|
chmod 755 script.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.2 符号方式
|
||||||
|
|
||||||
|
可以使用 `u`、`g`、`o`、`a` 搭配 `+`、`-`、`=` 设置权限。
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
chmod u+x script.sh
|
||||||
|
chmod g-w file.txt
|
||||||
|
chmod o-r file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.3 递归修改
|
||||||
|
|
||||||
|
```shell
|
||||||
|
chmod -R 755 dirName
|
||||||
|
```
|
||||||
|
|
||||||
|
对目录递归改权限时要非常谨慎,避免把文件和目录都改成不合适的权限。
|
||||||
|
|
||||||
|
## 6、默认权限 `umask`
|
||||||
|
|
||||||
|
`umask` 决定新建文件和目录时默认去掉哪些权限。
|
||||||
|
|
||||||
|
### 6.1 常见规则
|
||||||
|
|
||||||
|
- 文件默认基准通常是 `666`
|
||||||
|
- 目录默认基准通常是 `777`
|
||||||
|
|
||||||
|
因此:
|
||||||
|
|
||||||
|
- 文件默认权限 ≈ `666 - umask`
|
||||||
|
- 目录默认权限 ≈ `777 - umask`
|
||||||
|
|
||||||
|
### 6.2 常见默认值
|
||||||
|
|
||||||
|
- `root` 常见默认值:`022`
|
||||||
|
- 普通用户常见默认值:`002` 或 `022`
|
||||||
|
|
||||||
|
### 6.3 永久生效
|
||||||
|
|
||||||
|
如果想长期修改 `umask`,通常写入:
|
||||||
|
|
||||||
|
- `/etc/profile`
|
||||||
|
- `~/.bashrc`
|
||||||
|
- `~/.profile`
|
||||||
|
|
||||||
|
具体取决于系统和登录方式。
|
||||||
|
|
||||||
|
## 7、特殊权限
|
||||||
|
|
||||||
|
除了普通的 `rwx` 外,Linux 还有 3 类常见特殊权限:
|
||||||
|
|
||||||
|
- SUID
|
||||||
|
- SGID
|
||||||
|
- Sticky Bit
|
||||||
|
|
||||||
|
### 7.1 SUID
|
||||||
|
|
||||||
|
SUID 主要作用在**可执行文件**上。
|
||||||
|
|
||||||
|
效果:普通用户执行该程序时,会临时以**文件属主**的身份运行。
|
||||||
|
|
||||||
|
典型例子:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ls -l /bin/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
可能看到:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
-rwsr-xr-x
|
||||||
|
```
|
||||||
|
|
||||||
|
其中属主执行位上的 `s` 就表示设置了 SUID。
|
||||||
|
|
||||||
|
### 7.2 SGID
|
||||||
|
|
||||||
|
SGID 有两种常见作用:
|
||||||
|
|
||||||
|
- 作用在可执行文件上:以文件属组身份运行
|
||||||
|
- 作用在目录上:新建文件会继承该目录的属组
|
||||||
|
|
||||||
|
这在团队共享目录里非常常见。
|
||||||
|
|
||||||
|
### 7.3 Sticky Bit
|
||||||
|
|
||||||
|
Sticky Bit 主要作用在目录上。
|
||||||
|
|
||||||
|
效果:目录中的文件通常只能被**文件所有者**或 `root` 删除。
|
||||||
|
|
||||||
|
典型例子:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ls -ld /tmp
|
||||||
|
```
|
||||||
|
|
||||||
|
可能看到:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
drwxrwxrwt
|
||||||
|
```
|
||||||
|
|
||||||
|
最后的 `t` 就表示设置了 Sticky Bit。
|
||||||
|
|
||||||
|
## 8、特殊属性 `chattr` 与 `lsattr`
|
||||||
|
|
||||||
|
除了权限位外,Linux 还支持一些额外文件属性。
|
||||||
|
|
||||||
|
### 8.1 `chattr`
|
||||||
|
|
||||||
|
常见属性:
|
||||||
|
|
||||||
|
- `+i`:不可删除、不可改名、不可修改
|
||||||
|
- `+a`:只能追加内容,不能覆盖或删除
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
chattr +i important.conf
|
||||||
|
chattr +a app.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.2 `lsattr`
|
||||||
|
|
||||||
|
用于查看文件特殊属性。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
lsattr important.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
## 9、常见运维建议
|
||||||
|
|
||||||
|
- 给脚本加执行权限前,先确认内容安全
|
||||||
|
- 不要随意对系统目录做递归 `chmod -R 777`
|
||||||
|
- 团队共享目录可考虑配合 SGID 使用
|
||||||
|
- 核心配置文件可结合 `chattr +i` 防误删或误改
|
||||||
|
- 处理目录权限时,一定要先区分“文件权限”和“目录权限”
|
||||||
|
|
||||||
|
## 10、小结
|
||||||
|
|
||||||
|
- `rwx` 是 Linux 权限的基础
|
||||||
|
- 文件权限和目录权限含义不同
|
||||||
|
- `chown`、`chgrp`、`chmod` 是最常见的权限管理命令
|
||||||
|
- `umask` 决定新建文件和目录的默认权限
|
||||||
|
- SUID、SGID、Sticky Bit 是高频特殊权限知识点
|
||||||
|
- `chattr` 和 `lsattr` 用于管理更细粒度的文件属性
|
||||||
|
|||||||
@ -1,7 +1,92 @@
|
|||||||
grep:文本搜索
|
## 1、`grep` 概览
|
||||||
-m:匹配几次后停止
|
|
||||||
-v:取反
|
`grep` 是 Linux 中最常用的文本搜索命令之一,用于在文件或命令输出中查找匹配的内容。
|
||||||
-i: 忽略大小写
|
|
||||||
-n:显示匹配到的行号
|
日常使用场景包括:
|
||||||
-c:匹配到的次数
|
|
||||||
-w:匹配到整个单词
|
- 在配置文件中查找关键字
|
||||||
|
- 在日志中定位报错信息
|
||||||
|
- 过滤命令输出
|
||||||
|
- 结合管道做批量分析
|
||||||
|
|
||||||
|
## 2、基本格式
|
||||||
|
|
||||||
|
```shell
|
||||||
|
grep [选项] "模式" 文件名
|
||||||
|
```
|
||||||
|
|
||||||
|
例如:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
grep "error" app.log
|
||||||
|
```
|
||||||
|
|
||||||
|
表示在 `app.log` 中查找包含 `error` 的行。
|
||||||
|
|
||||||
|
## 3、常见选项
|
||||||
|
|
||||||
|
- `-m`:匹配指定次数后停止
|
||||||
|
- `-v`:取反,显示不匹配的行
|
||||||
|
- `-i`:忽略大小写
|
||||||
|
- `-n`:显示匹配行的行号
|
||||||
|
- `-c`:只显示匹配次数
|
||||||
|
- `-w`:只匹配完整单词
|
||||||
|
|
||||||
|
## 4、常见示例
|
||||||
|
|
||||||
|
### 4.1 忽略大小写搜索
|
||||||
|
|
||||||
|
```shell
|
||||||
|
grep -i "error" app.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 显示行号
|
||||||
|
|
||||||
|
```shell
|
||||||
|
grep -n "listen" /etc/ssh/sshd_config
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 统计匹配次数
|
||||||
|
|
||||||
|
```shell
|
||||||
|
grep -c "404" access.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4 显示不匹配的行
|
||||||
|
|
||||||
|
```shell
|
||||||
|
grep -v "^#" /etc/ssh/sshd_config
|
||||||
|
```
|
||||||
|
|
||||||
|
这类用法常用于过滤掉注释行。
|
||||||
|
|
||||||
|
### 4.5 只匹配完整单词
|
||||||
|
|
||||||
|
```shell
|
||||||
|
grep -w "root" /etc/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5、结合管道使用
|
||||||
|
|
||||||
|
`grep` 经常和其他命令组合:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ps -ef | grep nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
```shell
|
||||||
|
journalctl -xe | grep -i "failed"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6、实战建议
|
||||||
|
|
||||||
|
- 配置文件查找时,经常结合 `-n` 看行号
|
||||||
|
- 查日志时,经常结合 `-i` 忽略大小写
|
||||||
|
- 过滤无效行时,经常用 `-v`
|
||||||
|
- 要统计数量时,用 `-c` 比肉眼数更快
|
||||||
|
|
||||||
|
## 7、小结
|
||||||
|
|
||||||
|
- `grep` 是最基础、最高频的文本搜索命令
|
||||||
|
- `-i`、`-n`、`-v`、`-c`、`-w` 是最常用选项
|
||||||
|
- 它非常适合配合管道过滤日志、进程、配置输出
|
||||||
|
|||||||
@ -1,5 +1,104 @@
|
|||||||
sed:从文件或者管道符里读取一行,处理一行
|
## 1、`sed` 概览
|
||||||
-r:使用拓展正则表达式
|
|
||||||
-i:保存到文件中
|
`sed` 是 Linux 中非常常见的流编辑器(stream editor),它会按行读取输入内容,然后对文本进行处理。
|
||||||
s/要被替换的值/最中通过值/修饰符
|
|
||||||
g:行内全局替换
|
常见用途:
|
||||||
|
|
||||||
|
- 文本替换
|
||||||
|
- 删除指定行
|
||||||
|
- 打印指定范围内容
|
||||||
|
- 批量修改配置文件
|
||||||
|
|
||||||
|
## 2、基本特点
|
||||||
|
|
||||||
|
可以这样理解 `sed`:
|
||||||
|
|
||||||
|
- 从文件或标准输入中逐行读取内容
|
||||||
|
- 对每一行按规则处理
|
||||||
|
- 默认把处理结果输出到标准输出
|
||||||
|
|
||||||
|
如果想直接修改原文件,通常需要使用 `-i`。
|
||||||
|
|
||||||
|
## 3、常见选项
|
||||||
|
|
||||||
|
- `-r`:使用扩展正则表达式
|
||||||
|
- `-i`:直接修改文件内容
|
||||||
|
- `-n`:默认不输出,常配合 `p` 使用
|
||||||
|
|
||||||
|
## 4、最常见的替换命令
|
||||||
|
|
||||||
|
基本格式:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sed 's/旧内容/新内容/修饰符' 文件名
|
||||||
|
```
|
||||||
|
|
||||||
|
其中:
|
||||||
|
|
||||||
|
- `s`:表示 substitute(替换)
|
||||||
|
- `g`:表示行内全局替换
|
||||||
|
|
||||||
|
### 4.1 替换每行第一个匹配项
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sed 's/root/admin/' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 替换每行所有匹配项
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sed 's/root/admin/g' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 直接修改原文件
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sed -i 's/root/admin/g' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5、常见示例
|
||||||
|
|
||||||
|
### 5.1 打印指定行
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sed -n '1,5p' /etc/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
表示只打印第 1 到第 5 行。
|
||||||
|
|
||||||
|
### 5.2 删除指定行
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sed '3d' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
表示删除第 3 行后输出结果。
|
||||||
|
|
||||||
|
### 5.3 删除空行
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sed '/^$/d' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.4 替换配置项
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
|
||||||
|
```
|
||||||
|
|
||||||
|
这是运维里很常见的批量改配置写法。
|
||||||
|
|
||||||
|
## 6、实战建议
|
||||||
|
|
||||||
|
- 批量改配置时优先考虑 `sed -i`
|
||||||
|
- 涉及正则时可结合 `-r`
|
||||||
|
- 正式改文件前,建议先不加 `-i` 预览结果
|
||||||
|
- 对系统配置文件做替换前,最好先备份
|
||||||
|
|
||||||
|
## 7、小结
|
||||||
|
|
||||||
|
- `sed` 是按行处理文本的流编辑器
|
||||||
|
- `s/旧/新/g` 是最常用的替换格式
|
||||||
|
- `-i` 用于直接修改文件
|
||||||
|
- `-n` 常和 `p` 搭配控制输出
|
||||||
|
- 它非常适合批量替换和配置修改场景
|
||||||
|
|||||||
@ -1,47 +1,155 @@
|
|||||||
awk
|
## 1、`awk` 概览
|
||||||
-F:指定分隔符
|
|
||||||
变量
|
|
||||||
FS:输入字段分隔符,默认为空白字符,功能相当于-F
|
|
||||||
自定义变量:-v var=value
|
|
||||||
|
|
||||||
语句块
|
`awk` 是 Linux 中非常强大的文本分析工具,特别适合处理**按列分隔**的数据。
|
||||||
BEGIN:语句块
|
|
||||||
模式匹配的同游语句块
|
|
||||||
END语句块
|
|
||||||
|
|
||||||
工作过程
|
常见用途:
|
||||||
第一步:执行BEGIN{action;...}语句块中的语句
|
|
||||||
第二步:从文件或标准输入读取一行,然后执行pattern{action;...}语句块
|
|
||||||
第三步:当读到末尾后,执行END模块
|
|
||||||
|
|
||||||
常见action分类
|
- 提取某几列字段
|
||||||
print
|
- 按条件筛选内容
|
||||||
,:分隔符
|
- 统计求和
|
||||||
固定字符要用“”引用起来,而变量和数字不需要
|
- 格式化输出
|
||||||
|
- 分析日志和表格类文本
|
||||||
|
|
||||||
printf
|
## 2、工作流程
|
||||||
"FORMAT"
|
|
||||||
必须指定FORMAT,且分别需要为后面每个item指定格式符
|
|
||||||
不会自动换行,需要显示给出换行控制符\n
|
|
||||||
|
|
||||||
%s:显示字符串
|
`awk` 的处理流程通常是:
|
||||||
%d:显示十进制整数
|
|
||||||
%f:显示为浮点数
|
|
||||||
%e:显示科学计数法数值
|
|
||||||
%c:显示字符的ascii码
|
|
||||||
%u:显示无符号整数
|
|
||||||
|
|
||||||
算数,比较表达式
|
1. 先执行 `BEGIN` 语句块
|
||||||
组合语句
|
2. 逐行读取输入
|
||||||
if,while等
|
3. 对每一行执行 `pattern { action }`
|
||||||
输入
|
4. 最后执行 `END` 语句块
|
||||||
|
|
||||||
控制语句
|
基本格式:
|
||||||
if
|
|
||||||
if else
|
```shell
|
||||||
while
|
awk 'BEGIN{action} pattern{action} END{action}' file
|
||||||
do while
|
```
|
||||||
for
|
|
||||||
break
|
## 3、字段分隔符
|
||||||
continue
|
|
||||||
exit
|
### 3.1 `-F`
|
||||||
|
|
||||||
|
用于指定输入字段分隔符。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
awk -F: '{print $1}' /etc/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
这里的 `:` 表示按冒号分列。
|
||||||
|
|
||||||
|
### 3.2 内置变量 `FS`
|
||||||
|
|
||||||
|
`FS` 表示输入字段分隔符,功能类似 `-F`。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
awk 'BEGIN{FS=":"} {print $1}' /etc/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4、常用变量
|
||||||
|
|
||||||
|
- `FS`:输入字段分隔符
|
||||||
|
- `OFS`:输出字段分隔符
|
||||||
|
- `NF`:当前行字段数
|
||||||
|
- `NR`:当前处理到第几行
|
||||||
|
- `$1`、`$2`:第 1 列、第 2 列
|
||||||
|
- `$0`:整行内容
|
||||||
|
|
||||||
|
### 4.1 自定义变量
|
||||||
|
|
||||||
|
可以使用 `-v` 定义变量:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
awk -v threshold=100 '$3 > threshold {print $0}' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5、常见动作
|
||||||
|
|
||||||
|
### 5.1 `print`
|
||||||
|
|
||||||
|
用于简单输出。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
awk -F: '{print $1,$3}' /etc/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
- 逗号表示按输出分隔符拼接
|
||||||
|
- 字符串要用引号包裹
|
||||||
|
|
||||||
|
### 5.2 `printf`
|
||||||
|
|
||||||
|
用于格式化输出。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
awk -F: '{printf "user=%s uid=%s\n", $1, $3}' /etc/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
常见格式符:
|
||||||
|
|
||||||
|
- `%s`:字符串
|
||||||
|
- `%d`:整数
|
||||||
|
- `%f`:浮点数
|
||||||
|
- `%e`:科学计数法
|
||||||
|
- `%c`:字符
|
||||||
|
- `%u`:无符号整数
|
||||||
|
|
||||||
|
注意:`printf` **不会自动换行**,通常要手动加 `\n`。
|
||||||
|
|
||||||
|
## 6、流程控制
|
||||||
|
|
||||||
|
`awk` 支持常见控制语句:
|
||||||
|
|
||||||
|
- `if`
|
||||||
|
- `if ... else`
|
||||||
|
- `while`
|
||||||
|
- `for`
|
||||||
|
- `break`
|
||||||
|
- `continue`
|
||||||
|
- `exit`
|
||||||
|
|
||||||
|
### 6.1 条件筛选示例
|
||||||
|
|
||||||
|
```shell
|
||||||
|
awk -F: '$3 >= 1000 {print $1,$3}' /etc/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
表示打印 UID 大于等于 1000 的用户。
|
||||||
|
|
||||||
|
## 7、常见示例
|
||||||
|
|
||||||
|
### 7.1 提取第一列
|
||||||
|
|
||||||
|
```shell
|
||||||
|
awk '{print $1}' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.2 打印行号和内容
|
||||||
|
|
||||||
|
```shell
|
||||||
|
awk '{print NR, $0}' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3 统计某列总和
|
||||||
|
|
||||||
|
```shell
|
||||||
|
awk '{sum += $1} END {print sum}' numbers.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.4 格式化输出 `/etc/passwd`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
awk -F: '{printf "user=%-15s uid=%s\n", $1, $3}' /etc/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8、实战建议
|
||||||
|
|
||||||
|
- 按列处理文本时优先考虑 `awk`
|
||||||
|
- 做简单列提取时,`cut` 更轻;做条件判断和计算时,`awk` 更强
|
||||||
|
- 处理日志、表格、监控数据时,`awk` 非常高频
|
||||||
|
- 写复杂语句时,先从简单 `print` 版本调试,再逐步增强
|
||||||
|
|
||||||
|
## 9、小结
|
||||||
|
|
||||||
|
- `awk` 是按行读、按列处理的强力文本工具
|
||||||
|
- `-F`、`FS`、`NR`、`NF`、`$1`、`$0` 是最常见概念
|
||||||
|
- `print` 适合简单输出,`printf` 适合格式化输出
|
||||||
|
- 它非常适合做日志分析、列提取和条件统计
|
||||||
|
|||||||
@ -1,27 +1,149 @@
|
|||||||
## 1、标准输入和输出
|
## 1、I/O 重定向概览
|
||||||
**Linux给程序提供三种I/O设备**
|
|
||||||
|
|
||||||
- 标准输入(STDIN) -0 默认接收来自终端窗口的输入
|
Linux 程序默认会使用 3 个标准输入输出通道:
|
||||||
- 标准输出(STDOUT) -1 默认输出到终端窗口
|
|
||||||
- 标准错误(STDERR) -2 默认输出到终端串口
|
- **标准输入** `STDIN`:文件描述符 `0`
|
||||||
|
- **标准输出** `STDOUT`:文件描述符 `1`
|
||||||
|
- **标准错误** `STDERR`:文件描述符 `2`
|
||||||
|
|
||||||
|
理解这 3 个通道后,重定向和管道就会非常好理解。
|
||||||
|
|
||||||
|
## 2、标准输入输出说明
|
||||||
|
|
||||||
|
### 2.1 标准输入 `STDIN`
|
||||||
|
|
||||||
|
默认从终端读取输入。
|
||||||
|
|
||||||
|
### 2.2 标准输出 `STDOUT`
|
||||||
|
|
||||||
|
默认把正常结果输出到当前终端。
|
||||||
|
|
||||||
|
### 2.3 标准错误 `STDERR`
|
||||||
|
|
||||||
|
默认把错误信息也输出到终端。
|
||||||
|
|
||||||
|
虽然默认都显示在终端里,但 `STDOUT` 和 `STDERR` 在逻辑上是两条不同的输出流。
|
||||||
|
|
||||||
|
## 3、输出重定向
|
||||||
|
|
||||||
|
### 3.1 重定向标准输出
|
||||||
|
|
||||||
STDOUT和STDERR都可以被重定向到指定文件,而非默认当前的终端
|
|
||||||
```shell
|
```shell
|
||||||
1>或> 把STDOUT 重定向到文件
|
command > file
|
||||||
2> 把STDERR 重定向到文件
|
|
||||||
&> 把标准输出和标准错误都输出到文件
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 2、多行重定向
|
等价于:
|
||||||
不一定要EOF,任何字符都行
|
|
||||||
|
```shell
|
||||||
|
command 1> file
|
||||||
|
```
|
||||||
|
|
||||||
|
表示把标准输出写入文件。
|
||||||
|
|
||||||
|
### 3.2 重定向标准错误
|
||||||
|
|
||||||
|
```shell
|
||||||
|
command 2> error.log
|
||||||
|
```
|
||||||
|
|
||||||
|
表示把错误输出写入文件。
|
||||||
|
|
||||||
|
### 3.3 同时重定向标准输出和标准错误
|
||||||
|
|
||||||
|
```shell
|
||||||
|
command &> all.log
|
||||||
|
```
|
||||||
|
|
||||||
|
表示把正常输出和错误输出都写入同一个文件。
|
||||||
|
|
||||||
|
### 3.4 追加重定向
|
||||||
|
|
||||||
|
```shell
|
||||||
|
command >> file
|
||||||
|
command 2>> error.log
|
||||||
|
```
|
||||||
|
|
||||||
|
表示追加到文件末尾,而不是覆盖原内容。
|
||||||
|
|
||||||
|
## 4、输入重定向
|
||||||
|
|
||||||
|
可以把文件内容作为命令输入:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
command < file
|
||||||
|
```
|
||||||
|
|
||||||
|
例如:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wc -l < /etc/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5、多行重定向 Here Document
|
||||||
|
|
||||||
|
Here Document 用于把多行文本直接传给命令输入。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
cat > 1.txt <<EOF
|
cat > 1.txt <<EOF
|
||||||
> 1231231
|
1231231
|
||||||
> asasssf
|
asasssf
|
||||||
> EOF
|
EOF
|
||||||
```
|
```
|
||||||
|
|
||||||
## 3、管道
|
说明:
|
||||||
简介:把命令1 的输出最为 命令2的输入...
|
|
||||||
命令1 | 命令2 | 命令3
|
|
||||||
|
|
||||||
|
- `EOF` 只是结束标记,不一定必须写成 `EOF`
|
||||||
|
- 也可以换成其他自定义标识符
|
||||||
|
|
||||||
|
## 6、管道 `|`
|
||||||
|
|
||||||
|
管道会把前一个命令的标准输出,作为后一个命令的标准输入。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
命令1 | 命令2 | 命令3
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.1 示例
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cat /etc/passwd | grep root
|
||||||
|
```
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ps -ef | grep nginx | wc -l
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7、常见使用场景
|
||||||
|
|
||||||
|
### 7.1 保存命令输出
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ip addr > ip.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.2 单独保存报错信息
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /root -name "*.log" 2> error.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3 把结果和错误一起保存
|
||||||
|
|
||||||
|
```shell
|
||||||
|
bash script.sh &> run.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.4 通过管道过滤结果
|
||||||
|
|
||||||
|
```shell
|
||||||
|
dmesg | grep -i error
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8、小结
|
||||||
|
|
||||||
|
- `0`、`1`、`2` 分别表示标准输入、标准输出、标准错误
|
||||||
|
- `>` 和 `1>` 用于重定向标准输出
|
||||||
|
- `2>` 用于重定向错误输出
|
||||||
|
- `&>` 可同时重定向标准输出和错误输出
|
||||||
|
- `<<EOF` 属于多行输入重定向
|
||||||
|
- 管道 `|` 是把前一个命令输出交给后一个命令处理
|
||||||
|
|||||||
@ -1,22 +1,185 @@
|
|||||||
## 1、基本正则表达式
|
## 1、正则表达式概览
|
||||||
##### 1.1 字符匹配
|
|
||||||
|
|
||||||
- .:匹配任意单个字符
|
正则表达式(Regular Expression)用于描述一类字符串匹配规则,在 Linux 中常与 `grep`、`sed`、`awk` 等命令搭配使用。
|
||||||
- []:匹配指定范围内的任意单个字符,示例[0-9]
|
|
||||||
- [^]:匹配指定范围外的人一个字符
|
|
||||||
##### 1.2 匹配次数
|
|
||||||
|
|
||||||
- *:匹配前面的字符0次或任意次
|
常见场景:
|
||||||
- .*:匹配任意长度的任意字符
|
|
||||||
- \?:匹配前面的字符0次或者1次
|
- 匹配日志中的特定格式
|
||||||
- \+:匹配前面的字符至少一次
|
- 过滤 IP、端口、用户名等文本
|
||||||
- \{n\}:匹配前面的字符n次
|
- 批量替换字符串
|
||||||
- \{m,n\}:匹配前面的字符至少m次,至多n次
|
- 校验输入格式
|
||||||
- \{,n\}:匹配前面的字符至多n次
|
|
||||||
- \{n,\}:匹配前面的字符至少n次
|
## 2、基本字符匹配
|
||||||
##### 1.3 位置锚定
|
|
||||||
^:行首锚定
|
### 2.1 `.`
|
||||||
$:行尾锚定
|
|
||||||
^$:空行
|
- `.`:匹配任意单个字符
|
||||||
##### 1.4 或者
|
|
||||||
\|
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
a.c
|
||||||
|
```
|
||||||
|
|
||||||
|
可以匹配:`abc`、`a1c`、`a-c`
|
||||||
|
|
||||||
|
### 2.2 `[]`
|
||||||
|
|
||||||
|
- `[]`:匹配指定范围中的任意单个字符
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
[0-9]
|
||||||
|
[a-z]
|
||||||
|
[A-Z]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 `[^]`
|
||||||
|
|
||||||
|
- `[^...]`:匹配不在指定范围内的任意单个字符
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
[^0-9]
|
||||||
|
```
|
||||||
|
|
||||||
|
表示匹配任意一个非数字字符。
|
||||||
|
|
||||||
|
## 3、匹配次数
|
||||||
|
|
||||||
|
### 3.1 `*`
|
||||||
|
|
||||||
|
- `*`:匹配前一个字符 **0 次或多次**
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ab*c
|
||||||
|
```
|
||||||
|
|
||||||
|
可以匹配:`ac`、`abc`、`abbc`
|
||||||
|
|
||||||
|
### 3.2 `.*`
|
||||||
|
|
||||||
|
- `.*`:匹配任意长度的任意字符
|
||||||
|
|
||||||
|
这个组合在日志处理里非常常见。
|
||||||
|
|
||||||
|
### 3.3 `?`
|
||||||
|
|
||||||
|
在基本正则中通常写作 `\?`,表示:
|
||||||
|
|
||||||
|
- 前一个字符 **0 次或 1 次**
|
||||||
|
|
||||||
|
### 3.4 `+`
|
||||||
|
|
||||||
|
在基本正则中通常写作 `\+`,表示:
|
||||||
|
|
||||||
|
- 前一个字符 **至少 1 次**
|
||||||
|
|
||||||
|
### 3.5 `{}`
|
||||||
|
|
||||||
|
在基本正则中通常写作转义形式:
|
||||||
|
|
||||||
|
- `\{n\}`:前一个字符恰好出现 `n` 次
|
||||||
|
- `\{m,n\}`:前一个字符出现 `m` 到 `n` 次
|
||||||
|
- `\{,n\}`:前一个字符最多出现 `n` 次
|
||||||
|
- `\{n,\}`:前一个字符至少出现 `n` 次
|
||||||
|
|
||||||
|
## 4、位置锚定
|
||||||
|
|
||||||
|
- `^`:行首
|
||||||
|
- `$`:行尾
|
||||||
|
- `^$`:空行
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
^root
|
||||||
|
```
|
||||||
|
|
||||||
|
表示匹配以 `root` 开头的行。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
bash$
|
||||||
|
```
|
||||||
|
|
||||||
|
表示匹配以 `bash` 结尾的行。
|
||||||
|
|
||||||
|
## 5、分组与或关系
|
||||||
|
|
||||||
|
### 5.1 `\|`
|
||||||
|
|
||||||
|
在基本正则中,`\|` 表示“或者”。
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
root\|admin
|
||||||
|
```
|
||||||
|
|
||||||
|
表示匹配 `root` 或 `admin`。
|
||||||
|
|
||||||
|
### 5.2 `()`
|
||||||
|
|
||||||
|
在扩展正则中,分组通常使用 `()`;在部分基本正则工具中可能需要转义。
|
||||||
|
|
||||||
|
## 6、基本正则与扩展正则
|
||||||
|
|
||||||
|
### 6.1 基本正则 BRE
|
||||||
|
|
||||||
|
常见于:
|
||||||
|
|
||||||
|
- 默认 `grep`
|
||||||
|
- 默认 `sed`
|
||||||
|
|
||||||
|
其中 `?`、`+`、`{}`、`|` 往往要写成转义形式。
|
||||||
|
|
||||||
|
### 6.2 扩展正则 ERE
|
||||||
|
|
||||||
|
常见于:
|
||||||
|
|
||||||
|
- `grep -E`
|
||||||
|
- `egrep`
|
||||||
|
- `sed -r`
|
||||||
|
|
||||||
|
扩展正则写法更自然,例如:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
grep -E 'root|admin' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7、常见示例
|
||||||
|
|
||||||
|
### 7.1 匹配空行
|
||||||
|
|
||||||
|
```shell
|
||||||
|
grep '^$' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.2 匹配注释行
|
||||||
|
|
||||||
|
```shell
|
||||||
|
grep '^#' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3 匹配数字
|
||||||
|
|
||||||
|
```shell
|
||||||
|
grep '[0-9]' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.4 匹配以 `.log` 结尾的文件名
|
||||||
|
|
||||||
|
```shell
|
||||||
|
grep '\.log$' file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8、小结
|
||||||
|
|
||||||
|
- 正则表达式用于描述字符串匹配规则
|
||||||
|
- `.`、`[]`、`*`、`^`、`$` 是最基础也是最高频的元字符
|
||||||
|
- BRE 和 ERE 的主要区别在于部分符号是否需要转义
|
||||||
|
- 学会正则后,`grep`、`sed`、`awk` 的能力会明显提升
|
||||||
|
|||||||
@ -1,90 +1,224 @@
|
|||||||
```shell
|
## 1、磁盘和文件系统管理概览
|
||||||
dd | hdparm /硬盘
|
|
||||||
```
|
|
||||||
## 1、分区方式
|
|
||||||
**分类:**
|
|
||||||
|
|
||||||
- MBR:1982年设计的,使用32位表示扇区数,分区最大2T
|
磁盘管理通常涉及以下几个层次:
|
||||||
- GPT:64位,最大支持128个分区,支持8Z
|
|
||||||
## 2、BIOS和UEFI
|
- 磁盘与分区
|
||||||
**区别:**
|
- 分区表类型
|
||||||
|
- 文件系统创建与识别
|
||||||
|
- 挂载与卸载
|
||||||
|
- 空间使用查看
|
||||||
|
|
||||||
|
理解这条主线后,再学习 RAID、LVM 会更顺。
|
||||||
|
|
||||||
|
## 2、分区方式
|
||||||
|
|
||||||
|
### 2.1 MBR
|
||||||
|
|
||||||
|
- 较早期的分区表格式
|
||||||
|
- 使用 32 位扇区地址
|
||||||
|
- 单盘常见上限约为 2 TB
|
||||||
|
- 主分区数量有限
|
||||||
|
|
||||||
|
### 2.2 GPT
|
||||||
|
|
||||||
|
- 更现代的分区表格式
|
||||||
|
- 支持更大的磁盘容量
|
||||||
|
- 支持更多分区
|
||||||
|
- 常与 UEFI 配合使用
|
||||||
|
|
||||||
|
## 3、BIOS 与 UEFI
|
||||||
|
|
||||||
|
### 3.1 BIOS
|
||||||
|
|
||||||
|
- 较传统的启动方式
|
||||||
|
- 常和 MBR 磁盘搭配
|
||||||
|
- 对大容量系统盘支持有限
|
||||||
|
|
||||||
|
### 3.2 UEFI
|
||||||
|
|
||||||
|
- 更新的启动方式
|
||||||
|
- 更适合 GPT 分区表
|
||||||
|
- 支持更大容量磁盘和更多现代特性
|
||||||
|
|
||||||
|
## 4、查看磁盘与分区
|
||||||
|
|
||||||
|
### 4.1 `lsblk`
|
||||||
|
|
||||||
- bios只能识别到MBR初始化的硬盘,最大支持2T的系统盘
|
|
||||||
- UEFI支持2T以上
|
|
||||||
## 3、管理分区
|
|
||||||
```shell
|
```shell
|
||||||
lsblk
|
lsblk
|
||||||
|
|
||||||
-f:列出文件系统
|
|
||||||
```
|
```
|
||||||
##### 3.1 创建分区
|
|
||||||
```shell
|
|
||||||
fdis 管理MBR分区
|
|
||||||
gdisk 管理GPT分区
|
|
||||||
|
|
||||||
#两者命令相同
|
常见选项:
|
||||||
p #打印分区列表
|
|
||||||
t #更改分区类型
|
- `-f`:显示文件系统信息
|
||||||
n #创建新分区
|
|
||||||
d #删除分区
|
### 4.2 `blkid`
|
||||||
v #校验分区
|
|
||||||
u #转换单位
|
|
||||||
w #保存并退出
|
|
||||||
q #不保存退出
|
|
||||||
```
|
|
||||||
##### 3.2 同步分区表
|
|
||||||
`partprobe`
|
|
||||||
## 4、文件系统类型
|
|
||||||
EXT4:提供纳秒级时间戳,创建和使用单个大文件(16T),最大支持1EB
|
|
||||||
XFS:单文件及文件系统最大支持8EB
|
|
||||||
NTFS:windows使用
|
|
||||||
##### 4.1 创建文件系统
|
|
||||||
`mkfs`
|
|
||||||
##### 4.2 查看分区信息
|
|
||||||
`blkid -U UUID `可以通过uuid查询磁盘
|
|
||||||
## 5、挂载
|
|
||||||
挂载:`mount`
|
|
||||||
卸载:`umount`
|
|
||||||
```shell
|
```shell
|
||||||
|
blkid
|
||||||
|
```
|
||||||
|
|
||||||
|
用于查看:
|
||||||
|
|
||||||
|
- UUID
|
||||||
|
- 文件系统类型
|
||||||
|
- 分区 UUID
|
||||||
|
|
||||||
|
### 4.3 `partprobe`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
partprobe
|
||||||
|
```
|
||||||
|
|
||||||
|
用于通知内核重新读取分区表,常见于新建或调整分区后。
|
||||||
|
|
||||||
|
## 5、创建和管理分区
|
||||||
|
|
||||||
|
### 5.1 常见工具
|
||||||
|
|
||||||
|
- `fdisk`:常用于管理 MBR 分区
|
||||||
|
- `gdisk`:常用于管理 GPT 分区
|
||||||
|
|
||||||
|
### 5.2 常见交互命令
|
||||||
|
|
||||||
|
- `p`:打印分区表
|
||||||
|
- `n`:新建分区
|
||||||
|
- `d`:删除分区
|
||||||
|
- `t`:修改分区类型
|
||||||
|
- `v`:校验分区表
|
||||||
|
- `w`:保存并退出
|
||||||
|
- `q`:不保存退出
|
||||||
|
|
||||||
|
## 6、文件系统类型
|
||||||
|
|
||||||
|
常见文件系统:
|
||||||
|
|
||||||
|
- `ext4`:Linux 中非常常见,兼容性好
|
||||||
|
- `xfs`:大文件和大容量场景常见
|
||||||
|
- `ntfs`:Windows 常见文件系统
|
||||||
|
|
||||||
|
### 6.1 创建文件系统
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mkfs
|
||||||
|
```
|
||||||
|
|
||||||
|
实际使用中通常会结合具体类型:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mkfs.ext4 /dev/sdb1
|
||||||
|
mkfs.xfs /dev/sdb1
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7、挂载与卸载
|
||||||
|
|
||||||
|
### 7.1 挂载命令
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mount
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.2 卸载命令
|
||||||
|
|
||||||
|
```shell
|
||||||
|
umount
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3 `/etc/fstab`
|
||||||
|
|
||||||
|
系统开机自动挂载通常依赖 `/etc/fstab`。
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```fstab
|
||||||
/dev/sda1 / ext4 defaults,noatime 0 1
|
/dev/sda1 / ext4 defaults,noatime 0 1
|
||||||
/dev/sda2 none swap defaults 0 0
|
/dev/sda2 none swap defaults 0 0
|
||||||
/dev/sda3 /home ext4 defaults,noatime 0 2
|
/dev/sda3 /home ext4 defaults,noatime 0 2
|
||||||
#盘符,也可以是UUID
|
|
||||||
#挂载点
|
|
||||||
#分区格式
|
|
||||||
#参数:
|
|
||||||
defaults - 使用文件系统的默认挂载参数,例如 ext4 的默认参数为:rw, suid, dev, exec, auto, nouser, async
|
|
||||||
auto - 在启动时或键入了 mount -a 命令时自动挂载。
|
|
||||||
noauto - 只在你的命令下被挂载。
|
|
||||||
exec - 允许执行此分区的二进制文件。
|
|
||||||
noexec - 不允许执行此文件系统上的二进制文件。
|
|
||||||
ro - 以只读模式挂载文件系统。
|
|
||||||
rw - 以读写模式挂载文件系统。
|
|
||||||
user - 允许任意用户挂载此文件系统,若无显示定义,隐含启用 noexec, nosuid, nodev 参数。
|
|
||||||
users - 允许所有 users 组中的用户挂载文件系统.
|
|
||||||
nouser - 只能被 root 挂载。
|
|
||||||
owner - 允许设备所有者挂载.
|
|
||||||
sync - I/O 同步进行。
|
|
||||||
async - I/O 异步进行。
|
|
||||||
dev - 解析文件系统上的块特殊设备。
|
|
||||||
nodev - 不解析文件系统上的块特殊设备。
|
|
||||||
suid - 允许 suid 操作和设定 sgid 位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。
|
|
||||||
nosuid - 禁止 suid 操作和设定 sgid 位。
|
|
||||||
noatime - 不更新文件系统上 inode 访问记录,可以提升性能(参见 atime 参数)。
|
|
||||||
nodiratime - 不更新文件系统上的目录 inode 访问记录,可以提升性能(参见 atime 参数)。
|
|
||||||
relatime - 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能(参见 atime 参数)。
|
|
||||||
flush - vfat 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。
|
|
||||||
#dumo 工具决定如何进行备份,一般选0就对了
|
|
||||||
#fsck 1 表示优先通过fsck检查磁盘,2表示在系统盘检查完成之后检查,0表示不检查
|
|
||||||
```
|
```
|
||||||
## 6、常用命令
|
|
||||||
##### 6.1 df 查看文件系统空间
|
|
||||||
常用选项:
|
|
||||||
|
|
||||||
- -T:显示文件系统类型
|
字段含义:
|
||||||
- -h:单位自动转化
|
|
||||||
- -i:显示inode
|
1. 设备名或 UUID
|
||||||
##### 6.2 du查看目录总体空间占用
|
2. 挂载点
|
||||||
常用选项:
|
3. 文件系统类型
|
||||||
-a:显示所有文件和目录的大小,默认只显示目录大小
|
4. 挂载参数
|
||||||
-h:单位自动转化
|
5. 备份标志(通常为 `0`)
|
||||||
|
6. `fsck` 检查顺序
|
||||||
|
|
||||||
|
### 7.4 常见挂载参数
|
||||||
|
|
||||||
|
- `defaults`:默认挂载参数
|
||||||
|
- `auto`:开机或 `mount -a` 时自动挂载
|
||||||
|
- `noauto`:不自动挂载
|
||||||
|
- `ro`:只读挂载
|
||||||
|
- `rw`:读写挂载
|
||||||
|
- `exec`:允许执行二进制文件
|
||||||
|
- `noexec`:禁止执行二进制文件
|
||||||
|
- `suid`:允许 SUID/SGID 生效
|
||||||
|
- `nosuid`:禁止 SUID/SGID
|
||||||
|
- `dev`:允许解析设备文件
|
||||||
|
- `nodev`:不解析设备文件
|
||||||
|
- `noatime`:不更新访问时间,常用于优化性能
|
||||||
|
- `relatime`:相对更新时间,兼顾性能和兼容性
|
||||||
|
|
||||||
|
## 8、查看磁盘空间
|
||||||
|
|
||||||
|
### 8.1 `df`
|
||||||
|
|
||||||
|
用于查看文件系统层面的空间使用情况。
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-T`:显示文件系统类型
|
||||||
|
- `-h`:以易读单位显示
|
||||||
|
- `-i`:显示 inode 使用情况
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
df -hT
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.2 `du`
|
||||||
|
|
||||||
|
用于查看目录或文件实际占用空间。
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-a`:显示所有文件和目录
|
||||||
|
- `-h`:以易读单位显示
|
||||||
|
- `-s`:汇总显示总大小
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
du -sh /var/log
|
||||||
|
```
|
||||||
|
|
||||||
|
## 9、常见运维流程
|
||||||
|
|
||||||
|
### 9.1 新磁盘上线
|
||||||
|
|
||||||
|
通常步骤:
|
||||||
|
|
||||||
|
- 用 `lsblk` 确认设备
|
||||||
|
- 用 `fdisk` 或 `gdisk` 分区
|
||||||
|
- 用 `mkfs` 创建文件系统
|
||||||
|
- 用 `mount` 挂载
|
||||||
|
- 写入 `/etc/fstab` 实现持久化
|
||||||
|
|
||||||
|
### 9.2 磁盘空间排查
|
||||||
|
|
||||||
|
通常步骤:
|
||||||
|
|
||||||
|
- 先看 `df -h`
|
||||||
|
- 再看 `du -sh` 找大目录
|
||||||
|
- 必要时看 inode:`df -i`
|
||||||
|
|
||||||
|
## 10、小结
|
||||||
|
|
||||||
|
- 分区表常见有 MBR 和 GPT
|
||||||
|
- 启动方式常见有 BIOS 和 UEFI
|
||||||
|
- `lsblk`、`blkid`、`fdisk/gdisk`、`mkfs`、`mount` 是高频命令
|
||||||
|
- `df` 看文件系统空间,`du` 看目录实际占用
|
||||||
|
- `/etc/fstab` 决定系统开机自动挂载行为
|
||||||
|
|||||||
@ -1,19 +1,36 @@
|
|||||||
### 查看系统信息
|
## 1、查看系统信息
|
||||||
##### 查看系统版本信息
|
|
||||||
|
系统管理中,第一步通常不是直接操作,而是先确认当前系统的基本信息,例如:机器架构、内核版本、发行版信息等。
|
||||||
|
|
||||||
|
### 1.1 查看机器架构
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# arch
|
[root@tencentos ~]# arch
|
||||||
x86_64
|
x86_64
|
||||||
```
|
```
|
||||||
##### 查看内核版本
|
|
||||||
|
- `x86_64` 表示当前机器是 64 位架构
|
||||||
|
- `arch` 适合快速查看当前机器架构信息
|
||||||
|
|
||||||
|
### 1.2 查看内核版本
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# uname -r
|
[root@tencentos ~]# uname -r
|
||||||
5.4.119-19.0009.28
|
5.4.119-19.0009.28
|
||||||
```
|
```
|
||||||
##### 查看操作系统发行版本
|
|
||||||
|
- `uname -r` 用于查看当前运行中的 Linux 内核版本
|
||||||
|
- 排查驱动、内核模块、系统兼容性问题时很常用
|
||||||
|
|
||||||
|
### 1.3 查看发行版信息
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# cat /etc/redhat-release
|
[root@tencentos ~]# cat /etc/redhat-release
|
||||||
TencentOS Server release 3.1 (Final)
|
TencentOS Server release 3.1 (Final)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
这个文件适合快速查看基于 Red Hat 系列系统的版本信息。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# cat /etc/os-release
|
[root@tencentos ~]# cat /etc/os-release
|
||||||
NAME="TencentOS Server"
|
NAME="TencentOS Server"
|
||||||
@ -21,114 +38,264 @@ VERSION="3.1 (Final)"
|
|||||||
ID="tencentos"
|
ID="tencentos"
|
||||||
ID_LIKE="rhel fedora centos"
|
ID_LIKE="rhel fedora centos"
|
||||||
VERSION_ID="3.1"
|
VERSION_ID="3.1"
|
||||||
PLATFORM_ID="platform:el8"
|
|
||||||
PRETTY_NAME="TencentOS Server 3.1 (Final)"
|
PRETTY_NAME="TencentOS Server 3.1 (Final)"
|
||||||
ANSI_COLOR="0;31"
|
|
||||||
CPE_NAME="cpe:/o:tencentos:tencentos:3"
|
|
||||||
HOME_URL="https://cloud.tencent.com/product/ts"
|
|
||||||
|
|
||||||
TENCENT_SUPPORT_PRODUCT="tencentos"
|
|
||||||
TENCENT_SUPPORT_PRODUCT_VERSION="3"
|
|
||||||
NAME_ORIG="TencentOS Server
|
|
||||||
```
|
```
|
||||||
### 关机或重启
|
|
||||||
###### halt
|
- `/etc/os-release` 是更通用的系统发行版信息文件
|
||||||
使用"halt"命令可以停止系统并完全停机。它关闭操作系统并停止所有进程,但不会关闭计算机的电源。系统保持停机状态,需要手动关闭电源才能完全关闭计算机。
|
- 自动化脚本中通常优先读取这个文件
|
||||||
###### poweroff
|
|
||||||
使用"poweroff"命令可以关闭系统并关闭计算机的电源。它会对操作系统进行干净的关闭,停止所有进程,然后关闭计算机的电源。这个命令通常用于完全关闭系统并关闭计算机
|
## 2、关机与重启
|
||||||
###### shutdown
|
|
||||||
"shutdown"命令是一个更灵活的命令,允许用户安排系统关机或指定其他选项。默认情况下,"shutdown"命令会关闭系统并关闭计算机的电源,类似于"poweroff"命令。但是还可以使用"shutdown"命令在特定时间安排关机、向登录用户发送消息或指定延迟关机。
|
Linux 中常见的关机和重启命令有 `halt`、`poweroff`、`reboot`、`shutdown`。
|
||||||
|
在现代系统中,最常用、也最推荐的是 `shutdown`,因为它更灵活、更安全。
|
||||||
|
|
||||||
|
### 2.1 `halt`
|
||||||
|
|
||||||
|
`halt` 会停止系统运行,传统意义上表示“停机”。在不同系统中,具体行为可能受 systemd 或发行版实现影响。
|
||||||
|
|
||||||
|
### 2.2 `poweroff`
|
||||||
|
|
||||||
|
`poweroff` 会关闭系统并尝试关闭电源,常用于真正意义上的关机。
|
||||||
|
|
||||||
|
### 2.3 `reboot`
|
||||||
|
|
||||||
|
`reboot` 用于重启系统。
|
||||||
|
|
||||||
|
### 2.4 `shutdown`
|
||||||
|
|
||||||
|
`shutdown` 是最灵活的关机命令,可以:
|
||||||
|
|
||||||
|
- 立即关机
|
||||||
|
- 定时关机
|
||||||
|
- 定时重启
|
||||||
|
- 向当前登录用户发送提示信息
|
||||||
|
- 取消尚未执行的关机任务
|
||||||
|
|
||||||
|
#### 常见用法
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
shutdown
|
shutdown -h now
|
||||||
|
|
||||||
参数:
|
|
||||||
-r:reboot
|
|
||||||
-h:halt
|
|
||||||
-c:取消
|
|
||||||
|
|
||||||
TIME:
|
|
||||||
now:立刻
|
|
||||||
+#:表示几分钟之后
|
|
||||||
hh:mm 绝对时间表示法
|
|
||||||
```
|
```
|
||||||
### 显示信息
|
|
||||||
|
立即关机。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
shutdown -r now
|
||||||
|
```
|
||||||
|
|
||||||
|
立即重启。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
shutdown -h +10
|
||||||
|
```
|
||||||
|
|
||||||
|
10 分钟后关机。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
shutdown -c
|
||||||
|
```
|
||||||
|
|
||||||
|
取消已经设置的关机或重启任务。
|
||||||
|
|
||||||
|
#### 常用参数
|
||||||
|
|
||||||
|
- `-h`:关机
|
||||||
|
- `-r`:重启
|
||||||
|
- `-c`:取消
|
||||||
|
|
||||||
|
#### 时间格式
|
||||||
|
|
||||||
|
- `now`:立刻执行
|
||||||
|
- `+#`:表示若干分钟后执行,例如 `+10`
|
||||||
|
- `hh:mm`:指定绝对时间,例如 `23:30`
|
||||||
|
|
||||||
|
## 3、终端输出与显示信息
|
||||||
|
|
||||||
|
在 Shell 脚本中,`echo` 经常用于输出提示信息、控制换行、显示彩色文字等。
|
||||||
|
|
||||||
|
### 3.1 `echo` 基本用法
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
echo [-neE] [字符串]
|
echo [-neE] [字符串]
|
||||||
|
|
||||||
command:
|
|
||||||
-E(默认):不支持转义
|
|
||||||
-n:不自动换行
|
|
||||||
-e:启用转义功能
|
|
||||||
\a:发出警告声
|
|
||||||
\b:退格键
|
|
||||||
\c:最后不加上换行符
|
|
||||||
\e:escape
|
|
||||||
\n:换行
|
|
||||||
\r:回车
|
|
||||||
\t:插入tab
|
|
||||||
|
|
||||||
echo -e "\033[44;31;5mMySQL Server Stop...\033[0m"
|
|
||||||
\033 #转换
|
|
||||||
44 #字符背景色
|
|
||||||
31 #字体颜色
|
|
||||||
5m #控制码
|
|
||||||
最后那段 #重置,避免下一行也变色
|
|
||||||
|
|
||||||
字符背景色:
|
|
||||||
40:黑
|
|
||||||
41:红
|
|
||||||
42:绿
|
|
||||||
43:黄
|
|
||||||
44:蓝
|
|
||||||
45:紫
|
|
||||||
46:深绿
|
|
||||||
47:白色
|
|
||||||
|
|
||||||
字符前景色:\033[30m
|
|
||||||
30:黑
|
|
||||||
31:红
|
|
||||||
32:绿
|
|
||||||
33:黄
|
|
||||||
34:蓝
|
|
||||||
35:紫
|
|
||||||
36:深绿
|
|
||||||
37:白色
|
|
||||||
|
|
||||||
控制码:
|
|
||||||
\033[0m:关闭所有属性
|
|
||||||
\033[1m:设置高度
|
|
||||||
\033[4m:下划线
|
|
||||||
\033[5m:闪烁
|
|
||||||
\033[7m:反显
|
|
||||||
\033[8m:消隐
|
|
||||||
```
|
```
|
||||||
### 命令行扩展
|
|
||||||
单引号:强引用,六亲不认
|
|
||||||
双引号:弱引用,不能识别命令,但能识别变量
|
|
||||||
反向单引号:里面的内容必须是能执行的命令
|
|
||||||
$():在子shell 里执行命令
|
|
||||||
{}可以实现打印重复字符串,如{1..10}
|
|
||||||
### 命令补全
|
|
||||||
需要安装:bash-completion
|
|
||||||
### 命令历史(history)
|
|
||||||
当执行命令后,系统会默认在内存记录执行过的命令,当用户正常退出的时候,会将内存的命令历史存放到对应的历史文件中,默认是~/.bash_history,登录的时候,会读取命令历史文件中的命令加载到内存中,方便用户通过他来重复执行命令,提高输入效率
|
|
||||||
**参数:**
|
|
||||||
|
|
||||||
- -c:清空历史命令
|
### 3.2 常用参数
|
||||||
- -d:删除第x条数据
|
|
||||||
- n:显示最近的n条历史
|
|
||||||
|
|
||||||
**相关环境变量:**
|
- `-E`:默认值,不解析转义字符
|
||||||
|
- `-n`:输出结束后不自动换行
|
||||||
|
- `-e`:启用转义字符解析
|
||||||
|
|
||||||
|
### 3.3 常见转义字符
|
||||||
|
|
||||||
|
- `\a`:发出提示音
|
||||||
|
- `\b`:退格
|
||||||
|
- `\c`:输出后不换行
|
||||||
|
- `\e`:Escape 字符
|
||||||
|
- `\n`:换行
|
||||||
|
- `\r`:回车
|
||||||
|
- `\t`:Tab
|
||||||
|
|
||||||
|
### 3.4 彩色输出示例
|
||||||
|
|
||||||
- HISTSIZE:命令历史记录的条数
|
|
||||||
- HISTFILE:指定历史文件
|
|
||||||
- HISTFILESIZE:命令历史文件记录历史的条数
|
|
||||||
- HISTTIMEFORMAT:指定命令的格式,建议“%F %T `whoami` ”
|
|
||||||
- HISTCONTROL:控制历史命令的记录方式
|
|
||||||
- ignoredups:默认值,忽略连续且重复的命令
|
|
||||||
- ignorespace:忽略所有已空白开头的命令
|
|
||||||
- ignoreboth:相当于上面两个
|
|
||||||
- erasedups:删除重复命令
|
|
||||||
```shell
|
```shell
|
||||||
HISTTIMEFORMAT="%F %T `whoami` $(who | awk '{ print $5 }' | awk -F '[()]' '{print $2}') "
|
echo -e "\033[44;31;5mMySQL Server Stop...\033[0m"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
这段输出的含义:
|
||||||
|
|
||||||
|
- `\033`:转义开始
|
||||||
|
- `44`:背景色为蓝色
|
||||||
|
- `31`:前景色为红色
|
||||||
|
- `5`:闪烁效果
|
||||||
|
- `\033[0m`:恢复默认显示,避免影响后续输出
|
||||||
|
|
||||||
|
### 3.5 常见颜色代码
|
||||||
|
|
||||||
|
#### 背景色
|
||||||
|
|
||||||
|
- `40`:黑
|
||||||
|
- `41`:红
|
||||||
|
- `42`:绿
|
||||||
|
- `43`:黄
|
||||||
|
- `44`:蓝
|
||||||
|
- `45`:紫
|
||||||
|
- `46`:青
|
||||||
|
- `47`:白
|
||||||
|
|
||||||
|
#### 前景色
|
||||||
|
|
||||||
|
- `30`:黑
|
||||||
|
- `31`:红
|
||||||
|
- `32`:绿
|
||||||
|
- `33`:黄
|
||||||
|
- `34`:蓝
|
||||||
|
- `35`:紫
|
||||||
|
- `36`:青
|
||||||
|
- `37`:白
|
||||||
|
|
||||||
|
#### 控制码
|
||||||
|
|
||||||
|
- `0`:关闭所有属性
|
||||||
|
- `1`:高亮
|
||||||
|
- `4`:下划线
|
||||||
|
- `5`:闪烁
|
||||||
|
- `7`:反显
|
||||||
|
- `8`:消隐
|
||||||
|
|
||||||
|
## 4、命令行扩展与引用
|
||||||
|
|
||||||
|
这一部分属于 Shell 的基础知识,平时写命令和脚本时会经常用到。
|
||||||
|
|
||||||
|
### 4.1 单引号
|
||||||
|
|
||||||
|
```shell
|
||||||
|
echo '$HOME'
|
||||||
|
```
|
||||||
|
|
||||||
|
单引号是**强引用**,里面的内容基本原样输出,不会解析变量,也不会执行命令替换。
|
||||||
|
|
||||||
|
### 4.2 双引号
|
||||||
|
|
||||||
|
```shell
|
||||||
|
echo "$HOME"
|
||||||
|
```
|
||||||
|
|
||||||
|
双引号是**弱引用**,会解析变量,但不会把普通文本当命令执行。
|
||||||
|
|
||||||
|
### 4.3 反引号
|
||||||
|
|
||||||
|
```shell
|
||||||
|
echo `date`
|
||||||
|
```
|
||||||
|
|
||||||
|
反引号表示命令替换,里面必须是可执行命令。不过现在更推荐使用 `$()`,可读性更好。
|
||||||
|
|
||||||
|
### 4.4 `$()`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
echo $(date)
|
||||||
|
```
|
||||||
|
|
||||||
|
作用和反引号类似,表示先执行命令,再把结果嵌入当前命令。
|
||||||
|
|
||||||
|
### 4.5 花括号扩展
|
||||||
|
|
||||||
|
```shell
|
||||||
|
echo {1..10}
|
||||||
|
```
|
||||||
|
|
||||||
|
输出结果:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
1 2 3 4 5 6 7 8 9 10
|
||||||
|
```
|
||||||
|
|
||||||
|
花括号扩展常用于批量生成字符串、文件名或序列。
|
||||||
|
|
||||||
|
## 5、命令补全
|
||||||
|
|
||||||
|
Bash 可以通过 Tab 键进行命令补全、路径补全、参数补全。
|
||||||
|
|
||||||
|
如果希望有更丰富的补全能力,通常需要安装:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
bash-completion
|
||||||
|
```
|
||||||
|
|
||||||
|
安装后,很多命令可以直接通过 Tab 获得更智能的补全提示。
|
||||||
|
|
||||||
|
## 6、命令历史 `history`
|
||||||
|
|
||||||
|
Linux 会记录用户执行过的命令,方便重复执行、排查问题和审计操作。
|
||||||
|
|
||||||
|
一般流程如下:
|
||||||
|
|
||||||
|
- 当前会话中的历史命令先保存在内存中
|
||||||
|
- 正常退出 Shell 时,再写入历史文件
|
||||||
|
- 登录新的 Shell 时,再从历史文件中读取回来
|
||||||
|
|
||||||
|
默认历史文件通常是:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
~/.bash_history
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.1 常用参数
|
||||||
|
|
||||||
|
- `history`:查看历史命令
|
||||||
|
- `history 10`:查看最近 10 条历史命令
|
||||||
|
- `history -c`:清空历史命令
|
||||||
|
- `history -d 100`:删除第 100 条历史记录
|
||||||
|
|
||||||
|
### 6.2 常见环境变量
|
||||||
|
|
||||||
|
- `HISTSIZE`:内存中保留的历史记录条数
|
||||||
|
- `HISTFILE`:历史文件路径
|
||||||
|
- `HISTFILESIZE`:历史文件中保留的历史记录条数
|
||||||
|
- `HISTTIMEFORMAT`:设置历史命令显示时间格式
|
||||||
|
- `HISTCONTROL`:控制哪些命令会被记录
|
||||||
|
|
||||||
|
### 6.3 `HISTCONTROL` 常见取值
|
||||||
|
|
||||||
|
- `ignoredups`:忽略连续重复命令
|
||||||
|
- `ignorespace`:忽略以空格开头的命令
|
||||||
|
- `ignoreboth`:相当于同时启用前两者
|
||||||
|
- `erasedups`:删除重复命令,只保留最新一条
|
||||||
|
|
||||||
|
### 6.4 时间格式示例
|
||||||
|
|
||||||
|
```shell
|
||||||
|
HISTTIMEFORMAT="%F %T "
|
||||||
|
```
|
||||||
|
|
||||||
|
如果你希望 `history` 命令显示执行时间,可以先设置这个变量。
|
||||||
|
|
||||||
|
## 7、小结
|
||||||
|
|
||||||
|
- `arch`、`uname -r`、`cat /etc/os-release` 常用于查看系统基本信息
|
||||||
|
- `shutdown` 是最常用、最灵活的关机和重启命令
|
||||||
|
- `echo -e` 可以输出带转义字符或颜色效果的文本
|
||||||
|
- 单引号、双引号、反引号、`$()` 是 Shell 中非常基础的内容
|
||||||
|
- `history` 可以帮助你提高操作效率,也有助于问题排查和审计
|
||||||
|
|
||||||
|
这篇内容属于 Linux 日常运维和 Shell 入门都非常常见的基础知识。
|
||||||
@ -1,109 +1,201 @@
|
|||||||
# Linux RAID详解
|
## 1、RAID 概览
|
||||||
RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)是一种通过将多个磁盘组合在一起来提高数据存储性能和可靠性的技术。通俗的讲就是把多块硬盘组成一个独立的磁盘阵列进行管理。RAID 可以将多个磁盘组合成一个逻辑卷,从而提供更高的数据吞吐量、更好的数据保护和更高的可用性。
|
|
||||||
## RAID等级介绍
|
RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)是一种把多块磁盘组合起来使用的技术,目的是在**性能、容量、可靠性**之间做平衡。
|
||||||
RAID 技术有多种不同的级别,每种级别都有不同的优点和缺点。以下是常见的 RAID 级别及其特点:
|
|
||||||
### RAID 0
|
常见目标:
|
||||||
RAID 0 是一种将多个磁盘组合在一起来提高数据存储性能的技术。RAID 0 不提供数据冗余,因此如果其中一个磁盘故障,所有数据都将丢失。RAID 0 的主要优点是可以提供更高的数据吞吐量和更快的读写速度。
|
|
||||||
### RAID 1
|
- 提升读写性能
|
||||||
RAID 1 是一种将多个磁盘组合在一起来提高数据存储可靠性的技术。RAID 1 将数据复制到多个磁盘上,从而提供数据冗余和更高的可用性。如果其中一个磁盘故障,系统可以从其他磁盘中恢复数据。RAID 1 的主要优点是提供更高的数据可靠性和更好的数据保护。
|
- 提高数据可靠性
|
||||||
### RAID 5
|
- 提供故障容忍能力
|
||||||
RAID 5 是一种将多个磁盘组合在一起来提高数据存储性能和可靠性的技术。RAID 5 将数据分散存储在多个磁盘上,并使用奇偶校验码来检测和纠正数据错误。如果其中一个磁盘故障,系统可以使用奇偶校验码从其他磁盘中恢复数据。RAID 5 的主要优点是提供更高的数据可靠性和更好的数据保护。
|
|
||||||
### RAID 6
|
需要注意:**RAID 不是备份**。即使做了 RAID,仍然需要独立备份策略。
|
||||||
RAID 6 是一种将多个磁盘组合在一起来提高数据存储性能和可靠性的技术。RAID 6 类似于 RAID 5,但使用两个奇偶校验码来检测和纠正数据错误。如果其中两个磁盘故障,系统可以使用奇偶校验码从其他磁盘中恢复数据。RAID 6 的主要优点是提供更高的数据可靠性和更好的数据保护。
|
|
||||||
### RAID 10
|
## 2、常见 RAID 级别
|
||||||
RAID 10 是一种将多个磁盘组合在一起来提高数据存储性能和可靠性的技术。RAID 10 将多个 RAID 1 组合在一起,从而提供更高的数据吞吐量和更好的数据保护。RAID 10 的主要优点是提供更高的数据可靠性和更好的数据保护。
|
|
||||||
### 等级总结
|
### 2.1 RAID 0
|
||||||
| | 介绍 | 所需硬盘及容量 | 性能及安全 | 应用场景 |
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 条带化写入
|
||||||
|
- 读写性能高
|
||||||
|
- 无冗余
|
||||||
|
- 任意一块盘坏掉,数据整体丢失
|
||||||
|
|
||||||
|
适合:
|
||||||
|
|
||||||
|
- 临时数据
|
||||||
|
- 对性能要求高、对安全性要求不高的场景
|
||||||
|
|
||||||
|
### 2.2 RAID 1
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 镜像
|
||||||
|
- 数据写入两份
|
||||||
|
- 安全性高
|
||||||
|
- 成本较高,容量利用率低
|
||||||
|
|
||||||
|
适合:
|
||||||
|
|
||||||
|
- 对可靠性要求较高的系统盘或小型关键业务盘
|
||||||
|
|
||||||
|
### 2.3 RAID 5
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 条带化 + 单校验
|
||||||
|
- 至少需要 3 块盘
|
||||||
|
- 可容忍 1 块盘故障
|
||||||
|
- 读性能较好,写性能受校验影响
|
||||||
|
|
||||||
|
适合:
|
||||||
|
|
||||||
|
- 兼顾容量和可靠性的通用场景
|
||||||
|
|
||||||
|
### 2.4 RAID 6
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 双校验
|
||||||
|
- 至少需要 4 块盘
|
||||||
|
- 可容忍 2 块盘故障
|
||||||
|
- 安全性更高,但写入开销更大
|
||||||
|
|
||||||
|
适合:
|
||||||
|
|
||||||
|
- 大容量存储、对容错要求较高的场景
|
||||||
|
|
||||||
|
### 2.5 RAID 10
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- RAID 1 + RAID 0 的组合
|
||||||
|
- 兼顾性能和可靠性
|
||||||
|
- 容量利用率通常约为一半
|
||||||
|
- 成本较高
|
||||||
|
|
||||||
|
适合:
|
||||||
|
|
||||||
|
- 数据库、高并发业务、性能和安全性都重要的场景
|
||||||
|
|
||||||
|
## 3、RAID 级别对比
|
||||||
|
|
||||||
|
| 级别 | 最少磁盘数 | 容量利用率 | 容错能力 | 性能特点 |
|
||||||
| --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- |
|
||||||
| RAID 0 | 把连续的数据分成几份,然后分散存储到阵列中的各个硬盘上。其中任何一个磁盘故障,都会导致数据丢失 | 最少一块硬盘;容量为所有硬盘容量的和 | 读写性能高,随机写性能高,无冗余,无热备,无容错性,安全性低 | 无故障的迅速读写,要求安全性不高的使用场景 |
|
| RAID 0 | 2 | 高 | 无 | 读写快 |
|
||||||
| RAID 1 | 把相同的数据分别写入阵列中的每一块磁盘中,最大限度的保证用户数据的可用性和可修复性。缺点是存储成本高 | 2n块硬盘,容量是总容量的一半 | 读写性能低,随机写性能低,利用复制进行冗余,有热备,可容错,安全性高 | 随机数据写入,要求安全性高,如服务器、数据库存储领域 |
|
| RAID 1 | 2 | 低 | 可坏 1 块(镜像组内) | 读较好,写一般 |
|
||||||
| RAID 5 | 是一种存储性能、数据安全和存储成本兼顾的存储方案,也可理解为是RAID 0和RAID 1的折衷方案。其原理是把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。相对于RAID 0,只是多了一个奇偶校验信息 | 3块或更多的硬盘,容量为(n-1)/n,n为磁盘数量 | 随机和连续写性能低,读性能高,利用奇偶校验进行冗余,可容错,安全性高 | 随机数据传输要求安全性高,如金融、数据库、存储等 |
|
| RAID 5 | 3 | 较高 | 可坏 1 块 | 读好,写有校验开销 |
|
||||||
| RAID 10 | 兼顾存储性能和数据安全,提供了与RAID 1一样的数据安全保障,同时具备与RAID 0近似的存储性能。缺点是存储成本高 | 4n块硬盘,容量为总量的一半 | 读写性能适中,利用复制进行冗余,可容错,安全高 | 适于于要求存取数据量大,安全性高,如银行、金融等领域 |
|
| RAID 6 | 4 | 中等 | 可坏 2 块 | 安全高,写更慢 |
|
||||||
|
| RAID 10 | 4 | 低 | 较好 | 性能和可靠性都不错 |
|
||||||
|
|
||||||
|
## 4、硬 RAID 与软 RAID
|
||||||
|
|
||||||
## RAID区别
|
### 4.1 硬 RAID
|
||||||
RAID 分为硬RAID(RAID卡)软RAID(软件实现的,没啥特殊需求就别用了,软件始终没有硬件稳定)
|
|
||||||
硬RAID就不解释了,主要在服务器等物理设备上体现,RAID卡等,本次主要介绍并实现下软RAID(没啥大病真的别用)
|
由 RAID 卡等硬件完成管理。
|
||||||
## 软RAID
|
|
||||||
`mdadm`是linux下用于创建和管理软件RAID的命令,是一个模式化命令。但由于现在服务器一般都带有RAID阵列卡,并且RAID阵列卡也很廉价,且由于软件RAID的自身缺陷(不能用作启动分区、使用CPU实现,降低CPU利用率),因此在生产环境下并不适用。但为了学习和了解RAID原理和管理,因此仍然进行一个详细的讲解:
|
特点:
|
||||||
### mdadm命令语法
|
|
||||||
`mdadm [mode] <raiddevice> [options] <component-devices>`
|
- 对操作系统更透明
|
||||||
常用选项说明
|
- 稳定性通常更强
|
||||||
|
- 常见于物理服务器
|
||||||
|
|
||||||
|
### 4.2 软 RAID
|
||||||
|
|
||||||
|
由操作系统通过软件实现,Linux 中常用工具是 `mdadm`。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 成本低
|
||||||
|
- 学习和实验方便
|
||||||
|
- 依赖系统资源
|
||||||
|
|
||||||
|
生产中是否使用软 RAID,要根据业务、硬件条件和运维能力综合判断。
|
||||||
|
|
||||||
|
## 5、`mdadm` 命令
|
||||||
|
|
||||||
|
`mdadm` 是 Linux 下管理软 RAID 的核心工具。
|
||||||
|
|
||||||
|
### 5.1 基本语法
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mdadm [mode] <raiddevice> [options] <component-devices>
|
||||||
```
|
```
|
||||||
模式:
|
|
||||||
创建: -C
|
|
||||||
装配:-A
|
|
||||||
监控:-F
|
|
||||||
管理:-f, -r, -a
|
|
||||||
<raiddevice>: /dev/md#
|
|
||||||
<component-devices> :任意块设备
|
|
||||||
-C:创建模式
|
|
||||||
-n #:使用#个块设备来创建此RAID
|
|
||||||
-l #:指明要创建的RAID的级别
|
|
||||||
-a {yes / no}:自动创建目标RAID设备的设备文件
|
|
||||||
-c CHUNK_SIZE:指明块大小,单位k
|
|
||||||
-x #:指明空闲盘的个数
|
|
||||||
-D:显示raid的详细信息
|
|
||||||
mdadm -D / dev / md#
|
|
||||||
|
|
||||||
管理模式:
|
### 5.2 常见模式和选项
|
||||||
-f:标记指定磁盘为损坏
|
|
||||||
-a:添加磁盘
|
|
||||||
-r:移除磁盘
|
|
||||||
|
|
||||||
观察md的状态:
|
- `-C`:创建 RAID
|
||||||
|
- `-A`:装配 RAID
|
||||||
|
- `-D`:查看详细信息
|
||||||
|
- `-f`:标记某块盘故障
|
||||||
|
- `-r`:移除磁盘
|
||||||
|
- `-a`:添加磁盘
|
||||||
|
- `-n`:指定 RAID 成员盘数量
|
||||||
|
- `-l`:指定 RAID 级别
|
||||||
|
- `-x`:指定热备盘数量
|
||||||
|
|
||||||
|
### 5.3 查看状态
|
||||||
|
|
||||||
|
```shell
|
||||||
cat /proc/mdstat
|
cat /proc/mdstat
|
||||||
```
|
```
|
||||||
### 详细操作
|
|
||||||
#### 创建 RAID 设备
|
## 6、常见操作示例
|
||||||
要创建一个新的 RAID 设备,可以使用以下命令:
|
|
||||||
```
|
### 6.1 创建 RAID 1
|
||||||
|
|
||||||
|
```shell
|
||||||
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
|
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
|
||||||
```
|
```
|
||||||
该命令将创建一个名为 /dev/md0 的 RAID 1 设备,使用 /dev/sda1 和 /dev/sdb1 两个磁盘作为 RAID 设备。
|
|
||||||
#### 格式化RAID设备
|
### 6.2 格式化 RAID 设备
|
||||||
```
|
|
||||||
|
```shell
|
||||||
mkfs.xfs /dev/md0
|
mkfs.xfs /dev/md0
|
||||||
```
|
```
|
||||||
#### 查看 RAID 设备信息
|
|
||||||
要查看当前系统中的 RAID 设备信息,可以使用以下命令:
|
### 6.3 查看 RAID 详细信息
|
||||||
```
|
|
||||||
mdadm --detail --scan
|
```shell
|
||||||
```
|
mdadm --detail /dev/md0
|
||||||
该命令将显示当前系统中所有的 RAID 设备信息。
|
|
||||||
#### 添加磁盘到 RAID 设备
|
|
||||||
要将一个新的磁盘添加到一个 RAID 设备中,可以使用以下命令:
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 6.4 添加磁盘
|
||||||
|
|
||||||
|
```shell
|
||||||
mdadm --add /dev/md0 /dev/sdc1
|
mdadm --add /dev/md0 /dev/sdc1
|
||||||
```
|
```
|
||||||
该命令将将 /dev/sdc1 磁盘添加到名为 /dev/md0 的 RAID 设备中。
|
|
||||||
#### 删除 RAID 设备中的磁盘
|
### 6.5 移除磁盘
|
||||||
要从一个 RAID 设备中删除一个磁盘,可以使用以下命令:
|
|
||||||
```
|
```shell
|
||||||
mdadm --remove /dev/md0 /dev/sdc1
|
mdadm --remove /dev/md0 /dev/sdc1
|
||||||
```
|
```
|
||||||
该命令将从名为 /dev/md0 的 RAID 设备中删除 /dev/sdc1 磁盘。
|
|
||||||
#### 替换 RAID 设备中的磁盘
|
### 6.6 停止 RAID
|
||||||
要替换一个 RAID 设备中的磁盘,可以使用以下命令:
|
|
||||||
```
|
```shell
|
||||||
mdadm --replace /dev/md0 /dev/sdc1
|
|
||||||
```
|
|
||||||
该命令将将 /dev/sdc1 磁盘替换名为 /dev/md0 的 RAID 设备中的故障磁盘。
|
|
||||||
#### 监视 RAID 设备状态
|
|
||||||
要监视 RAID 设备的状态,可以使用以下命令:
|
|
||||||
```
|
|
||||||
mdadm --monitor --scan
|
|
||||||
```
|
|
||||||
该命令将启动一个 mdadm 进程,用于监视系统中所有 RAID 设备的状态。
|
|
||||||
#### 停止RAID设备
|
|
||||||
```
|
|
||||||
mdadm -S /dev/md0
|
mdadm -S /dev/md0
|
||||||
```
|
```
|
||||||
#### 激活RAID设备
|
|
||||||
```
|
### 6.7 清理 RAID 元数据
|
||||||
mdadm -A -s /dev/md0
|
|
||||||
```
|
```shell
|
||||||
#### 删除raid信息
|
|
||||||
```
|
|
||||||
mdadm --zero-superblock /dev/sdb1
|
mdadm --zero-superblock /dev/sdb1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 7、常见运维注意点
|
||||||
|
|
||||||
|
- RAID 不是备份,重要数据仍需独立备份
|
||||||
|
- RAID 重建期间性能可能下降
|
||||||
|
- RAID 5/6 在大容量盘上重建时间可能较长
|
||||||
|
- 对系统盘、数据库盘、归档盘要根据业务特点选择不同 RAID 级别
|
||||||
|
- 动手前一定要确认设备名,避免误清盘
|
||||||
|
|
||||||
|
## 8、小结
|
||||||
|
|
||||||
|
- RAID 用于平衡性能、容量和可靠性
|
||||||
|
- RAID 0 快但不安全,RAID 1 安全但成本高
|
||||||
|
- RAID 5/6 适合做冗余存储,RAID 10 兼顾性能与可靠性
|
||||||
|
- Linux 软 RAID 的核心工具是 `mdadm`
|
||||||
|
- 做 RAID 前先明确业务目标:要性能、要容量,还是要容错
|
||||||
|
|||||||
@ -1,93 +1,178 @@
|
|||||||
# Linux LVM详解
|
## 1、LVM 概览
|
||||||
LVM(Logical Volume Manager)是一种用于管理磁盘分区和卷的技术。LVM 可以将多个物理磁盘分区组合成一个或多个逻辑卷,并提供动态调整卷大小、备份和恢复等功能。(也不建议使用,之前有遇到朋友购买的云服务器使用LVM管理多块云硬盘,忘记之后把其中一块云硬盘给删除了。。。)
|
|
||||||
## LVM 的主要概念和组件
|
LVM(Logical Volume Manager,逻辑卷管理)用于在 Linux 中更灵活地管理磁盘空间。
|
||||||
物理卷(Physical Volume,PV):物理卷是指一个或多个物理磁盘分区,可以使用 LVM 命令将其初始化为物理卷。
|
|
||||||
卷组(Volume Group,VG):卷组是由一个或多个物理卷组成的逻辑卷集合,可以使用 LVM 命令创建和管理卷组。
|
相比传统分区,LVM 的优势在于:
|
||||||
逻辑卷(Logical Volume,LV):逻辑卷是由卷组分配的逻辑磁盘,可以使用 LVM 命令创建和管理逻辑卷。
|
|
||||||
物理区(Physical Extent,PE):物理区是指物理卷和逻辑卷的最小存储单元,通常为 4MB 或 8MB。
|
- 可以把多块磁盘组合成一个逻辑空间
|
||||||
## LVM 常用的命令及其功能
|
- 可以更灵活地扩容和缩容
|
||||||
### 创建物理卷
|
- 更适合做在线扩容、统一存储管理
|
||||||
要创建一个新的物理卷,可以使用以下命令:
|
|
||||||
```
|
不过,LVM 也会增加一定的复杂度,实际生产中要根据业务场景使用。
|
||||||
|
|
||||||
|
## 2、LVM 核心概念
|
||||||
|
|
||||||
|
### 2.1 PV:物理卷
|
||||||
|
|
||||||
|
Physical Volume,物理卷。
|
||||||
|
|
||||||
|
可以理解为:把磁盘分区或整块磁盘初始化成 LVM 可识别的底层存储单元。
|
||||||
|
|
||||||
|
### 2.2 VG:卷组
|
||||||
|
|
||||||
|
Volume Group,卷组。
|
||||||
|
|
||||||
|
把一个或多个 PV 组合起来,形成一个大的存储池。
|
||||||
|
|
||||||
|
### 2.3 LV:逻辑卷
|
||||||
|
|
||||||
|
Logical Volume,逻辑卷。
|
||||||
|
|
||||||
|
从卷组里切分出来给文件系统使用的逻辑设备。
|
||||||
|
|
||||||
|
### 2.4 PE:物理扩展单元
|
||||||
|
|
||||||
|
Physical Extent,物理扩展单元。
|
||||||
|
|
||||||
|
是 LVM 中分配空间时的最小单位,通常是若干 MB。
|
||||||
|
|
||||||
|
## 3、LVM 的基本关系
|
||||||
|
|
||||||
|
可以把它理解成:
|
||||||
|
|
||||||
|
- **磁盘/分区** 先做成 **PV**
|
||||||
|
- 多个 **PV** 组成 **VG**
|
||||||
|
- 从 **VG** 中划分出 **LV**
|
||||||
|
- 再把 **LV** 格式化并挂载给系统使用
|
||||||
|
|
||||||
|
## 4、物理卷管理
|
||||||
|
|
||||||
|
### 4.1 创建物理卷
|
||||||
|
|
||||||
|
```shell
|
||||||
pvcreate /dev/sdb1
|
pvcreate /dev/sdb1
|
||||||
```
|
```
|
||||||
该命令将初始化 /dev/sdb1 分区为一个新的物理卷。
|
|
||||||
### 查看物理卷
|
### 4.2 查看物理卷
|
||||||
扫描系统中所有硬盘的物理卷列表
|
|
||||||
```
|
```shell
|
||||||
pvscan
|
pvscan
|
||||||
```
|
|
||||||
### 删除物理卷
|
|
||||||
删除物理卷 `pvremove(选项)(参数)`
|
|
||||||
```
|
|
||||||
pvremove /dev/sdb1
|
|
||||||
```
|
|
||||||
### 显示物理卷属性
|
|
||||||
`pvdisplay`用于显示物理卷的属性。`pvdisplay`命令显示的物理卷信息包括:物理卷名称、所属的卷组、物理卷大小、PE大小、总PE数、可用PE数、已分配的PE数和UUID。
|
|
||||||
```
|
|
||||||
pvdisplay /dev/sdb1
|
pvdisplay /dev/sdb1
|
||||||
```
|
```
|
||||||
### 创建卷组
|
|
||||||
要创建一个新的卷组,可以使用以下命令:
|
### 4.3 删除物理卷
|
||||||
|
|
||||||
|
```shell
|
||||||
|
pvremove /dev/sdb1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 5、卷组管理
|
||||||
|
|
||||||
|
### 5.1 创建卷组
|
||||||
|
|
||||||
|
```shell
|
||||||
vgcreate myvg /dev/sdb1 /dev/sdc1
|
vgcreate myvg /dev/sdb1 /dev/sdc1
|
||||||
```
|
```
|
||||||
该命令将创建一个名为 myvg 的卷组,并将 /dev/sdb1 和 /dev/sdc1 分区添加到卷组中。
|
|
||||||
### 从卷组中删除物理卷
|
### 5.2 查看卷组
|
||||||
`vgreduce`命令,通过删除LVM卷组中的物理卷来减少卷组容量。不能删除LVM卷组中剩余的最后一个物理卷。
|
|
||||||
```
|
```shell
|
||||||
vgreduce myvg /dev/sdb1
|
|
||||||
```
|
|
||||||
### 删除卷组
|
|
||||||
`vgremove命令`用于用户删除LVM卷组。当要删除的卷组上已经创建了逻辑卷时,`vgremove`命令需要进行确认删除,防止误删除数据
|
|
||||||
```
|
|
||||||
vgremove myvg
|
|
||||||
```
|
|
||||||
### 卷组重命名
|
|
||||||
**grename命令** 可以重命名卷组的名称。
|
|
||||||
语法:`vgrename [选项] [旧卷组路径|旧卷组名称|旧卷组UUID] [新卷组路径|新卷组名称]`
|
|
||||||
```
|
|
||||||
vgrename /dev/vg1 /dev/vg2
|
|
||||||
```
|
|
||||||
### 查看所有卷组
|
|
||||||
扫描并显示系统中的卷组
|
|
||||||
```
|
|
||||||
vgscan
|
vgscan
|
||||||
```
|
|
||||||
### 显示卷组详细信息
|
|
||||||
`vgdisplay`命令用于显示LVM卷组的信息。如果不指定"卷组"参数,则分别显示所有卷组的属性。
|
|
||||||
```
|
|
||||||
vgdisplay myvg
|
vgdisplay myvg
|
||||||
```
|
```
|
||||||
### 创建逻辑卷
|
|
||||||
要创建一个新的逻辑卷,可以使用以下命令:
|
### 5.3 从卷组中移除物理卷
|
||||||
|
|
||||||
|
```shell
|
||||||
|
vgreduce myvg /dev/sdb1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 5.4 删除卷组
|
||||||
|
|
||||||
|
```shell
|
||||||
|
vgremove myvg
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.5 重命名卷组
|
||||||
|
|
||||||
|
```shell
|
||||||
|
vgrename myvg newvg
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6、逻辑卷管理
|
||||||
|
|
||||||
|
### 6.1 创建逻辑卷
|
||||||
|
|
||||||
|
```shell
|
||||||
lvcreate -L 10G -n mylv myvg
|
lvcreate -L 10G -n mylv myvg
|
||||||
```
|
```
|
||||||
该命令将创建一个名为 mylv 的逻辑卷,大小为 10GB,分配给 myvg 卷组。
|
|
||||||
### 扩展逻辑卷
|
### 6.2 查看逻辑卷
|
||||||
要扩展一个现有的逻辑卷,可以使用以下命令:
|
|
||||||
|
```shell
|
||||||
|
lvscan
|
||||||
|
lvdisplay /dev/myvg/mylv
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 6.3 扩容逻辑卷
|
||||||
|
|
||||||
|
```shell
|
||||||
lvextend -L +5G /dev/myvg/mylv
|
lvextend -L +5G /dev/myvg/mylv
|
||||||
```
|
```
|
||||||
该命令将将 /dev/myvg/mylv 逻辑卷的大小增加 5GB。
|
|
||||||
### 缩小逻辑卷
|
扩容后,通常还需要继续扩展文件系统。
|
||||||
要缩小一个现有的逻辑卷,可以使用以下命令:
|
|
||||||
```
|
### 6.4 缩容逻辑卷
|
||||||
|
|
||||||
|
```shell
|
||||||
lvreduce -L -5G /dev/myvg/mylv
|
lvreduce -L -5G /dev/myvg/mylv
|
||||||
```
|
```
|
||||||
该命令将将 /dev/myvg/mylv 逻辑卷的大小减少 5GB。
|
|
||||||
### 查看所有逻辑卷
|
**缩容风险较高**,必须先确认文件系统支持、先备份数据,并严格按步骤操作。
|
||||||
```
|
|
||||||
lvscanx
|
### 6.5 删除逻辑卷
|
||||||
```
|
|
||||||
### 删除逻辑卷
|
```shell
|
||||||
`lvremove命令`用于删除指定LVM逻辑卷。如果逻辑卷已经使用`mount`命令加载,则不能使用`lvremove`命令删除。必须使用`umount`命令卸载后,逻辑卷方可被删除。
|
lvremove /dev/myvg/mylv
|
||||||
```
|
|
||||||
lvremove /dev/vg1000/lvol0
|
|
||||||
```
|
|
||||||
### 查看逻辑卷详细信息
|
|
||||||
`lvdisplay命令` 用于显示LVM逻辑卷空间大小、读写状态和快照信息等属性。如果省略"逻辑卷"参数,则`lvdisplay`命令显示所有的逻辑卷属性。否则,仅显示指定的逻辑卷属性。
|
|
||||||
```
|
|
||||||
lvdisplay /dev/vg1000/lvol0
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
删除前如果已经挂载,通常要先卸载。
|
||||||
|
|
||||||
|
## 7、典型使用流程
|
||||||
|
|
||||||
|
### 7.1 新建 LVM 存储
|
||||||
|
|
||||||
|
常见步骤:
|
||||||
|
|
||||||
|
1. 分区或准备磁盘
|
||||||
|
2. `pvcreate`
|
||||||
|
3. `vgcreate`
|
||||||
|
4. `lvcreate`
|
||||||
|
5. `mkfs`
|
||||||
|
6. `mount`
|
||||||
|
7. 写入 `/etc/fstab`
|
||||||
|
|
||||||
|
### 7.2 逻辑卷扩容
|
||||||
|
|
||||||
|
常见步骤:
|
||||||
|
|
||||||
|
1. 确认 VG 还有剩余空间
|
||||||
|
2. `lvextend`
|
||||||
|
3. 扩展文件系统,例如 `resize2fs` 或 `xfs_growfs`
|
||||||
|
4. 再次检查容量是否生效
|
||||||
|
|
||||||
|
## 8、常见运维注意点
|
||||||
|
|
||||||
|
- 扩容通常比缩容安全得多
|
||||||
|
- 缩容前一定要备份数据
|
||||||
|
- 删除 PV、VG、LV 前要先确认是否还在使用
|
||||||
|
- 记清楚设备关系,避免误删底层磁盘
|
||||||
|
- 云服务器场景中,如果 LVM 跨多块盘,删除任意一块底层盘都可能导致卷组异常
|
||||||
|
|
||||||
|
## 9、小结
|
||||||
|
|
||||||
|
- LVM 让磁盘管理更灵活
|
||||||
|
- 核心对象是 `PV`、`VG`、`LV`
|
||||||
|
- `pvcreate`、`vgcreate`、`lvcreate` 是三步基础命令
|
||||||
|
- 扩容逻辑卷后通常还要扩展文件系统
|
||||||
|
- 缩容和删除操作都要格外谨慎
|
||||||
|
|||||||
@ -1,80 +1,149 @@
|
|||||||
redhat:rpm文件,rpm管理器,使用yum、dnf包管理器
|
## 1、软件管理概览
|
||||||
debian:deb文件,dpkg管理器,使用apt包管理器
|
|
||||||
## 1、rpm详解
|
不同 Linux 发行版使用的包格式和包管理工具不同:
|
||||||
rpm 用的很少,都是用的dnf管理器管理
|
|
||||||
1.1 包查询
|
- **Red Hat 系**:`rpm` 包,常用 `yum` / `dnf`
|
||||||
```shell
|
- **Debian 系**:`deb` 包,常用 `dpkg` / `apt`
|
||||||
rpm -q 参数1、
|
|
||||||
参数:
|
日常运维中,更多时候直接使用**高级包管理器**,例如 `dnf` 或 `apt`,而不是手动操作底层包文件。
|
||||||
-a:所有包
|
|
||||||
-f:查看指定的文件由哪个包安装生成
|
## 2、RPM 系软件管理
|
||||||
-l:查看指定的程序包安装后生成的所有文件
|
|
||||||
```
|
### 2.1 `rpm`
|
||||||
## 2、dnf详解
|
|
||||||
现在是dnf的天下,yum代码维护困难,速度差
|
`rpm` 更偏底层,适合:
|
||||||
|
|
||||||
|
- 查询包信息
|
||||||
|
- 查看文件归属
|
||||||
|
- 手动安装本地 rpm 包
|
||||||
|
|
||||||
|
### 2.2 常见查询命令
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
/etc/dnf/dnf.conf #为所有仓库提供的公共配置文件
|
rpm -qa
|
||||||
/etc/yum.repos.d/*.repo #每个仓库的配置文件
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
查看所有已安装软件包。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
gpgcheck=1 #安装包前要做包的合法性和完整性校验
|
rpm -qf /usr/bin/ls
|
||||||
installonly_limit=3 #同事可以安装3个包,最小值为2,如果设置0或1,则不限制
|
|
||||||
clean_requirements_on_remove=True #删除包的时候是否将不再使用的包删除
|
|
||||||
bast=True #升级时,自动选择安装最新版,即使缺少包的依赖
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
查看某个文件由哪个包安装生成。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[仓库名]
|
rpm -ql bash
|
||||||
name=仓库名
|
```
|
||||||
baseurl=仓库位置
|
|
||||||
enabled={1|0}
|
查看某个包安装后包含哪些文件。
|
||||||
gpgcheck={1|0}
|
|
||||||
|
## 3、`dnf` 包管理器
|
||||||
|
|
||||||
|
在新版本 Red Hat 系系统中,`dnf` 是常用包管理器。
|
||||||
|
|
||||||
|
### 3.1 常见配置文件
|
||||||
|
|
||||||
|
```shell
|
||||||
|
/etc/dnf/dnf.conf
|
||||||
|
/etc/yum.repos.d/*.repo
|
||||||
|
```
|
||||||
|
|
||||||
|
- `/etc/dnf/dnf.conf`:全局配置
|
||||||
|
- `/etc/yum.repos.d/*.repo`:仓库配置文件
|
||||||
|
|
||||||
|
### 3.2 常见配置项
|
||||||
|
|
||||||
|
- `gpgcheck=1`:安装前校验软件包签名
|
||||||
|
- `installonly_limit=3`:保留多个内核版本
|
||||||
|
- `clean_requirements_on_remove=True`:删除包时清理无用依赖
|
||||||
|
- `best=True`:优先选择最佳可用版本
|
||||||
|
|
||||||
|
### 3.3 仓库文件常见字段
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[repo-name]
|
||||||
|
name=仓库名称
|
||||||
|
baseurl=仓库地址
|
||||||
|
enabled=1
|
||||||
|
gpgcheck=1
|
||||||
gpgkey=URL
|
gpgkey=URL
|
||||||
```
|
```
|
||||||
## 3、dnf 常用命令
|
|
||||||
##### 3.1 显示仓库列表
|
## 4、`dnf` 常用命令
|
||||||
|
|
||||||
|
### 4.1 查看仓库
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
dnf repolist [all|enbaled|disabled]
|
dnf repolist
|
||||||
dnf repolist -v #显示详细仓库列表
|
dnf repolist all
|
||||||
|
dnf repolist -v
|
||||||
```
|
```
|
||||||
##### 3.2 显示程序包
|
|
||||||
|
### 4.2 查看软件包
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
dnf list [available|installd|updates]
|
dnf list
|
||||||
dnf list 包名
|
dnf list installed
|
||||||
|
dnf list available
|
||||||
|
dnf list updates
|
||||||
|
dnf list nginx
|
||||||
```
|
```
|
||||||
##### 3.3 安装程序包
|
|
||||||
|
### 4.3 安装和重装
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
dnf install 包名
|
dnf install nginx
|
||||||
dnf reinstall 包名
|
dnf reinstall nginx
|
||||||
```
|
```
|
||||||
##### 3.4 只下载相关依赖的包,而不安装
|
|
||||||
|
### 4.4 只下载不安装
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
dnf install nginx --downloadonly --downloaddir=/保存文件夹
|
dnf install nginx --downloadonly --downloaddir=/tmp/pkg
|
||||||
```
|
```
|
||||||
##### 3.5 卸载程序包
|
|
||||||
|
### 4.5 卸载软件
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
dnf remove 包名
|
dnf remove nginx
|
||||||
dnf remove 包名 --purge #删除配置文件
|
|
||||||
```
|
```
|
||||||
##### 3.6 查询
|
|
||||||
|
### 4.6 查询与搜索
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
dnf info 包名
|
dnf info nginx
|
||||||
```
|
dnf search nginx
|
||||||
```shell
|
|
||||||
dnf search 包名
|
|
||||||
```
|
|
||||||
## 4、apt包管理器
|
|
||||||
```shell
|
|
||||||
install:安装
|
|
||||||
remove:卸载
|
|
||||||
purge:卸载并删除配置文件
|
|
||||||
update:刷新存储库索引
|
|
||||||
uograde:升级所有包
|
|
||||||
autoremove:自动删除不需要的包
|
|
||||||
search:搜索
|
|
||||||
show:显示软件包细节
|
|
||||||
list:查看包
|
|
||||||
--installed:已安装
|
|
||||||
--available:可获得
|
|
||||||
--updates:可升级
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 5、APT 包管理器
|
||||||
|
|
||||||
|
Debian / Ubuntu 系统中,常见包管理器是 `apt`。
|
||||||
|
|
||||||
|
### 5.1 常见命令
|
||||||
|
|
||||||
|
- `apt install`:安装
|
||||||
|
- `apt remove`:卸载
|
||||||
|
- `apt purge`:卸载并删除配置文件
|
||||||
|
- `apt update`:刷新软件源索引
|
||||||
|
- `apt upgrade`:升级已安装软件包
|
||||||
|
- `apt autoremove`:删除不再需要的依赖
|
||||||
|
- `apt search`:搜索软件包
|
||||||
|
- `apt show`:查看软件包详情
|
||||||
|
- `apt list --installed`:查看已安装包
|
||||||
|
- `apt list --upgradable`:查看可升级包
|
||||||
|
|
||||||
|
## 6、常见运维建议
|
||||||
|
|
||||||
|
- Red Hat 系优先用 `dnf`,Debian 系优先用 `apt`
|
||||||
|
- 修改仓库配置后,先更新索引再安装软件
|
||||||
|
- 卸载软件前,先确认是否存在依赖关系
|
||||||
|
- 线上环境尽量使用可信仓库并保留 GPG 校验
|
||||||
|
- 排障时可先判断:是仓库问题、依赖问题,还是网络问题
|
||||||
|
|
||||||
|
## 7、小结
|
||||||
|
|
||||||
|
- `rpm` / `deb` 是包格式,`dnf` / `apt` 是更常用的高级管理工具
|
||||||
|
- `rpm` 常用于查询和底层包操作
|
||||||
|
- `dnf` 是 Red Hat 系主流包管理器
|
||||||
|
- `apt` 是 Debian 系主流包管理器
|
||||||
|
- 软件管理重点不只是安装,还包括仓库、依赖、升级和清理
|
||||||
|
|||||||
@ -1,181 +1,207 @@
|
|||||||
## 1、ARP
|
## 1、网络管理概览
|
||||||
- -a # 主机 :显示 arp 缓冲区的所有条目;
|
|
||||||
- -H # 地址类型 :指定 arp 指令使用的地址类型;
|
|
||||||
- -d # 主机 :从 arp 缓冲区中删除指定主机的 arp 条目;
|
|
||||||
- -D # 使用指定接口的硬件地址;
|
|
||||||
- -e # 以 Linux 的显示风格显示 arp 缓冲区中的条目;
|
|
||||||
- -i # 接口 :指定要操作 arp 缓冲区的网络接口;
|
|
||||||
- -s # 主机 MAC 地址 :设置指定的主机的 IP 地址与 MAC 地址的静态映射;
|
|
||||||
- -n # 以数字方式显示 arp 缓冲区中的条目;
|
|
||||||
- -v # 显示详细的 arp 缓冲区条目,包括缓冲区条目的统计信息;
|
|
||||||
- -f # 文件 :设置主机的 IP 地址与 MAC 地址的静态映射。
|
|
||||||
```shell
|
|
||||||
[root@centos ~]#arp -a
|
|
||||||
目标地址 MAC地址 接口
|
|
||||||
? (169.254.0.138) at fe:ee:e4:1e:74:cd [ether] on eth0
|
|
||||||
? (169.254.0.83) at fe:ee:e4:1e:74:cd [ether] on eth0
|
|
||||||
? (169.254.0.15) at fe:ee:e4:1e:74:cd [ether] on eth0
|
|
||||||
```
|
|
||||||
## 2、netstat
|
|
||||||
netstat 命令
|
|
||||||
|
|
||||||
- -t:tcp协议相关
|
Linux 网络管理中,常见关注点包括:
|
||||||
- -u:udp协议相关
|
|
||||||
- -l:监听状态的
|
- 地址解析与邻居表
|
||||||
- -a:所有状态
|
- 端口和连接状态
|
||||||
- -n:显示ip和端口
|
- 路由
|
||||||
- -p:显示进程
|
- 网卡信息
|
||||||
- -I:指定网卡
|
- 网络带宽和连接统计
|
||||||
```shell
|
|
||||||
root@jumpserver:~# netstat -s
|
常用命令包括:`arp`、`ip`、`netstat`、`ss`、`nload` 等。
|
||||||
|
|
||||||
|
## 2、ARP 与邻居信息
|
||||||
|
|
||||||
|
### 2.1 `arp`
|
||||||
|
|
||||||
|
`arp` 用于查看或管理 ARP 缓存表,即 IP 地址和 MAC 地址的映射关系。
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-a`:显示所有 ARP 条目
|
||||||
|
- `-d`:删除指定主机条目
|
||||||
|
- `-i`:指定网卡接口
|
||||||
|
- `-s`:手动添加静态映射
|
||||||
|
- `-n`:以数字形式显示
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
Ip: //与 IP 协议相关的统计信息。
|
|
||||||
Forwarding: 2 //如果该值为 2,表示 IP 转发(路由)已启用。
|
|
||||||
64972 total packets received //接收到的总数据包数量
|
|
||||||
0 forwarded
|
|
||||||
0 incoming packets discarded //成功传递到上层协议(如 TCP 或 UDP)的数据包数量。
|
|
||||||
64972 incoming packets delivered
|
|
||||||
47450 requests sent out
|
|
||||||
20 outgoing packets dropped
|
|
||||||
4 dropped because of missing route
|
|
||||||
Icmp:
|
|
||||||
43 ICMP messages received //
|
|
||||||
0 input ICMP message failed
|
|
||||||
ICMP input histogram:
|
|
||||||
destination unreachable: 43
|
|
||||||
43 ICMP messages sent
|
|
||||||
0 ICMP messages failed
|
|
||||||
ICMP output histogram:
|
|
||||||
destination unreachable: 43
|
|
||||||
IcmpMsg:
|
|
||||||
InType3: 43
|
|
||||||
OutType3: 43
|
|
||||||
Tcp:
|
|
||||||
51 active connection openings //主动打开的 TCP 连接数量(由本机发起)。
|
|
||||||
2992 passive connection openings //被动打开的 TCP 连接数量(由远程机器发起)。
|
|
||||||
0 failed connection attempts
|
|
||||||
66 connection resets received
|
|
||||||
1 connections established
|
|
||||||
64420 segments received
|
|
||||||
47156 segments sent out
|
|
||||||
9 segments retransmitted
|
|
||||||
0 bad segments received
|
|
||||||
76 resets sent
|
|
||||||
Udp:
|
|
||||||
240 packets received
|
|
||||||
41 packets to unknown port received
|
|
||||||
0 packet receive errors
|
|
||||||
284 packets sent
|
|
||||||
0 receive buffer errors
|
|
||||||
0 send buffer errors
|
|
||||||
IgnoredMulti: 228
|
|
||||||
UdpLite:
|
|
||||||
TcpExt:
|
|
||||||
31 TCP sockets finished time wait in fast timer
|
|
||||||
132 delayed acks sent
|
|
||||||
1 delayed acks further delayed because of locked socket
|
|
||||||
Quick ack mode was activated 3438 times
|
|
||||||
13014 packet headers predicted
|
|
||||||
16401 acknowledgments not containing data payload received
|
|
||||||
12784 predicted acknowledgments
|
|
||||||
1 congestion windows recovered without slow start after partial ack
|
|
||||||
TCPLostRetransmit: 3
|
|
||||||
TCPTimeouts: 6
|
|
||||||
TCPLossProbes: 3
|
|
||||||
TCPBacklogCoalesce: 49
|
|
||||||
TCPDSACKOldSent: 3438
|
|
||||||
TCPDSACKRecv: 4
|
|
||||||
2 connections reset due to unexpected data
|
|
||||||
57 connections reset due to early user close
|
|
||||||
TCPDSACKIgnoredNoUndo: 4
|
|
||||||
TCPRcvCoalesce: 852
|
|
||||||
TCPAutoCorking: 17
|
|
||||||
TCPSynRetrans: 2
|
|
||||||
TCPOrigDataSent: 27013
|
|
||||||
TCPDelivered: 26990
|
|
||||||
TcpTimeoutRehash: 6
|
|
||||||
TcpDuplicateDataRehash: 168
|
|
||||||
TCPDSACKRecvSegs: 4
|
|
||||||
IpExt:
|
|
||||||
InBcastPkts: 228
|
|
||||||
InOctets: 20619636
|
|
||||||
OutOctets: 8344373
|
|
||||||
InBcastOctets: 55089
|
|
||||||
InNoECTPkts: 68885
|
|
||||||
InECT0Pkts: 2992
|
|
||||||
MPTcpExt:
|
|
||||||
```
|
|
||||||
```shell
|
```shell
|
||||||
root@jumpserver:~# netstat -n | grep TIME_WAIT | wc -l
|
arp -a
|
||||||
3
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
使用场景:
|
||||||
|
|
||||||
|
- 检查局域网 IP 与 MAC 的对应关系
|
||||||
|
- 排查 ARP 缓存异常
|
||||||
|
|
||||||
|
## 3、连接和端口查看
|
||||||
|
|
||||||
|
### 3.1 `netstat`
|
||||||
|
|
||||||
|
`netstat` 是传统网络统计命令,现在很多场景已被 `ss` 替代,但仍然常见。
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-t`:TCP
|
||||||
|
- `-u`:UDP
|
||||||
|
- `-l`:监听状态
|
||||||
|
- `-a`:所有状态
|
||||||
|
- `-n`:显示数字地址和端口
|
||||||
|
- `-p`:显示进程信息
|
||||||
|
- `-s`:显示协议统计信息
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
root@jumpserver:~# netstat -ntlp
|
netstat -ntlp
|
||||||
Active Internet connections (only servers)
|
|
||||||
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
|
|
||||||
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 874/sshd: /usr/sbin
|
|
||||||
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 672/systemd-resolve
|
|
||||||
tcp6 0 0 :::22 :::* LISTEN 874/sshd: /usr/sbin
|
|
||||||
```
|
```
|
||||||
## 3、nload
|
|
||||||
|
查看当前监听端口及对应进程。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
netstat -n | grep TIME_WAIT | wc -l
|
||||||
|
```
|
||||||
|
|
||||||
|
统计 `TIME_WAIT` 连接数量。
|
||||||
|
|
||||||
|
### 3.2 `ss`
|
||||||
|
|
||||||
|
`ss` 是更现代、更快的套接字查看工具。
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-n`:不解析服务名
|
||||||
|
- `-a`:显示所有套接字
|
||||||
|
- `-l`:显示监听状态
|
||||||
|
- `-p`:显示进程
|
||||||
|
- `-t`:TCP
|
||||||
|
- `-u`:UDP
|
||||||
|
- `-4`:仅 IPv4
|
||||||
|
- `-6`:仅 IPv6
|
||||||
|
- `-m`:显示内存使用
|
||||||
|
- `-i`:显示 TCP 内部信息
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ss -ntlp
|
||||||
|
```
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ss -4 state time-wait | wc -l
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4、网卡与 IP 管理
|
||||||
|
|
||||||
|
### 4.1 `ip a`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ip a
|
||||||
|
```
|
||||||
|
|
||||||
|
用于查看:
|
||||||
|
|
||||||
|
- 网卡名称
|
||||||
|
- IPv4 / IPv6 地址
|
||||||
|
- 网卡状态
|
||||||
|
- MAC 地址
|
||||||
|
|
||||||
|
### 4.2 `ip route`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ip route
|
||||||
|
```
|
||||||
|
|
||||||
|
用于查看当前路由表。
|
||||||
|
|
||||||
|
示例输出通常包含:
|
||||||
|
|
||||||
|
- 默认路由
|
||||||
|
- 直连网段路由
|
||||||
|
- 静态路由
|
||||||
|
|
||||||
|
### 4.3 添加和删除静态路由
|
||||||
|
|
||||||
|
添加:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ip route add 192.168.30.201 via 192.168.30.11 dev ens32
|
||||||
|
```
|
||||||
|
|
||||||
|
删除:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ip route del 192.168.30.201
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4 查看某个目标的路由路径
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ip route get 8.8.8.8
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令在排查“访问某个地址到底从哪个网卡出去”时很有用。
|
||||||
|
|
||||||
|
## 5、带宽与流量查看
|
||||||
|
|
||||||
|
### 5.1 `nload`
|
||||||
|
|
||||||
|
`nload` 是一个简单直观的带宽监控工具。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
nload -m
|
nload -m
|
||||||
```
|
```
|
||||||
## 4、ip
|
|
||||||
```shell
|
|
||||||
root@jumpserver:~# ip a
|
|
||||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
|
|
||||||
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
|
||||||
inet 127.0.0.1/8 scope host lo
|
|
||||||
valid_lft forever preferred_lft forever
|
|
||||||
inet6 ::1/128 scope host
|
|
||||||
valid_lft forever preferred_lft forever
|
|
||||||
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
|
|
||||||
link/ether 00:0c:29:8c:8d:89 brd ff:ff:ff:ff:ff:ff
|
|
||||||
altname enp2s0
|
|
||||||
inet 192.168.30.100/24 brd 192.168.30.255 scope global ens32
|
|
||||||
valid_lft forever preferred_lft forever
|
|
||||||
inet6 fe80::20c:29ff:fe8c:8d89/64 scope link
|
|
||||||
valid_lft forever preferred_lft forever
|
|
||||||
```
|
|
||||||
```shell
|
|
||||||
root@jumpserver:~# ip route
|
|
||||||
default via 192.168.30.250 dev ens32 proto static
|
|
||||||
192.168.30.0/24 dev ens32 proto kernel scope link src 192.168.30.100
|
|
||||||
```
|
|
||||||
```shell
|
|
||||||
ip route add 目标ip via 转发设备(网关) dev 网卡 src 源IP
|
|
||||||
|
|
||||||
root@jumpserver:~# ip route add 192.168.30.201 via 192.168.30.11 dev ens32
|
常见用途:
|
||||||
root@jumpserver:~# ip route
|
|
||||||
default via 192.168.30.250 dev ens32 proto static
|
- 快速观察实时流量变化
|
||||||
192.168.30.0/24 dev ens32 proto kernel scope link src 192.168.30.100
|
- 排查网络高峰或带宽占用异常
|
||||||
192.168.30.201 via 192.168.30.11 dev ens32
|
|
||||||
```
|
## 6、常见运维场景
|
||||||
|
|
||||||
|
### 6.1 查服务端口是否监听
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
root@jumpserver:~# ip route del 192.168.30.201
|
ss -ntlp
|
||||||
root@jumpserver:~# ip route
|
|
||||||
default via 192.168.30.250 dev ens32 proto static
|
|
||||||
192.168.30.0/24 dev ens32 proto kernel scope link src 192.168.30.100
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 6.2 查连接状态是否异常
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
ip route get 目标地址
|
ss -s
|
||||||
|
netstat -s
|
||||||
```
|
```
|
||||||
## 5、ss
|
|
||||||
|
### 6.3 查默认路由是否正确
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
-n, --numeric 不解析服务名称
|
ip route
|
||||||
-a, --all 显示所有套接字(sockets)
|
|
||||||
-l, --listening 显示监听状态的套接字(sockets)
|
|
||||||
-m, --memory 显示套接字(socket)的内存使用情况
|
|
||||||
-p, --processes 显示使用套接字(socket)的进程
|
|
||||||
-i, --info 显示 TCP内部信息
|
|
||||||
-4, --ipv4 仅显示IPv4的套接字(sockets)
|
|
||||||
-6, --ipv6 仅显示IPv6的套接字(sockets)
|
|
||||||
-0, --packet 显示 PACKET 套接字(socket)
|
|
||||||
-t, --tcp 仅显示 TCP套接字(sockets)
|
|
||||||
-u, --udp 仅显示 UCP套接字(sockets)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 6.4 查单个目标走哪条路由
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
root@jumpserver:~# ss -4 state time-wait | wc -l
|
ip route get 目标IP
|
||||||
4
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 6.5 查局域网 ARP 映射
|
||||||
|
|
||||||
|
```shell
|
||||||
|
arp -a
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7、现代使用建议
|
||||||
|
|
||||||
|
- 新系统中优先使用 `ip` 和 `ss`
|
||||||
|
- `netstat` 仍然值得会看,因为很多老文档和线上环境还在用
|
||||||
|
- 排查端口问题时,优先关注“是否监听、监听在哪个地址、对应哪个进程”
|
||||||
|
- 排查网络问题时,通常按“网卡 → IP → 路由 → 端口 → 流量”这个顺序看
|
||||||
|
|
||||||
|
## 8、小结
|
||||||
|
|
||||||
|
- `arp` 用于看 IP 和 MAC 的映射
|
||||||
|
- `ip a` 看网卡和地址,`ip route` 看路由
|
||||||
|
- `netstat` 和 `ss` 用于查看连接、端口和协议统计
|
||||||
|
- `ss` 更现代,推荐优先掌握
|
||||||
|
- `nload` 适合快速看实时带宽变化
|
||||||
|
|||||||
@ -1,58 +1,124 @@
|
|||||||
将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。
|
## 1、Bonding 概览
|
||||||
## 1、工作模式
|
|
||||||
##### 1、mode=0(balance-rr)(平衡轮询策略)
|
|
||||||
链路负载均衡,增加带宽,支持容错,一条链路故障会自动切换正常链路。交换机需要配置聚合口,思科叫port channel。
|
|
||||||
**特点:**传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环下去,直到最后一个传输完毕),此模式提供负载平衡和容错能力;但是我们知道如果一个连接
|
|
||||||
或者会话的数据包从不同的接口发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络的吞吐量就会下降
|
|
||||||
|
|
||||||
##### 2、mode=1(active-backup)(主-备份策略)
|
Bonding(网卡绑定)是把多块物理网卡组合成一个逻辑接口,对外通常表现为一个 IP 地址。
|
||||||
主备模式,只有一块网卡是active,另一块是备用的standby,所有流量都在active链路上处理,交换机配置的是捆绑的话将不能工作,因为交换机往两块网卡发包,有一半包是丢弃的。
|
|
||||||
**特点:**只有一个设备处于活动状态,当一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见得,从外面看来,bond的MAC地址是唯一的,以避免switch(交换机)发生混乱。
|
|
||||||
此模式只提供了容错能力;由此可见此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N
|
|
||||||
|
|
||||||
3、mode=2(balance-xor)(平衡策略)
|
常见目的:
|
||||||
表示XOR Hash负载分担,和交换机的聚合强制不协商方式配合。(需要xmit_hash_policy,需要交换机配置port channel)
|
|
||||||
特点:基于指定的传输HASH策略传输数据包。缺省的策略是:(源MAC地址 XOR 目标MAC地址) % slave数量。其他的传输策略可以通过xmit_hash_policy选项指定,此模式提供负载平衡和容错能力
|
|
||||||
|
|
||||||
4、mode=3(broadcast)(广播策略)
|
- 提高链路可用性
|
||||||
表示所有包从所有网络接口发出,这个不均衡,只有冗余机制,但过于浪费资源。此模式适用于金融行业,因为他们需要高可靠性的网络,不允许出现任何问题。需要和交换机的聚合强制不协商方式配合。
|
- 实现故障切换
|
||||||
特点:在每个slave接口上传输每个数据包,此模式提供了容错能力
|
- 提升带宽或做负载分担
|
||||||
|
|
||||||
5、mode=4(802.3ad)(IEEE 802.3ad 动态链接聚合)
|
是否真正实现带宽叠加,取决于 **Bond 模式**、交换机配置、流量模型等因素。
|
||||||
表示支持802.3ad协议,和交换机的聚合LACP方式配合(需要xmit_hash_policy).标准要求所有设备在聚合操作时,要在同样的速率和双工模式,而且,和除了balance-rr模式外的其它bonding负载均衡模式一样,任何连接都不能使用多于一个接口的带宽。
|
|
||||||
特点:创建一个聚合组,它们共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一个激活的聚合体下。
|
|
||||||
外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。需要注意的 是,并不是所有的传输策略都是802.3ad适应的,
|
|
||||||
尤其考虑到在802.3ad标准43.2.4章节提及的包乱序问题。不同的实现可能会有不同的适应 性。
|
|
||||||
必要条件:
|
|
||||||
条件1:ethtool支持获取每个slave的速率和双工设定
|
|
||||||
条件2:switch(交换机)支持IEEE 802.3ad Dynamic link aggregation
|
|
||||||
条件3:大多数switch(交换机)需要经过特定配置才能支持802.3ad模式
|
|
||||||
|
|
||||||
6、mode=5(balance-tlb)(适配器传输负载均衡)
|
## 2、常见 Bond 模式
|
||||||
是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave。该模式要求slave接口的网络设备驱动有某种ethtool支持;而且ARP监控不可用。
|
|
||||||
特点:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。
|
|
||||||
必要条件:
|
|
||||||
ethtool支持获取每个slave的速率
|
|
||||||
|
|
||||||
7、mode=6(balance-alb)(适配器适应性负载均衡)
|
### 2.1 `mode=0` `balance-rr`
|
||||||
在5的tlb基础上增加了rlb(接收负载均衡receive load balance).不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的.
|
|
||||||
特点:该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receive load balance, rlb),而且不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。
|
轮询发送流量。
|
||||||
来自服务器端的接收流量也会被均衡。当本机发送ARP请求时,bonding驱动把对端的IP信息从ARP包中复制并保存下来。当ARP应答从对端到达 时,bonding驱动把它的硬件地址提取出来,并发起一个ARP应答给bond中的某个slave。
|
|
||||||
使用ARP协商进行负载均衡的一个问题是:每次广播 ARP请求时都会使用bond的硬件地址,因此对端学习到这个硬件地址后,接收流量将会全部流向当前的slave。这个问题可以通过给所有的对端发送更新 (ARP应答)来解决,应答中包含他们独一无二的硬件地址,从而导致流量重新分布。
|
特点:
|
||||||
当新的slave加入到bond中时,或者某个未激活的slave重新 激活时,接收流量也要重新分布。接收的负载被顺序地分布(round robin)在bond中最高速的slave上
|
|
||||||
当某个链路被重新接上,或者一个新的slave加入到bond中,接收流量在所有当前激活的slave中全部重新分配,通过使用指定的MAC地址给每个 client发起ARP应答。下面介绍的updelay参数必须被设置为某个大于等于switch(交换机)转发延时的值,从而保证发往对端的ARP应答 不会被switch(交换机)阻截。
|
- 负载均衡
|
||||||
必要条件:
|
- 支持容错
|
||||||
条件1:ethtool支持获取每个slave的速率;
|
- 需要交换机配合链路聚合
|
||||||
条件2:底层驱动支持设置某个设备的硬件地址,从而使得总是有个slave(curr_active_slave)使用bond的硬件地址,同时保证每个bond 中的slave都有一个唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址将会被新选出来的 curr_active_slave接管
|
- 可能出现包乱序问题
|
||||||
其实mod=6与mod=0的区别:mod=6,先把eth0流量占满,再占eth1,….ethX;而mod=0的话,会发现2个口的流量都很稳定,基本一样的带宽。而mod=6,会发现第一个口流量很高,第2个口只占了小部分流量。
|
|
||||||
## 2、配置方法
|
### 2.2 `mode=1` `active-backup`
|
||||||
```shell
|
|
||||||
root@jumpserver:~# vim /etc/netplan/00-installer-config.yaml
|
主备模式。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 同时只有一块网卡工作
|
||||||
|
- 一块故障时自动切换到备份网卡
|
||||||
|
- 主要用于高可用
|
||||||
|
- 对交换机要求较低
|
||||||
|
|
||||||
|
这是生产中非常常见、也相对稳妥的模式。
|
||||||
|
|
||||||
|
### 2.3 `mode=2` `balance-xor`
|
||||||
|
|
||||||
|
基于哈希策略分担流量。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 支持负载均衡和容错
|
||||||
|
- 需要交换机聚合配置
|
||||||
|
- 常结合 `xmit_hash_policy`
|
||||||
|
|
||||||
|
### 2.4 `mode=3` `broadcast`
|
||||||
|
|
||||||
|
所有包都从所有网卡发出。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 容错强
|
||||||
|
- 资源浪费大
|
||||||
|
- 一般不常用
|
||||||
|
|
||||||
|
### 2.5 `mode=4` `802.3ad`
|
||||||
|
|
||||||
|
也就是 LACP 动态链路聚合。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 标准化程度高
|
||||||
|
- 需要交换机支持 802.3ad / LACP
|
||||||
|
- 兼顾性能和可靠性
|
||||||
|
- 配置要求更高
|
||||||
|
|
||||||
|
### 2.6 `mode=5` `balance-tlb`
|
||||||
|
|
||||||
|
发送负载均衡。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 不要求交换机特殊支持
|
||||||
|
- 主要对发送流量做均衡
|
||||||
|
|
||||||
|
### 2.7 `mode=6` `balance-alb`
|
||||||
|
|
||||||
|
自适应负载均衡。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 在 `mode=5` 基础上增强
|
||||||
|
- 不依赖交换机特殊支持
|
||||||
|
- 能做一定程度的接收负载均衡
|
||||||
|
|
||||||
|
## 3、模式选择建议
|
||||||
|
|
||||||
|
### 3.1 追求稳定高可用
|
||||||
|
|
||||||
|
优先考虑:
|
||||||
|
|
||||||
|
- `mode=1` `active-backup`
|
||||||
|
|
||||||
|
### 3.2 有交换机配合且希望聚合
|
||||||
|
|
||||||
|
优先考虑:
|
||||||
|
|
||||||
|
- `mode=4` `802.3ad`
|
||||||
|
|
||||||
|
### 3.3 没有交换机聚合能力
|
||||||
|
|
||||||
|
可考虑:
|
||||||
|
|
||||||
|
- `mode=1`
|
||||||
|
- `mode=6`
|
||||||
|
|
||||||
|
## 4、配置示例
|
||||||
|
|
||||||
|
不同发行版网络配置方式不同,常见有 `netplan`、`NetworkManager`、`ifcfg-*` 等。
|
||||||
|
|
||||||
|
### 4.1 Netplan 示例
|
||||||
|
|
||||||
|
```yaml
|
||||||
network:
|
network:
|
||||||
version: 2
|
version: 2
|
||||||
ethernets:
|
ethernets:
|
||||||
eth1:
|
eth1:
|
||||||
addresses: [] #绑定单网卡不需要写IP地址
|
addresses: []
|
||||||
dhcp4: no
|
dhcp4: no
|
||||||
eth2:
|
eth2:
|
||||||
addresses: []
|
addresses: []
|
||||||
@ -69,33 +135,58 @@ network:
|
|||||||
interfaces:
|
interfaces:
|
||||||
- eth1
|
- eth1
|
||||||
- eth2
|
- eth2
|
||||||
parameters: #参数
|
parameters:
|
||||||
mode: balance-alb
|
mode: balance-alb
|
||||||
```
|
```
|
||||||
```shell
|
|
||||||
/etc/sysconfig/network-scripts/ifcfg-bond0
|
### 4.2 传统 ifcfg 配置示例
|
||||||
|
|
||||||
|
`/etc/sysconfig/network-scripts/ifcfg-bond0`
|
||||||
|
|
||||||
|
```ini
|
||||||
NAME=bond0
|
NAME=bond0
|
||||||
TYPE=bond
|
TYPE=Bond
|
||||||
DEVICE=bond0
|
DEVICE=bond0
|
||||||
BOOTPROTO=none
|
BOOTPROTO=none
|
||||||
IPADDR=10.0.0.100
|
IPADDR=10.0.0.100
|
||||||
PREFIX-8
|
PREFIX=8
|
||||||
#miimon指定链路监测时间间隔。如果miimon=100,那么系统每100ms 监测一次链路连接状态,如果有条线路不通就转入另一条线路
|
BONDING_OPTS="mode=1 miimon=100"
|
||||||
BONDING_OPTS="mode=1 miimon=100 fail_over_mac-1"
|
|
||||||
|
|
||||||
/etc/sysconfig/network-scripts/ifcfg-eth0
|
|
||||||
NAME=eth0
|
|
||||||
DEVICE=eth0
|
|
||||||
BOOTPROTO-none
|
|
||||||
MASTER=bond0
|
|
||||||
SLAVE=yes
|
|
||||||
ONBO0T=yes
|
|
||||||
|
|
||||||
/etc/sysconfig/network-scripts/ifcfg-eth1
|
|
||||||
NAME=eth1
|
|
||||||
DEVICE=eth1
|
|
||||||
BOOTPROTO=none
|
|
||||||
MASTER=bond0
|
|
||||||
SLAVE=yes
|
|
||||||
ONBO0T=yes
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
从接口配置中要指定:
|
||||||
|
|
||||||
|
- `MASTER=bond0`
|
||||||
|
- `SLAVE=yes`
|
||||||
|
|
||||||
|
## 5、关键参数说明
|
||||||
|
|
||||||
|
### 5.1 `miimon`
|
||||||
|
|
||||||
|
用于指定链路检测间隔,单位通常是毫秒。
|
||||||
|
|
||||||
|
例如:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
miimon=100
|
||||||
|
```
|
||||||
|
|
||||||
|
表示每 100 ms 检测一次链路状态。
|
||||||
|
|
||||||
|
### 5.2 `xmit_hash_policy`
|
||||||
|
|
||||||
|
用于指定发包哈希策略,在某些负载均衡模式中很关键。
|
||||||
|
|
||||||
|
## 6、常见运维注意点
|
||||||
|
|
||||||
|
- Bond 能不能真正提升带宽,要看连接模型和交换机配置
|
||||||
|
- 配 `802.3ad` 前先确认交换机侧也已正确配置 LACP
|
||||||
|
- `active-backup` 最简单、最稳,适合先保高可用
|
||||||
|
- 做 Bond 前,最好先明确目标:是要容灾,还是要带宽聚合
|
||||||
|
- 变更 Bond 配置前要评估中断风险,最好有带外或控制台入口
|
||||||
|
|
||||||
|
## 7、小结
|
||||||
|
|
||||||
|
- Bonding 是把多块网卡组合成一个逻辑接口
|
||||||
|
- 常见目标是高可用、容错和流量分担
|
||||||
|
- `mode=1` 适合高可用,`mode=4` 适合标准聚合
|
||||||
|
- 配置时既要看 Linux 端,也要看交换机端是否匹配
|
||||||
|
|||||||
@ -1,71 +1,205 @@
|
|||||||
## 1、进程
|
## 1、进程概览
|
||||||
进程是一个具有一定独立功能的程序在一个数据及上的一次动态执行的过程。是操作系统进行资源分配的一个独立单位
|
|
||||||
**进程的基本状态**
|
|
||||||
创建状态:进程在创建时需要申请一个空白的PCB(进程控制块),向其中填写控制和管理进程的信息,完成资源分配。
|
|
||||||
就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
|
|
||||||
执行状态:进程处于就绪状态被调度后,进程进入执行状态
|
|
||||||
阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。满足请求时进入就绪状态等待系统调用
|
|
||||||
终止状态:进程结束,或出现错误,或系统终止,进入终止状态。无法再执行
|
|
||||||
|
|
||||||
- R (Running):进程正在运行,或在运行队列中等待运行。
|
进程是程序的一次运行实例,是操作系统进行资源分配和调度的基本单位。
|
||||||
- S (Sleeping):进程处于休眠状态,等待某些条件的发生(例如等待资源可用或新的输入数据)。
|
|
||||||
- D (Uninterruptible Sleep):进程在等待 I/O 完成,不能被打断。
|
可以简单理解为:
|
||||||
- T (Stopped or Traced):进程被停止(例如,被调试器停止)。
|
|
||||||
- Z (Zombie):进程已经终止,但其父进程尚未获取其终止状态(称为 "僵尸进程")。
|
- **程序**:静态文件
|
||||||
|
- **进程**:程序运行起来后的动态实体
|
||||||
|
|
||||||
|
## 2、进程的基本状态
|
||||||
|
|
||||||
|
常见运行状态包括:
|
||||||
|
|
||||||
|
- **创建状态**:进程刚被创建
|
||||||
|
- **就绪状态**:已准备运行,等待分配 CPU
|
||||||
|
- **运行状态**:正在执行
|
||||||
|
- **阻塞状态**:等待某些资源或事件,例如 I/O
|
||||||
|
- **终止状态**:执行结束或异常退出
|
||||||
|
|
||||||
|
在 Linux 中,`ps`、`top` 等命令里更常看到下面这些状态码:
|
||||||
|
|
||||||
|
- `R`:Running,运行中或在运行队列中
|
||||||
|
- `S`:Sleeping,可中断睡眠
|
||||||
|
- `D`:Uninterruptible Sleep,不可中断睡眠,常见于 I/O 等待
|
||||||
|
- `T`:Stopped,被暂停或被调试
|
||||||
|
- `Z`:Zombie,僵尸进程
|
||||||
|
|
||||||
|
## 3、进程、线程、协程
|
||||||
|
|
||||||
|
### 3.1 线程
|
||||||
|
|
||||||
|
线程是进程中的执行流,是 CPU 调度的基本执行单位之一。一个进程可以包含多个线程。
|
||||||
|
|
||||||
|
### 3.2 协程
|
||||||
|
|
||||||
|
协程通常由用户态程序自己调度,切换开销更小,适合高并发编程场景。
|
||||||
|
|
||||||
|
在日常 Linux 运维里,最常关注的仍然是**进程**和**线程**。
|
||||||
|
|
||||||
|
## 4、进程类型
|
||||||
|
|
||||||
|
- **守护进程**:后台长期运行、通常不依赖终端,例如各种服务进程
|
||||||
|
- **前台进程**:与当前终端交互的进程
|
||||||
|
- **后台进程**:由当前 shell 启动但放到后台运行的进程
|
||||||
|
|
||||||
|
## 5、常用查看命令
|
||||||
|
|
||||||
|
### 5.1 `pstree`
|
||||||
|
|
||||||
|
用于查看进程树关系。
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-p`:显示 PID
|
||||||
|
- `-T`:不显示线程
|
||||||
|
- `-u`:显示用户切换
|
||||||
|
- `-H`:高亮指定进程及其祖先进程
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
**进程类型:**
|
|
||||||
守护进程:daemon,在系统引导过程中启动的进程,和终端无关的进程
|
|
||||||
前台进程:跟终端相关,通过终端启动的进程
|
|
||||||
## 2、线程
|
|
||||||
线程是程序执行中一个单一的吮吸控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位,一个进程可以有一个或多个线程
|
|
||||||
## 3、协程
|
|
||||||
协程的调度由用户完成,资源占用小,不会带来严重的性能问题,不需要多线程的锁机制,因为只有一个小城,也不存在同时写变量冲突。
|
|
||||||
## 4、常用命令
|
|
||||||
##### 4.1 pstree
|
|
||||||
```shell
|
```shell
|
||||||
pstree
|
pstree -p
|
||||||
|
|
||||||
常用选项:
|
|
||||||
-p: 显示PID
|
|
||||||
-T:不显示线程,默认显示线程
|
|
||||||
-u:显示用户切换
|
|
||||||
-H:高亮显示指定进程及其前辈进程
|
|
||||||
```
|
```
|
||||||
##### 4.2 ps
|
|
||||||
|
### 5.2 `ps`
|
||||||
|
|
||||||
|
用于查看进程快照。
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `a`:显示所有终端相关进程
|
||||||
|
- `x`:显示不依赖终端的进程
|
||||||
|
- `u`:显示用户信息
|
||||||
|
- `f`:树状显示父子关系
|
||||||
|
|
||||||
|
高频示例:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
ps
|
ps aux
|
||||||
|
ps -ef
|
||||||
常用选项:
|
ps auxf
|
||||||
a:选项包括所有终端中的进程
|
|
||||||
x:选项包括不连接终端的进程
|
|
||||||
u:显示进程的所有者信息
|
|
||||||
f:显示进程数
|
|
||||||
```
|
```
|
||||||
##### 4.3 prtstat
|
|
||||||
|
### 5.3 `pidof` 与 `pgrep`
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
prtstat -r pid
|
pidof nginx
|
||||||
|
pgrep nginx
|
||||||
```
|
```
|
||||||
pidof
|
|
||||||
pgrep
|
适合快速查找某个进程的 PID。
|
||||||
|
|
||||||
|
### 5.4 `top` 与 `htop`
|
||||||
|
|
||||||
|
- `top`:动态查看系统负载、CPU、内存、进程情况
|
||||||
|
- `htop`:更友好的交互式进程查看工具
|
||||||
|
|
||||||
|
### 5.5 `pmap`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
pmap PID
|
||||||
|
```
|
||||||
|
|
||||||
|
用于查看进程内存映射。
|
||||||
|
|
||||||
|
### 5.6 `vmstat`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
vmstat 1
|
||||||
|
```
|
||||||
|
|
||||||
|
用于观察系统整体运行情况,如 CPU、内存、上下文切换、I/O 等。
|
||||||
|
|
||||||
|
### 5.7 `iostat`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
iostat
|
||||||
|
```
|
||||||
|
|
||||||
|
用于查看 CPU 和磁盘 I/O 情况,通常来自 `sysstat` 软件包。
|
||||||
|
|
||||||
|
### 5.8 `lsof`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
lsof -p PID
|
||||||
|
```
|
||||||
|
|
||||||
|
用于查看某个进程打开了哪些文件、端口、套接字。
|
||||||
|
|
||||||
|
## 6、进程控制命令
|
||||||
|
|
||||||
|
### 6.1 `kill`
|
||||||
|
|
||||||
|
用于按 PID 发送信号。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
kill PID
|
||||||
|
kill -9 PID
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.2 `pkill`
|
||||||
|
|
||||||
|
用于按进程名或条件杀进程。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
pkill nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.3 `nohup`
|
||||||
|
|
||||||
|
用于让命令在退出终端后继续运行。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
nohup command &
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.4 `jobs`、`bg`、`fg`
|
||||||
|
|
||||||
|
这些命令用于 shell 作业控制:
|
||||||
|
|
||||||
|
- `jobs`:查看当前 shell 的作业
|
||||||
|
- `bg`:把任务放到后台继续执行
|
||||||
|
- `fg`:把后台任务切回前台
|
||||||
|
|
||||||
|
## 7、常见排障场景
|
||||||
|
|
||||||
|
### 7.1 查某个服务是否存在
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ps -ef | grep nginx
|
||||||
|
pgrep nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.2 查谁占用 CPU 高
|
||||||
|
|
||||||
|
```shell
|
||||||
top
|
top
|
||||||
htop
|
htop
|
||||||
glance
|
|
||||||
pmap
|
|
||||||
vmstat
|
|
||||||
dstat
|
|
||||||
kill
|
|
||||||
pkill
|
|
||||||
job
|
|
||||||
lsof
|
|
||||||
bg
|
|
||||||
fg
|
|
||||||
kill
|
|
||||||
nohup
|
|
||||||
nethogs
|
|
||||||
free
|
|
||||||
iostat
|
|
||||||
```shell
|
|
||||||
该软件存放于sysstat包
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 7.3 查进程打开了哪些文件
|
||||||
|
|
||||||
|
```shell
|
||||||
|
lsof -p PID
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.4 查进程内存映射
|
||||||
|
|
||||||
|
```shell
|
||||||
|
pmap PID
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.5 查僵尸进程
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ps aux | grep ' Z '
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8、小结
|
||||||
|
|
||||||
|
- 进程是资源分配和调度的核心对象
|
||||||
|
- `R`、`S`、`D`、`T`、`Z` 是最常见的进程状态
|
||||||
|
- `ps`、`pstree`、`top`、`htop`、`lsof` 是高频排障命令
|
||||||
|
- `kill`、`pkill`、`nohup`、`jobs`、`bg`、`fg` 常用于进程控制
|
||||||
|
- 排查问题时,通常从“进程是否存在、状态是否正常、资源占用是否异常”这条线入手
|
||||||
|
|||||||
@ -1,26 +1,147 @@
|
|||||||
通过任务计划,可以让系统自动的按时间或周期性执行任务
|
## 1、任务计划概览
|
||||||
## 1、一次性任务
|
|
||||||
```shell
|
|
||||||
at
|
|
||||||
|
|
||||||
常用选项:
|
Linux 中任务计划主要分两类:
|
||||||
-v:显示版本信息
|
|
||||||
-t:时间格式 MMDDhhmm
|
|
||||||
-l:列出指定队列中等待运行的卓越
|
|
||||||
-d:删除
|
|
||||||
-c:查看具体作业
|
|
||||||
-f:指定文件
|
|
||||||
```
|
|
||||||
```shell
|
|
||||||
at -f 1.sh now + 1 hour #在1小时后执行
|
|
||||||
at -f 1.sh 00:00 07.01.2024 #在2024年7月1日0点0分执行
|
|
||||||
```
|
|
||||||
2、周期性任务计划
|
|
||||||
```shell
|
|
||||||
crontab
|
|
||||||
|
|
||||||
常用选项
|
- **一次性任务**:只执行一次,例如 `at`
|
||||||
-l:列出
|
- **周期性任务**:按固定时间重复执行,例如 `cron` / `crontab`
|
||||||
-e:编辑
|
|
||||||
-r:移除所有
|
常见用途:
|
||||||
|
|
||||||
|
- 定时备份
|
||||||
|
- 定时清理日志
|
||||||
|
- 定时执行脚本
|
||||||
|
- 安排未来某个时间点执行一次命令
|
||||||
|
|
||||||
|
## 2、一次性任务 `at`
|
||||||
|
|
||||||
|
`at` 用于安排任务在未来某个时间执行一次。
|
||||||
|
|
||||||
|
### 2.1 常见选项
|
||||||
|
|
||||||
|
- `-v`:显示版本信息
|
||||||
|
- `-t`:指定时间,格式通常为 `MMDDhhmm`
|
||||||
|
- `-l`:列出等待执行的任务
|
||||||
|
- `-d`:删除指定任务
|
||||||
|
- `-c`:查看任务具体内容
|
||||||
|
- `-f`:从文件读取任务内容
|
||||||
|
|
||||||
|
### 2.2 常见示例
|
||||||
|
|
||||||
|
1 小时后执行脚本:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
at -f 1.sh now + 1 hour
|
||||||
```
|
```
|
||||||
|
|
||||||
|
在指定日期时间执行脚本:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
at -f 1.sh 00:00 07.01.2024
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 常见管理命令
|
||||||
|
|
||||||
|
```shell
|
||||||
|
atq
|
||||||
|
atrm 任务编号
|
||||||
|
```
|
||||||
|
|
||||||
|
- `atq`:查看任务队列
|
||||||
|
- `atrm`:删除指定任务
|
||||||
|
|
||||||
|
## 3、周期性任务 `crontab`
|
||||||
|
|
||||||
|
`crontab` 用于按固定周期执行任务。
|
||||||
|
|
||||||
|
### 3.1 常见选项
|
||||||
|
|
||||||
|
- `-l`:列出当前用户的定时任务
|
||||||
|
- `-e`:编辑当前用户的定时任务
|
||||||
|
- `-r`:删除当前用户全部定时任务
|
||||||
|
|
||||||
|
### 3.2 时间格式
|
||||||
|
|
||||||
|
`crontab` 每行通常由 5 个时间字段加命令组成:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
分 时 日 月 周 命令
|
||||||
|
```
|
||||||
|
|
||||||
|
例如:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
0 2 * * * /bin/bash /opt/backup.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
表示每天凌晨 2 点执行脚本。
|
||||||
|
|
||||||
|
### 3.3 特殊符号
|
||||||
|
|
||||||
|
- `*`:任意值
|
||||||
|
- `,`:多个离散值
|
||||||
|
- `-`:范围
|
||||||
|
- `/`:步长
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
*/5 * * * * /bin/bash /opt/check.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
表示每 5 分钟执行一次。
|
||||||
|
|
||||||
|
## 4、系统级与用户级任务
|
||||||
|
|
||||||
|
### 4.1 用户级
|
||||||
|
|
||||||
|
每个用户都可以有自己的 `crontab` 任务。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
crontab -e
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 系统级
|
||||||
|
|
||||||
|
系统级定时任务常见位置:
|
||||||
|
|
||||||
|
- `/etc/crontab`
|
||||||
|
- `/etc/cron.d/`
|
||||||
|
- `/etc/cron.hourly/`
|
||||||
|
- `/etc/cron.daily/`
|
||||||
|
- `/etc/cron.weekly/`
|
||||||
|
- `/etc/cron.monthly/`
|
||||||
|
|
||||||
|
## 5、常见运维建议
|
||||||
|
|
||||||
|
- 定时任务中的命令尽量写绝对路径
|
||||||
|
- 依赖环境变量的脚本,最好在脚本内部显式设置
|
||||||
|
- 给定时任务加日志输出,方便排障
|
||||||
|
- `crontab -r` 很危险,执行前要确认
|
||||||
|
- 线上任务变更前建议先手动执行验证
|
||||||
|
|
||||||
|
## 6、常见排障思路
|
||||||
|
|
||||||
|
### 6.1 任务没有执行
|
||||||
|
|
||||||
|
优先检查:
|
||||||
|
|
||||||
|
- 服务是否正常
|
||||||
|
- `crontab` 写法是否正确
|
||||||
|
- 执行脚本是否有权限
|
||||||
|
- 环境变量是否缺失
|
||||||
|
- 输出是否被重定向到日志
|
||||||
|
|
||||||
|
### 6.2 脚本手动能跑,定时跑不起来
|
||||||
|
|
||||||
|
高频原因:
|
||||||
|
|
||||||
|
- `PATH` 不同
|
||||||
|
- 当前用户不同
|
||||||
|
- 工作目录不同
|
||||||
|
- 依赖的环境变量未加载
|
||||||
|
|
||||||
|
## 7、小结
|
||||||
|
|
||||||
|
- `at` 用于一次性任务
|
||||||
|
- `crontab` 用于周期性任务
|
||||||
|
- 定时任务最重要的是“时间表达式正确 + 命令路径明确 + 日志可排查”
|
||||||
|
|||||||
@ -1,85 +1,178 @@
|
|||||||
从CentOS7开始,使用systemd实现init进程,系统启动和服务器守护进程管理器,负责在系统启动或者运行时,激活系统资源,服务器进程和其他进程。
|
## 1、Systemd 概览
|
||||||
## 1、Unit类型
|
|
||||||
unit表示不同类型的systemd对象,通过配置文件进行标识和配置,文件中主要包含了系统服务、监听socket、保存的系统快照以及其他与init相关的进程
|
从 CentOS 7 及很多现代 Linux 发行版开始,`systemd` 成为默认的初始化系统(init system)和服务管理器。
|
||||||
|
|
||||||
|
它负责:
|
||||||
|
|
||||||
|
- 系统启动流程管理
|
||||||
|
- 服务启动、停止、重启
|
||||||
|
- 依赖关系控制
|
||||||
|
- 挂载点、socket、target 等资源管理
|
||||||
|
|
||||||
|
在日常运维中,最常接触的是 `systemctl` 和 service unit。
|
||||||
|
|
||||||
|
## 2、Unit 是什么
|
||||||
|
|
||||||
|
Systemd 使用 **Unit** 表示不同类型的管理对象,每种 Unit 都对应一种资源或行为。
|
||||||
|
|
||||||
|
### 2.1 常见 Unit 类型
|
||||||
|
|
||||||
|
- `service`:系统服务
|
||||||
|
- `socket`:套接字
|
||||||
|
- `target`:目标组,类似传统运行级别概念
|
||||||
|
- `mount`:挂载点
|
||||||
|
- `automount`:自动挂载点
|
||||||
|
- `swap`:交换分区
|
||||||
|
- `device`:设备
|
||||||
|
- `snapshot`:系统快照
|
||||||
|
|
||||||
|
查看支持的 Unit 类型:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@centos ~]#systemctl -t help
|
systemctl -t help
|
||||||
Available unit types:
|
|
||||||
service #文件拓展名为.service,用于定义系统服务
|
|
||||||
socket #定义进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
|
|
||||||
target #文件扩展名为.target,用于模拟实现运行级别
|
|
||||||
snapshot #管理系统快照
|
|
||||||
device #用于定义内核识别的设备
|
|
||||||
mount #定义文件系统挂载点
|
|
||||||
automount #文件系统的自动挂载点
|
|
||||||
swap #用于表示swap设备
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 3、Unit 文件位置
|
||||||
|
|
||||||
|
常见目录:
|
||||||
|
|
||||||
|
- `/usr/lib/systemd/system`:发行版提供的 unit 文件
|
||||||
|
- `/lib/systemd/system`:部分系统对应目录
|
||||||
|
- `/run/systemd/system`:运行时生成的 unit
|
||||||
|
- `/etc/systemd/system`:管理员自定义或覆盖配置
|
||||||
|
|
||||||
|
优先级通常是:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/etc > /run > /usr/lib
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4、Unit 文件结构
|
||||||
|
|
||||||
|
一个典型的 service 文件通常分为 3 部分:
|
||||||
|
|
||||||
|
- `[Unit]`
|
||||||
|
- `[Service]`
|
||||||
|
- `[Install]`
|
||||||
|
|
||||||
|
### 4.1 `[Unit]`
|
||||||
|
|
||||||
|
用于描述:
|
||||||
|
|
||||||
|
- 单元说明信息
|
||||||
|
- 启动顺序
|
||||||
|
- 依赖关系
|
||||||
|
|
||||||
|
常见字段:
|
||||||
|
|
||||||
|
- `Description`:描述信息
|
||||||
|
- `Documentation`:文档说明
|
||||||
|
- `Requires`:强依赖
|
||||||
|
- `Wants`:弱依赖
|
||||||
|
- `After`:指定在某些 unit 之后启动
|
||||||
|
|
||||||
|
### 4.2 `[Service]`
|
||||||
|
|
||||||
|
用于定义服务本身的运行方式。
|
||||||
|
|
||||||
|
常见字段:
|
||||||
|
|
||||||
|
- `Type`:服务类型
|
||||||
|
- `ExecStart`:启动命令
|
||||||
|
- `ExecStartPre`:启动前执行
|
||||||
|
- `ExecStartPost`:启动后执行
|
||||||
|
- `ExecReload`:重载命令
|
||||||
|
- `EnvironmentFile`:环境变量文件
|
||||||
|
- `Restart`:失败后是否重启
|
||||||
|
- `RestartSec`:重启前等待时间
|
||||||
|
|
||||||
|
### 4.3 常见 `Type`
|
||||||
|
|
||||||
|
- `simple`:默认类型,前台运行
|
||||||
|
- `forking`:启动后派生子进程,父进程退出
|
||||||
|
- `oneshot`:执行一次即退出
|
||||||
|
- `dbus`:依赖 D-Bus
|
||||||
|
- `notify`:服务启动完成后主动通知 systemd
|
||||||
|
- `idle`:延后执行
|
||||||
|
|
||||||
|
### 4.4 `[Install]`
|
||||||
|
|
||||||
|
用于定义启用或禁用时与哪些 target 建立关联。
|
||||||
|
|
||||||
|
常见字段:
|
||||||
|
|
||||||
|
- `WantedBy`:被哪些 target 弱依赖
|
||||||
|
- `RequiredBy`:被哪些 target 强依赖
|
||||||
|
- `Alias`:别名
|
||||||
|
|
||||||
|
## 5、常用 `systemctl` 命令
|
||||||
|
|
||||||
|
### 5.1 查看运行中的 unit
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
/usr/lib/systemd/system #每个服务最主要的启动脚本
|
systemctl list-units -t service
|
||||||
/lib/systemd/system #ubuntu的对应目录
|
|
||||||
|
|
||||||
/run/systemd/system #系统执行过程中所产生的服务脚本,比上面的目录优先运行
|
|
||||||
/etc/systemd/system #管理员建立的执行脚本,比上面的目录优先运行
|
|
||||||
```
|
```
|
||||||
## 2、unit文件格式
|
|
||||||
/etc/systemd/system:系统管理员和用户使用
|
### 5.2 查看所有 unit 文件状态
|
||||||
/usr/lib/systemd/system:发行版打包者使用
|
|
||||||
```shell
|
```shell
|
||||||
# /usr/lib/systemd/system/sshd.service
|
systemctl list-unit-files -t service
|
||||||
[Unit]:定义与unit类型无关的通用选项,用于提供unit的描述信息、unit行为及依赖关系等
|
|
||||||
Description=OpenSSH server daemon #描述信息
|
|
||||||
Documentation=man:sshd(8) man:sshd_config(5)
|
|
||||||
Requires=network.target #依赖到的其他units,强依赖,被依赖的服务无法激活时,当前unit也无法激活
|
|
||||||
After=network.target sshd-keygen.service #定义unit的启动次序,表示当前unit应该晚于哪些unit启动
|
|
||||||
Wants=sshd-keygen.service #依赖到的其他units,弱依赖
|
|
||||||
|
|
||||||
[Service]:与特定类型相关的专用选项
|
|
||||||
Type=notify #定义影响ExecStart及相关参数的功能的unit进程启动类型
|
|
||||||
simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
|
|
||||||
forking:由ExecStart启动的程序透过spawns眼神出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会结束
|
|
||||||
oneshot:与simple类似,不过这个程序在工作完成后就结束了,不会常驻在内存中
|
|
||||||
dbus:与simple相似,但是这个daemon必须要在取得一个D-Bus的名称后,才会继续运行,因此通常要设定BusName=才行
|
|
||||||
notify:在启动完成后会发送一个通知信息,还需要配合NotifyAccess来让systemd接收消息
|
|
||||||
idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行
|
|
||||||
EnvironmentFile=/etc/sysconfig/sshd #环境配置文件
|
|
||||||
ExecStartPre= #ExecStart前运行
|
|
||||||
ExecStartPost= #ExecStart后运行
|
|
||||||
ExecStart=/usr/sbin/sshd -D $OPTIONS #启动unit要运行命令或脚本的绝对路径
|
|
||||||
ExecReload=/bin/kill -HUP $MAINPID
|
|
||||||
KillMode=process
|
|
||||||
Restart=on-failure #失败后会再次自动启动此服务
|
|
||||||
RestartSec=42s #重启服务前暂停多长时间
|
|
||||||
|
|
||||||
[Install]:定义由"systemctl enbale" 以及"systemctl disable" 命令在实现服务启用或禁用时用到的一些选项
|
|
||||||
WantedBy=multi-user.target #被那些units所依赖,弱依赖
|
|
||||||
Alias= #别名
|
|
||||||
RequiredBy= #被哪些units所依赖,强依赖
|
|
||||||
|
|
||||||
```
|
```
|
||||||
2、常用命令
|
|
||||||
|
### 5.3 管理服务
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@centos ~]#systemctl list-units -t service
|
systemctl start nginx
|
||||||
UNIT LOAD ACTIVE SUB DESCRIPTION
|
systemctl stop nginx
|
||||||
acpid.service loaded active running ACPI Event Daemon
|
systemctl restart nginx
|
||||||
atd.service loaded active running Job spooling tools
|
systemctl reload nginx
|
||||||
auditd.service loaded active running Security Auditing Service
|
systemctl status nginx
|
||||||
ccsp.service loaded active running fraps service
|
|
||||||
cloud-config.service loaded active exited Apply the settings specified in cloud-config
|
|
||||||
cloud-final.service loaded active exited Execute cloud user/final scripts
|
|
||||||
|
|
||||||
[root@centos ~]#systemctl list-unit-files -t service
|
|
||||||
UNIT FILE STATE
|
|
||||||
abrt-ccpp.service disabled
|
|
||||||
abrt-oops.service disabled
|
|
||||||
abrt-pstoreoops.service disabled
|
|
||||||
abrt-vmcore.service disabled
|
|
||||||
|
|
||||||
loaded:unit配置文件已处理
|
|
||||||
active(running) 一次或多次持续处理的音响
|
|
||||||
active(exited)成功完成一次性的配置
|
|
||||||
active(waiting)运行中,等待一个事件
|
|
||||||
inactive 不允许
|
|
||||||
enbaled 开机启动
|
|
||||||
disabled 开机不启动
|
|
||||||
static 开机不启动,但可以被另外一个启动的服务激活
|
|
||||||
indirect 重定向到别处
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 5.4 开机自启管理
|
||||||
|
|
||||||
|
```shell
|
||||||
|
systemctl enable nginx
|
||||||
|
systemctl disable nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.5 重新加载配置
|
||||||
|
|
||||||
|
```shell
|
||||||
|
systemctl daemon-reload
|
||||||
|
```
|
||||||
|
|
||||||
|
修改或新增 unit 文件后,经常需要执行这条命令。
|
||||||
|
|
||||||
|
## 6、常见状态理解
|
||||||
|
|
||||||
|
### 6.1 运行状态
|
||||||
|
|
||||||
|
- `loaded`:配置文件已加载
|
||||||
|
- `active (running)`:正在运行
|
||||||
|
- `active (exited)`:一次性任务已成功执行完
|
||||||
|
- `inactive`:未运行
|
||||||
|
- `failed`:运行失败
|
||||||
|
|
||||||
|
### 6.2 开机启动状态
|
||||||
|
|
||||||
|
- `enabled`:开机自动启动
|
||||||
|
- `disabled`:不开机自动启动
|
||||||
|
- `static`:不能单独 enable,通常被其他 unit 依赖激活
|
||||||
|
- `indirect`:间接启用
|
||||||
|
|
||||||
|
## 7、常见运维建议
|
||||||
|
|
||||||
|
- 改 unit 文件后记得 `daemon-reload`
|
||||||
|
- 排查服务问题时先看 `systemctl status`
|
||||||
|
- 再结合 `journalctl -u 服务名` 看日志
|
||||||
|
- 依赖关系问题要重点看 `Requires` / `Wants` / `After`
|
||||||
|
- 自定义服务建议放在 `/etc/systemd/system`
|
||||||
|
|
||||||
|
## 8、小结
|
||||||
|
|
||||||
|
- `systemd` 是现代 Linux 的核心初始化与服务管理系统
|
||||||
|
- Unit 是它管理资源的基本对象
|
||||||
|
- 最常见的是 `service` 和 `target`
|
||||||
|
- `systemctl` 是日常管理服务的主力命令
|
||||||
|
- 掌握 unit 结构和状态含义后,排查服务问题会更高效
|
||||||
|
|||||||
@ -1,17 +1,121 @@
|
|||||||
1. UEFI或BIOS初始化,运行POST开机自检
|
## 1、系统引导顺序概览
|
||||||
2. 选择启动设备
|
|
||||||
3. 引导装载程序
|
Linux 系统从开机到进入可登录状态,大致会经历一条固定链路。
|
||||||
4. 加载initramfs驱动模块
|
|
||||||
5. 加载内核选项
|
理解这条链路后,排查“为什么机器起不来”“为什么服务没有自动启动”“为什么卡在某个阶段”会更有方向。
|
||||||
6. 内核初始化
|
|
||||||
7. 执行initrd.target所有单元。包括挂载/etc/fstab
|
## 2、典型启动流程
|
||||||
8. 从initramfs根文件系统切换到磁盘根目录
|
|
||||||
9. systemd执行默认target配置,配置文件/etc/systemd/system/default.traget
|
### 2.1 固件初始化
|
||||||
10. systemd启动multi-user.target下的本机与服务器服务
|
|
||||||
11. systemd执行multi-user.target下的/etc/rc.d/rc.local
|
- BIOS 或 UEFI 上电初始化
|
||||||
12. systemd执行multi-user.target下的getty.target及登录服务
|
- 执行 POST(开机自检)
|
||||||
13. systemd执行graphical需要的服务
|
|
||||||
|
### 2.2 选择启动设备
|
||||||
|
|
||||||
|
固件根据启动顺序选择硬盘、U 盘、网络等启动介质。
|
||||||
|
|
||||||
|
### 2.3 引导装载程序
|
||||||
|
|
||||||
|
常见是 GRUB,负责加载内核和引导参数。
|
||||||
|
|
||||||
|
### 2.4 加载内核与 initramfs
|
||||||
|
|
||||||
|
- 加载 Linux 内核
|
||||||
|
- 加载 `initramfs` 中的临时驱动和初始化环境
|
||||||
|
|
||||||
|
### 2.5 内核初始化
|
||||||
|
|
||||||
|
内核初始化硬件、内存、驱动、调度器等基础能力。
|
||||||
|
|
||||||
|
### 2.6 切换到真实根文件系统
|
||||||
|
|
||||||
|
系统从 `initramfs` 的临时根切换到磁盘上的真实根目录。
|
||||||
|
|
||||||
|
### 2.7 启动 `systemd`
|
||||||
|
|
||||||
|
内核启动完成后,交给 PID 1,也就是 `systemd` 继续完成用户空间初始化。
|
||||||
|
|
||||||
|
### 2.8 加载默认 target
|
||||||
|
|
||||||
|
`systemd` 根据默认 target 启动系统服务、登录服务以及图形服务(如果有)。
|
||||||
|
|
||||||
|
## 3、常见 target 理解
|
||||||
|
|
||||||
|
### 3.1 `multi-user.target`
|
||||||
|
|
||||||
|
类似传统的多用户文本模式,适合服务器环境。
|
||||||
|
|
||||||
|
### 3.2 `graphical.target`
|
||||||
|
|
||||||
|
在 `multi-user.target` 基础上增加图形界面相关服务。
|
||||||
|
|
||||||
|
### 3.3 默认 target
|
||||||
|
|
||||||
|
系统默认 target 常由以下链接决定:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
systemd-analyze plot > 1.html
|
/etc/systemd/system/default.target
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 4、启动阶段可能涉及的内容
|
||||||
|
|
||||||
|
- 读取内核参数
|
||||||
|
- 挂载根文件系统
|
||||||
|
- 处理 `/etc/fstab`
|
||||||
|
- 启动 `rc.local`(如果系统启用)
|
||||||
|
- 拉起登录服务 `getty`
|
||||||
|
- 启动图形相关服务
|
||||||
|
|
||||||
|
## 5、分析启动耗时
|
||||||
|
|
||||||
|
### 5.1 `systemd-analyze`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
systemd-analyze
|
||||||
|
```
|
||||||
|
|
||||||
|
查看启动耗时概览。
|
||||||
|
|
||||||
|
### 5.2 生成启动时序图
|
||||||
|
|
||||||
|
```shell
|
||||||
|
systemd-analyze plot > boot.html
|
||||||
|
```
|
||||||
|
|
||||||
|
生成 HTML 图,便于分析系统在启动阶段各服务耗时和依赖关系。
|
||||||
|
|
||||||
|
## 6、排障思路
|
||||||
|
|
||||||
|
### 6.1 系统卡在引导阶段
|
||||||
|
|
||||||
|
优先判断:
|
||||||
|
|
||||||
|
- 是 BIOS/UEFI 阶段问题
|
||||||
|
- 是 GRUB 问题
|
||||||
|
- 是内核启动问题
|
||||||
|
- 还是 `systemd` / 服务启动问题
|
||||||
|
|
||||||
|
### 6.2 系统启动慢
|
||||||
|
|
||||||
|
优先使用:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
systemd-analyze
|
||||||
|
systemd-analyze blame
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.3 服务没有自动启动
|
||||||
|
|
||||||
|
重点检查:
|
||||||
|
|
||||||
|
- 默认 target 是否正确
|
||||||
|
- 服务是否已 `enable`
|
||||||
|
- 依赖关系是否满足
|
||||||
|
|
||||||
|
## 7、小结
|
||||||
|
|
||||||
|
- Linux 启动链路大致是:BIOS/UEFI → 引导程序 → 内核/initramfs → 根文件系统 → systemd → target / 服务
|
||||||
|
- `multi-user.target` 和 `graphical.target` 是最常见的启动目标
|
||||||
|
- `systemd-analyze` 是分析启动耗时的高频工具
|
||||||
|
- 明确系统卡在哪个阶段,是启动排障的第一步
|
||||||
|
|||||||
@ -1,17 +1,139 @@
|
|||||||
隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时有规则定义的行为进行处理的一组功能的组件。
|
## 1、防火墙概览
|
||||||
## 一、netfilter
|
|
||||||
Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在Linux内核中
|
|
||||||
Netfilter在内核中选取五个位置放了五个hook(钩子)function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables、firewalld、nft)向其写入规则
|
|
||||||
##### 1、报文流向
|
|
||||||

|
|
||||||
数据包沿着链传输,iptables有5个链:PREROUTING, INPUT, FORWORD, OUTPUT, POSTROUTING,可以想象成5个关卡,每个关卡都有很多规则,也可能没有规则。
|
|
||||||
流入本机:PREROUTING —>INPUT—>用户空间进程
|
|
||||||
流出本机:用户空间进程 —>OUTPUT—>POSTROUTING
|
|
||||||
转发:PREROUTING —>FORWARD —> POSTROUTING
|
|
||||||
## 二、防火墙工具介绍
|
|
||||||
##### 1、iptables
|
|
||||||
##### 2、firewalld
|
|
||||||
CentOS7使用的防火墙工具,调用底层netfilter
|
|
||||||
##### 3、nftables
|
|
||||||
CentOS8及ubuntu22.04使用的防火墙工具,由netfilter项目组开发
|
|
||||||
|
|
||||||
|
防火墙的核心作用是:对进出主机或网络边界的数据包按规则进行检查,并根据规则决定**允许、拒绝、丢弃、转发**等行为。
|
||||||
|
|
||||||
|
在 Linux 中,防火墙底层通常依赖 **Netfilter** 框架。
|
||||||
|
|
||||||
|
## 2、Netfilter 基础
|
||||||
|
|
||||||
|
Netfilter 工作在 Linux 内核空间,在报文经过内核协议栈时提供多个钩子点(hook),供防火墙规则介入处理。
|
||||||
|
|
||||||
|
常见链路包括:
|
||||||
|
|
||||||
|
- `PREROUTING`
|
||||||
|
- `INPUT`
|
||||||
|
- `FORWARD`
|
||||||
|
- `OUTPUT`
|
||||||
|
- `POSTROUTING`
|
||||||
|
|
||||||
|
### 2.1 报文常见流向
|
||||||
|
|
||||||
|
#### 流入本机
|
||||||
|
|
||||||
|
```text
|
||||||
|
PREROUTING -> INPUT -> 用户空间进程
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 本机发出
|
||||||
|
|
||||||
|
```text
|
||||||
|
用户空间进程 -> OUTPUT -> POSTROUTING
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 转发流量
|
||||||
|
|
||||||
|
```text
|
||||||
|
PREROUTING -> FORWARD -> POSTROUTING
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3、常见防火墙工具
|
||||||
|
|
||||||
|
### 3.1 `iptables`
|
||||||
|
|
||||||
|
传统 Linux 防火墙工具,直接操作 Netfilter 规则。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 资料多
|
||||||
|
- 老系统常见
|
||||||
|
- 规则链和表概念较重要
|
||||||
|
|
||||||
|
### 3.2 `firewalld`
|
||||||
|
|
||||||
|
在 CentOS 7 等系统中较常见。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 底层仍基于 Netfilter
|
||||||
|
- 提供更高层抽象,如 zone、service
|
||||||
|
- 动态修改更方便
|
||||||
|
|
||||||
|
### 3.3 `nftables`
|
||||||
|
|
||||||
|
更现代的防火墙方案。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 设计更统一
|
||||||
|
- 可逐渐替代 `iptables`
|
||||||
|
- 现代发行版中越来越常见
|
||||||
|
|
||||||
|
## 4、如何理解链和规则
|
||||||
|
|
||||||
|
可以把每条链理解成一个“关卡”,数据包经过时,逐条匹配规则:
|
||||||
|
|
||||||
|
- 匹配到允许规则,就放行
|
||||||
|
- 匹配到拒绝规则,就拒绝
|
||||||
|
- 匹配到丢弃规则,就静默丢弃
|
||||||
|
- 如果都不匹配,则按默认策略处理
|
||||||
|
|
||||||
|
## 5、常见使用建议
|
||||||
|
|
||||||
|
### 5.1 先明确流量方向
|
||||||
|
|
||||||
|
排查前先区分:
|
||||||
|
|
||||||
|
- 是入站流量问题?
|
||||||
|
- 是出站流量问题?
|
||||||
|
- 还是转发流量问题?
|
||||||
|
|
||||||
|
### 5.2 先明确工具体系
|
||||||
|
|
||||||
|
要先看系统到底主要在用:
|
||||||
|
|
||||||
|
- `iptables`
|
||||||
|
- `firewalld`
|
||||||
|
- `nftables`
|
||||||
|
|
||||||
|
不同工具的管理方式差别很大。
|
||||||
|
|
||||||
|
### 5.3 规则变更要留后门
|
||||||
|
|
||||||
|
远程改防火墙时要特别小心:
|
||||||
|
|
||||||
|
- 优先保留 SSH 放行规则
|
||||||
|
- 先验证再保存
|
||||||
|
- 最好有控制台或带外管理入口
|
||||||
|
|
||||||
|
## 6、排障思路
|
||||||
|
|
||||||
|
### 6.1 服务端口明明启动了但访问不到
|
||||||
|
|
||||||
|
优先检查:
|
||||||
|
|
||||||
|
- 端口是否真的在监听
|
||||||
|
- 防火墙是否放行该端口
|
||||||
|
- 路由和安全组是否正确
|
||||||
|
|
||||||
|
### 6.2 主机能发不能收,或能收不能发
|
||||||
|
|
||||||
|
重点判断:
|
||||||
|
|
||||||
|
- 是 `INPUT` 问题
|
||||||
|
- 是 `OUTPUT` 问题
|
||||||
|
- 还是上游网络策略问题
|
||||||
|
|
||||||
|
### 6.3 路由转发不生效
|
||||||
|
|
||||||
|
重点检查:
|
||||||
|
|
||||||
|
- 是否命中 `FORWARD` 链
|
||||||
|
- 是否开启了 IP 转发
|
||||||
|
- NAT / masquerade 是否配置正确
|
||||||
|
|
||||||
|
## 7、小结
|
||||||
|
|
||||||
|
- Linux 防火墙底层核心是 Netfilter
|
||||||
|
- 常见链有 `PREROUTING`、`INPUT`、`FORWARD`、`OUTPUT`、`POSTROUTING`
|
||||||
|
- 常见工具有 `iptables`、`firewalld`、`nftables`
|
||||||
|
- 排查防火墙问题时,先判断流量方向,再判断所用工具,再看规则是否命中
|
||||||
|
|||||||
@ -1,175 +1,214 @@
|
|||||||
### 查看硬件信息
|
## 1、硬件管理概览
|
||||||
##### 查看CPU
|
|
||||||
###### lscpu命令
|
在 Linux 中查看硬件信息,常见关注点主要有三类:
|
||||||
|
|
||||||
|
- CPU:核心数、线程数、架构、缓存、是否虚拟化
|
||||||
|
- 内存:总量、可用量、缓存、Swap 使用情况
|
||||||
|
- 磁盘:设备、分区、文件系统类型、挂载点
|
||||||
|
|
||||||
|
做系统巡检或排障时,通常也是按这个顺序查看。
|
||||||
|
|
||||||
|
## 2、查看 CPU 信息
|
||||||
|
|
||||||
|
### 2.1 使用 `lscpu`
|
||||||
|
|
||||||
|
`lscpu` 是查看 CPU 信息最直观的命令,适合快速了解当前机器的处理器概况。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# lscpu
|
[root@tencentos ~]# lscpu
|
||||||
Architecture: x86_64 #CPU架构及位数
|
Architecture: x86_64
|
||||||
CPU op-mode(s): 32-bit, 64-bit #CPU可以运行的操作系统位数
|
CPU op-mode(s): 32-bit, 64-bit
|
||||||
Byte Order: Little Endian #数据存储方式
|
Byte Order: Little Endian
|
||||||
CPU(s): 2 #系统有两个核心
|
CPU(s): 2
|
||||||
On-line CPU(s) list: 0,1 #可用的CPU列表
|
On-line CPU(s) list: 0,1
|
||||||
Thread(s) per core: 1 #每个核心有1个线程
|
Thread(s) per core: 1
|
||||||
Core(s) per socket: 2 #每个插槽(物理CPU)有2个核心
|
Core(s) per socket: 2
|
||||||
Socket(s): 1 #有1个物理CPU
|
Socket(s): 1
|
||||||
NUMA node(s): 1 #有1个NUMA节点
|
NUMA node(s): 1
|
||||||
Vendor ID: GenuineIntel #CPU的制造商是Intel
|
Vendor ID: GenuineIntel
|
||||||
BIOS Vendor ID: Smdbmds
|
Model name: Intel(R) Xeon(R) Platinum 8255C CPU @ 2.50GHz
|
||||||
CPU family: 6 #CPU的家族编号是6
|
CPU MHz: 2494.140
|
||||||
Model: 85 #CPU的型号编号是85
|
Hypervisor vendor: KVM
|
||||||
Model name: Intel(R) Xeon(R) Platinum 8255C CPU @ 2.50GHz #CPU的型号名称是Intel Xeon Platinum 8255C,主频为2.50GHz。
|
Virtualization type: full
|
||||||
BIOS Model name: 3.0
|
L1d cache: 32K
|
||||||
Stepping: 5 #CPU的步进值是5,这是CPU版本的一种标识
|
|
||||||
CPU MHz: 2494.140 #CPU的实际运行速度是2494.140 MHz
|
|
||||||
BogoMIPS: 4988.28 #BogoMIPS是一种测量CPU速度的方法,但并不总是准确的
|
|
||||||
Hypervisor vendor: KVM #虚拟化软件的供应商是KVM
|
|
||||||
Virtualization type: full #支持全虚拟化
|
|
||||||
L1d cache: 32K #CPU的不同级别的缓存大小
|
|
||||||
L1i cache: 32K
|
L1i cache: 32K
|
||||||
L2 cache: 4096K
|
L2 cache: 4096K
|
||||||
L3 cache: 36608K
|
L3 cache: 36608K
|
||||||
NUMA node0 CPU(s): 0,1 #NUMA节点0包含CPU 0和1。
|
|
||||||
Flags(这是CPU支持的各种特性和指令集): fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat avx512_vnni
|
|
||||||
```
|
```
|
||||||
###### /proc/cpuinfo
|
|
||||||
|
### 2.2 重点字段说明
|
||||||
|
|
||||||
|
- `Architecture`:CPU 架构,例如 `x86_64` 表示 64 位架构
|
||||||
|
- `CPU op-mode(s)`:CPU 支持运行 32 位和 64 位操作系统
|
||||||
|
- `CPU(s)`:逻辑 CPU 数量,不一定等于物理核心数
|
||||||
|
- `Thread(s) per core`:每个核心的线程数,开启超线程时通常大于 1
|
||||||
|
- `Core(s) per socket`:每个物理 CPU 的核心数
|
||||||
|
- `Socket(s)`:物理 CPU 颗数
|
||||||
|
- `Model name`:CPU 型号
|
||||||
|
- `Hypervisor vendor`:当前是否运行在虚拟化环境中,例如 KVM
|
||||||
|
- `L1/L2/L3 cache`:不同层级的 CPU 缓存大小
|
||||||
|
|
||||||
|
### 2.3 使用 `/proc/cpuinfo`
|
||||||
|
|
||||||
|
如果你想看更底层、更详细的信息,可以直接查看:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# cat /proc/cpuinfo
|
[root@tencentos ~]# cat /proc/cpuinfo
|
||||||
processor : 0 #处理器编号,这里有两个处理器,编号分别为0和1
|
|
||||||
vendor_id : GenuineIntel #CPU制造商,这里是GenuineIntel,表示是英特尔的CPU
|
|
||||||
cpu family : 6 #CPU家族,这里是6,表示属于第6代CPU
|
|
||||||
model : 85 #CPU型号,这里是85
|
|
||||||
model name : Intel(R) Xeon(R) Platinum 8255C CPU @ 2.50GHz
|
|
||||||
stepping : 5
|
|
||||||
microcode : 0x1
|
|
||||||
cpu MHz : 2494.140
|
|
||||||
cache size : 36608 KB #CPU缓存大小,这里是36608 KB
|
|
||||||
physical id : 0
|
|
||||||
siblings : 2
|
|
||||||
core id : 0
|
|
||||||
cpu cores : 2
|
|
||||||
apicid : 0
|
|
||||||
initial apicid : 0
|
|
||||||
fpu : yes
|
|
||||||
fpu_exception : yes
|
|
||||||
cpuid level : 13
|
|
||||||
wp : yes
|
|
||||||
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat avx512_vnni
|
|
||||||
bugs(CPU的已知问题和漏洞) : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa itlb_multihit
|
|
||||||
bogomips : 4988.28
|
|
||||||
clflush size : 64
|
|
||||||
cache_alignment : 64
|
|
||||||
address sizes : 46 bits physical, 48 bits virtual
|
|
||||||
power management:
|
|
||||||
|
|
||||||
processor : 1
|
|
||||||
vendor_id : GenuineIntel
|
|
||||||
cpu family : 6
|
|
||||||
model : 85
|
|
||||||
model name : Intel(R) Xeon(R) Platinum 8255C CPU @ 2.50GHz
|
|
||||||
stepping : 5
|
|
||||||
microcode : 0x1
|
|
||||||
cpu MHz : 2494.140
|
|
||||||
cache size : 36608 KB
|
|
||||||
physical id : 0
|
|
||||||
siblings : 2
|
|
||||||
core id : 1
|
|
||||||
cpu cores : 2
|
|
||||||
apicid : 1
|
|
||||||
initial apicid : 1
|
|
||||||
fpu : yes
|
|
||||||
fpu_exception : yes
|
|
||||||
cpuid level : 13
|
|
||||||
wp : yes
|
|
||||||
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat avx512_vnni
|
|
||||||
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa itlb_multihit
|
|
||||||
bogomips : 4988.28
|
|
||||||
clflush size : 64
|
|
||||||
cache_alignment : 64
|
|
||||||
address sizes : 46 bits physical, 48 bits virtual
|
|
||||||
power management:
|
|
||||||
|
|
||||||
[root@tencentos ~]#
|
|
||||||
```
|
```
|
||||||
##### 查看内存
|
|
||||||
###### free命令
|
这个文件会按每个逻辑 CPU 分别列出详细参数,例如:
|
||||||
|
|
||||||
|
- `processor`:逻辑 CPU 编号
|
||||||
|
- `vendor_id`:CPU 厂商
|
||||||
|
- `model name`:CPU 型号名称
|
||||||
|
- `cpu MHz`:当前频率
|
||||||
|
- `cache size`:缓存大小
|
||||||
|
- `flags`:CPU 支持的指令集特性
|
||||||
|
- `bugs`:已知 CPU 漏洞或风险标记
|
||||||
|
- `address sizes`:物理地址和虚拟地址位数
|
||||||
|
|
||||||
|
### 2.4 使用场景建议
|
||||||
|
|
||||||
|
- **快速巡检**:优先用 `lscpu`
|
||||||
|
- **查看更细节的 CPU 参数**:使用 `/proc/cpuinfo`
|
||||||
|
- **判断是否是虚拟机**:关注 `Hypervisor vendor`
|
||||||
|
- **判断核心、线程、物理 CPU 数**:结合 `CPU(s)`、`Thread(s) per core`、`Core(s) per socket`、`Socket(s)` 一起看
|
||||||
|
|
||||||
|
## 3、查看内存信息
|
||||||
|
|
||||||
|
### 3.1 使用 `free -h`
|
||||||
|
|
||||||
|
`free` 是查看内存最常用的命令,`-h` 可以用更适合阅读的单位显示。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# free -h
|
[root@tencentos ~]# free -h
|
||||||
total used free shared buff/cache available
|
total used free shared buff/cache available
|
||||||
Mem: 1.7Gi 323Mi 341Mi 35Mi 1.0Gi 1.2Gi
|
Mem: 1.7Gi 323Mi 341Mi 35Mi 1.0Gi 1.2Gi
|
||||||
Swap: 0B 0B 0B
|
Swap: 0B 0B 0B
|
||||||
```
|
```
|
||||||
###### /proc/meminfo
|
|
||||||
|
### 3.2 重点字段说明
|
||||||
|
|
||||||
|
- `total`:内存总量
|
||||||
|
- `used`:已使用内存
|
||||||
|
- `free`:完全空闲的内存
|
||||||
|
- `shared`:共享内存
|
||||||
|
- `buff/cache`:被缓冲区和页缓存占用的内存
|
||||||
|
- `available`:当前可供应用程序使用的内存,通常比 `free` 更有参考价值
|
||||||
|
- `Swap`:交换分区使用情况
|
||||||
|
|
||||||
|
### 3.3 使用 `/proc/meminfo`
|
||||||
|
|
||||||
|
如果需要更完整的内存明细,可以查看:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# cat /proc/meminfo
|
[root@tencentos ~]# cat /proc/meminfo
|
||||||
MemTotal: 1762908 kB
|
|
||||||
MemFree: 353604 kB
|
|
||||||
MemAvailable: 1229960 kB
|
|
||||||
Buffers: 100912 kB
|
|
||||||
Cached: 902816 kB
|
|
||||||
SwapCached: 0 kB
|
|
||||||
Active: 810564 kB
|
|
||||||
Inactive: 425712 kB
|
|
||||||
Active(anon): 235464 kB
|
|
||||||
Inactive(anon): 32936 kB
|
|
||||||
Active(file): 575100 kB
|
|
||||||
Inactive(file): 392776 kB
|
|
||||||
Unevictable: 0 kB
|
|
||||||
Mlocked: 0 kB
|
|
||||||
SwapTotal: 0 kB
|
|
||||||
SwapFree: 0 kB
|
|
||||||
Dirty: 188 kB
|
|
||||||
Writeback: 0 kB
|
|
||||||
AnonPages: 212480 kB
|
|
||||||
Mapped: 121384 kB
|
|
||||||
Shmem: 35860 kB
|
|
||||||
KReclaimable: 78132 kB
|
|
||||||
Slab: 130264 kB
|
|
||||||
SReclaimable: 78132 kB
|
|
||||||
SUnreclaim: 52132 kB
|
|
||||||
KernelStack: 2784 kB
|
|
||||||
PageTables: 6572 kB
|
|
||||||
NFS_Unstable: 0 kB
|
|
||||||
Bounce: 0 kB
|
|
||||||
WritebackTmp: 0 kB
|
|
||||||
CommitLimit: 881452 kB
|
|
||||||
Committed_AS: 1222084 kB
|
|
||||||
VmallocTotal: 34359738367 kB
|
|
||||||
VmallocUsed: 8032 kB
|
|
||||||
VmallocChunk: 0 kB
|
|
||||||
Percpu: 2320 kB
|
|
||||||
HardwareCorrupted: 0 kB
|
|
||||||
AnonHugePages: 118784 kB
|
|
||||||
ShmemHugePages: 0 kB
|
|
||||||
ShmemPmdMapped: 0 kB
|
|
||||||
FileHugePages: 0 kB
|
|
||||||
FilePmdMapped: 0 kB
|
|
||||||
HugePages_Total: 0
|
|
||||||
HugePages_Free: 0
|
|
||||||
HugePages_Rsvd: 0
|
|
||||||
HugePages_Surp: 0
|
|
||||||
Hugepagesize: 2048 kB
|
|
||||||
Hugetlb: 0 kB
|
|
||||||
DirectMap4k: 122744 kB
|
|
||||||
DirectMap2M: 1974272 kB
|
|
||||||
DirectMap1G: 0 kB
|
|
||||||
```
|
```
|
||||||
##### 查看硬盘
|
|
||||||
###### lsblk命令
|
其中比较常见的字段有:
|
||||||
|
|
||||||
|
- `MemTotal`:物理内存总量
|
||||||
|
- `MemFree`:当前空闲内存
|
||||||
|
- `MemAvailable`:当前可用内存
|
||||||
|
- `Buffers`:块设备缓冲区使用量
|
||||||
|
- `Cached`:页缓存使用量
|
||||||
|
- `SwapTotal`:Swap 总量
|
||||||
|
- `SwapFree`:Swap 剩余量
|
||||||
|
- `Slab`:内核 slab 缓存占用
|
||||||
|
- `Dirty`:等待写回磁盘的数据量
|
||||||
|
|
||||||
|
### 3.4 排障时怎么看内存
|
||||||
|
|
||||||
|
- 日常巡检时优先看 `free -h`
|
||||||
|
- 不要只盯着 `free`,应重点关注 `available`
|
||||||
|
- 如果 `Swap` 持续上升,通常需要关注内存压力
|
||||||
|
- 如果想进一步排查缓存、页表、HugePages 等问题,再看 `/proc/meminfo`
|
||||||
|
|
||||||
|
## 4、查看磁盘与分区信息
|
||||||
|
|
||||||
|
### 4.1 使用 `lsblk`
|
||||||
|
|
||||||
|
`lsblk` 用于查看块设备、分区和挂载关系,是查看磁盘结构时最常用的命令之一。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# lsblk
|
[root@tencentos ~]# lsblk
|
||||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
|
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
|
||||||
vda 253:0 0 50G 0 disk
|
vda 253:0 0 50G 0 disk
|
||||||
└─vda1 253:1 0 50G 0 part /
|
└─vda1 253:1 0 50G 0 part /
|
||||||
```
|
```
|
||||||
###### /proc/partitions
|
|
||||||
|
### 4.2 重点字段说明
|
||||||
|
|
||||||
|
- `NAME`:设备名称
|
||||||
|
- `MAJ:MIN`:主设备号和次设备号
|
||||||
|
- `RM`:是否可移动设备,`1` 表示是,`0` 表示否
|
||||||
|
- `SIZE`:设备或分区大小
|
||||||
|
- `RO`:是否只读
|
||||||
|
- `TYPE`:设备类型,例如 `disk`、`part`
|
||||||
|
- `MOUNTPOINT`:挂载点
|
||||||
|
|
||||||
|
### 4.3 使用 `/proc/partitions`
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# cat /proc/partitions
|
[root@tencentos ~]# cat /proc/partitions
|
||||||
major minor #blocks name
|
major minor #blocks name
|
||||||
|
|
||||||
253 0 52428800 vda
|
253 0 52428800 vda
|
||||||
253 1 52427759 vda1
|
253 1 52427759 vda1
|
||||||
```
|
```
|
||||||
###### blkid命令
|
|
||||||
|
这个文件更偏底层,适合查看系统识别到的块设备和分区情况。
|
||||||
|
|
||||||
|
### 4.4 使用 `blkid`
|
||||||
|
|
||||||
|
`blkid` 可以查看设备的文件系统类型、UUID、分区 UUID 等信息。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# blkid
|
[root@tencentos ~]# blkid
|
||||||
/dev/vda1: UUID="ded6c45d-0699-43e5-bc44-f31c21449dcc" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="5f3d9d70-01"
|
/dev/vda1: UUID="ded6c45d-0699-43e5-bc44-f31c21449dcc" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="5f3d9d70-01"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 4.5 `blkid` 常见用途
|
||||||
|
|
||||||
|
- 查看文件系统类型,例如 `ext4`、`xfs`
|
||||||
|
- 获取 `UUID`,便于写入 `/etc/fstab`
|
||||||
|
- 排查磁盘挂载失败、设备识别异常等问题
|
||||||
|
|
||||||
|
## 5、常用巡检思路
|
||||||
|
|
||||||
|
如果只是做一次简单的硬件巡检,通常可以按下面的顺序:
|
||||||
|
|
||||||
|
### 5.1 看 CPU
|
||||||
|
|
||||||
|
```shell
|
||||||
|
lscpu
|
||||||
|
```
|
||||||
|
|
||||||
|
关注:架构、核心数、线程数、虚拟化信息。
|
||||||
|
|
||||||
|
### 5.2 看内存
|
||||||
|
|
||||||
|
```shell
|
||||||
|
free -h
|
||||||
|
```
|
||||||
|
|
||||||
|
关注:总量、可用内存、Swap 是否被使用。
|
||||||
|
|
||||||
|
### 5.3 看磁盘
|
||||||
|
|
||||||
|
```shell
|
||||||
|
lsblk
|
||||||
|
blkid
|
||||||
|
```
|
||||||
|
|
||||||
|
关注:磁盘和分区结构、挂载点、文件系统类型。
|
||||||
|
|
||||||
|
## 6、小结
|
||||||
|
|
||||||
|
- `lscpu` 适合快速查看 CPU 总体情况
|
||||||
|
- `/proc/cpuinfo` 更详细,适合深入分析 CPU 参数
|
||||||
|
- `free -h` 是查看内存使用最常用的命令
|
||||||
|
- `/proc/meminfo` 提供更细的内存统计信息
|
||||||
|
- `lsblk` 适合看块设备和挂载关系
|
||||||
|
- `blkid` 适合看 UUID 和文件系统类型
|
||||||
|
|
||||||
|
这几个命令已经能覆盖 Linux 中大部分基础硬件巡检场景。
|
||||||
|
|||||||
@ -1,44 +1,143 @@
|
|||||||
## 1、Linux内核版本号
|
## 1、Linux 内核概览
|
||||||
源码状态:开源GPL协议
|
|
||||||
内核版本,linux-5.4.119-19-0009
|
|
||||||
主版本号(较大变化):5
|
|
||||||
次版本号(较小变化):4
|
|
||||||
末版本号(修订版本号,错误修复、漏洞修补等变化):119-19-0009
|
|
||||||
|
|
||||||
## 2、Linux发行版
|
Linux 内核是操作系统最核心的部分,负责:
|
||||||
|
|
||||||
|
- 进程调度
|
||||||
|
- 内存管理
|
||||||
|
- 设备驱动
|
||||||
|
- 文件系统
|
||||||
|
- 网络协议栈
|
||||||
|
- 系统调用接口
|
||||||
|
|
||||||
|
用户平时操作的大多数命令和程序,最终都需要通过内核来访问系统资源。
|
||||||
|
|
||||||
|
## 2、内核版本号
|
||||||
|
|
||||||
|
以一个示例版本为例:
|
||||||
|
|
||||||
|
```text
|
||||||
|
linux-5.4.119-19-0009
|
||||||
|
```
|
||||||
|
|
||||||
|
可以大致理解为:
|
||||||
|
|
||||||
|
- `5`:主版本号
|
||||||
|
- `4`:次版本号
|
||||||
|
- `119-19-0009`:修订版本或发行版附加版本信息
|
||||||
|
|
||||||
|
通常主版本和次版本更偏向内核主线版本,后面的部分则常见于发行版维护补丁版本。
|
||||||
|
|
||||||
|
## 3、源码状态与协议
|
||||||
|
|
||||||
|
Linux 内核是开源软件,常见采用 GPL 协议发布。
|
||||||
|
|
||||||
|
## 4、Linux 发行版和内核的关系
|
||||||
|
|
||||||
|
Linux 内核并不等于 Linux 发行版。发行版通常是在内核基础上,加上:
|
||||||
|
|
||||||
|
- 软件包管理器
|
||||||
|
- 系统工具
|
||||||
|
- 服务管理组件
|
||||||
|
- 默认配置
|
||||||
|
- 桌面环境或服务器工具链
|
||||||
|
|
||||||
|
常见发行版:
|
||||||
|
|
||||||
|
- `Red Hat` / `Rocky Linux` / `AlmaLinux`
|
||||||
|
- `Debian`
|
||||||
|
- `Ubuntu`
|
||||||
|
- `Fedora`
|
||||||
|
- `Alpine`
|
||||||
|
|
||||||
|
### 4.1 简单理解
|
||||||
|
|
||||||
|
- `Fedora`:相对更新、更激进
|
||||||
|
- `Ubuntu`:桌面和服务器都很常见,LTS 版本支持周期长
|
||||||
|
- `Debian`:稳定著称
|
||||||
|
- `Alpine`:轻量、简洁,容器场景常见
|
||||||
|
|
||||||
|
## 5、用户态与内核态
|
||||||
|
|
||||||
|
### 5.1 用户态
|
||||||
|
|
||||||
|
用户程序运行的空间。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 权限受限
|
||||||
|
- 不能直接操作底层硬件和关键系统资源
|
||||||
|
- 需要通过系统调用进入内核态
|
||||||
|
|
||||||
|
### 5.2 内核态
|
||||||
|
|
||||||
|
内核运行的空间。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 拥有更高权限
|
||||||
|
- 可以直接管理 CPU、内存、磁盘、网络等资源
|
||||||
|
|
||||||
|
### 5.3 两者关系
|
||||||
|
|
||||||
|
应用程序大多运行在用户态,但在访问文件、网络、设备等资源时,需要通过系统调用进入内核态完成相关操作。
|
||||||
|
|
||||||
|
## 6、`/proc` 与内核参数管理
|
||||||
|
|
||||||
|
Linux 通过 `/proc` 这个伪文件系统暴露很多内核状态、统计信息和可调参数。
|
||||||
|
|
||||||
|
例如:
|
||||||
|
|
||||||
|
- 进程信息
|
||||||
|
- CPU 信息
|
||||||
|
- 内存信息
|
||||||
|
- 网络参数
|
||||||
|
- `sysctl` 内核参数
|
||||||
|
|
||||||
|
## 7、`sysctl` 命令
|
||||||
|
|
||||||
|
常见配置文件:
|
||||||
|
|
||||||
- redhat:每18个月发行一个新版本
|
|
||||||
- fedora:redhat的测试版,每6个月发一个新版本
|
|
||||||
- centos:centos已死,rocky linux当立
|
|
||||||
- debian:
|
|
||||||
- ubuntu:相较于fedora的激进还好一些,不过也是使用一些较新的Linux内核版本,每两年的4月份都会推出一个长期支持版本(LTS),支持周期长达5年,非LTS的版本支持周期为半年
|
|
||||||
- Alpine:一个面向安全的轻型Linux发行版,只有5M大小左右
|
|
||||||
## 3、proc目录和内核参数管理
|
|
||||||
内核把自己内部状态信息及统计信息,以及可配置参数通过proc为文件系统加以输出
|
|
||||||
```shell
|
```shell
|
||||||
配置文件:/etc/sysctl.conf
|
/etc/sysctl.conf
|
||||||
|
```
|
||||||
|
|
||||||
1、临时设置某参数
|
常见用法:
|
||||||
|
|
||||||
|
### 7.1 临时设置参数
|
||||||
|
|
||||||
|
```shell
|
||||||
sysctl -w 参数=value
|
sysctl -w 参数=value
|
||||||
|
```
|
||||||
|
|
||||||
2、读取配置文件设置参数
|
### 7.2 重新加载配置文件
|
||||||
sysctl -p 文件
|
|
||||||
|
|
||||||
3、查看指定参数
|
```shell
|
||||||
|
sysctl -p
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3 查看指定参数
|
||||||
|
|
||||||
|
```shell
|
||||||
sysctl 参数名
|
sysctl 参数名
|
||||||
|
```
|
||||||
|
|
||||||
4、查看所有生效参数
|
### 7.4 查看所有生效参数
|
||||||
|
|
||||||
|
```shell
|
||||||
sysctl -a
|
sysctl -a
|
||||||
```
|
```
|
||||||
|
|
||||||
### 用户态
|
## 8、常见运维建议
|
||||||
|
|
||||||
- 简介:用户程序的运行空间
|
- 先理解“内核”和“发行版”不是同一个概念
|
||||||
- 作用:和内核运行空间隔离,即使用户的程序崩溃也不影响内核
|
- 调整内核参数前,先明确业务目标
|
||||||
- 限制:只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(system call),才能向内核发出指令
|
- 临时调优先用 `sysctl -w`
|
||||||
|
- 永久调优再写入 `/etc/sysctl.conf` 或 `/etc/sysctl.d/`
|
||||||
|
- 不熟悉的内核参数不要直接在生产环境修改
|
||||||
|
|
||||||
### 内核态
|
## 9、小结
|
||||||
|
|
||||||
- 简介:内核的运行空间
|
|
||||||
- 作用:调用系统资源
|
|
||||||
|
|
||||||
|
- Linux 内核负责系统最底层的资源管理
|
||||||
|
- 发行版是在内核之上封装出的完整操作系统环境
|
||||||
|
- 用户态和内核态是 Linux 权限与执行模型的重要概念
|
||||||
|
- `/proc` 和 `sysctl` 是观察和调整内核行为的常用入口
|
||||||
|
|||||||
@ -1,104 +1,245 @@
|
|||||||
# Linux 内核参数列表
|
# Linux 内核参数列表
|
||||||
|
|
||||||
```
|
## 1、说明
|
||||||
kernel.panic:在内核崩溃时自动重启系统之前等待的时间(以秒为单位)。默认值为0,表示禁用自动重启。
|
|
||||||
|
|
||||||
kernel.core_uses_pid:控制内核是否在生成核心转储文件时包括进程ID。默认值为1,表示包括进程ID。
|
这篇笔记用于记录常见 `sysctl` 内核参数,方便按类别快速查阅。它不是完整清单,而是**运维中相对高频**的一组参数索引。
|
||||||
|
|
||||||
kernel.core_pattern:指定生成核心转储文件的文件名模式。默认值为“core”,可以设置为其他文件名模式。
|
查看参数:
|
||||||
|
|
||||||
kernel.msgmax:设置系统中单个IPC消息的最大大小(以字节为单位)。默认值为8192,可以根据需要增加。
|
```shell
|
||||||
|
sysctl 参数名
|
||||||
kernel.msgmnb:设置系统中单个IPC消息队列的最大大小(以字节为单位)。默认值为16384,可以根据需要增加。
|
|
||||||
|
|
||||||
kernel.shmmax:设置共享内存段的最大大小(以字节为单位)。默认值为4294967295,可以根据需要增加。
|
|
||||||
|
|
||||||
kernel.shmall:设置系统中共享内存段的最大数量。默认值为4294967295,可以根据需要增加。
|
|
||||||
|
|
||||||
kernel.sem:设置系统范围内的信号量参数。该参数由三个值组成,分别表示信号量集的最大数量、每个信号量集的最大数量和系统范围内的最大信号量数量。
|
|
||||||
|
|
||||||
kernel.sysrq:启用Linux SysRq键,该键允许在系统崩溃或死锁时执行一些紧急操作。默认值为0,可以设置为1以启用。
|
|
||||||
|
|
||||||
kernel.randomize_va_space:启用地址空间随机化,以增加系统的安全性。默认值为2,表示启用完全随机化。
|
|
||||||
|
|
||||||
kernel.pid_max:设置系统中进程ID的最大值。默认值为32768,可以根据需要增加。
|
|
||||||
|
|
||||||
kernel.threads-max:设置系统中线程的最大数量。默认值为65536,可以根据需要增加。
|
|
||||||
|
|
||||||
kernel.printk:控制内核消息的输出级别。默认值为4,表示输出所有消息。
|
|
||||||
|
|
||||||
vm.swappiness:控制内核将内存页面交换到交换空间的倾向程度。默认值为60,可以设置为0以完全禁用交换,或设置为100以强制内核尽可能多地使用交换空间。
|
|
||||||
|
|
||||||
vm.dirty_ratio:设置内核在写入脏页面之前允许内存缓存的最大大小(以百分比为单位)。默认值为20,可以根据需要调整。
|
|
||||||
|
|
||||||
vm.dirty_background_ratio:设置内核在后台写入脏页面时允许内存缓存的最大大小(以百分比为单位)。默认值为10,可以根据需要调整。
|
|
||||||
|
|
||||||
vm.dirty_expire_centisecs:设置内核在将脏页面写入磁盘之前等待的时间(以百分之一秒为单位)。默认值为3000,可以根据需要调整。
|
|
||||||
|
|
||||||
vm.vfs_cache_pressure:控制内核在释放缓存时如何权衡inode和dentry缓存。默认值为100,可以根据需要调整。
|
|
||||||
|
|
||||||
net.ipv4.ip_forward:启用IP转发,以允许Linux系统作为路由器使用。默认值为0,可以设置为1以启用。
|
|
||||||
|
|
||||||
net.ipv4.conf.all.accept_redirects:控制内核是否接受ICMP重定向消息。默认值为1,表示接受。
|
|
||||||
|
|
||||||
net.ipv4.conf.all.send_redirects:控制内核是否发送ICMP重定向消息。默认值为1,表示发送。
|
|
||||||
|
|
||||||
net.ipv4.conf.all.rp_filter:控制内核是否启用反向路径过滤。默认值为1,表示启用。
|
|
||||||
|
|
||||||
net.ipv4.conf.all.log_martians:控制内核是否记录收到的无效IP数据包。默认值为0,表示禁用记录。
|
|
||||||
|
|
||||||
net.ipv4.tcp_syncookies:启用SYN Cookies保护,以防止TCP SYN Flood攻击。默认值为0,可以设置为1以启用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_max_syn_backlog:设置TCP连接队列的最大长度。默认值为128,可以根据需要增加。
|
|
||||||
|
|
||||||
net.ipv4.tcp_fin_timeout:设置TCP连接关闭后等待的时间(以秒为单位)。默认值为60,可以根据需要调整。
|
|
||||||
|
|
||||||
net.ipv4.tcp_keepalive_time:设置TCP keepalive定时器的时间间隔(以秒为单位)。默认值为7200,可以根据需要调整。
|
|
||||||
|
|
||||||
net.ipv4.tcp_keepalive_probes:设置TCP keepalive定时器发送的探测次数。默认值为9,可以根据需要调整。
|
|
||||||
|
|
||||||
net.ipv4.tcp_keepalive_intvl:设置TCP keepalive定时器发送探测之间的时间间隔(以秒为单位)。默认值为75,可以根据需要调整。
|
|
||||||
|
|
||||||
net.ipv4.tcp_retries1:设置TCP连接失败后重新尝试连接的次数。默认值为3,可以根据需要调整。
|
|
||||||
|
|
||||||
net.ipv4.tcp_retries2:设置TCP连接失败后重新尝试连接的次数。默认值为15,可以根据需要调整。
|
|
||||||
|
|
||||||
net.ipv4.tcp_synack_retries:设置TCP连接失败后重新尝试连接的次数。默认值为5,可以根据需要调整。
|
|
||||||
|
|
||||||
net.ipv4.tcp_timestamps:启用TCP时间戳,以提高TCP连接的性能。默认值为1,表示启用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_sack:启用TCP选择确认,以提高TCP连接的性能。默认值为1,表示启用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_window_scaling:启用TCP窗口缩放,以提高TCP连接的性能。默认值为1,表示启用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_slow_start_after_idle:启用TCP慢启动,以提高TCP连接的性能。默认值为1,表示启用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_fastopen:启用TCP快速打开,以提高TCP连接的性能。默认值为1,表示启用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_mtu_probing:启用TCP MTU探测,以提高TCP连接的性能。默认值为0,表示禁用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_congestion_control:设置TCP拥塞控制算法。默认值为cubic,可以设置为其他算法。
|
|
||||||
|
|
||||||
net.ipv4.tcp_no_metrics_save:禁用TCP性能测量。默认值为0,表示启用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_moderate_rcvbuf:启用TCP接收缓冲区自适应调整。默认值为1,表示启用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_ecn:启用TCP显式拥塞通知。默认值为0,表示禁用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_fack:启用TCP FACK拥塞控制算法。默认值为1,表示启用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_low_latency:启用TCP低延迟模式。默认值为0,表示禁用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_tw_reuse:启用TCP TIME-WAIT套接字重用。默认值为0,表示禁用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_tw_recycle:启用TCP TIME-WAIT套接字回收。默认值为0,表示禁用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_abort_on_overflow:启用TCP连接队列溢出时的异常处理。默认值为0,表示禁用。
|
|
||||||
|
|
||||||
net.ipv4.tcp_adv_win_scale:设置TCP高级窗口缩放因子。默认值为2,可以根据需要调整。
|
|
||||||
|
|
||||||
net.ipv4.tcp_app_win:设置TCP应用程序窗口大小。默认值为31,可以根据需要调整。
|
|
||||||
|
|
||||||
net.ipv4.tcp_dsack:启用TCP D-SACK拥塞控制算法。默认值为1,表示启用。
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
临时设置参数:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sysctl -w 参数=value
|
||||||
|
```
|
||||||
|
|
||||||
|
永久生效通常写入:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
/etc/sysctl.conf
|
||||||
|
/etc/sysctl.d/*.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2、Kernel 类
|
||||||
|
|
||||||
|
### 2.1 `kernel.panic`
|
||||||
|
|
||||||
|
内核崩溃后自动重启前等待的秒数。
|
||||||
|
|
||||||
|
### 2.2 `kernel.core_uses_pid`
|
||||||
|
|
||||||
|
控制 core dump 文件名中是否带进程 ID。
|
||||||
|
|
||||||
|
### 2.3 `kernel.core_pattern`
|
||||||
|
|
||||||
|
指定 core dump 文件名模式。
|
||||||
|
|
||||||
|
### 2.4 `kernel.msgmax`
|
||||||
|
|
||||||
|
单个 IPC 消息的最大大小。
|
||||||
|
|
||||||
|
### 2.5 `kernel.msgmnb`
|
||||||
|
|
||||||
|
单个 IPC 消息队列的最大大小。
|
||||||
|
|
||||||
|
### 2.6 `kernel.shmmax`
|
||||||
|
|
||||||
|
单个共享内存段最大大小。
|
||||||
|
|
||||||
|
### 2.7 `kernel.shmall`
|
||||||
|
|
||||||
|
系统共享内存总量上限。
|
||||||
|
|
||||||
|
### 2.8 `kernel.sem`
|
||||||
|
|
||||||
|
系统级信号量参数。
|
||||||
|
|
||||||
|
### 2.9 `kernel.sysrq`
|
||||||
|
|
||||||
|
是否启用 SysRq 紧急控制功能。
|
||||||
|
|
||||||
|
### 2.10 `kernel.randomize_va_space`
|
||||||
|
|
||||||
|
地址空间随机化(ASLR)开关,影响系统安全性。
|
||||||
|
|
||||||
|
### 2.11 `kernel.pid_max`
|
||||||
|
|
||||||
|
系统可分配的最大 PID。
|
||||||
|
|
||||||
|
### 2.12 `kernel.threads-max`
|
||||||
|
|
||||||
|
系统线程总数上限。
|
||||||
|
|
||||||
|
### 2.13 `kernel.printk`
|
||||||
|
|
||||||
|
内核日志输出级别控制。
|
||||||
|
|
||||||
|
## 3、VM 类
|
||||||
|
|
||||||
|
### 3.1 `vm.swappiness`
|
||||||
|
|
||||||
|
控制系统使用 swap 的倾向,值越大越倾向使用交换分区。
|
||||||
|
|
||||||
|
### 3.2 `vm.dirty_ratio`
|
||||||
|
|
||||||
|
内存中脏页占比达到该阈值时,触发写回。
|
||||||
|
|
||||||
|
### 3.3 `vm.dirty_background_ratio`
|
||||||
|
|
||||||
|
后台刷盘开始的脏页比例。
|
||||||
|
|
||||||
|
### 3.4 `vm.dirty_expire_centisecs`
|
||||||
|
|
||||||
|
脏页可停留多久后被回写,单位是百分之一秒。
|
||||||
|
|
||||||
|
### 3.5 `vm.vfs_cache_pressure`
|
||||||
|
|
||||||
|
控制回收 inode / dentry 缓存的积极程度。
|
||||||
|
|
||||||
|
## 4、网络与 IPv4 类
|
||||||
|
|
||||||
|
### 4.1 `net.ipv4.ip_forward`
|
||||||
|
|
||||||
|
是否启用 IPv4 转发。
|
||||||
|
|
||||||
|
### 4.2 `net.ipv4.conf.all.accept_redirects`
|
||||||
|
|
||||||
|
是否接受 ICMP Redirect。
|
||||||
|
|
||||||
|
### 4.3 `net.ipv4.conf.all.send_redirects`
|
||||||
|
|
||||||
|
是否发送 ICMP Redirect。
|
||||||
|
|
||||||
|
### 4.4 `net.ipv4.conf.all.rp_filter`
|
||||||
|
|
||||||
|
是否启用反向路径过滤。
|
||||||
|
|
||||||
|
### 4.5 `net.ipv4.conf.all.log_martians`
|
||||||
|
|
||||||
|
是否记录异常来源的 IP 数据包。
|
||||||
|
|
||||||
|
## 5、TCP 类
|
||||||
|
|
||||||
|
### 5.1 `net.ipv4.tcp_syncookies`
|
||||||
|
|
||||||
|
SYN Cookies 开关,用于缓解 SYN Flood。
|
||||||
|
|
||||||
|
### 5.2 `net.ipv4.tcp_max_syn_backlog`
|
||||||
|
|
||||||
|
半连接队列最大长度。
|
||||||
|
|
||||||
|
### 5.3 `net.ipv4.tcp_fin_timeout`
|
||||||
|
|
||||||
|
连接关闭后 `FIN_WAIT` 等待时间。
|
||||||
|
|
||||||
|
### 5.4 `net.ipv4.tcp_keepalive_time`
|
||||||
|
|
||||||
|
TCP keepalive 首次探测时间。
|
||||||
|
|
||||||
|
### 5.5 `net.ipv4.tcp_keepalive_probes`
|
||||||
|
|
||||||
|
TCP keepalive 探测次数。
|
||||||
|
|
||||||
|
### 5.6 `net.ipv4.tcp_keepalive_intvl`
|
||||||
|
|
||||||
|
TCP keepalive 探测间隔。
|
||||||
|
|
||||||
|
### 5.7 `net.ipv4.tcp_retries1`
|
||||||
|
|
||||||
|
TCP 初阶段重传次数。
|
||||||
|
|
||||||
|
### 5.8 `net.ipv4.tcp_retries2`
|
||||||
|
|
||||||
|
TCP 更长阶段重传次数。
|
||||||
|
|
||||||
|
### 5.9 `net.ipv4.tcp_synack_retries`
|
||||||
|
|
||||||
|
服务端 SYN-ACK 重试次数。
|
||||||
|
|
||||||
|
### 5.10 `net.ipv4.tcp_timestamps`
|
||||||
|
|
||||||
|
是否启用 TCP 时间戳。
|
||||||
|
|
||||||
|
### 5.11 `net.ipv4.tcp_sack`
|
||||||
|
|
||||||
|
是否启用 TCP SACK。
|
||||||
|
|
||||||
|
### 5.12 `net.ipv4.tcp_window_scaling`
|
||||||
|
|
||||||
|
是否启用 TCP 窗口缩放。
|
||||||
|
|
||||||
|
### 5.13 `net.ipv4.tcp_slow_start_after_idle`
|
||||||
|
|
||||||
|
空闲后是否重新进入慢启动。
|
||||||
|
|
||||||
|
### 5.14 `net.ipv4.tcp_fastopen`
|
||||||
|
|
||||||
|
TCP Fast Open 开关。
|
||||||
|
|
||||||
|
### 5.15 `net.ipv4.tcp_mtu_probing`
|
||||||
|
|
||||||
|
TCP MTU 探测开关。
|
||||||
|
|
||||||
|
### 5.16 `net.ipv4.tcp_congestion_control`
|
||||||
|
|
||||||
|
TCP 拥塞控制算法,如 `cubic`、`bbr`。
|
||||||
|
|
||||||
|
### 5.17 `net.ipv4.tcp_no_metrics_save`
|
||||||
|
|
||||||
|
是否禁用保存连接性能指标。
|
||||||
|
|
||||||
|
### 5.18 `net.ipv4.tcp_moderate_rcvbuf`
|
||||||
|
|
||||||
|
是否启用接收缓冲区自动调节。
|
||||||
|
|
||||||
|
### 5.19 `net.ipv4.tcp_ecn`
|
||||||
|
|
||||||
|
是否启用 ECN。
|
||||||
|
|
||||||
|
### 5.20 `net.ipv4.tcp_fack`
|
||||||
|
|
||||||
|
是否启用 FACK 相关机制。
|
||||||
|
|
||||||
|
### 5.21 `net.ipv4.tcp_low_latency`
|
||||||
|
|
||||||
|
低延迟倾向控制。
|
||||||
|
|
||||||
|
### 5.22 `net.ipv4.tcp_tw_reuse`
|
||||||
|
|
||||||
|
是否允许重用 `TIME_WAIT` 套接字。
|
||||||
|
|
||||||
|
### 5.23 `net.ipv4.tcp_tw_recycle`
|
||||||
|
|
||||||
|
旧参数,现代内核中通常不再建议或已移除。
|
||||||
|
|
||||||
|
### 5.24 `net.ipv4.tcp_abort_on_overflow`
|
||||||
|
|
||||||
|
连接队列溢出时是否直接中止连接。
|
||||||
|
|
||||||
|
### 5.25 `net.ipv4.tcp_adv_win_scale`
|
||||||
|
|
||||||
|
高级窗口缩放因子。
|
||||||
|
|
||||||
|
### 5.26 `net.ipv4.tcp_app_win`
|
||||||
|
|
||||||
|
应用窗口参数。
|
||||||
|
|
||||||
|
### 5.27 `net.ipv4.tcp_dsack`
|
||||||
|
|
||||||
|
是否启用 D-SACK。
|
||||||
|
|
||||||
|
## 6、使用建议
|
||||||
|
|
||||||
|
- 修改前先确认当前值:`sysctl 参数名`
|
||||||
|
- 临时调优先测试,再决定是否永久写入
|
||||||
|
- 网络内核参数对业务影响较大,尤其是高并发和代理场景
|
||||||
|
- 内核参数没有“通用最佳值”,一定要结合业务、内核版本、发行版默认行为来评估
|
||||||
|
|
||||||
|
## 7、小结
|
||||||
|
|
||||||
|
- 这份列表更适合作为索引,而不是盲目套参数模板
|
||||||
|
- 常见高频类别主要是 `kernel.*`、`vm.*`、`net.ipv4.*`
|
||||||
|
- 实际调优时,要先明确目标:稳定性、吞吐量、延迟,还是安全性
|
||||||
|
|||||||
@ -1,25 +1,192 @@
|
|||||||
# Linux 系统日志详解
|
# Linux 系统日志详解
|
||||||
|
|
||||||
## 一、安装日志
|
## 1、日志概览
|
||||||
|
|
||||||
```
|
Linux 系统日志主要用于记录:
|
||||||
/root/install.log #存储了安装在系统中的软件包及其版本信息
|
|
||||||
/root/install.log.syslog #存储了安装过程中留下的事件记录
|
- 系统启动过程
|
||||||
/root/anaconda-ks.cfg #以Kickstart配置文件的格式记录安装过程中设置的
|
- 服务运行状态
|
||||||
|
- 用户登录与认证行为
|
||||||
|
- 定时任务执行情况
|
||||||
|
- 内核与硬件信息
|
||||||
|
|
||||||
|
日志是排障时最重要的证据之一。
|
||||||
|
|
||||||
|
## 2、安装相关日志
|
||||||
|
|
||||||
|
常见安装阶段相关文件:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/root/install.log
|
||||||
|
/root/install.log.syslog
|
||||||
|
/root/anaconda-ks.cfg
|
||||||
```
|
```
|
||||||
|
|
||||||
## 二、其他日志
|
说明:
|
||||||
|
|
||||||
```
|
- `/root/install.log`:安装期间的软件包和版本记录
|
||||||
/var/log/cron #记录了系统定时任务相关的日志。
|
- `/root/install.log.syslog`:安装阶段事件日志
|
||||||
/var/log/cups/ #记录打印信息的日志
|
- `/root/anaconda-ks.cfg`:安装过程生成的 Kickstart 配置参考
|
||||||
/var/log/dmesg #记录了系统在开机时内核自检的信息。也可以使用dmesg命令直接查看内核自检信息。
|
|
||||||
/var/log/btmp #记录错误登录的日志。这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看,命令如下:
|
## 3、常见系统日志文件
|
||||||
/var/log/lastlog #记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件,不能直接vi,而要使用lastlog命令查看。
|
|
||||||
/var/log/mailog #记录邮件信息。
|
### 3.1 定时任务
|
||||||
/var/log/message #记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件。
|
|
||||||
/var/log/secure #记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录。比如说系统的登录,ssh 的登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中。
|
```text
|
||||||
/var/log/wtmp #永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看。
|
/var/log/cron
|
||||||
/var/run/utmp #记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w, who,users 等命令来查询。
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
记录定时任务相关日志。
|
||||||
|
|
||||||
|
### 3.2 打印日志
|
||||||
|
|
||||||
|
```text
|
||||||
|
/var/log/cups/
|
||||||
|
```
|
||||||
|
|
||||||
|
记录打印系统日志。
|
||||||
|
|
||||||
|
### 3.3 启动内核日志
|
||||||
|
|
||||||
|
```text
|
||||||
|
/var/log/dmesg
|
||||||
|
```
|
||||||
|
|
||||||
|
记录系统启动时的内核消息,也可通过 `dmesg` 命令直接查看。
|
||||||
|
|
||||||
|
### 3.4 登录失败日志
|
||||||
|
|
||||||
|
```text
|
||||||
|
/var/log/btmp
|
||||||
|
```
|
||||||
|
|
||||||
|
这是二进制日志文件,通常用下面命令查看:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
lastb
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.5 最后登录记录
|
||||||
|
|
||||||
|
```text
|
||||||
|
/var/log/lastlog
|
||||||
|
```
|
||||||
|
|
||||||
|
同样是二进制日志,通常使用:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
lastlog
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.6 邮件日志
|
||||||
|
|
||||||
|
```text
|
||||||
|
/var/log/maillog
|
||||||
|
```
|
||||||
|
|
||||||
|
记录邮件系统相关日志。
|
||||||
|
|
||||||
|
### 3.7 重要系统日志
|
||||||
|
|
||||||
|
```text
|
||||||
|
/var/log/messages
|
||||||
|
```
|
||||||
|
|
||||||
|
很多系统重要信息都会记录到这里,是传统排障时的高频入口。
|
||||||
|
|
||||||
|
### 3.8 认证与授权日志
|
||||||
|
|
||||||
|
```text
|
||||||
|
/var/log/secure
|
||||||
|
```
|
||||||
|
|
||||||
|
记录账户、密码、SSH 登录、`su`、`sudo` 等认证授权相关日志。
|
||||||
|
|
||||||
|
### 3.9 登录历史日志
|
||||||
|
|
||||||
|
```text
|
||||||
|
/var/log/wtmp
|
||||||
|
```
|
||||||
|
|
||||||
|
记录用户登录、注销、重启、关机等历史事件。
|
||||||
|
|
||||||
|
查看命令:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
last
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.10 当前登录信息
|
||||||
|
|
||||||
|
```text
|
||||||
|
/var/run/utmp
|
||||||
|
```
|
||||||
|
|
||||||
|
记录当前登录用户信息。
|
||||||
|
|
||||||
|
常用查看命令:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
w
|
||||||
|
who
|
||||||
|
users
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4、二进制日志的查看方式
|
||||||
|
|
||||||
|
以下文件通常不能直接用 `cat` 或 `vi` 查看:
|
||||||
|
|
||||||
|
- `/var/log/btmp`
|
||||||
|
- `/var/log/wtmp`
|
||||||
|
- `/var/log/lastlog`
|
||||||
|
- `/var/run/utmp`
|
||||||
|
|
||||||
|
对应常见命令:
|
||||||
|
|
||||||
|
- `lastb`:看失败登录
|
||||||
|
- `last`:看登录历史
|
||||||
|
- `lastlog`:看每个用户最后登录时间
|
||||||
|
- `w` / `who`:看当前登录会话
|
||||||
|
|
||||||
|
## 5、常见排障思路
|
||||||
|
|
||||||
|
### 5.1 登录失败
|
||||||
|
|
||||||
|
重点查看:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/var/log/secure
|
||||||
|
/var/log/btmp
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.2 定时任务没执行
|
||||||
|
|
||||||
|
重点查看:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/var/log/cron
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.3 系统启动异常
|
||||||
|
|
||||||
|
重点查看:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/var/log/dmesg
|
||||||
|
/var/log/messages
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.4 服务报错
|
||||||
|
|
||||||
|
优先查看:
|
||||||
|
|
||||||
|
- 服务自身日志
|
||||||
|
- `/var/log/messages`
|
||||||
|
- 现代系统中再结合 `journalctl`
|
||||||
|
|
||||||
|
## 6、小结
|
||||||
|
|
||||||
|
- 日志是 Linux 排障的第一手资料
|
||||||
|
- `/var/log/messages`、`/var/log/secure`、`/var/log/cron` 是高频日志文件
|
||||||
|
- `wtmp`、`btmp`、`lastlog`、`utmp` 都是偏登录审计相关的二进制日志
|
||||||
|
- 遇到问题时,要先判断问题类型,再去对应日志位置查证据
|
||||||
|
|||||||
@ -1,185 +1,145 @@
|
|||||||
|
|
||||||
|
|
||||||
# Linux 监控指标
|
# Linux 监控指标
|
||||||
|
|
||||||
## 一、CPU类
|
## 1、监控指标概览
|
||||||
|
|
||||||
### 1、CPU idle
|
做 Linux 监控时,不要只盯某一个指标,而是要结合 CPU、内存、磁盘、网络、进程等多个维度一起看。
|
||||||
|
|
||||||
Linux CPU idle 是指 CPU 空闲的时间百分比,也就是 CPU 没有在执行任何任务的时间占总时间的比例。在 Linux 系统中,可以通过查看 /proc/stat 文件来获取 CPU idle 的信息。
|
这篇先整理最常见的 CPU 指标,再补充观察思路。
|
||||||
|
|
||||||
可以使用以下命令来查看 CPU idle 的信息:
|
## 2、CPU 相关指标
|
||||||
|
|
||||||
```
|
Linux 中 CPU 指标常可从 `/proc/stat` 获取,也可以通过 `top`、`sar`、`vmstat` 等工具观察。
|
||||||
cat /proc/stat | grep 'cpu'
|
|
||||||
|
```shell
|
||||||
|
cat /proc/stat | grep '^cpu '
|
||||||
```
|
```
|
||||||
|
|
||||||
该命令会输出类似以下的信息:
|
示例输出:
|
||||||
|
|
||||||
```
|
```text
|
||||||
cpu 123456 7890 123456 7890123 4567 0 0 0 0 0
|
cpu 123456 7890 123456 7890123 4567 0 0 0 0 0
|
||||||
```
|
```
|
||||||
|
|
||||||
其中,第 5 个字段就是 CPU idle 的时间,单位是 jiffies(Linux 内核中的一个时间单位,通常为 1/100 秒)。可以将该值除以 CPU 的时钟频率,再乘以 100,就可以得到 CPU idle 的百分比。
|
这些字段是**累计时间片**,通常单位是 jiffies,不是直接百分比。真正做监控时,通常是采样两个时间点之间的增量,再换算比例。
|
||||||
|
|
||||||
例如,如果 CPU 的时钟频率是 2.4 GHz,那么可以使用以下命令来计算 CPU idle 的百分比:
|
## 3、常见 CPU 指标说明
|
||||||
|
|
||||||
```
|
### 3.1 CPU idle
|
||||||
echo "scale=2; $(cat /proc/stat | grep 'cpu ' | awk '{print $5}') / 2400000000 * 100" | bc
|
|
||||||
|
表示 CPU 空闲时间占比。
|
||||||
|
|
||||||
|
- 值高:说明 CPU 相对空闲
|
||||||
|
- 值低:说明 CPU 比较忙
|
||||||
|
|
||||||
|
### 3.2 CPU user
|
||||||
|
|
||||||
|
表示 CPU 花在**用户态程序**上的时间比例。
|
||||||
|
|
||||||
|
如果这个值高,说明大量时间花在用户进程执行上。
|
||||||
|
|
||||||
|
### 3.3 CPU system
|
||||||
|
|
||||||
|
表示 CPU 花在**内核态**上的时间比例。
|
||||||
|
|
||||||
|
如果这个值高,可能与系统调用频繁、网络栈、磁盘 I/O、内核开销增加等有关。
|
||||||
|
|
||||||
|
### 3.4 CPU iowait
|
||||||
|
|
||||||
|
表示 CPU 在等待 I/O 完成的时间比例。
|
||||||
|
|
||||||
|
如果 `iowait` 高,常见方向是:
|
||||||
|
|
||||||
|
- 磁盘压力大
|
||||||
|
- 网络存储慢
|
||||||
|
- 后端 I/O 阻塞
|
||||||
|
|
||||||
|
### 3.5 CPU irq
|
||||||
|
|
||||||
|
表示 CPU 花在硬中断上的时间比例。
|
||||||
|
|
||||||
|
如果这个值高,可能与硬件中断频繁有关,例如高网卡中断、高磁盘中断等。
|
||||||
|
|
||||||
|
### 3.6 CPU softirq
|
||||||
|
|
||||||
|
表示 CPU 花在软中断上的时间比例。
|
||||||
|
|
||||||
|
如果这个值高,常见和:
|
||||||
|
|
||||||
|
- 高网络流量
|
||||||
|
- 大量包处理
|
||||||
|
- 内核网络栈压力
|
||||||
|
|
||||||
|
有关。
|
||||||
|
|
||||||
|
## 4、如何理解这些指标
|
||||||
|
|
||||||
|
### 4.1 不是看单点,而是看组合
|
||||||
|
|
||||||
|
例如:
|
||||||
|
|
||||||
|
- `user` 高:更像业务代码或用户进程忙
|
||||||
|
- `system` 高:更像内核态开销大
|
||||||
|
- `iowait` 高:更像 I/O 瓶颈
|
||||||
|
- `softirq` 高:更像网络包处理压力大
|
||||||
|
|
||||||
|
### 4.2 不是看瞬时,而是看趋势
|
||||||
|
|
||||||
|
监控更重要的是:
|
||||||
|
|
||||||
|
- 持续升高还是偶发尖峰
|
||||||
|
- 单机异常还是集群共性
|
||||||
|
- 指标升高时,业务是否真的受影响
|
||||||
|
|
||||||
|
## 5、常用观察命令
|
||||||
|
|
||||||
|
### 5.1 `top`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
top
|
||||||
```
|
```
|
||||||
|
|
||||||
该命令会输出 CPU idle 的百分比,例如:
|
### 5.2 `vmstat`
|
||||||
|
|
||||||
```
|
```shell
|
||||||
98.23
|
vmstat 1
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2、CPU busy user
|
### 5.3 `sar`
|
||||||
|
|
||||||
Linux CPU busy user 是指 CPU 在执行用户进程的时间百分比,也就是 CPU 在执行用户进程的时间占总时间的比例。在 Linux 系统中,可以通过查看 /proc/stat 文件来获取 CPU busy user 的信息。
|
```shell
|
||||||
|
sar -u 1 5
|
||||||
具体来说,可以使用以下命令来查看 CPU busy user 的信息:
|
|
||||||
|
|
||||||
```
|
|
||||||
cat /proc/stat | grep 'cpu '
|
|
||||||
```
|
```
|
||||||
|
|
||||||
该命令会输出类似以下的信息:
|
### 5.4 `mpstat`
|
||||||
|
|
||||||
```
|
```shell
|
||||||
cpu 123456 7890 123456 7890123 4567 0 0 0 0 0
|
mpstat -P ALL 1
|
||||||
```
|
```
|
||||||
|
|
||||||
其中,第 2 个字段就是 CPU 在执行用户进程的时间,单位是 jiffies(Linux 内核中的一个时间单位,通常为 1/100 秒)。可以将该值除以 CPU 的时钟频率,再乘以 100,就可以得到 CPU busy user 的百分比。
|
## 6、监控排障建议
|
||||||
|
|
||||||
例如,如果 CPU 的时钟频率是 2.4 GHz,那么可以使用以下命令来计算 CPU busy user 的百分比:
|
### 6.1 CPU 高但 `idle` 也高
|
||||||
|
|
||||||
```
|
说明可能只是瞬时波动,或者不是 CPU 真正瓶颈。
|
||||||
echo "scale=2; $(cat /proc/stat | grep 'cpu ' | awk '{print $2}') / 2400000000 * 100" | bc
|
|
||||||
```
|
|
||||||
|
|
||||||
该命令会输出 CPU busy user 的百分比,例如:
|
### 6.2 `iowait` 高
|
||||||
|
|
||||||
```
|
优先联动查看:
|
||||||
12.34
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3、CPU busy system
|
- 磁盘 I/O
|
||||||
|
- 文件系统
|
||||||
|
- 后端存储
|
||||||
|
|
||||||
Linux CPU busy system 是指 CPU 在执行内核进程的时间百分比,也就是 CPU 在执行内核进程的时间占总时间的比例。在 Linux 系统中,可以通过查看 /proc/stat 文件来获取 CPU busy system 的信息。
|
### 6.3 `softirq` 高
|
||||||
|
|
||||||
具体来说,可以使用以下命令来查看 CPU busy system 的信息:
|
优先联动查看:
|
||||||
|
|
||||||
```
|
- 网卡流量
|
||||||
cat /proc/stat | grep 'cpu '
|
- 网卡中断
|
||||||
```
|
- 网络连接数
|
||||||
|
|
||||||
该命令会输出类似以下的信息:
|
## 7、小结
|
||||||
|
|
||||||
```
|
- `/proc/stat` 中的 CPU 字段是累计值,不是直接百分比
|
||||||
cpu 123456 7890 123456 7890123 4567 0 0 0 0 0
|
- 高价值指标通常包括 `idle`、`user`、`system`、`iowait`、`irq`、`softirq`
|
||||||
```
|
- 看监控要结合趋势、场景和其他系统指标一起分析
|
||||||
|
|
||||||
其中,第 4 个字段就是 CPU 在执行内核进程的时间,单位是 jiffies(Linux 内核中的一个时间单位,通常为 1/100 秒)。可以将该值除以 CPU 的时钟频率,再乘以 100,就可以得到 CPU busy system 的百分比。
|
|
||||||
|
|
||||||
例如,如果 CPU 的时钟频率是 2.4 GHz,那么可以使用以下命令来计算 CPU busy system 的百分比:
|
|
||||||
|
|
||||||
```
|
|
||||||
echo "scale=2; $(cat /proc/stat | grep 'cpu ' | awk '{print $4}') / 2400000000 * 100" | bc
|
|
||||||
```
|
|
||||||
|
|
||||||
该命令会输出 CPU busy system 的百分比,例如:
|
|
||||||
|
|
||||||
```
|
|
||||||
5.67
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4、CPU iowait
|
|
||||||
|
|
||||||
Linux CPU iowait 是指 CPU 等待 I/O 操作完成的时间百分比,也就是 CPU 在等待 I/O 操作完成的时间占总时间的比例。在 Linux 系统中,可以通过查看 /proc/stat 文件来获取 CPU iowait 的信息。
|
|
||||||
|
|
||||||
具体来说,可以使用以下命令来查看 CPU iowait 的信息:
|
|
||||||
|
|
||||||
```
|
|
||||||
cat /proc/stat | grep 'cpu '
|
|
||||||
```
|
|
||||||
|
|
||||||
该命令会输出类似以下的信息:
|
|
||||||
|
|
||||||
```
|
|
||||||
cpu 123456 7890 123456 7890123 4567 0 0 0 0 0
|
|
||||||
```
|
|
||||||
|
|
||||||
其中,第 5 个字段就是 CPU 等待 I/O 操作完成的时间,单位是 jiffies(Linux 内核中的一个时间单位,通常为 1/100 秒)。可以将该值除以 CPU 的时钟频率,再乘以 100,就可以得到 CPU iowait 的百分比。
|
|
||||||
|
|
||||||
例如,如果 CPU 的时钟频率是 2.4 GHz,那么可以使用以下命令来计算 CPU iowait 的百分比:
|
|
||||||
|
|
||||||
```
|
|
||||||
复制echo "scale=2; $(cat /proc/stat | grep 'cpu ' | awk '{print $5}') / 2400000000 * 100" | bc
|
|
||||||
```
|
|
||||||
|
|
||||||
该命令会输出 CPU iowait 的百分比,例如:
|
|
||||||
|
|
||||||
```
|
|
||||||
2.34
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5、CPU IRQs
|
|
||||||
|
|
||||||
Linux CPU IRQs 是指 CPU 在处理硬件中断的时间百分比,也就是 CPU 在处理硬件中断的时间占总时间的比例。在 Linux 系统中,可以通过查看 /proc/stat 文件来获取 CPU IRQs 的信息。
|
|
||||||
|
|
||||||
具体来说,可以使用以下命令来查看 CPU IRQs 的信息:
|
|
||||||
|
|
||||||
```
|
|
||||||
cat /proc/stat | grep 'cpu '
|
|
||||||
```
|
|
||||||
|
|
||||||
该命令会输出类似以下的信息:
|
|
||||||
|
|
||||||
```
|
|
||||||
cpu 123456 7890 123456 7890123 4567 0 0 0 0 0
|
|
||||||
```
|
|
||||||
|
|
||||||
其中,第 6 个字段就是 CPU 在处理硬件中断的时间,单位是 jiffies(Linux 内核中的一个时间单位,通常为 1/100 秒)。可以将该值除以 CPU 的时钟频率,再乘以 100,就可以得到 CPU IRQs 的百分比。
|
|
||||||
|
|
||||||
例如,如果 CPU 的时钟频率是 2.4 GHz,那么可以使用以下命令来计算 CPU IRQs 的百分比:
|
|
||||||
|
|
||||||
```
|
|
||||||
echo "scale=2; $(cat /proc/stat | grep 'cpu ' | awk '{print $6}') / 2400000000 * 100" | bc
|
|
||||||
```
|
|
||||||
|
|
||||||
该命令会输出 CPU IRQs 的百分比,例如:
|
|
||||||
|
|
||||||
```
|
|
||||||
0.56
|
|
||||||
```
|
|
||||||
|
|
||||||
### 6、CPU softirq
|
|
||||||
|
|
||||||
Linux CPU 软中断(softirq)对应的参数是 CPU 的第 7 个字段。软中断是一种由内核发起的中断,用于处理一些与网络、磁盘、定时器等相关的事件。在 Linux 系统中,软中断是由软件实现的,因此相对于硬中断来说,软中断的开销更小,但是也会占用 CPU 的一定时间。
|
|
||||||
|
|
||||||
具体来说,可以使用以下命令来查看 CPU 软中断的信息:
|
|
||||||
|
|
||||||
```
|
|
||||||
复制cat /proc/stat | grep 'cpu '
|
|
||||||
```
|
|
||||||
|
|
||||||
该命令会输出类似以下的信息:
|
|
||||||
|
|
||||||
```
|
|
||||||
复制cpu 123456 7890 123456 7890123 4567 0 89012 0 0 0
|
|
||||||
```
|
|
||||||
|
|
||||||
其中,第 7 个字段就是 CPU 在处理软中断的时间,单位是 jiffies(Linux 内核中的一个时间单位,通常为 1/100 秒)。可以将该值除以 CPU 的时钟频率,再乘以 100,就可以得到 CPU 软中断的百分比。
|
|
||||||
|
|
||||||
例如,如果 CPU 的时钟频率是 2.4 GHz,那么可以使用以下命令来计算 CPU 软中断的百分比:
|
|
||||||
|
|
||||||
```
|
|
||||||
复制echo "scale=2; $(cat /proc/stat | grep 'cpu ' | awk '{print $7}') / 2400000000 * 100" | bc
|
|
||||||
```
|
|
||||||
|
|
||||||
该命令会输出 CPU 软中断的百分比,例如:
|
|
||||||
|
|
||||||
```
|
|
||||||
复制0.23
|
|
||||||
```
|
|
||||||
|
|||||||
@ -1,10 +1,43 @@
|
|||||||
清屏:Ctrl + l
|
## 1、Bash 快捷键概览
|
||||||
阻止屏幕输出:Ctrl + s
|
|
||||||
允许屏幕输出:Ctrl + q
|
熟悉 Bash 快捷键可以显著提升终端操作效率,尤其是在频繁输入、修改长命令、排障时非常有用。
|
||||||
将光标移动到行首:Ctrl + a
|
|
||||||
将光标移至行尾:Ctrl + e
|
## 2、常用快捷键
|
||||||
将光标左移动一个单词尾:Ctrl + >
|
|
||||||
将光标右移动一个单词首:Ctrl + <
|
### 2.1 屏幕控制
|
||||||
从光标处删除至命令行首:Ctrl + u
|
|
||||||
将光标删除至命令行尾:Ctrl + k
|
- `Ctrl + l`:清屏
|
||||||
删除左边单词:Alt + Backspace
|
- `Ctrl + s`:暂停终端输出
|
||||||
|
- `Ctrl + q`:恢复终端输出
|
||||||
|
|
||||||
|
### 2.2 光标移动
|
||||||
|
|
||||||
|
- `Ctrl + a`:移动到行首
|
||||||
|
- `Ctrl + e`:移动到行尾
|
||||||
|
- `Alt + b`:向左移动一个单词
|
||||||
|
- `Alt + f`:向右移动一个单词
|
||||||
|
|
||||||
|
### 2.3 删除操作
|
||||||
|
|
||||||
|
- `Ctrl + u`:删除光标前到行首的内容
|
||||||
|
- `Ctrl + k`:删除光标后到行尾的内容
|
||||||
|
- `Ctrl + w`:删除光标前一个单词
|
||||||
|
- `Alt + Backspace`:删除左侧一个单词
|
||||||
|
|
||||||
|
### 2.4 命令控制
|
||||||
|
|
||||||
|
- `Ctrl + c`:中断当前命令
|
||||||
|
- `Ctrl + d`:退出当前 shell 或表示 EOF
|
||||||
|
- `Ctrl + z`:挂起当前前台任务
|
||||||
|
|
||||||
|
## 3、使用建议
|
||||||
|
|
||||||
|
- 长命令输错时,优先用光标移动和删除快捷键,不必整行重打
|
||||||
|
- 不小心按了 `Ctrl + s` 发现终端“卡住”,先试试 `Ctrl + q`
|
||||||
|
- 配合作业控制时,`Ctrl + z`、`bg`、`fg` 很实用
|
||||||
|
|
||||||
|
## 4、小结
|
||||||
|
|
||||||
|
- `Ctrl + a` / `Ctrl + e` 是最常用的行内移动快捷键
|
||||||
|
- `Ctrl + u` / `Ctrl + k` 是最高频删除组合
|
||||||
|
- `Ctrl + l`、`Ctrl + c`、`Ctrl + z` 也是终端操作必会快捷键
|
||||||
|
|||||||
@ -1,10 +1,102 @@
|
|||||||
sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。
|
## 1、`sudo` 概览
|
||||||
|
|
||||||
|
`sudo` 是 Linux 中常见的权限委派机制,允许管理员授权普通用户以更高权限执行指定命令,而不必直接告诉对方 `root` 密码。
|
||||||
|
|
||||||
|
它的核心价值在于:
|
||||||
|
|
||||||
|
- 最小权限授权
|
||||||
|
- 便于审计操作记录
|
||||||
|
- 避免多人共用 root 密码
|
||||||
|
|
||||||
|
## 2、基本概念
|
||||||
|
|
||||||
|
`sudo` 配置的核心通常写在:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
root ALL=(ALL:ALL) ALL
|
/etc/sudoers
|
||||||
你的用户名
|
|
||||||
你的连接地址
|
|
||||||
允许用户组youuser里面的用户执行sudo命令(需要输入密码)
|
|
||||||
允许用户youuser执行sudo命令,并且在执行的时候输入密码
|
|
||||||
允许用户组youuser里面的用户执行sudo命令,并且在执行的时候不输入密码
|
|
||||||
```
|
```
|
||||||
瞎写的,感觉没啥用,别看了
|
|
||||||
|
也可以拆分到:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
/etc/sudoers.d/
|
||||||
|
```
|
||||||
|
|
||||||
|
实际修改时,**强烈建议使用**:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
visudo
|
||||||
|
```
|
||||||
|
|
||||||
|
这样可以在保存前做语法检查,避免配置写坏导致 sudo 不可用。
|
||||||
|
|
||||||
|
## 3、sudoers 规则格式
|
||||||
|
|
||||||
|
常见格式大致是:
|
||||||
|
|
||||||
|
```text
|
||||||
|
用户或组 主机列表=(可切换身份) 命令列表
|
||||||
|
```
|
||||||
|
|
||||||
|
典型示例:
|
||||||
|
|
||||||
|
```text
|
||||||
|
root ALL=(ALL:ALL) ALL
|
||||||
|
```
|
||||||
|
|
||||||
|
含义可以理解为:
|
||||||
|
|
||||||
|
- `root`:用户
|
||||||
|
- `ALL`:允许从任意主机规则匹配
|
||||||
|
- `(ALL:ALL)`:可以切换为任意用户和组身份执行
|
||||||
|
- `ALL`:允许执行任意命令
|
||||||
|
|
||||||
|
## 4、常见授权方式
|
||||||
|
|
||||||
|
### 4.1 授权单个用户
|
||||||
|
|
||||||
|
```text
|
||||||
|
lzc ALL=(ALL:ALL) ALL
|
||||||
|
```
|
||||||
|
|
||||||
|
表示用户 `lzc` 可以执行任意 sudo 命令,执行时通常需要输入自己的密码。
|
||||||
|
|
||||||
|
### 4.2 授权用户组
|
||||||
|
|
||||||
|
```text
|
||||||
|
%devops ALL=(ALL:ALL) ALL
|
||||||
|
```
|
||||||
|
|
||||||
|
表示 `devops` 组内用户可执行 sudo 命令。
|
||||||
|
|
||||||
|
### 4.3 免密执行
|
||||||
|
|
||||||
|
```text
|
||||||
|
%devops ALL=(ALL:ALL) NOPASSWD: ALL
|
||||||
|
```
|
||||||
|
|
||||||
|
表示 `devops` 组内用户执行 sudo 时不需要输入密码。
|
||||||
|
|
||||||
|
## 5、常见运维建议
|
||||||
|
|
||||||
|
- 优先按**用户组**授权,而不是给每个人单独写规则
|
||||||
|
- 能精细授权命令时,尽量不要直接给 `ALL`
|
||||||
|
- 免密 sudo 要谨慎,只给可信场景
|
||||||
|
- 修改 sudo 配置时优先用 `visudo`
|
||||||
|
- 生产环境中建议结合审计日志一起使用
|
||||||
|
|
||||||
|
## 6、排障提示
|
||||||
|
|
||||||
|
如果 sudo 突然不可用,优先检查:
|
||||||
|
|
||||||
|
- `/etc/sudoers` 是否有语法错误
|
||||||
|
- `/etc/sudoers.d/` 中是否有冲突规则
|
||||||
|
- 文件权限是否正确
|
||||||
|
- 当前用户是否真的属于目标用户组
|
||||||
|
|
||||||
|
## 7、小结
|
||||||
|
|
||||||
|
- `sudo` 用于做权限委派,而不是直接共享 root
|
||||||
|
- 核心配置在 `/etc/sudoers` 和 `/etc/sudoers.d/`
|
||||||
|
- 推荐使用 `visudo` 修改配置
|
||||||
|
- 最佳实践是最小权限、分组授权、谨慎免密
|
||||||
|
|||||||
@ -1,45 +1,132 @@
|
|||||||
### 1、终端类型
|
## 1、终端管理概览
|
||||||
- 控制台终端:/dev/console #服务器console口,或者公有云VNC连接服务器时所用
|
|
||||||
- 串行终端:/dev/ttyS# #服务器串口链接
|
在 Linux 中,终端管理主要围绕这几个概念展开:
|
||||||
- 虚拟终端:/dev/tty# 通过Ctrl+Alt+F#切换 #Linux图形环境中的终端
|
|
||||||
- 伪终端:/dev/pts/# #ssh连接用的
|
- 终端类型:当前是本地控制台、串口还是 SSH 登录
|
||||||
- 图形终端:startx,xwindows
|
- 图形界面与命令行界面:GUI 和 CLI 的区别
|
||||||
|
- Shell:用户与系统交互的命令解释器
|
||||||
|
- 提示符、别名、主机名:日常使用中最常配置的内容
|
||||||
|
|
||||||
|
理解这些内容后,平时排查“我现在登录到哪了”“当前用的是什么 shell”“为什么命令行为不一样”等问题会更容易。
|
||||||
|
|
||||||
|
## 2、终端类型
|
||||||
|
|
||||||
|
Linux 中常见终端类型如下。
|
||||||
|
|
||||||
|
### 2.1 控制台终端
|
||||||
|
|
||||||
|
- 设备文件:`/dev/console`
|
||||||
|
- 常见场景:服务器物理控制台、云服务器 VNC 控制台
|
||||||
|
|
||||||
|
控制台终端通常用于系统启动、紧急排障、无法通过网络登录时的本地管理。
|
||||||
|
|
||||||
|
### 2.2 串行终端
|
||||||
|
|
||||||
|
- 设备文件:`/dev/ttyS#`
|
||||||
|
- 常见场景:通过串口线连接服务器、网络设备或嵌入式设备
|
||||||
|
|
||||||
|
串口终端在机房设备、交换机、路由器、服务器底层管理中很常见。
|
||||||
|
|
||||||
|
### 2.3 虚拟终端
|
||||||
|
|
||||||
|
- 设备文件:`/dev/tty#`
|
||||||
|
- 常见场景:本地文本控制台
|
||||||
|
- 切换方式:`Ctrl + Alt + F1 ~ F6`(不同发行版可能略有差异)
|
||||||
|
|
||||||
|
虚拟终端更准确地说是 Linux 的**本地字符界面终端**,不是图形终端本身。
|
||||||
|
|
||||||
|
### 2.4 伪终端
|
||||||
|
|
||||||
|
- 设备文件:`/dev/pts/#`
|
||||||
|
- 常见场景:SSH 登录、远程终端窗口、图形界面中的终端模拟器
|
||||||
|
|
||||||
|
平时通过 SSH 连到服务器后,最常见的就是伪终端。
|
||||||
|
|
||||||
|
### 2.5 图形终端
|
||||||
|
|
||||||
|
图形终端一般是桌面环境中的终端模拟器,例如 GNOME Terminal、Xfce Terminal、Konsole 等。
|
||||||
|
它们本质上通常也是运行在图形界面中的伪终端。
|
||||||
|
|
||||||
|
### 2.6 查看当前终端
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# tty
|
[root@tencentos ~]# tty
|
||||||
/dev/pts/0
|
/dev/pts/0
|
||||||
```
|
```
|
||||||
### 2、GUI(GraphicalUserInterface 图形用户界面)
|
|
||||||
##### GNOME
|
|
||||||
|
|
||||||
- 简介:GNOME是一款功能强大的桌面环境,它提供了丰富的应用程序和工具,支持多任务操作和自定义设置
|
- `tty` 用于查看当前会话对应的终端设备
|
||||||
- 特点:对较重,需要较高的硬件配置才能运行流畅
|
- 如果输出是 `/dev/pts/0`,通常表示当前是远程登录或图形终端模拟器
|
||||||
- github:[https://github.com/GNOME/gnome-shell](https://github.com/GNOME/gnome-shell)
|
|
||||||
##### Xfce
|
|
||||||
|
|
||||||
- 简介:Xfce是一款轻量级的桌面环境,它提供了基本的应用程序和工具,支持多任务操作和自定义设置。
|
## 3、GUI 与 CLI
|
||||||
- 特点:运行速度快,占用资源少,适合老旧计算机使用。
|
|
||||||
##### LXDE
|
|
||||||
|
|
||||||
- 简介:LXDE是一款极轻量级的桌面环境,它提供了基本的应用程序和工具,支持多任务操作和自定义设置。
|
### 3.1 GUI
|
||||||
- 特点:运行速度非常快,占用资源极少,适合老旧计算机使用。
|
|
||||||
##### KDE Plasma
|
|
||||||
|
|
||||||
- 简介:KDE Plasma是一款美观、灵活的桌面环境,它提供了丰富的应用程序和工具,支持多任务操作和自定义设置。
|
GUI 全称是 Graphical User Interface,即图形用户界面。
|
||||||
- 特点:相对较重,需要较高的硬件配置才能运行流畅。
|
它适合桌面办公、图形化配置和交互式操作。
|
||||||
##### MATE
|
|
||||||
|
|
||||||
- 简介:MATE是一款传统的桌面环境,它提供了丰富的应用程序和工具,支持多任务操作和自定义设置。
|
常见 Linux 桌面环境有:
|
||||||
- 特点:运行速度较快,占用资源较少,适合中低端计算机使用
|
|
||||||
### 3、CLI(Command-lineinterface 命令行界面)
|
|
||||||
##### shell分类:(通过# echo ${shell} 查看当前shell)
|
|
||||||
|
|
||||||
- sh(起源)
|
#### GNOME
|
||||||
- bash(主流)
|
|
||||||
|
- **简介**:功能完整,生态成熟,常见于主流 Linux 发行版
|
||||||
|
- **特点**:界面现代,但资源占用相对较高
|
||||||
|
- **项目地址**:[GNOME Shell](https://github.com/GNOME/gnome-shell)
|
||||||
|
|
||||||
|
#### Xfce
|
||||||
|
|
||||||
|
- **简介**:轻量级桌面环境
|
||||||
|
- **特点**:运行速度快,占用资源少,适合配置较低的机器
|
||||||
|
|
||||||
|
#### LXDE
|
||||||
|
|
||||||
|
- **简介**:更偏极简和轻量的桌面环境
|
||||||
|
- **特点**:资源占用很低,适合老旧设备
|
||||||
|
|
||||||
|
#### KDE Plasma
|
||||||
|
|
||||||
|
- **简介**:功能丰富、可定制性强
|
||||||
|
- **特点**:界面美观,功能全面,但整体较重
|
||||||
|
|
||||||
|
#### MATE
|
||||||
|
|
||||||
|
- **简介**:传统风格桌面环境
|
||||||
|
- **特点**:兼顾易用性和资源占用,适合中低配置机器
|
||||||
|
|
||||||
|
### 3.2 CLI
|
||||||
|
|
||||||
|
CLI 全称是 Command-Line Interface,即命令行界面。
|
||||||
|
在服务器运维场景中,CLI 更常见,原因主要有:
|
||||||
|
|
||||||
|
- 资源消耗更低
|
||||||
|
- 远程管理更方便
|
||||||
|
- 适合自动化和脚本化操作
|
||||||
|
- 排障时更高效
|
||||||
|
|
||||||
|
## 4、Shell 与命令分类
|
||||||
|
|
||||||
|
### 4.1 什么是 Shell
|
||||||
|
|
||||||
|
Shell 是用户和 Linux 内核之间的命令解释器。用户输入命令后,Shell 负责解释并调用对应程序执行。
|
||||||
|
|
||||||
|
常见 Shell 有:
|
||||||
|
|
||||||
|
- `sh`:早期的标准 shell
|
||||||
|
- `bash`:最常见、最主流的 shell
|
||||||
|
- `zsh`:交互能力更强,常见于开发环境
|
||||||
|
- `ksh`、`csh`、`tcsh`、`dash`:其他常见 shell
|
||||||
|
|
||||||
|
### 4.2 查看当前 Shell
|
||||||
|
|
||||||
|
```shell
|
||||||
|
[root@tencentos ~]# echo $SHELL
|
||||||
|
/bin/bash
|
||||||
|
```
|
||||||
|
|
||||||
|
注意这里通常使用的是大写环境变量 `SHELL`,不是 `shell`。
|
||||||
|
|
||||||
|
### 4.3 查看系统支持哪些 Shell
|
||||||
|
|
||||||
等等了,不做概述(通过# cat /etc/shells 查看支持哪些shell)
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# echo ${shell}
|
|
||||||
bash
|
|
||||||
[root@tencentos ~]# cat /etc/shells
|
[root@tencentos ~]# cat /etc/shells
|
||||||
/bin/sh
|
/bin/sh
|
||||||
/bin/bash
|
/bin/bash
|
||||||
@ -57,59 +144,159 @@ bash
|
|||||||
/usr/bin/tcsh
|
/usr/bin/tcsh
|
||||||
/bin/dash
|
/bin/dash
|
||||||
```
|
```
|
||||||
##### 命令分类:(查看方式:# type COMMAND)
|
|
||||||
|
|
||||||
- 内部命令:shell自带的,用户登录后自动加载并常驻内存中
|
### 4.4 命令分类
|
||||||
- 查看内部命令列表(# help)
|
|
||||||
- 外部命令:在PATH路径下,执行命令时需要从磁盘加载到内存,执行完成后删除
|
|
||||||
- 查看外部命令路径(# which -a )(# whereis)
|
|
||||||
- 内部命令使用 `help cd`这种形式获取帮助,外部命令通过`man`来获取帮助
|
|
||||||
|
|
||||||
hash缓存:系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后放到hash表中,当再次使用时,shell 会直接读hash表(# hash -l 查看hash表数据)
|
可以通过下面的命令查看某个命令的类型:
|
||||||
##### 终端类型(通过tty命令查看)
|
|
||||||
|
```shell
|
||||||
|
type COMMAND
|
||||||
|
```
|
||||||
|
|
||||||
|
命令大体可以分为两类:
|
||||||
|
|
||||||
|
#### 内部命令
|
||||||
|
|
||||||
|
内部命令是 Shell 自带的命令,启动 Shell 后即可直接使用。
|
||||||
|
|
||||||
|
- 查看帮助方式:`help cd`
|
||||||
|
- 查看所有内部命令帮助:`help`
|
||||||
|
|
||||||
|
#### 外部命令
|
||||||
|
|
||||||
|
外部命令是磁盘上的可执行程序,执行时由 Shell 到相应路径中查找。
|
||||||
|
|
||||||
|
- 查看路径:`which -a COMMAND`
|
||||||
|
- 辅助查看:`whereis COMMAND`
|
||||||
|
- 查看帮助:`man COMMAND`
|
||||||
|
|
||||||
|
### 4.5 hash 缓存
|
||||||
|
|
||||||
|
Shell 会把已经找到路径的外部命令缓存到 hash 表中,后续再次执行时可以减少路径查找。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
hash -l
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令可以查看当前 shell 的 hash 缓存内容。
|
||||||
|
|
||||||
|
## 5、提示符 `PS1`
|
||||||
|
|
||||||
|
提示符就是你每次看到的命令行前缀,例如:
|
||||||
|
|
||||||
- 控制台终端:/dev/console (服务器console口,或公有云平台VNC链接服务器时使用)
|
|
||||||
- 串行终端:/dev/ttyS# (服务器串口连接)
|
|
||||||
- 虚拟终端:tty /dev/tty# 可以通过Ctrl+Alt+F#切换(Linux 图形界面中的终端)
|
|
||||||
- 伪终端:pty /dev/pts#(SSH连接)
|
|
||||||
- 图形终端:startx,xwindows
|
|
||||||
##### 提示符格式说明
|
|
||||||
```shell
|
```shell
|
||||||
[lzc@tencentos ~]$ echo $PS1
|
[lzc@tencentos ~]$ echo $PS1
|
||||||
[\u@\h \W]\$
|
[\u@\h \W]\$
|
||||||
```
|
```
|
||||||
|
|
||||||
- \e 控制符\033
|
常见占位符说明:
|
||||||
- \u 当前用户
|
|
||||||
- \h 主机名简称
|
- `\u`:当前用户名
|
||||||
- \H 主机名
|
- `\h`:短主机名
|
||||||
- \w 当前工作目录
|
- `\H`:完整主机名
|
||||||
- \W 当前工作目录基名
|
- `\w`:当前工作目录完整路径
|
||||||
- \t 24小时时间格式
|
- `\W`:当前工作目录基名
|
||||||
- \T 12小时时间格式
|
- `\t`:24 小时制时间
|
||||||
```shell
|
- `\T`:12 小时制时间
|
||||||
PS1=‘\[\e[1;41;33m\][\u@\h \W]\$\[\e[0m\]’
|
- `\e`:转义字符,常用于颜色控制
|
||||||
```
|
|
||||||
##### 命令别名
|
### 5.1 自定义提示符示例
|
||||||
命令行中仅临时有效,要想永久有效,要定义在配置文件中
|
|
||||||
|
|
||||||
- 仅对当前用户:~/.bashrc
|
|
||||||
- 针对所有用户生效:/etc/bashrc
|
|
||||||
```shell
|
```shell
|
||||||
alias NAME=‘VALUE’
|
PS1='\[\e[1;41;33m\][\u@\h \W]\$\[\e[0m\]'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
这条配置会让提示符带颜色显示。`
|
||||||
|
\[ ... \]` 用于告诉 shell 这里是非打印字符,避免光标错位。
|
||||||
|
|
||||||
|
如果想永久生效,通常把它写到:
|
||||||
|
|
||||||
|
- 当前用户:`~/.bashrc`
|
||||||
|
- 所有用户:`/etc/bashrc`
|
||||||
|
|
||||||
|
## 6、命令别名 `alias`
|
||||||
|
|
||||||
|
别名适合给常用长命令起一个短名字,提高输入效率。
|
||||||
|
|
||||||
|
### 6.1 临时设置
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
unalias -a #取消所有别名
|
alias NAME='VALUE'
|
||||||
unalias NAME #取消别名
|
|
||||||
```
|
```
|
||||||
##### 登录提示文件
|
|
||||||
|
例如:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
alias ll='ls -l --color=auto'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.2 取消别名
|
||||||
|
|
||||||
|
```shell
|
||||||
|
unalias NAME
|
||||||
|
```
|
||||||
|
|
||||||
|
```shell
|
||||||
|
unalias -a
|
||||||
|
```
|
||||||
|
|
||||||
|
- `unalias NAME`:取消指定别名
|
||||||
|
- `unalias -a`:取消所有别名
|
||||||
|
|
||||||
|
### 6.3 永久生效
|
||||||
|
|
||||||
|
如果希望每次登录都生效,需要把别名配置写入:
|
||||||
|
|
||||||
|
- 当前用户:`~/.bashrc`
|
||||||
|
- 所有用户:`/etc/bashrc`
|
||||||
|
|
||||||
|
修改后通常执行:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
source ~/.bashrc
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7、登录提示文件
|
||||||
|
|
||||||
|
系统登录后的欢迎信息通常来自:
|
||||||
|
|
||||||
|
```shell
|
||||||
/etc/motd
|
/etc/motd
|
||||||
|
```
|
||||||
|
|
||||||
|
这个文件常用于显示运维通知、登录提醒、版权信息等。
|
||||||
|
|
||||||
|
## 8、设置主机名
|
||||||
|
|
||||||
|
### 8.1 临时设置
|
||||||
|
|
||||||
##### 设置主机名
|
|
||||||
```shell
|
```shell
|
||||||
hostname NAME
|
hostname NAME
|
||||||
```
|
```
|
||||||
|
|
||||||
|
这种方式通常只对当前运行环境立即生效,重启后是否保留取决于系统配置。
|
||||||
|
|
||||||
|
### 8.2 推荐方式
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
hostnamectl set-hostname NAME
|
hostnamectl set-hostname NAME
|
||||||
```
|
```
|
||||||
**注意:主机名不支持使用下划线,但支持横线。**
|
|
||||||
|
在使用 systemd 的系统中,更推荐使用 `hostnamectl` 来修改主机名。
|
||||||
|
|
||||||
|
### 8.3 注意事项
|
||||||
|
|
||||||
|
- 主机名不建议使用下划线 `_`
|
||||||
|
- 通常推荐使用字母、数字和中划线 `-`
|
||||||
|
- 主机名应简洁、易识别,便于批量运维管理
|
||||||
|
|
||||||
|
## 9、小结
|
||||||
|
|
||||||
|
- `tty` 可以查看当前终端设备
|
||||||
|
- `/dev/tty#`、`/dev/pts/#`、`/dev/console` 分别对应不同类型终端
|
||||||
|
- GUI 适合图形化操作,CLI 更适合服务器运维
|
||||||
|
- `bash` 是最常见的 Shell,`echo $SHELL` 可以查看当前 shell
|
||||||
|
- `type`、`help`、`which`、`man` 常用于判断命令类型和查看帮助
|
||||||
|
- `PS1`、`alias`、`hostnamectl` 是终端环境中很常见的配置点
|
||||||
|
|
||||||
|
这篇内容属于 Linux 终端与 Shell 基础,理解后对日常登录、操作和环境配置都很有帮助。
|
||||||
|
|||||||
@ -1,38 +1,310 @@
|
|||||||
### 日期和时间
|
## 1、时间管理概览
|
||||||
Linux的时钟分为两种
|
|
||||||
|
Linux 中的时间管理,核心需要分清 4 个概念:
|
||||||
|
|
||||||
|
- **系统时间**:当前操作系统正在使用的时间
|
||||||
|
- **硬件时钟**:主板上的 RTC 时间,也叫 BIOS 时间
|
||||||
|
- **时区**:决定时间以哪个地区标准显示
|
||||||
|
- **时间同步**:通过 NTP 等方式自动校准系统时间
|
||||||
|
|
||||||
|
平时排查“服务器时间不准”“日志时间对不上”“定时任务执行异常”等问题时,通常都绕不开这几个概念。
|
||||||
|
|
||||||
|
## 2、系统时钟与硬件时钟
|
||||||
|
|
||||||
|
Linux 中通常会涉及两种时间:
|
||||||
|
|
||||||
|
### 2.1 系统时钟
|
||||||
|
|
||||||
|
系统时钟是当前 Linux 内核运行时维护的时间。
|
||||||
|
|
||||||
|
- `date` 命令查看和设置的主要是**系统时间**
|
||||||
|
- 应用程序、日志、定时任务通常主要依赖系统时间
|
||||||
|
|
||||||
|
### 2.2 硬件时钟
|
||||||
|
|
||||||
|
硬件时钟是主板上的 RTC(Real-Time Clock)时间。
|
||||||
|
|
||||||
|
- 机器关机后,硬件时钟通常仍能继续走时
|
||||||
|
- 系统启动时,通常会从硬件时钟读取初始时间
|
||||||
|
- 现代 Linux 中通常使用 `hwclock` 查看硬件时钟
|
||||||
|
|
||||||
|
### 2.3 两者关系
|
||||||
|
|
||||||
|
可以简单理解为:
|
||||||
|
|
||||||
|
- **开机后主要使用系统时间**
|
||||||
|
- **硬件时钟更像底层基准时间**
|
||||||
|
- 系统时间和硬件时钟不一致时,可能会导致时间混乱
|
||||||
|
|
||||||
|
## 3、`date` 命令
|
||||||
|
|
||||||
|
`date` 是 Linux 中最常用的时间命令,用于显示、格式化、转换和设置系统时间。
|
||||||
|
|
||||||
|
### 3.1 查看当前时间
|
||||||
|
|
||||||
- 系统时钟:由Linux内核通过CPU的工作频率控制
|
|
||||||
- 硬件时钟:主板上的时间
|
|
||||||
###### date命令
|
|
||||||
```shell
|
```shell
|
||||||
参数:
|
date
|
||||||
-r #显示文件上次修改的时间
|
```
|
||||||
-d #时间转换
|
|
||||||
-s #设置时间
|
|
||||||
|
|
||||||
|
### 3.2 自定义格式输出
|
||||||
|
|
||||||
|
```shell
|
||||||
date +"%F %T"
|
date +"%F %T"
|
||||||
format:输出的时间格式。
|
|
||||||
%F 完整的日期;等价于%+4Y-%m-%d
|
|
||||||
%Y 年
|
|
||||||
%m 月
|
|
||||||
%d 日
|
|
||||||
%T 时间;等价于%H:%M:%S
|
|
||||||
%H 小时
|
|
||||||
%M 分钟
|
|
||||||
%S 秒
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
输出示例:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# clock
|
2026-04-08 14:18:00
|
||||||
2023-11-26 00:12:24.485439+08:00
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
常见格式符:
|
||||||
|
|
||||||
|
- `%F`:完整日期,等价于 `%Y-%m-%d`
|
||||||
|
- `%Y`:四位年份
|
||||||
|
- `%m`:月份
|
||||||
|
- `%d`:日期
|
||||||
|
- `%T`:完整时间,等价于 `%H:%M:%S`
|
||||||
|
- `%H`:小时
|
||||||
|
- `%M`:分钟
|
||||||
|
- `%S`:秒
|
||||||
|
|
||||||
|
### 3.3 常用参数
|
||||||
|
|
||||||
|
- `-r`:显示指定文件的时间戳
|
||||||
|
- `-d`:进行时间计算或时间转换
|
||||||
|
- `-s`:设置系统时间
|
||||||
|
|
||||||
|
### 3.4 常见示例
|
||||||
|
|
||||||
|
#### 查看文件修改时间
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
Commands:
|
date -r /etc/passwd
|
||||||
status Show current time settings
|
|
||||||
show Show properties of systemd-timedated
|
|
||||||
set-time TIME Set system time
|
|
||||||
set-timezone ZONE Set system time zone
|
|
||||||
list-timezones Show known time zones
|
|
||||||
set-local-rtc BOOL Control whether RTC is in local time
|
|
||||||
set-ntp BOOL Enable or disable network time synchronizatio
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### 时间转换
|
||||||
|
|
||||||
|
```shell
|
||||||
|
date -d "2026-04-08 08:00:00" +"%F %T"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 查看昨天的时间
|
||||||
|
|
||||||
|
```shell
|
||||||
|
date -d "yesterday" +"%F %T"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 设置系统时间
|
||||||
|
|
||||||
|
```shell
|
||||||
|
date -s "2026-04-08 14:30:00"
|
||||||
|
```
|
||||||
|
|
||||||
|
注意:手动设置时间通常需要 root 权限,并且在生产环境中要谨慎操作。
|
||||||
|
|
||||||
|
## 4、`hwclock` 命令
|
||||||
|
|
||||||
|
很多旧资料里会提到 `clock`,但在现代 Linux 中更常见的是 `hwclock`。
|
||||||
|
|
||||||
|
### 4.1 查看硬件时钟
|
||||||
|
|
||||||
|
```shell
|
||||||
|
hwclock
|
||||||
|
```
|
||||||
|
|
||||||
|
输出示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
2026-04-08 14:20:00.123456+08:00
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 常见用途
|
||||||
|
|
||||||
|
#### 查看硬件时钟
|
||||||
|
|
||||||
|
```shell
|
||||||
|
hwclock --show
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 把硬件时钟同步到系统时间
|
||||||
|
|
||||||
|
```shell
|
||||||
|
hwclock --hctosys
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 把系统时间写入硬件时钟
|
||||||
|
|
||||||
|
```shell
|
||||||
|
hwclock --systohc
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 和 `date` 的区别
|
||||||
|
|
||||||
|
- `date`:查看或设置**系统时间**
|
||||||
|
- `hwclock`:查看或设置**硬件时钟**
|
||||||
|
|
||||||
|
如果系统时间和硬件时钟不一致,系统启动后可能出现时间偏差。
|
||||||
|
|
||||||
|
## 5、`timedatectl` 命令
|
||||||
|
|
||||||
|
在基于 systemd 的 Linux 发行版中,`timedatectl` 是时间管理的常用工具。
|
||||||
|
|
||||||
|
### 5.1 查看当前时间状态
|
||||||
|
|
||||||
|
```shell
|
||||||
|
timedatectl status
|
||||||
|
```
|
||||||
|
|
||||||
|
它通常可以显示:
|
||||||
|
|
||||||
|
- 本地时间
|
||||||
|
- 世界标准时间(UTC)
|
||||||
|
- RTC 时间
|
||||||
|
- 当前时区
|
||||||
|
- 是否启用 NTP 自动同步
|
||||||
|
|
||||||
|
### 5.2 常见子命令
|
||||||
|
|
||||||
|
```shell
|
||||||
|
timedatectl status
|
||||||
|
```
|
||||||
|
|
||||||
|
查看当前时间设置。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
timedatectl show
|
||||||
|
```
|
||||||
|
|
||||||
|
查看 `systemd-timedated` 的详细属性。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
timedatectl set-time "2026-04-08 14:30:00"
|
||||||
|
```
|
||||||
|
|
||||||
|
设置系统时间。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
timedatectl set-timezone Asia/Shanghai
|
||||||
|
```
|
||||||
|
|
||||||
|
设置时区。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
timedatectl list-timezones
|
||||||
|
```
|
||||||
|
|
||||||
|
列出系统支持的时区。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
timedatectl set-local-rtc 0
|
||||||
|
```
|
||||||
|
|
||||||
|
设置 RTC 是否使用本地时间。一般 Linux 环境更常使用 UTC。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
timedatectl set-ntp true
|
||||||
|
```
|
||||||
|
|
||||||
|
启用网络时间同步。
|
||||||
|
|
||||||
|
## 6、时区管理
|
||||||
|
|
||||||
|
时间正确不只取决于“几点几分”,还取决于系统使用的是哪个时区。
|
||||||
|
|
||||||
|
### 6.1 查看当前时区
|
||||||
|
|
||||||
|
```shell
|
||||||
|
timedatectl
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.2 设置时区
|
||||||
|
|
||||||
|
```shell
|
||||||
|
timedatectl set-timezone Asia/Shanghai
|
||||||
|
```
|
||||||
|
|
||||||
|
中国大陆服务器一般常设为:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
Asia/Shanghai
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.3 为什么时区重要
|
||||||
|
|
||||||
|
如果时区设置错误,可能会出现:
|
||||||
|
|
||||||
|
- 日志时间和实际时间不一致
|
||||||
|
- 定时任务执行时间偏移
|
||||||
|
- 应用程序显示时间异常
|
||||||
|
- 多台服务器之间时间显示混乱
|
||||||
|
|
||||||
|
## 7、时间同步
|
||||||
|
|
||||||
|
在生产环境中,通常不建议长期依赖手动设置时间,而是应通过 NTP 自动同步。
|
||||||
|
|
||||||
|
### 7.1 为什么要同步时间
|
||||||
|
|
||||||
|
- 保证日志时间一致
|
||||||
|
- 保证集群节点时间一致
|
||||||
|
- 避免证书校验异常
|
||||||
|
- 避免定时任务和监控系统误判
|
||||||
|
|
||||||
|
### 7.2 启用自动同步
|
||||||
|
|
||||||
|
```shell
|
||||||
|
timedatectl set-ntp true
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3 检查是否启用同步
|
||||||
|
|
||||||
|
```shell
|
||||||
|
timedatectl status
|
||||||
|
```
|
||||||
|
|
||||||
|
关注输出中的 NTP 状态是否已开启。
|
||||||
|
|
||||||
|
## 8、常见排障思路
|
||||||
|
|
||||||
|
### 8.1 系统时间不对
|
||||||
|
|
||||||
|
优先检查:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
date
|
||||||
|
timedatectl status
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.2 怀疑硬件时钟有问题
|
||||||
|
|
||||||
|
检查:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
hwclock --show
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.3 日志时间不一致
|
||||||
|
|
||||||
|
重点检查:
|
||||||
|
|
||||||
|
- 系统时间是否正确
|
||||||
|
- 时区是否正确
|
||||||
|
- 是否开启 NTP 自动同步
|
||||||
|
|
||||||
|
### 8.4 定时任务执行时间异常
|
||||||
|
|
||||||
|
重点检查:
|
||||||
|
|
||||||
|
- 系统时间是否正确
|
||||||
|
- 时区是否正确
|
||||||
|
- `cron` 或应用自身是否使用了其他时区设置
|
||||||
|
|
||||||
|
## 9、小结
|
||||||
|
|
||||||
|
- `date` 主要操作的是**系统时间**
|
||||||
|
- `hwclock` 主要操作的是**硬件时钟**
|
||||||
|
- `timedatectl` 是 systemd 系统中最常用的时间管理工具
|
||||||
|
- 时间管理不仅要看“时间”,还要看“时区”和“同步状态”
|
||||||
|
- 排查时间问题时,建议先看 `date`、`hwclock --show`、`timedatectl status`
|
||||||
|
|
||||||
|
理解这几个命令后,Linux 中绝大多数基础时间问题都能快速定位。
|
||||||
|
|||||||
@ -1,137 +1,318 @@
|
|||||||
### 1、用户登录信息查看
|
## 1、用户管理概览
|
||||||
|
|
||||||
|
Linux 是多用户操作系统,因此用户和用户组管理是日常运维的基础能力。通常会涉及以下内容:
|
||||||
|
|
||||||
|
- 查看当前登录用户和会话信息
|
||||||
|
- 理解 UID、GID 的含义
|
||||||
|
- 管理用户和用户组
|
||||||
|
- 管理密码、锁定状态、过期时间
|
||||||
|
- 切换身份执行命令
|
||||||
|
|
||||||
|
这些内容和权限控制、文件归属、服务运行身份都有直接关系。
|
||||||
|
|
||||||
|
## 2、查看当前登录信息
|
||||||
|
|
||||||
|
### 2.1 `whoami`
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# whoami
|
[root@tencentos ~]# whoami
|
||||||
root
|
root
|
||||||
```
|
```
|
||||||
|
|
||||||
|
- `whoami` 用于查看**当前有效用户名**
|
||||||
|
- 常用于快速确认自己正以哪个用户身份执行命令
|
||||||
|
|
||||||
|
### 2.2 `who`
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# who
|
[root@tencentos ~]# who
|
||||||
root pts/0 2023-11-25 19:37 (111.201.149.21)
|
root pts/0 2023-11-25 19:37 (111.201.149.21)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
- `who` 用于查看当前有哪些用户登录了系统
|
||||||
|
- 能看到登录终端、登录时间、来源地址等信息
|
||||||
|
|
||||||
|
### 2.3 `w`
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[root@tencentos ~]# w
|
[root@tencentos ~]# w
|
||||||
00:25:21 up 17:30, 1 user, load average: 0.00, 0.00, 0.00
|
00:25:21 up 17:30, 1 user, load average: 0.00, 0.00, 0.00
|
||||||
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
|
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
|
||||||
root pts/0 111.201.149.21 19:37 0.00s 0.20s 0.00s w
|
root pts/0 111.201.149.21 19:37 0.00s 0.20s 0.00s w
|
||||||
```
|
```
|
||||||
## 2、用户
|
|
||||||
Linux中每隔用户是通过User ID(UID)来唯一标识的
|
|
||||||
|
|
||||||
- 管理员:root,0(因为UID是0,所以root是管理员)
|
- `w` 会显示当前登录用户及其正在执行的命令
|
||||||
- 普通用户:1-60000 UID自动分配
|
- 排查“谁在登录系统、谁在跑什么”时很常用
|
||||||
- 系统用户:1-999 UID,对守护进程获取资源进行权限分配
|
|
||||||
- 登录用户:1000+,给用户进行交互式登录使用
|
|
||||||
|
|
||||||
** id命令查看用户的UID,GID等信息**
|
## 3、用户与用户组基础概念
|
||||||
## 3、用户组
|
|
||||||
Linux中可以将一个或者多个用户加入用户组中,用户组是通过Group ID(GID)来唯一标识的,GID 同UID相同
|
|
||||||
|
|
||||||
## 4、用户及用户组配置文件
|
### 3.1 用户 `User`
|
||||||
/etc/passwd:用户机器属性信息(名称、UID、主组ID等)
|
|
||||||
/etc/shadow:用户密码及其相关属性
|
|
||||||
/etc/group:组及其属性信息
|
|
||||||
/etc/gshadow:组密码机器相关属性
|
|
||||||
##### 4.1 passwd文件格式
|
|
||||||
|
|
||||||
- login name:用户名(root)
|
Linux 中每个用户都由 **UID(User ID)** 唯一标识。
|
||||||
- passwd:密码(X)
|
|
||||||
|
常见范围大致如下:
|
||||||
|
|
||||||
|
- `0`:超级管理员 `root`
|
||||||
|
- `1-999`:系统用户,通常供服务或守护进程使用
|
||||||
|
- `1000+`:普通登录用户(不同发行版可能略有差异)
|
||||||
|
|
||||||
|
### 3.2 用户组 `Group`
|
||||||
|
|
||||||
|
用户组通过 **GID(Group ID)** 唯一标识。
|
||||||
|
|
||||||
|
Linux 中一个用户通常会涉及两类组:
|
||||||
|
|
||||||
|
- **主组**:用户创建时默认所属的组
|
||||||
|
- **附加组**:额外加入的组,用于补充权限
|
||||||
|
|
||||||
|
### 3.3 查看用户身份信息
|
||||||
|
|
||||||
|
```shell
|
||||||
|
id
|
||||||
|
```
|
||||||
|
|
||||||
|
常见输出会包含:
|
||||||
|
|
||||||
|
- 用户名
|
||||||
|
- UID
|
||||||
|
- 主组 GID
|
||||||
|
- 所属附加组列表
|
||||||
|
|
||||||
|
`id` 是查看用户身份信息最直接的命令之一。
|
||||||
|
|
||||||
|
## 4、用户与用户组配置文件
|
||||||
|
|
||||||
|
Linux 中用户和组的核心配置文件主要有以下几个:
|
||||||
|
|
||||||
|
- `/etc/passwd`:用户基本属性信息
|
||||||
|
- `/etc/shadow`:用户密码及密码策略信息
|
||||||
|
- `/etc/group`:用户组信息
|
||||||
|
- `/etc/gshadow`:用户组密码及组安全信息
|
||||||
|
|
||||||
|
### 4.1 `/etc/passwd`
|
||||||
|
|
||||||
|
这个文件主要记录用户的基本属性,例如:
|
||||||
|
|
||||||
|
- 用户名
|
||||||
|
- 密码占位符(通常为 `x`)
|
||||||
- UID
|
- UID
|
||||||
- GID
|
- GID
|
||||||
- GECOS:注释
|
- 注释信息(GECOS)
|
||||||
- home directory:用户家目录
|
- 家目录
|
||||||
- shell:用户默认使用的shell
|
- 默认 shell
|
||||||
##### 4.2 shadow文件格式
|
|
||||||
|
### 4.2 `/etc/shadow`
|
||||||
|
|
||||||
|
这个文件主要记录密码及密码过期策略,例如:
|
||||||
|
|
||||||
- 登录名
|
- 登录名
|
||||||
- 用户密码
|
- 加密后的密码
|
||||||
- 从1970年1月1日起到密码最近一次被修改的时间
|
- 上次修改密码时间
|
||||||
- 密码再过几天可以变更(0表示随时可变)
|
- 最短修改间隔
|
||||||
- 密码再过几天必须变更(99999表示永不过期)
|
- 最长有效期
|
||||||
- 密码过期前几天系统提醒用户(默认为一周)
|
- 到期前提醒天数
|
||||||
- 密码过期几天后账号会被锁定
|
- 密码过期后锁定天数
|
||||||
##### 4.3 group文件格式
|
|
||||||
|
|
||||||
- 群组名称
|
### 4.3 `/etc/group`
|
||||||
- 群组密码
|
|
||||||
|
这个文件主要记录:
|
||||||
|
|
||||||
|
- 组名
|
||||||
|
- 组密码占位符
|
||||||
- GID
|
- GID
|
||||||
- 以当前组为附加组的用户列表,多个用户间用逗号分隔
|
- 附加组成员列表
|
||||||
|
|
||||||
## 5、用户管理命令
|
## 5、用户管理命令
|
||||||
|
|
||||||
- useradd
|
### 5.1 创建用户 `useradd`
|
||||||
- usermod
|
|
||||||
- userdel
|
|
||||||
##### 5.1 用户创建
|
|
||||||
**useradd格式:**
|
|
||||||
`useradd [options] LOGIN`
|
|
||||||
**常见选项:**
|
|
||||||
|
|
||||||
- -u:UID
|
```shell
|
||||||
- -g:GID
|
useradd [options] LOGIN
|
||||||
- -c:注释
|
```
|
||||||
- -d:家目录
|
|
||||||
- -s:shell,可用列表在/etc/shells,特殊shell /sbin/nologin
|
|
||||||
- -G:附加组
|
|
||||||
- -r:创建系统用户
|
|
||||||
- -M:不创建家目录
|
|
||||||
##### 5.2 用户属性修改
|
|
||||||
**usermod格式:**
|
|
||||||
`usermod [option] login`
|
|
||||||
**常见选项:**
|
|
||||||
|
|
||||||
- -u:新UID
|
常见选项:
|
||||||
- -g:新GID
|
|
||||||
- -G:新附加组
|
- `-u`:指定 UID
|
||||||
- -s:新shell
|
- `-g`:指定主组 GID 或组名
|
||||||
- -c:新注释
|
- `-c`:添加注释
|
||||||
- -d:新家目录
|
- `-d`:指定家目录
|
||||||
- -l:新名字
|
- `-s`:指定默认 shell
|
||||||
- -L:锁定用户
|
- `-G`:指定附加组
|
||||||
- -U:解锁用户
|
- `-r`:创建系统用户
|
||||||
- -e:YYYY-MM-DD,指定用户账号过期日期
|
- `-M`:不创建家目录
|
||||||
- -f:设置宽限期
|
|
||||||
##### 5.3 删除用户
|
示例:
|
||||||
**userdel格式:**
|
|
||||||
`和上面一样,不多bb`
|
```shell
|
||||||
**常见选项:**
|
useradd -u 2001 -g developers -G wheel -c "dev user" -s /bin/bash lzc
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.2 修改用户 `usermod`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
usermod [options] LOGIN
|
||||||
|
```
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-u`:修改 UID
|
||||||
|
- `-g`:修改主组
|
||||||
|
- `-G`:修改附加组
|
||||||
|
- `-s`:修改 shell
|
||||||
|
- `-c`:修改注释
|
||||||
|
- `-d`:修改家目录
|
||||||
|
- `-l`:修改用户名
|
||||||
|
- `-L`:锁定用户
|
||||||
|
- `-U`:解锁用户
|
||||||
|
- `-e`:设置账户过期日期,格式如 `YYYY-MM-DD`
|
||||||
|
- `-f`:设置密码过期后的宽限期
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
usermod -G wheel,devops -s /bin/bash lzc
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.3 删除用户 `userdel`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
userdel [options] LOGIN
|
||||||
|
```
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-f`:强制删除
|
||||||
|
- `-r`:删除用户时同时删除家目录和邮件目录
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
userdel -r lzc
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6、切换用户身份 `su`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
su [options] [-] USER
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.1 `su user` 与 `su - user` 的区别
|
||||||
|
|
||||||
|
```shell
|
||||||
|
su ubuntu
|
||||||
|
```
|
||||||
|
|
||||||
|
- 非登录式切换
|
||||||
|
- 通常不会完整加载目标用户登录环境
|
||||||
|
- 当前工作目录通常保持不变
|
||||||
|
|
||||||
|
```shell
|
||||||
|
su - ubuntu
|
||||||
|
```
|
||||||
|
|
||||||
|
- 登录式切换
|
||||||
|
- 会读取目标用户的登录配置
|
||||||
|
- 通常会切换到目标用户家目录
|
||||||
|
- 更接近“真正以该用户重新登录一次”
|
||||||
|
|
||||||
|
### 6.2 切换后执行命令
|
||||||
|
|
||||||
- -f:强制
|
|
||||||
- -r:删除家目录和邮箱
|
|
||||||
##### 5.4 用户身份切换
|
|
||||||
**su 格式:**
|
|
||||||
`su [option] [-] user`
|
|
||||||
**-的作用:**
|
|
||||||
`su ubuntu`非登录式切换,不会读取目标用户的配置文件,不改变当前工作目录
|
|
||||||
`su - ubuntu` 登录式切换,读取配置文件,改变当前工作目录
|
|
||||||
**范例:切换到其他用户执行命令**
|
|
||||||
```shell
|
```shell
|
||||||
su - root -c 'cat /etc/passwd'
|
su - root -c 'cat /etc/passwd'
|
||||||
```
|
```
|
||||||
##### 5.5 设置用户密码
|
|
||||||
passwd格式和其他一样
|
|
||||||
**常用选项:**
|
|
||||||
|
|
||||||
- -d:删除指定用户密码
|
这个用法表示切换到 `root` 后执行指定命令。
|
||||||
- -l:锁定用户
|
|
||||||
- -u:解锁
|
|
||||||
- -e:强制用户下次登录的时候修改密码
|
|
||||||
- -f:强制操作
|
|
||||||
## 6、用户组管理命令
|
|
||||||
##### 6.1 创建用户组
|
|
||||||
**groupadd常用选项:**
|
|
||||||
|
|
||||||
- -g GID:指定GID
|
## 7、设置用户密码 `passwd`
|
||||||
##### 6.2 修改用户组
|
|
||||||
groupmod常用选项:
|
|
||||||
|
|
||||||
- -n:新名字
|
`passwd` 用于设置或管理用户密码。
|
||||||
- -g GID:新GID
|
|
||||||
##### 6.3 删除组
|
|
||||||
**groupdel常见选项:**
|
|
||||||
|
|
||||||
- -f:强制删除
|
常见选项:
|
||||||
##### 6.4 管理附加组
|
|
||||||
groupmems常见选项
|
|
||||||
|
|
||||||
- -a:指定用户加入组
|
- `-d`:删除指定用户密码
|
||||||
- -d:从组中删除用户
|
- `-l`:锁定密码
|
||||||
- -p:从组中清除所有成员
|
- `-u`:解锁密码
|
||||||
- -l:显示组成员列表
|
- `-e`:强制用户下次登录时修改密码
|
||||||
|
- `-f`:强制执行操作
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
passwd lzc
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8、用户组管理命令
|
||||||
|
|
||||||
|
### 8.1 创建用户组 `groupadd`
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-g`:指定 GID
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
groupadd -g 3001 devops
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.2 修改用户组 `groupmod`
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-n`:修改组名
|
||||||
|
- `-g`:修改 GID
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
groupmod -n ops devops
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.3 删除用户组 `groupdel`
|
||||||
|
|
||||||
|
用于删除指定组。
|
||||||
|
|
||||||
|
### 8.4 管理附加组成员 `groupmems`
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-a`:把用户加入组
|
||||||
|
- `-d`:把用户从组中删除
|
||||||
|
- `-p`:清空组成员
|
||||||
|
- `-l`:显示组成员列表
|
||||||
|
|
||||||
|
## 9、常见运维场景
|
||||||
|
|
||||||
|
### 9.1 新建一个可登录用户
|
||||||
|
|
||||||
|
通常需要做这些事:
|
||||||
|
|
||||||
|
- 创建用户
|
||||||
|
- 指定 shell
|
||||||
|
- 设置密码
|
||||||
|
- 加入合适的附加组
|
||||||
|
|
||||||
|
### 9.2 禁止某个账户继续登录
|
||||||
|
|
||||||
|
常见做法:
|
||||||
|
|
||||||
|
- 锁定密码:`passwd -l USER`
|
||||||
|
- 锁定账户:`usermod -L USER`
|
||||||
|
- 把 shell 改成 `/sbin/nologin`
|
||||||
|
|
||||||
|
### 9.3 删除离职用户
|
||||||
|
|
||||||
|
常见做法:
|
||||||
|
|
||||||
|
- 确认是否有进程仍在运行
|
||||||
|
- 备份家目录或重要数据
|
||||||
|
- 使用 `userdel -r USER` 删除账户和家目录
|
||||||
|
|
||||||
|
## 10、小结
|
||||||
|
|
||||||
|
- `UID` 标识用户,`GID` 标识用户组
|
||||||
|
- `/etc/passwd`、`/etc/shadow`、`/etc/group` 是最核心的账户文件
|
||||||
|
- `useradd`、`usermod`、`userdel` 用于管理用户
|
||||||
|
- `groupadd`、`groupmod`、`groupdel` 用于管理用户组
|
||||||
|
- `su - USER` 比单独 `su USER` 更接近完整登录环境
|
||||||
|
- 管理用户时要特别注意密码、过期时间、登录 shell 和附加组
|
||||||
|
|||||||
@ -1,4 +1,83 @@
|
|||||||
### 设置语言
|
## 1、语言环境概览
|
||||||
|
|
||||||
|
Linux 中的“语言管理”通常指的是 **Locale(本地化设置)**,它会影响系统的:
|
||||||
|
|
||||||
|
- 显示语言
|
||||||
|
- 日期和时间格式
|
||||||
|
- 数字和货币格式
|
||||||
|
- 排序规则
|
||||||
|
- 字符编码
|
||||||
|
|
||||||
|
如果系统出现中文乱码、命令输出语言不对、程序处理字符异常,很多时候都和 Locale 配置有关。
|
||||||
|
|
||||||
|
## 2、查看当前语言环境
|
||||||
|
|
||||||
|
### 2.1 使用 `echo $LANG`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
echo $LANG
|
||||||
|
```
|
||||||
|
|
||||||
|
这个环境变量通常表示当前会话默认使用的语言环境,例如:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
zh_CN.UTF-8
|
||||||
|
```
|
||||||
|
|
||||||
|
或:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
en_US.UTF-8
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 使用 `locale`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
locale
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令可以查看当前所有 Locale 相关环境变量,比如:
|
||||||
|
|
||||||
|
- `LANG`
|
||||||
|
- `LC_CTYPE`
|
||||||
|
- `LC_TIME`
|
||||||
|
- `LC_MESSAGES`
|
||||||
|
- `LC_ALL`
|
||||||
|
|
||||||
|
通常比单独看 `LANG` 更全面。
|
||||||
|
|
||||||
|
## 3、`localectl` 命令
|
||||||
|
|
||||||
|
在使用 systemd 的 Linux 发行版中,`localectl` 是常用的语言环境管理工具。
|
||||||
|
|
||||||
|
### 3.1 常见子命令
|
||||||
|
|
||||||
|
```shell
|
||||||
|
localectl status
|
||||||
|
```
|
||||||
|
|
||||||
|
查看当前语言环境设置。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
localectl set-locale LANG=zh_CN.UTF-8
|
||||||
|
```
|
||||||
|
|
||||||
|
设置系统语言环境。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
localectl list-locales
|
||||||
|
```
|
||||||
|
|
||||||
|
列出系统支持的 Locale。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
localectl set-keymap us
|
||||||
|
```
|
||||||
|
|
||||||
|
设置控制台键盘布局。
|
||||||
|
|
||||||
|
### 3.2 命令列表示意
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
Commands:
|
Commands:
|
||||||
status Show current locale settings
|
status Show current locale settings
|
||||||
@ -6,7 +85,117 @@ Commands:
|
|||||||
list-locales Show known locales
|
list-locales Show known locales
|
||||||
set-keymap MAP [MAP] Set console and X11 keyboard mappings
|
set-keymap MAP [MAP] Set console and X11 keyboard mappings
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 4、常见 Locale 格式
|
||||||
|
|
||||||
|
Locale 一般长这样:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
语言_国家.编码
|
||||||
```
|
```
|
||||||
|
|
||||||
|
例如:
|
||||||
|
|
||||||
|
- `zh_CN.UTF-8`:中文(中国),UTF-8 编码
|
||||||
|
- `en_US.UTF-8`:英文(美国),UTF-8 编码
|
||||||
|
- `ja_JP.UTF-8`:日文(日本),UTF-8 编码
|
||||||
|
|
||||||
|
其中:
|
||||||
|
|
||||||
|
- 前半部分表示语言
|
||||||
|
- 中间部分表示国家或地区
|
||||||
|
- 后半部分表示字符编码
|
||||||
|
|
||||||
|
## 5、常见配置项说明
|
||||||
|
|
||||||
|
### 5.1 `LANG`
|
||||||
|
|
||||||
|
默认语言环境,通常作为系统的基础 Locale 设置。
|
||||||
|
|
||||||
|
### 5.2 `LC_*`
|
||||||
|
|
||||||
|
可以对某个类别单独指定,例如:
|
||||||
|
|
||||||
|
- `LC_TIME`:时间格式
|
||||||
|
- `LC_MESSAGES`:提示信息语言
|
||||||
|
- `LC_NUMERIC`:数字格式
|
||||||
|
|
||||||
|
### 5.3 `LC_ALL`
|
||||||
|
|
||||||
|
优先级通常最高,用于临时强制覆盖其他 Locale 设置。
|
||||||
|
|
||||||
|
例如:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
LC_ALL=C ls
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令会临时使用最基础的 `C` 语言环境执行 `ls`。
|
||||||
|
|
||||||
|
## 6、常见使用场景
|
||||||
|
|
||||||
|
### 6.1 系统输出改成中文或英文
|
||||||
|
|
||||||
|
例如把系统语言设置为中文:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
localectl set-locale LANG=zh_CN.UTF-8
|
||||||
|
```
|
||||||
|
|
||||||
|
设置为英文:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
localectl set-locale LANG=en_US.UTF-8
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.2 排查乱码问题
|
||||||
|
|
||||||
|
常见检查点:
|
||||||
|
|
||||||
|
- 当前终端编码是否为 UTF-8
|
||||||
|
- `LANG` 和 `LC_*` 是否配置正确
|
||||||
|
- 文件本身编码是否匹配
|
||||||
|
- SSH 客户端和服务端编码是否一致
|
||||||
|
|
||||||
|
### 6.3 临时切换语言环境
|
||||||
|
|
||||||
|
```shell
|
||||||
|
LANG=en_US.UTF-8 date
|
||||||
|
```
|
||||||
|
|
||||||
|
这样只对当前这条命令生效,不会永久修改系统配置。
|
||||||
|
|
||||||
|
## 7、排障建议
|
||||||
|
|
||||||
|
### 7.1 输出乱码
|
||||||
|
|
||||||
|
优先检查:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
locale
|
||||||
echo $LANG
|
echo $LANG
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 7.2 程序日志时间格式不一致
|
||||||
|
|
||||||
|
重点检查:
|
||||||
|
|
||||||
|
- `LC_TIME`
|
||||||
|
- 时区配置
|
||||||
|
- 应用程序自身语言设置
|
||||||
|
|
||||||
|
### 7.3 命令输出语言和预期不一致
|
||||||
|
|
||||||
|
重点检查:
|
||||||
|
|
||||||
|
- `LANG`
|
||||||
|
- `LC_MESSAGES`
|
||||||
|
- 是否设置了 `LC_ALL`
|
||||||
|
|
||||||
|
## 8、小结
|
||||||
|
|
||||||
|
- Linux 语言管理本质上是 Locale 管理
|
||||||
|
- `echo $LANG` 可以快速查看当前默认语言环境
|
||||||
|
- `locale` 比单看 `LANG` 更完整
|
||||||
|
- `localectl` 是 systemd 系统中常用的语言环境管理工具
|
||||||
|
- 乱码、日期格式异常、提示信息语言不对,很多时候都和 Locale 有关
|
||||||
|
|||||||
@ -1,201 +1,339 @@
|
|||||||
**每打开一个文件都会消耗一个fd(文件描述符)**
|
## 1、文件管理概览
|
||||||
## 1、Linux目录
|
|
||||||
简介:Linux目录结构是一个单根倒置的树结构,文件系统从根目录开始,用"/"表示,文件名最长255字节,包括路径在内文件名称最长4095字节。
|
|
||||||
##### 1.1 绝对路径和相对路径
|
|
||||||
绝对路径:你家通过卫星定位是xx东经xx北纬,体现在linux上就是开头是根目录
|
|
||||||
相对路径:你家在小明家旁边,对应linux 就是当前目录的哪里
|
|
||||||
|
|
||||||
##### 1.2 文件目录大全
|
Linux 文件管理主要围绕以下几个方面展开:
|
||||||
|
|
||||||
- /:根目录
|
- 目录结构与路径
|
||||||
- /boot:引导文件、内核文件(vmlinuz)、引导加载grup都存放此目录中
|
- 文件类型与 inode
|
||||||
- /bin:所有用户使用的基本命令,必须存放到系统盘下,OS启动的时候会用到的程序
|
- 常见目录和文件操作命令
|
||||||
- /sbin:管理类的基本命令,OS启动时会用到里面的命令
|
- 文件状态与时间戳
|
||||||
- /lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
|
- 通配符与链接文件
|
||||||
- /lib64:专用于x86_64系统上的辅助共享库文件存放位置
|
|
||||||
- /etc:配置文件目录
|
|
||||||
- /home/USERNAME:普通用户家目录
|
|
||||||
- /root:管理员家目录
|
|
||||||
- /media:便携式移动设备挂载点
|
|
||||||
- /mnt:临时文件系统挂载点
|
|
||||||
- /dev:设备文件及特殊文件存储位置
|
|
||||||
- /opt:第三方应用程序的安装位置
|
|
||||||
- /srv:系统上运行的服务用到的数据
|
|
||||||
- /tmp:临时文件存储位置
|
|
||||||
- /usr:universal shared,read-only data 通用的共享的只读数据
|
|
||||||
- /usr/bin:保证系统拥有完整功能提供的应用程序
|
|
||||||
- /usr/lib:库文件
|
|
||||||
- /usr/include:C程序的头文件
|
|
||||||
- /usr/share:结构化独立的数据
|
|
||||||
- /usr/share/local:第三方程序的安装目录
|
|
||||||
- /var:variable data file,变化数据
|
|
||||||
- /var/cache:应用程序缓存的数据目录
|
|
||||||
- /var/lib:应用程序状态信息数据
|
|
||||||
- /var/local:专用于为/usr/local下的应用程序存放可变数据
|
|
||||||
- /var/lock:锁文件
|
|
||||||
- /var/log:日志文件
|
|
||||||
- /var/run:存放运行中的进程相关数据,常用于存储进程的PID文件
|
|
||||||
- /var/spool:应用程序数据池
|
|
||||||
- /var/tmp:存放系统两次重启之间产生的临时数据
|
|
||||||
- /proc:内核与进程信息相关
|
|
||||||
- /selinux:selinux相关的安全策略等信息的存储位置
|
|
||||||
|
|
||||||
## 2、目录常用操作命令
|
这些内容是后续学习权限、查找、文本处理、磁盘管理的基础。
|
||||||
##### 2.1 显示当前工作目录
|
|
||||||
|
**补充一点:** 每打开一个文件,进程通常都会占用一个文件描述符(fd)。
|
||||||
|
|
||||||
|
## 2、Linux 目录结构
|
||||||
|
|
||||||
|
Linux 文件系统采用**单根倒置树状结构**,一切都从根目录 `/` 开始。
|
||||||
|
|
||||||
|
- 单个文件名通常最长 255 字节
|
||||||
|
- 整个路径通常最长 4096 字节左右(不同系统实现可能略有差异)
|
||||||
|
|
||||||
|
### 2.1 绝对路径与相对路径
|
||||||
|
|
||||||
|
#### 绝对路径
|
||||||
|
|
||||||
|
从根目录 `/` 开始写起的完整路径,例如:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
/etc/passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 相对路径
|
||||||
|
|
||||||
|
相对于当前工作目录的位置,例如:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
../logs/app.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 常见目录说明
|
||||||
|
|
||||||
|
- `/`:根目录
|
||||||
|
- `/boot`:引导文件、内核、引导加载器相关文件
|
||||||
|
- `/bin`:基本用户命令
|
||||||
|
- `/sbin`:基本系统管理命令
|
||||||
|
- `/lib`:基础共享库和内核模块
|
||||||
|
- `/lib64`:64 位系统库文件目录
|
||||||
|
- `/etc`:系统配置文件
|
||||||
|
- `/home/USERNAME`:普通用户家目录
|
||||||
|
- `/root`:root 用户家目录
|
||||||
|
- `/media`:可移动设备挂载点
|
||||||
|
- `/mnt`:临时挂载点
|
||||||
|
- `/dev`:设备文件目录
|
||||||
|
- `/opt`:第三方软件安装目录
|
||||||
|
- `/srv`:服务相关数据
|
||||||
|
- `/tmp`:临时文件目录
|
||||||
|
- `/usr`:共享只读程序和数据
|
||||||
|
- `/usr/bin`:大量用户命令
|
||||||
|
- `/usr/lib`:库文件
|
||||||
|
- `/usr/include`:C 头文件
|
||||||
|
- `/usr/share`:共享数据
|
||||||
|
- `/usr/local`:本地手工安装软件目录
|
||||||
|
- `/var`:经常变化的数据
|
||||||
|
- `/var/cache`:缓存数据
|
||||||
|
- `/var/lib`:应用状态数据
|
||||||
|
- `/var/log`:日志文件
|
||||||
|
- `/var/run` 或 `/run`:运行时数据,如 PID 文件
|
||||||
|
- `/var/spool`:队列和缓冲池数据
|
||||||
|
- `/var/tmp`:重启后可能保留的临时文件
|
||||||
|
- `/proc`:内核和进程信息的伪文件系统
|
||||||
|
- `/sys`:内核设备和驱动信息
|
||||||
|
|
||||||
|
## 3、目录常用操作命令
|
||||||
|
|
||||||
|
### 3.1 `pwd`
|
||||||
|
|
||||||
|
```shell
|
||||||
pwd
|
pwd
|
||||||
|
```
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
root@lzc:~# pwd
|
root@lzc:~# pwd
|
||||||
/root
|
/root
|
||||||
|
|
||||||
pwd是使用PWD环境变量获取当前目录路径
|
|
||||||
```
|
```
|
||||||
|
|
||||||
##### 2.2 切换到其他目录
|
- `pwd` 用于显示当前工作目录
|
||||||
cd
|
- 常和环境变量 `PWD` 对应
|
||||||
|
|
||||||
- -:上一次所在的目录,cd使用OLDPWD变量获取上一次目录路径
|
### 3.2 `cd`
|
||||||
- ..:父目录
|
|
||||||
- .:当前目录
|
|
||||||
- -P:跳转到链接至的目录
|
|
||||||
- -S:从大到小排序
|
|
||||||
|
|
||||||
##### 2.3 列出目录内容
|
用于切换目录。
|
||||||
ls
|
|
||||||
|
|
||||||
- -a:包含隐藏文件
|
常见用法:
|
||||||
- -l:显示大小,权限等信息
|
|
||||||
- -R:目录递归
|
|
||||||
- -X:按文件后缀排序
|
|
||||||
|
|
||||||
##### 2.4 显示目录树
|
- `cd -`:回到上一次所在目录
|
||||||
tree
|
- `cd ..`:进入父目录
|
||||||
|
- `cd .`:当前目录
|
||||||
|
- `cd ~`:当前用户家目录
|
||||||
|
- `cd -P`:按物理路径切换,避免符号链接影响
|
||||||
|
|
||||||
- -d:只显示目录
|
### 3.3 `ls`
|
||||||
- -L:指定显示的层级数目
|
|
||||||
|
|
||||||
##### 2.5 创建目录
|
用于列出目录内容。
|
||||||
mkdir
|
|
||||||
|
|
||||||
- -p:递归创建
|
常见选项:
|
||||||
- -m:创建时直接指定权限
|
|
||||||
|
|
||||||
##### 2.6 删除目录
|
- `-a`:显示隐藏文件
|
||||||
rmdir
|
- `-l`:显示详细信息
|
||||||
|
- `-R`:递归显示
|
||||||
|
- `-X`:按扩展名排序
|
||||||
|
- `-S`:按文件大小排序
|
||||||
|
- `-h`:配合 `-l` 以易读单位显示大小
|
||||||
|
|
||||||
- -p:递归删除
|
### 3.4 `tree`
|
||||||
|
|
||||||
|
用于以树状结构显示目录。
|
||||||
|
|
||||||
## 3、Linux文件
|
常见选项:
|
||||||
##### 3.1 文件类型
|
|
||||||
|
|
||||||
- -:普通文件
|
- `-d`:只显示目录
|
||||||
- d:目录文件
|
- `-L`:限制显示层级
|
||||||
- l:符号链接文件
|
|
||||||
- b:块设备
|
|
||||||
- c:字符设备
|
|
||||||
- p:管道文件
|
|
||||||
- s:套接字文件
|
|
||||||
|
|
||||||
##### 3.2 文件数据
|
### 3.5 `mkdir`
|
||||||
metadata:源数据,属性信息,比如文件的大小,相关时间,类型,此类数据是存放在inode表中
|
|
||||||
inode(index node)保存的信息如下:
|
|
||||||
|
|
||||||
- inode number:节点号
|
用于创建目录。
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-p`:递归创建
|
||||||
|
- `-m`:创建时直接指定权限
|
||||||
|
|
||||||
|
### 3.6 `rmdir`
|
||||||
|
|
||||||
|
用于删除空目录。
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-p`:递归删除空目录
|
||||||
|
|
||||||
|
## 4、Linux 文件基础
|
||||||
|
|
||||||
|
### 4.1 文件类型
|
||||||
|
|
||||||
|
在 `ls -l` 输出中,第一列第一个字符表示文件类型:
|
||||||
|
|
||||||
|
- `-`:普通文件
|
||||||
|
- `d`:目录
|
||||||
|
- `l`:符号链接
|
||||||
|
- `b`:块设备文件
|
||||||
|
- `c`:字符设备文件
|
||||||
|
- `p`:管道文件
|
||||||
|
- `s`:套接字文件
|
||||||
|
|
||||||
|
### 4.2 inode 是什么
|
||||||
|
|
||||||
|
inode(index node)可以理解为文件的“元数据记录”。
|
||||||
|
|
||||||
|
它通常保存的信息包括:
|
||||||
|
|
||||||
|
- inode 编号
|
||||||
- 文件类型
|
- 文件类型
|
||||||
- 权限
|
- 权限
|
||||||
- UID
|
- UID
|
||||||
- GID
|
- GID
|
||||||
- 链接数
|
- 链接数
|
||||||
- 指向磁盘上文件的数据块指针
|
- 文件大小
|
||||||
|
- 时间戳
|
||||||
|
- 指向数据块的指针
|
||||||
|
|
||||||
**相关命令和inode的关系:**
|
目录本质上也是特殊文件,它记录了“文件名”和“inode 编号”的对应关系。
|
||||||
当执行cp时,底层发生以下变化,分配一个空闲的inode号,在inode表中生成新条目,在目标目录中创建一个目录项,将新文件名称与inode编号关联,拷贝数据生成新的文件
|
|
||||||
|
|
||||||
当执行rm 时,底层发生以下变化
|
### 4.3 `cp` 和 `rm` 与 inode 的关系
|
||||||
释放对应文件占用的inode号,把数据块放到空闲列表中,删除目录项
|
|
||||||
|
|
||||||
目录是一个特殊的文件,目录文件保存了此目录中的文件列表以及inode number对应关系,一个目录是目录下文件名和文件inode号之间的映射
|
#### 执行 `cp`
|
||||||
|
|
||||||
##### 3.3 文件颜色
|
通常会发生:
|
||||||
|
|
||||||
- 蓝色:目录
|
- 分配新的 inode
|
||||||
- 绿色:可执行文件
|
- 创建新的目录项
|
||||||
- 红色:压缩文件
|
- 复制数据块内容
|
||||||
- 浅蓝色:链接文件
|
|
||||||
- 灰色:其他文件
|
因此复制后的文件通常拥有**不同 inode**。
|
||||||
|
|
||||||
|
#### 执行 `rm`
|
||||||
|
|
||||||
|
通常会发生:
|
||||||
|
|
||||||
|
- 删除目录项
|
||||||
|
- 减少链接计数
|
||||||
|
- 当链接数归零时释放 inode 和数据块
|
||||||
|
|
||||||
|
## 5、文件状态与时间戳
|
||||||
|
|
||||||
|
### 5.1 `stat`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
stat 1.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
##### 3.4 文件状态
|
|
||||||
stat命令
|
|
||||||
```shell
|
```shell
|
||||||
root@lzc:~# stat 1.txt
|
root@lzc:~# stat 1.txt
|
||||||
File: 1.txt
|
File: 1.txt
|
||||||
Size: 210 Blocks: 8 IO Block: 4096 regular file
|
Size: 210 Blocks: 8 IO Block: 4096 regular file
|
||||||
Device: fc02h/64514d Inode: 556125 Links: 1
|
Device: fc02h/64514d Inode: 556125 Links: 1
|
||||||
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
|
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
|
||||||
Access: 2023-12-05 23:55:07.813678618 +0800 #访问时间,atime,读取文件内容时会更新
|
Access: 2023-12-05 23:55:07.813678618 +0800
|
||||||
Modify: 2023-12-05 23:55:07.005686767 +0800 #修改时间,mtine,改变文件内容时会更新
|
Modify: 2023-12-05 23:55:07.005686767 +0800
|
||||||
Change: 2023-12-05 23:55:07.005686767 +0800 #改变时间,ctime,元数据发生改变时更新,例如权限、所有者、大小等改变才会更新,仅更新文件内容,此值不会更新
|
Change: 2023-12-05 23:55:07.005686767 +0800
|
||||||
Birth: 2023-12-04 23:44:39.861025975 +0800
|
Birth: 2023-12-04 23:44:39.861025975 +0800
|
||||||
```
|
```
|
||||||
|
|
||||||
##### 3.5 文件通配符
|
### 5.2 三个常见时间
|
||||||
|
|
||||||
- *:匹配0个或多个字符,但不匹配.开头的文件 ,即不匹配隐藏文件
|
- `atime`:访问时间,读取文件内容时更新
|
||||||
- ?:匹配任何单个字符,一个汉字也算一个字符
|
- `mtime`:修改时间,文件内容变化时更新
|
||||||
- ~:当前用户家目录
|
- `ctime`:变更时间,元数据变化时更新,例如权限、属主、链接数变化
|
||||||
- [0-9]:匹配单个数字范围
|
|
||||||
- [a-z]:匹配一个小写字母
|
|
||||||
- [A-Z]:匹配一个大写字母
|
|
||||||
- [zhengchi]:匹配列表中任何一个字符
|
|
||||||
- [^zhengchi]:匹配列表中所有字符以外的字符
|
|
||||||
- ~-:前一个工作目录
|
|
||||||
- [:digit:]:任意数字
|
|
||||||
- [:lower:]:任意小写字母
|
|
||||||
- [:upper:]:任意大写字母
|
|
||||||
|
|
||||||
##### 3.6 创建文件
|
## 6、文件名通配符
|
||||||
touch
|
|
||||||
-a:仅改变atime和ctime
|
|
||||||
-m:仅改变mtime和ctime
|
|
||||||
|
|
||||||
##### 3.7 复制文件和目录
|
通配符常用于批量匹配文件名:
|
||||||
cp
|
|
||||||
|
|
||||||
- -i:如果目标已经存在,覆盖前提示是否覆盖
|
- `*`:匹配 0 个或多个字符,不包含隐藏文件开头的 `.`
|
||||||
- -n:不覆盖
|
- `?`:匹配任意单个字符
|
||||||
- -r,R:递归复制目录及内部所有内容
|
- `~`:当前用户家目录
|
||||||
- -a:递归复制,且复制权限
|
- `~-`:上一个工作目录
|
||||||
- cp -b:目标存在的话,覆盖前先备份,源文件名结尾会被加上~只保留最近一个备份
|
- `[0-9]`:匹配一个数字
|
||||||
|
- `[a-z]`:匹配一个小写字母
|
||||||
|
- `[A-Z]`:匹配一个大写字母
|
||||||
|
- `[abc]`:匹配列表中的任一字符
|
||||||
|
- `[^abc]`:匹配不在列表中的任一字符
|
||||||
|
- `[:digit:]`:数字字符类
|
||||||
|
- `[:lower:]`:小写字母字符类
|
||||||
|
- `[:upper:]`:大写字母字符类
|
||||||
|
|
||||||
##### 3.8 移动和重命名文件
|
## 7、常见文件操作命令
|
||||||
mv
|
|
||||||
-b:目标存在,覆盖前先备份,备份文件以~结尾
|
|
||||||
|
|
||||||
rename
|
### 7.1 `touch`
|
||||||
rename '原名字' '目标名字' 文件
|
|
||||||
|
|
||||||
|
用于创建空文件或更新时间戳。
|
||||||
|
|
||||||
##### 3.9 删除文件
|
- `-a`:仅修改访问时间
|
||||||
rm
|
- `-m`:仅修改修改时间
|
||||||
|
|
||||||
- -i:交互式
|
### 7.2 `cp`
|
||||||
- -f:强制删除
|
|
||||||
- -r:递归
|
|
||||||
|
|
||||||
##### 3.10 链接文件
|
用于复制文件和目录。
|
||||||
ln
|
|
||||||
**硬链接**
|
|
||||||
简介:硬链接就是新建一个文件和源文件数据绑定,当源文件被删除时,文件独立,否则数据持续同步,无法对目录创建硬链接,硬链接inode号相同
|
|
||||||
|
|
||||||
**软连接**
|
常见选项:
|
||||||
简介:类似于windows 的快捷方式,源文件被删除,软链接文件也去殉情
|
|
||||||
-s
|
|
||||||
# 注意:当软件链接目录时,要注意删除命令
|
|
||||||
rm -rf /data:# 只删除/data这个软连接
|
|
||||||
rm -rf /data/ # 删除软连接下所有文件
|
|
||||||
|
|
||||||
#####
|
- `-i`:覆盖前提示
|
||||||
|
- `-n`:不覆盖已有文件
|
||||||
|
- `-r` 或 `-R`:递归复制目录
|
||||||
|
- `-a`:尽量保留原属性进行归档复制
|
||||||
|
- `-b`:覆盖前创建备份文件
|
||||||
|
|
||||||
|
### 7.3 `mv`
|
||||||
|
|
||||||
|
用于移动文件或重命名。
|
||||||
|
|
||||||
|
- `-b`:覆盖前先备份
|
||||||
|
|
||||||
|
### 7.4 `rename`
|
||||||
|
|
||||||
|
用于批量重命名。
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
rename 'old' 'new' *
|
||||||
|
```
|
||||||
|
|
||||||
|
不同发行版的 `rename` 实现可能略有差异,实际使用前最好先看帮助文档。
|
||||||
|
|
||||||
|
### 7.5 `rm`
|
||||||
|
|
||||||
|
用于删除文件或目录。
|
||||||
|
|
||||||
|
常见选项:
|
||||||
|
|
||||||
|
- `-i`:交互确认
|
||||||
|
- `-f`:强制删除
|
||||||
|
- `-r`:递归删除
|
||||||
|
|
||||||
|
## 8、链接文件 `ln`
|
||||||
|
|
||||||
|
### 8.1 硬链接
|
||||||
|
|
||||||
|
硬链接本质上是让多个文件名指向同一个 inode。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- inode 相同
|
||||||
|
- 删除其中一个名字,不代表数据立刻消失
|
||||||
|
- 不能对目录创建硬链接(通常如此)
|
||||||
|
- 一般不能跨文件系统
|
||||||
|
|
||||||
|
### 8.2 软链接
|
||||||
|
|
||||||
|
软链接类似快捷方式。
|
||||||
|
|
||||||
|
创建方式:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ln -s 源文件 软链接名
|
||||||
|
```
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- inode 不同
|
||||||
|
- 保存的是目标路径
|
||||||
|
- 可以跨文件系统
|
||||||
|
- 原文件删除后,软链接会失效
|
||||||
|
|
||||||
|
### 8.3 删除软链接的注意点
|
||||||
|
|
||||||
|
```shell
|
||||||
|
rm -rf /data
|
||||||
|
```
|
||||||
|
|
||||||
|
如果 `/data` 是软链接,这样通常只会删除软链接本身。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
rm -rf /data/
|
||||||
|
```
|
||||||
|
|
||||||
|
如果路径末尾带 `/`,可能会把链接目标目录中的内容删掉,操作时一定要格外小心。
|
||||||
|
|
||||||
|
## 9、小结
|
||||||
|
|
||||||
|
- Linux 文件系统从根目录 `/` 开始组织
|
||||||
|
- 绝对路径和相对路径是最基础的路径概念
|
||||||
|
- `pwd`、`cd`、`ls`、`mkdir`、`rm`、`cp`、`mv` 是最常用的文件操作命令
|
||||||
|
- inode 记录的是文件元数据,不等于文件名本身
|
||||||
|
- `stat` 可用于查看文件详细状态和时间戳
|
||||||
|
- 硬链接和软链接的差异是高频面试和实战知识点
|
||||||
|
|||||||
@ -1,35 +1,228 @@
|
|||||||
## find
|
## 1、文件查找概览
|
||||||
- -maxdepth:最大搜索目录深度
|
|
||||||
- -mindepth:最小搜索目录深度
|
Linux 中查找文件时,最常用的命令之一就是 `find`。它功能非常强,既可以按名称找文件,也可以按类型、属主、权限、时间、大小等多种条件组合查找。
|
||||||
- -name “文件名称”:根据名称查找
|
|
||||||
- -iname “”:根据文件名和inode查找
|
在日常运维中,`find` 主要用于:
|
||||||
- inum: 按inode号查找
|
|
||||||
- -user:按属主查找
|
- 定位某个文件或目录
|
||||||
- -group:按数组查找
|
- 查找大文件、旧文件、异常权限文件
|
||||||
- -uid:按uid查找
|
- 结合删除、统计、打包等命令做批量处理
|
||||||
- -gid:按gid查找
|
|
||||||
- -type:按文件类型查找
|
## 2、`find` 基本格式
|
||||||
- d:目录文件
|
|
||||||
- l:符号链接文件
|
```shell
|
||||||
- s:套接字文件
|
find [路径] [条件] [动作]
|
||||||
- b:块设备文件
|
```
|
||||||
- c:字符设备文件
|
|
||||||
- p:管道文件
|
例如:
|
||||||
- -a:与
|
|
||||||
- -o:或
|
```shell
|
||||||
- -not:非
|
find /var/log -name "*.log"
|
||||||
- -size:根据文件大小查找
|
```
|
||||||
- k
|
|
||||||
- M
|
表示在 `/var/log` 下查找所有 `.log` 文件。
|
||||||
- G
|
|
||||||
|
## 3、目录深度控制
|
||||||
|
|
||||||
|
### 3.1 `-maxdepth`
|
||||||
|
|
||||||
|
限制最大搜索深度。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /etc -maxdepth 2 -name "*.conf"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 `-mindepth`
|
||||||
|
|
||||||
|
限制最小搜索深度。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /data -mindepth 2 -type f
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4、按名称和 inode 查找
|
||||||
|
|
||||||
|
### 4.1 `-name`
|
||||||
|
|
||||||
|
按文件名精确匹配查找,区分大小写。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /tmp -name "test.txt"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 `-iname`
|
||||||
|
|
||||||
|
按文件名查找,不区分大小写。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /tmp -iname "test.txt"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 `-inum`
|
||||||
|
|
||||||
|
按 inode 编号查找。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find / -inum 123456
|
||||||
|
```
|
||||||
|
|
||||||
|
这个场景在排查硬链接文件时比较有用。
|
||||||
|
|
||||||
|
## 5、按属主和属组查找
|
||||||
|
|
||||||
|
### 5.1 按用户查找
|
||||||
|
|
||||||
|
- `-user`:按用户名查找
|
||||||
|
- `-uid`:按 UID 查找
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /home -user lzc
|
||||||
|
find /home -uid 1000
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.2 按组查找
|
||||||
|
|
||||||
|
- `-group`:按组名查找
|
||||||
|
- `-gid`:按 GID 查找
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /data -group devops
|
||||||
|
find /data -gid 1001
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6、按文件类型查找
|
||||||
|
|
||||||
|
### 6.1 `-type`
|
||||||
|
|
||||||
|
常见类型值:
|
||||||
|
|
||||||
|
- `f`:普通文件
|
||||||
|
- `d`:目录
|
||||||
|
- `l`:符号链接
|
||||||
|
- `s`:套接字文件
|
||||||
|
- `b`:块设备文件
|
||||||
|
- `c`:字符设备文件
|
||||||
|
- `p`:管道文件
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /etc -type f
|
||||||
|
find /var -type d
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7、条件组合
|
||||||
|
|
||||||
|
`find` 支持逻辑组合条件:
|
||||||
|
|
||||||
|
- `-a`:与(AND)
|
||||||
|
- `-o`:或(OR)
|
||||||
|
- `-not`:非(NOT)
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /data -type f -a -name "*.log"
|
||||||
|
```
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /data \( -name "*.log" -o -name "*.txt" \)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8、按大小查找
|
||||||
|
|
||||||
|
### 8.1 `-size`
|
||||||
|
|
||||||
|
可以按文件大小查找,常见单位:
|
||||||
|
|
||||||
|
- `k`:KB
|
||||||
|
- `M`:MB
|
||||||
|
- `G`:GB
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /var/log -size +100M
|
||||||
|
```
|
||||||
|
|
||||||
|
表示查找大于 100 MB 的文件。
|
||||||
|
|
||||||
|
## 9、按时间查找
|
||||||
|
|
||||||
|
时间条件是 `find` 的高频用法之一。
|
||||||
|
|
||||||
|
### 9.1 分钟级条件
|
||||||
|
|
||||||
|
- `-amin`:按访问时间(分钟)
|
||||||
|
- `-cmin`:按状态变更时间(分钟)
|
||||||
|
- `-mmin`:按内容修改时间(分钟)
|
||||||
|
|
||||||
|
### 9.2 天级条件
|
||||||
|
|
||||||
|
- `-atime`:按访问时间(天)
|
||||||
|
- `-ctime`:按状态变更时间(天)
|
||||||
|
- `-mtime`:按内容修改时间(天)
|
||||||
|
|
||||||
|
### 9.3 参考文件比较
|
||||||
|
|
||||||
|
- `-anewer`:访问时间比指定文件新
|
||||||
|
- `-cnewer`:状态变更时间比指定文件新
|
||||||
|
- `-newer`:修改时间比指定文件新
|
||||||
|
|
||||||
|
### 9.4 常见示例
|
||||||
|
|
||||||
|
查找最近 2 天内修改过的普通文件:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /var -type f -mtime -2
|
||||||
|
```
|
||||||
|
|
||||||
|
查找比某个文件更新的文件:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /etc -type f -newer /tmp/base.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
查找 2 天内创建或修改的文件,也可以用:
|
||||||
|
|
||||||
-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
|
|
||||||
-anewer:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
|
|
||||||
-atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
|
|
||||||
-cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
|
|
||||||
-cnewer:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
|
|
||||||
-ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
|
|
||||||
##### 范例1:查找2天内创建的文件
|
|
||||||
```shell
|
```shell
|
||||||
find /var -type f -newermt "2 days ago"
|
find /var -type f -newermt "2 days ago"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 10、常见实战场景
|
||||||
|
|
||||||
|
### 10.1 查找大日志文件
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /var/log -type f -size +500M
|
||||||
|
```
|
||||||
|
|
||||||
|
### 10.2 查找空文件
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /data -type f -size 0
|
||||||
|
```
|
||||||
|
|
||||||
|
### 10.3 查找最近修改的配置文件
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /etc -type f -mtime -1
|
||||||
|
```
|
||||||
|
|
||||||
|
### 10.4 查找某用户拥有的文件
|
||||||
|
|
||||||
|
```shell
|
||||||
|
find /home -user lzc
|
||||||
|
```
|
||||||
|
|
||||||
|
## 11、小结
|
||||||
|
|
||||||
|
- `find` 是 Linux 中最强大的文件查找命令之一
|
||||||
|
- 它可以按名称、类型、属主、大小、时间等多条件组合搜索
|
||||||
|
- `-type`、`-name`、`-size`、`-mtime` 是最常用的几类条件
|
||||||
|
- `-maxdepth` 和 `-mindepth` 能帮助控制搜索范围
|
||||||
|
- 实战中最常见的场景是找日志、大文件、旧文件、异常文件
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user