diff --git a/.DS_Store b/.DS_Store index 8e41b40..fa7ad81 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/CAD/CAD快捷键.md b/CAD/CAD快捷键.md deleted file mode 100644 index aae633d..0000000 --- a/CAD/CAD快捷键.md +++ /dev/null @@ -1 +0,0 @@ -![Clipboard_Screenshot_1747219028](./assets/Clipboard_Screenshot_1747219028.png) \ No newline at end of file diff --git a/CAD/assets/Clipboard_Screenshot_1747219028.png b/CAD/assets/Clipboard_Screenshot_1747219028.png deleted file mode 100644 index bbd0b99..0000000 Binary files a/CAD/assets/Clipboard_Screenshot_1747219028.png and /dev/null differ diff --git a/images/.DS_Store b/images/.DS_Store new file mode 100644 index 0000000..f10ac95 Binary files /dev/null and b/images/.DS_Store differ diff --git a/开发/.DS_Store b/开发/.DS_Store index 3ef0f92..580112a 100644 Binary files a/开发/.DS_Store and b/开发/.DS_Store differ diff --git a/开发/后端/.DS_Store b/开发/后端/.DS_Store index 14ac0fd..73202f5 100644 Binary files a/开发/后端/.DS_Store and b/开发/后端/.DS_Store differ diff --git a/开发/后端/Go/.DS_Store b/开发/后端/Go/.DS_Store index ae242fa..8ed17b8 100644 Binary files a/开发/后端/Go/.DS_Store and b/开发/后端/Go/.DS_Store differ diff --git a/开发/后端/Go/课程/.DS_Store b/开发/后端/Go/课程/.DS_Store new file mode 100644 index 0000000..bc69918 Binary files /dev/null and b/开发/后端/Go/课程/.DS_Store differ diff --git a/折腾日记/assets/Clipboard_Screenshot_1748796448.png b/折腾日记/assets/Clipboard_Screenshot_1748796448.png deleted file mode 100644 index f832e17..0000000 Binary files a/折腾日记/assets/Clipboard_Screenshot_1748796448.png and /dev/null differ diff --git a/折腾日记/云服务器折腾服务.md b/折腾日记/云服务器折腾服务.md deleted file mode 100644 index c4c01dc..0000000 --- a/折腾日记/云服务器折腾服务.md +++ /dev/null @@ -1,14 +0,0 @@ -![Clipboard_Screenshot_1748796448](./assets/Clipboard_Screenshot_1748796448.png) - -# 部署清单 - -1、tke服务器 - -| 服务 | 要求 | 状态 | -| ---------- | ---------------- | -------------------- | -| jumpserver | 自动化注册服务器 | 已完成部署,未自动化 | -| grafana | 对接prometheus | 未完成 | -| prometheus | 自动化注册 | 未完成 | -| argocd | 对接gitea | 未完成 | - -2、个人服务器 \ No newline at end of file diff --git a/折腾日记/自建NAS.md b/折腾日记/自建NAS.md deleted file mode 100644 index a95a2e8..0000000 --- a/折腾日记/自建NAS.md +++ /dev/null @@ -1,17 +0,0 @@ - - -配置清单: - -机箱: - -主板: - -CPU: - -内存: - -固态硬盘: - -机械硬盘: - -电源: \ No newline at end of file diff --git a/网络/.DS_Store b/网络/.DS_Store new file mode 100644 index 0000000..9d5c979 Binary files /dev/null and b/网络/.DS_Store differ diff --git a/网络/华为材料/HCIA-Datacom V1.0 培训教材.pdf b/网络/华为材料/HCIA-Datacom V1.0 培训教材.pdf new file mode 100644 index 0000000..1d7b435 Binary files /dev/null and b/网络/华为材料/HCIA-Datacom V1.0 培训教材.pdf differ diff --git a/运维/.DS_Store b/运维/.DS_Store index 6a0f73e..03aa542 100644 Binary files a/运维/.DS_Store and b/运维/.DS_Store differ diff --git a/运维/云/.DS_Store b/运维/云/.DS_Store new file mode 100644 index 0000000..abeaa68 Binary files /dev/null and b/运维/云/.DS_Store differ diff --git a/运维/操作系统/Linux/.DS_Store b/运维/操作系统/Linux/.DS_Store index 155f557..69445c4 100644 Binary files a/运维/操作系统/Linux/.DS_Store and b/运维/操作系统/Linux/.DS_Store differ diff --git a/运维/操作系统/Linux/笔记/1.操作系统进制及位数.md b/运维/操作系统/Linux/笔记/1.操作系统进制及位数.md index c6b8bd7..03971d5 100644 --- a/运维/操作系统/Linux/笔记/1.操作系统进制及位数.md +++ b/运维/操作系统/Linux/笔记/1.操作系统进制及位数.md @@ -1,38 +1,157 @@ -当前计算机采用二进制,基本单位为bit(位),byte(字节)1byte=8bit -## 1、十进制和二进制转换 -`bc`命令,也可以做一些计算 -参数: 一定要先输入obase +计算机底层使用二进制来表示和处理数据。最基本的单位是 bit(位),8 个 bit 组成 1 个 Byte(字节)。 + +## 1、常见数据单位 + +- 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 -[root@tencentos ~]#bc #进入交互模式 +[root@tencentos ~]# bc obase=2 ibase=10 -100033333 #输入 -101111101100110001100110101 #结果 +10 +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位系统通常可以提供更好的性能。 -2. 内存寻址能力:32位系统最多只能支持4GB的内存(理论上是4GB,但实际上由于各种硬件和系统的限制,可用的内存通常会少于这个数值)。而64位系统可以支持的内存大小远超过4GB,理论上可以达到18.4亿GB。这使得64位系统可以运行那些需要大量内存的应用。 -3. 兼容性:64位操作系统通常可以运行为32位系统编写的软件,但反过来则不行。也就是说,如果你有一些只能在32位系统上运行的老旧软件,那么你可能需要继续使用32位系统。 +表示把十进制的 `10` 转换成二进制,结果是 `1010`。 + +### 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 [root@tencentos ~]# arch x86_64 ``` + +`x86_64` 表示当前机器架构是 64 位架构。 + +### 6.2 使用 `uname -m` + +```shell +[root@tencentos ~]# uname -m +x86_64 +``` + +这个命令也是查看机器架构时非常常用的方法。 + +### 6.3 使用 `getconf LONG_BIT` + ```shell [root@tencentos ~]# getconf LONG_BIT 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` 都很常用 diff --git a/运维/操作系统/Linux/笔记/10.文本查看.md b/运维/操作系统/Linux/笔记/10.文本查看.md index 4f7e16a..e3ab929 100644 --- a/运维/操作系统/Linux/笔记/10.文本查看.md +++ b/运维/操作系统/Linux/笔记/10.文本查看.md @@ -1,27 +1,167 @@ -## 1、文本编辑器 -全屏编辑器:nano -图形化工具:vi、vim +## 1、文本查看概览 -## 2、文本查看器 -##### 2.1 cat --E:输出行结束符 --A:显示所有控制符 --n:显示编号 --b:非空行编号 --s:连续空行压缩成1行 +Linux 中查看文本内容时,常用命令包括: -##### 2.2 tac(从后向前显示文本) +- `cat`:快速输出全文 +- `tac`:倒序显示文本 +- `more`:分页查看 +- `head`:查看开头部分 +- `tail`:查看结尾部分或持续追踪 +- `hexdump`:查看二进制或非文本文件内容 -##### 2.3 more(分页显示) -空格:下翻 -b:上翻 +根据文件大小和使用场景不同,应选择不同工具。 -##### 2.4 head(显示文本前面或者后面的行内容) --c:获取前x字节 --n:获取前x行,如果为负数,则取倒数第几行 +## 2、`cat` -##### 2.5 tail(查看文本倒数几行的内容) --n x:置顶获取后x行 --f:追踪 +`cat` 适合查看**较小文本文件**,也常用于拼接文件内容输出到标准输出。 -##### 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` 适合查看二进制或不可见字符内容 diff --git a/运维/操作系统/Linux/笔记/11.文本分析.md b/运维/操作系统/Linux/笔记/11.文本分析.md index b9ab107..6b73c9d 100644 --- a/运维/操作系统/Linux/笔记/11.文本分析.md +++ b/运维/操作系统/Linux/笔记/11.文本分析.md @@ -1,23 +1,130 @@ -##### 1、wc(文本数据统计) --l:只统计行数 --w:只统计单词数 +## 1、文本分析概览 -##### 2、sort(文本排序,仅输出到STDOUT) --R:随机排序 --n:按数字大小整理 --h:按人类可读排序 --u:合并重复项 +Linux 中很多日志分析和数据整理工作,都依赖文本分析命令。常见工具包括: + +- `wc`:统计文本信息 +- `sort`:排序 +- `uniq`:去重或统计重复次数 +- `cut`:按列提取内容 + +它们经常和管道一起使用,是文本处理的基础组合。 + +## 2、`wc` + +`wc` 用于统计文本的行数、单词数、字节数等。 + +### 2.1 常见选项 + +- `-l`:统计行数 +- `-w`:统计单词数 +- `-c`:统计字节数 + +### 2.2 示例 -##### 3、uniq(文本去重) --c:显示每行重复次数 --d:仅显示重复的行 --u:仅显示不重复的行 -范例:统计日志访问量最多的请求 ```shell -cut -d" " access_log | sort | uniq -c | sort -nr | head -3 +wc -l access.log ``` -##### 4、cut(按列抽取文本) --d:指定分隔符 --c:按字符分隔 --f:取第几列,1-6或1,3,5 +用于统计文件共有多少行。 + +## 3、`sort` + +`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` 用于按列抽取文本 +- 这几个命令经常组合使用,是日志分析和文本整理的基础工具 diff --git a/运维/操作系统/Linux/笔记/12.文本编辑-VIM.md b/运维/操作系统/Linux/笔记/12.文本编辑-VIM.md index 3da1cd9..e9addc7 100644 --- a/运维/操作系统/Linux/笔记/12.文本编辑-VIM.md +++ b/运维/操作系统/Linux/笔记/12.文本编辑-VIM.md @@ -1,35 +1,179 @@ -## 1、命令模式玩法 -- 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、Vim 概览 -##### 1.1 查找并替换 -**查找:** -`/文件` +Vim 是 Linux 中最常见的文本编辑器之一,特点是: -- n:向下 -- N:向上 +- 几乎所有 Linux 环境都能遇到 +- 适合终端内快速编辑文件 +- 对运维排障、改配置、写脚本都很常用 -**替换格式:** -`s/要查的内容/替换的内容/修饰符` -**修饰符:** +学习 Vim 的关键,不是死记命令,而是先理解它的**模式切换**。 -- i:忽略大小写 -- g:全局替换 -- gc:全局替换,每次替换前询问 +## 2、Vim 的常见模式 +### 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 后,终端下改配置文件会高效很多 diff --git a/运维/操作系统/Linux/笔记/13.文本权限.md b/运维/操作系统/Linux/笔记/13.文本权限.md index d0184d3..9493294 100644 --- a/运维/操作系统/Linux/笔记/13.文本权限.md +++ b/运维/操作系统/Linux/笔记/13.文本权限.md @@ -1,66 +1,254 @@ -## 1、文件权限管理 -简介:文件权限主要针对文件所属用户、用户组、其他人设置限制,从左到右进行顺序匹配一但匹配权限立即生效,不在查看右边的权限,r,w对root 无效,只要ugo任何一个有执行权限,root就可以执行 +## 1、文件权限概览 -- r:readable 4,可使用文件查看类工具,如cat -- w:writable 2,可以修改内容 -- x:excutable 1,可以把此文件提请内核启动为一个进程,及运行此文件 +Linux 文件权限控制的核心对象有三类: -- u:属主 -- g:属组 -- o:其他人 +- `u`:属主(user) +- `g`:属组(group) +- `o`:其他用户(others) -## 2、目录权限 +对应的基本权限有三种: -- r:可以使用ls查看此目录中文件名列表,但是无法看到文件的属性信息,不能查看文件的内容 -- w:可以在目录中创建文件,也可以删除目录中的文件 -- x:可以cd进此目录,可以查看文件的元数据 +- `r`:读,值为 4 +- `w`:写,值为 2 +- `x`:执行,值为 1 + +权限控制是 Linux 安全模型的基础之一,和文件访问、脚本执行、目录操作都直接相关。 + +## 2、文件权限与目录权限的区别 + +### 2.1 文件权限 + +对**普通文件**来说: + +- `r`:可以读取文件内容 +- `w`:可以修改文件内容 +- `x`:可以把该文件作为程序执行 + +### 2.2 目录权限 + +对**目录**来说,权限含义和普通文件不完全一样: + +- `r`:可以查看目录中的文件名列表 +- `w`:可以在目录中创建、删除、重命名文件 +- `x`:可以进入目录,也可以访问目录项的元数据 + +目录权限是很多初学者最容易搞混的地方。 + +## 3、`ls -l` 权限格式 -##### 2.1 文件权限格式(ls -l) ```shell 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 -chown root:root fileName #修改文件的所有者和所有组为root +chown root:root fileName ``` --R:递归 -##### 2.3 chgrp修改文件属组 --R:递归 +表示把文件的属主和属组都改为 `root`。 +常见选项: -##### 2.4 chmod修改文件权限 --R:递归 -数字或者ugo+ +- `-R`:递归处理目录及其内部文件 +### 4.2 `chgrp` -##### 2.5 umask默认权限 -文件:计算方式为666-umask,如果所得结果为存在执行(奇数)权限,则将其权限+1 -目录:计算方式为777-umask -默认值:root:022,其他用户:002 +用于单独修改文件属组。 -**修改umask 值,放在profile中永久生效** +常见选项: -## 3、特殊权限 -SUID(s):作用在二进制可执行文件上,其他用户将继承此程序所有者的权限,比如:passwd(# ls -l /bin/passwd)权限为-rwsr-xr-x,当其他用户执行passwd 的时候,他的权限就变成文件所属主的权限。 -SGID(s):作用于二进制可执行文件上时,用户将继承次程序所有组的权限,作用于目录上时,此目录新建的文件的所属组将自动从此目录继承 -STICKY(t):作用于目录上,此目录的文件只能有所有者删除,比如/tmp,rwxrwxrwt,只有设置在目录上才有效,只有文件的所有者或者root才能删除文件 +- `-R`:递归处理 -## 4、特殊属性 -chattr(管控root及其他用户) +示例: -- +i:不能删除,改名,更改内容 -- +a:只能追加内容,不能删除,改名 +```shell +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` 用于管理更细粒度的文件属性 diff --git a/运维/操作系统/Linux/笔记/14.文本grep.md b/运维/操作系统/Linux/笔记/14.文本grep.md index 8be7c27..129b497 100644 --- a/运维/操作系统/Linux/笔记/14.文本grep.md +++ b/运维/操作系统/Linux/笔记/14.文本grep.md @@ -1,7 +1,92 @@ -grep:文本搜索 --m:匹配几次后停止 --v:取反 --i: 忽略大小写 --n:显示匹配到的行号 --c:匹配到的次数 --w:匹配到整个单词 +## 1、`grep` 概览 + +`grep` 是 Linux 中最常用的文本搜索命令之一,用于在文件或命令输出中查找匹配的内容。 + +日常使用场景包括: + +- 在配置文件中查找关键字 +- 在日志中定位报错信息 +- 过滤命令输出 +- 结合管道做批量分析 + +## 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` 是最常用选项 +- 它非常适合配合管道过滤日志、进程、配置输出 diff --git a/运维/操作系统/Linux/笔记/15.文本sed.md b/运维/操作系统/Linux/笔记/15.文本sed.md index 62aee27..7af0ba0 100644 --- a/运维/操作系统/Linux/笔记/15.文本sed.md +++ b/运维/操作系统/Linux/笔记/15.文本sed.md @@ -1,5 +1,104 @@ -sed:从文件或者管道符里读取一行,处理一行 --r:使用拓展正则表达式 --i:保存到文件中 -s/要被替换的值/最中通过值/修饰符 -g:行内全局替换 +## 1、`sed` 概览 + +`sed` 是 Linux 中非常常见的流编辑器(stream editor),它会按行读取输入内容,然后对文本进行处理。 + +常见用途: + +- 文本替换 +- 删除指定行 +- 打印指定范围内容 +- 批量修改配置文件 + +## 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` 搭配控制输出 +- 它非常适合批量替换和配置修改场景 diff --git a/运维/操作系统/Linux/笔记/16.文本awk.md b/运维/操作系统/Linux/笔记/16.文本awk.md index 07ef79b..82588a1 100644 --- a/运维/操作系统/Linux/笔记/16.文本awk.md +++ b/运维/操作系统/Linux/笔记/16.文本awk.md @@ -1,47 +1,155 @@ -awk --F:指定分隔符 -变量 -FS:输入字段分隔符,默认为空白字符,功能相当于-F -自定义变量:-v var=value +## 1、`awk` 概览 -语句块 -BEGIN:语句块 -模式匹配的同游语句块 -END语句块 +`awk` 是 Linux 中非常强大的文本分析工具,特别适合处理**按列分隔**的数据。 -工作过程 -第一步:执行BEGIN{action;...}语句块中的语句 -第二步:从文件或标准输入读取一行,然后执行pattern{action;...}语句块 -第三步:当读到末尾后,执行END模块 +常见用途: -常见action分类 -print -,:分隔符 -固定字符要用“”引用起来,而变量和数字不需要 +- 提取某几列字段 +- 按条件筛选内容 +- 统计求和 +- 格式化输出 +- 分析日志和表格类文本 -printf -"FORMAT" -必须指定FORMAT,且分别需要为后面每个item指定格式符 -不会自动换行,需要显示给出换行控制符\n +## 2、工作流程 -%s:显示字符串 -%d:显示十进制整数 -%f:显示为浮点数 -%e:显示科学计数法数值 -%c:显示字符的ascii码 -%u:显示无符号整数 +`awk` 的处理流程通常是: -算数,比较表达式 -组合语句 -if,while等 -输入 +1. 先执行 `BEGIN` 语句块 +2. 逐行读取输入 +3. 对每一行执行 `pattern { action }` +4. 最后执行 `END` 语句块 -控制语句 -if -if else -while -do while -for -break -continue -exit +基本格式: + +```shell +awk 'BEGIN{action} pattern{action} END{action}' file +``` + +## 3、字段分隔符 + +### 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` 适合格式化输出 +- 它非常适合做日志分析、列提取和条件统计 diff --git a/运维/操作系统/Linux/笔记/17.IO重定向.md b/运维/操作系统/Linux/笔记/17.IO重定向.md index ae0cf38..432a74a 100644 --- a/运维/操作系统/Linux/笔记/17.IO重定向.md +++ b/运维/操作系统/Linux/笔记/17.IO重定向.md @@ -1,27 +1,149 @@ -## 1、标准输入和输出 -**Linux给程序提供三种I/O设备** +## 1、I/O 重定向概览 -- 标准输入(STDIN) -0 默认接收来自终端窗口的输入 -- 标准输出(STDOUT) -1 默认输出到终端窗口 -- 标准错误(STDERR) -2 默认输出到终端串口 +Linux 程序默认会使用 3 个标准输入输出通道: + +- **标准输入** `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 -1>或> 把STDOUT 重定向到文件 -2> 把STDERR 重定向到文件 -&> 把标准输出和标准错误都输出到文件 +command > file ``` -## 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 cat > 1.txt < 1231231 -> asasssf -> EOF +1231231 +asasssf +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>` 用于重定向错误输出 +- `&>` 可同时重定向标准输出和错误输出 +- `< [options] ` -常用选项说明 +### 4.1 硬 RAID + +由 RAID 卡等硬件完成管理。 + +特点: + +- 对操作系统更透明 +- 稳定性通常更强 +- 常见于物理服务器 + +### 4.2 软 RAID + +由操作系统通过软件实现,Linux 中常用工具是 `mdadm`。 + +特点: + +- 成本低 +- 学习和实验方便 +- 依赖系统资源 + +生产中是否使用软 RAID,要根据业务、硬件条件和运维能力综合判断。 + +## 5、`mdadm` 命令 + +`mdadm` 是 Linux 下管理软 RAID 的核心工具。 + +### 5.1 基本语法 + +```shell +mdadm [mode] [options] ``` -模式: - 创建: -C - 装配:-A - 监控:-F - 管理:-f, -r, -a -: /dev/md# - :任意块设备 --C:创建模式 - -n #:使用#个块设备来创建此RAID - -l #:指明要创建的RAID的级别 - -a {yes / no}:自动创建目标RAID设备的设备文件 - -c CHUNK_SIZE:指明块大小,单位k - -x #:指明空闲盘的个数 --D:显示raid的详细信息 - mdadm -D / dev / md# -管理模式: - -f:标记指定磁盘为损坏 - -a:添加磁盘 - -r:移除磁盘 +### 5.2 常见模式和选项 -观察md的状态: +- `-C`:创建 RAID +- `-A`:装配 RAID +- `-D`:查看详细信息 +- `-f`:标记某块盘故障 +- `-r`:移除磁盘 +- `-a`:添加磁盘 +- `-n`:指定 RAID 成员盘数量 +- `-l`:指定 RAID 级别 +- `-x`:指定热备盘数量 + +### 5.3 查看状态 + +```shell cat /proc/mdstat ``` -### 详细操作 -#### 创建 RAID 设备 -要创建一个新的 RAID 设备,可以使用以下命令: -``` + +## 6、常见操作示例 + +### 6.1 创建 RAID 1 + +```shell 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 ``` -#### 查看 RAID 设备信息 -要查看当前系统中的 RAID 设备信息,可以使用以下命令: -``` -mdadm --detail --scan -``` -该命令将显示当前系统中所有的 RAID 设备信息。 -#### 添加磁盘到 RAID 设备 -要将一个新的磁盘添加到一个 RAID 设备中,可以使用以下命令: + +### 6.3 查看 RAID 详细信息 + +```shell +mdadm --detail /dev/md0 ``` + +### 6.4 添加磁盘 + +```shell mdadm --add /dev/md0 /dev/sdc1 ``` -该命令将将 /dev/sdc1 磁盘添加到名为 /dev/md0 的 RAID 设备中。 -#### 删除 RAID 设备中的磁盘 -要从一个 RAID 设备中删除一个磁盘,可以使用以下命令: -``` + +### 6.5 移除磁盘 + +```shell mdadm --remove /dev/md0 /dev/sdc1 ``` -该命令将从名为 /dev/md0 的 RAID 设备中删除 /dev/sdc1 磁盘。 -#### 替换 RAID 设备中的磁盘 -要替换一个 RAID 设备中的磁盘,可以使用以下命令: -``` -mdadm --replace /dev/md0 /dev/sdc1 -``` -该命令将将 /dev/sdc1 磁盘替换名为 /dev/md0 的 RAID 设备中的故障磁盘。 -#### 监视 RAID 设备状态 -要监视 RAID 设备的状态,可以使用以下命令: -``` -mdadm --monitor --scan -``` -该命令将启动一个 mdadm 进程,用于监视系统中所有 RAID 设备的状态。 -#### 停止RAID设备 -``` + +### 6.6 停止 RAID + +```shell mdadm -S /dev/md0 ``` -#### 激活RAID设备 -``` -mdadm -A -s /dev/md0 -``` -#### 删除raid信息 -``` + +### 6.7 清理 RAID 元数据 + +```shell 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 前先明确业务目标:要性能、要容量,还是要容错 diff --git a/运维/操作系统/Linux/笔记/21.LVM.md b/运维/操作系统/Linux/笔记/21.LVM.md index c47e907..cf4ff50 100644 --- a/运维/操作系统/Linux/笔记/21.LVM.md +++ b/运维/操作系统/Linux/笔记/21.LVM.md @@ -1,93 +1,178 @@ -# Linux LVM详解 -LVM(Logical Volume Manager)是一种用于管理磁盘分区和卷的技术。LVM 可以将多个物理磁盘分区组合成一个或多个逻辑卷,并提供动态调整卷大小、备份和恢复等功能。(也不建议使用,之前有遇到朋友购买的云服务器使用LVM管理多块云硬盘,忘记之后把其中一块云硬盘给删除了。。。) -## LVM 的主要概念和组件 -物理卷(Physical Volume,PV):物理卷是指一个或多个物理磁盘分区,可以使用 LVM 命令将其初始化为物理卷。 -卷组(Volume Group,VG):卷组是由一个或多个物理卷组成的逻辑卷集合,可以使用 LVM 命令创建和管理卷组。 -逻辑卷(Logical Volume,LV):逻辑卷是由卷组分配的逻辑磁盘,可以使用 LVM 命令创建和管理逻辑卷。 -物理区(Physical Extent,PE):物理区是指物理卷和逻辑卷的最小存储单元,通常为 4MB 或 8MB。 -## LVM 常用的命令及其功能 -### 创建物理卷 -要创建一个新的物理卷,可以使用以下命令: -``` +## 1、LVM 概览 + +LVM(Logical Volume Manager,逻辑卷管理)用于在 Linux 中更灵活地管理磁盘空间。 + +相比传统分区,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 ``` -该命令将初始化 /dev/sdb1 分区为一个新的物理卷。 -### 查看物理卷 -扫描系统中所有硬盘的物理卷列表 -``` + +### 4.2 查看物理卷 + +```shell pvscan -``` -### 删除物理卷 -删除物理卷 `pvremove(选项)(参数)` -``` -pvremove /dev/sdb1 -``` -### 显示物理卷属性 -`pvdisplay`用于显示物理卷的属性。`pvdisplay`命令显示的物理卷信息包括:物理卷名称、所属的卷组、物理卷大小、PE大小、总PE数、可用PE数、已分配的PE数和UUID。 -``` pvdisplay /dev/sdb1 ``` -### 创建卷组 -要创建一个新的卷组,可以使用以下命令: + +### 4.3 删除物理卷 + +```shell +pvremove /dev/sdb1 ``` + +## 5、卷组管理 + +### 5.1 创建卷组 + +```shell vgcreate myvg /dev/sdb1 /dev/sdc1 ``` -该命令将创建一个名为 myvg 的卷组,并将 /dev/sdb1 和 /dev/sdc1 分区添加到卷组中。 -### 从卷组中删除物理卷 -`vgreduce`命令,通过删除LVM卷组中的物理卷来减少卷组容量。不能删除LVM卷组中剩余的最后一个物理卷。 -``` -vgreduce myvg /dev/sdb1 -``` -### 删除卷组 -`vgremove命令`用于用户删除LVM卷组。当要删除的卷组上已经创建了逻辑卷时,`vgremove`命令需要进行确认删除,防止误删除数据 -``` -vgremove myvg -``` -### 卷组重命名 -**grename命令** 可以重命名卷组的名称。 -语法:`vgrename [选项] [旧卷组路径|旧卷组名称|旧卷组UUID] [新卷组路径|新卷组名称]` -``` -vgrename /dev/vg1 /dev/vg2 -``` -### 查看所有卷组 -扫描并显示系统中的卷组 -``` + +### 5.2 查看卷组 + +```shell vgscan -``` -### 显示卷组详细信息 -`vgdisplay`命令用于显示LVM卷组的信息。如果不指定"卷组"参数,则分别显示所有卷组的属性。 -``` 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 ``` -该命令将创建一个名为 mylv 的逻辑卷,大小为 10GB,分配给 myvg 卷组。 -### 扩展逻辑卷 -要扩展一个现有的逻辑卷,可以使用以下命令: + +### 6.2 查看逻辑卷 + +```shell +lvscan +lvdisplay /dev/myvg/mylv ``` + +### 6.3 扩容逻辑卷 + +```shell lvextend -L +5G /dev/myvg/mylv ``` -该命令将将 /dev/myvg/mylv 逻辑卷的大小增加 5GB。 -### 缩小逻辑卷 -要缩小一个现有的逻辑卷,可以使用以下命令: -``` + +扩容后,通常还需要继续扩展文件系统。 + +### 6.4 缩容逻辑卷 + +```shell lvreduce -L -5G /dev/myvg/mylv ``` -该命令将将 /dev/myvg/mylv 逻辑卷的大小减少 5GB。 -### 查看所有逻辑卷 -``` -lvscanx -``` -### 删除逻辑卷 -`lvremove命令`用于删除指定LVM逻辑卷。如果逻辑卷已经使用`mount`命令加载,则不能使用`lvremove`命令删除。必须使用`umount`命令卸载后,逻辑卷方可被删除。 -``` -lvremove /dev/vg1000/lvol0 -``` -### 查看逻辑卷详细信息 -`lvdisplay命令` 用于显示LVM逻辑卷空间大小、读写状态和快照信息等属性。如果省略"逻辑卷"参数,则`lvdisplay`命令显示所有的逻辑卷属性。否则,仅显示指定的逻辑卷属性。 -``` -lvdisplay /dev/vg1000/lvol0 + +**缩容风险较高**,必须先确认文件系统支持、先备份数据,并严格按步骤操作。 + +### 6.5 删除逻辑卷 + +```shell +lvremove /dev/myvg/mylv ``` + +删除前如果已经挂载,通常要先卸载。 + +## 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` 是三步基础命令 +- 扩容逻辑卷后通常还要扩展文件系统 +- 缩容和删除操作都要格外谨慎 diff --git a/运维/操作系统/Linux/笔记/22.软件管理.md b/运维/操作系统/Linux/笔记/22.软件管理.md index decadf6..c7c40d2 100644 --- a/运维/操作系统/Linux/笔记/22.软件管理.md +++ b/运维/操作系统/Linux/笔记/22.软件管理.md @@ -1,80 +1,149 @@ -redhat:rpm文件,rpm管理器,使用yum、dnf包管理器 -debian:deb文件,dpkg管理器,使用apt包管理器 -## 1、rpm详解 -rpm 用的很少,都是用的dnf管理器管理 -1.1 包查询 -```shell -rpm -q 参数1、 -参数: --a:所有包 --f:查看指定的文件由哪个包安装生成 --l:查看指定的程序包安装后生成的所有文件 -``` -## 2、dnf详解 -现在是dnf的天下,yum代码维护困难,速度差 +## 1、软件管理概览 + +不同 Linux 发行版使用的包格式和包管理工具不同: + +- **Red Hat 系**:`rpm` 包,常用 `yum` / `dnf` +- **Debian 系**:`deb` 包,常用 `dpkg` / `apt` + +日常运维中,更多时候直接使用**高级包管理器**,例如 `dnf` 或 `apt`,而不是手动操作底层包文件。 + +## 2、RPM 系软件管理 + +### 2.1 `rpm` + +`rpm` 更偏底层,适合: + +- 查询包信息 +- 查看文件归属 +- 手动安装本地 rpm 包 + +### 2.2 常见查询命令 ```shell -/etc/dnf/dnf.conf #为所有仓库提供的公共配置文件 -/etc/yum.repos.d/*.repo #每个仓库的配置文件 +rpm -qa ``` + +查看所有已安装软件包。 + ```shell -gpgcheck=1 #安装包前要做包的合法性和完整性校验 -installonly_limit=3 #同事可以安装3个包,最小值为2,如果设置0或1,则不限制 -clean_requirements_on_remove=True #删除包的时候是否将不再使用的包删除 -bast=True #升级时,自动选择安装最新版,即使缺少包的依赖 +rpm -qf /usr/bin/ls ``` + +查看某个文件由哪个包安装生成。 + ```shell -[仓库名] -name=仓库名 -baseurl=仓库位置 -enabled={1|0} -gpgcheck={1|0} +rpm -ql bash +``` + +查看某个包安装后包含哪些文件。 + +## 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 ``` -## 3、dnf 常用命令 -##### 3.1 显示仓库列表 + +## 4、`dnf` 常用命令 + +### 4.1 查看仓库 + ```shell -dnf repolist [all|enbaled|disabled] -dnf repolist -v #显示详细仓库列表 +dnf repolist +dnf repolist all +dnf repolist -v ``` -##### 3.2 显示程序包 + +### 4.2 查看软件包 + ```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 -dnf install 包名 -dnf reinstall 包名 +dnf install nginx +dnf reinstall nginx ``` -##### 3.4 只下载相关依赖的包,而不安装 + +### 4.4 只下载不安装 + ```shell -dnf install nginx --downloadonly --downloaddir=/保存文件夹 +dnf install nginx --downloadonly --downloaddir=/tmp/pkg ``` -##### 3.5 卸载程序包 + +### 4.5 卸载软件 + ```shell -dnf remove 包名 -dnf remove 包名 --purge #删除配置文件 +dnf remove nginx ``` -##### 3.6 查询 + +### 4.6 查询与搜索 + ```shell -dnf info 包名 -``` -```shell -dnf search 包名 -``` -## 4、apt包管理器 -```shell -install:安装 -remove:卸载 -purge:卸载并删除配置文件 -update:刷新存储库索引 -uograde:升级所有包 -autoremove:自动删除不需要的包 -search:搜索 -show:显示软件包细节 -list:查看包 - --installed:已安装 - --available:可获得 - --updates:可升级 +dnf info nginx +dnf search nginx ``` + +## 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 系主流包管理器 +- 软件管理重点不只是安装,还包括仓库、依赖、升级和清理 diff --git a/运维/操作系统/Linux/笔记/23.网络管理.md b/运维/操作系统/Linux/笔记/23.网络管理.md index f74bcbc..db09f82 100644 --- a/运维/操作系统/Linux/笔记/23.网络管理.md +++ b/运维/操作系统/Linux/笔记/23.网络管理.md @@ -1,181 +1,207 @@ -## 1、ARP -- -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 命令 +## 1、网络管理概览 -- -t:tcp协议相关 -- -u:udp协议相关 -- -l:监听状态的 -- -a:所有状态 -- -n:显示ip和端口 -- -p:显示进程 -- -I:指定网卡 -```shell -root@jumpserver:~# netstat -s +Linux 网络管理中,常见关注点包括: + +- 地址解析与邻居表 +- 端口和连接状态 +- 路由 +- 网卡信息 +- 网络带宽和连接统计 + +常用命令包括:`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 -root@jumpserver:~# netstat -n | grep TIME_WAIT | wc -l -3 +arp -a ``` + +使用场景: + +- 检查局域网 IP 与 MAC 的对应关系 +- 排查 ARP 缓存异常 + +## 3、连接和端口查看 + +### 3.1 `netstat` + +`netstat` 是传统网络统计命令,现在很多场景已被 `ss` 替代,但仍然常见。 + +常见选项: + +- `-t`:TCP +- `-u`:UDP +- `-l`:监听状态 +- `-a`:所有状态 +- `-n`:显示数字地址和端口 +- `-p`:显示进程信息 +- `-s`:显示协议统计信息 + +示例: + ```shell -root@jumpserver:~# 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 +netstat -ntlp ``` -## 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 nload -m ``` -## 4、ip -```shell -root@jumpserver:~# ip a -1: lo: 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: 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 -root@jumpserver:~# ip route del 192.168.30.201 -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 +ss -ntlp ``` + +### 6.2 查连接状态是否异常 + ```shell -ip route get 目标地址 +ss -s +netstat -s ``` -## 5、ss + +### 6.3 查默认路由是否正确 + ```shell --n, --numeric 不解析服务名称 --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) +ip route ``` + +### 6.4 查单个目标走哪条路由 + ```shell -root@jumpserver:~# ss -4 state time-wait | wc -l -4 +ip route get 目标IP ``` + +### 6.5 查局域网 ARP 映射 + +```shell +arp -a +``` + +## 7、现代使用建议 + +- 新系统中优先使用 `ip` 和 `ss` +- `netstat` 仍然值得会看,因为很多老文档和线上环境还在用 +- 排查端口问题时,优先关注“是否监听、监听在哪个地址、对应哪个进程” +- 排查网络问题时,通常按“网卡 → IP → 路由 → 端口 → 流量”这个顺序看 + +## 8、小结 + +- `arp` 用于看 IP 和 MAC 的映射 +- `ip a` 看网卡和地址,`ip route` 看路由 +- `netstat` 和 `ss` 用于查看连接、端口和协议统计 +- `ss` 更现代,推荐优先掌握 +- `nload` 适合快速看实时带宽变化 diff --git a/运维/操作系统/Linux/笔记/24.多网卡Bond.md b/运维/操作系统/Linux/笔记/24.多网卡Bond.md index 6179381..d5a039b 100644 --- a/运维/操作系统/Linux/笔记/24.多网卡Bond.md +++ b/运维/操作系统/Linux/笔记/24.多网卡Bond.md @@ -1,58 +1,124 @@ -将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。 -## 1、工作模式 -##### 1、mode=0(balance-rr)(平衡轮询策略) -链路负载均衡,增加带宽,支持容错,一条链路故障会自动切换正常链路。交换机需要配置聚合口,思科叫port channel。 -**特点:**传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环下去,直到最后一个传输完毕),此模式提供负载平衡和容错能力;但是我们知道如果一个连接 -或者会话的数据包从不同的接口发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络的吞吐量就会下降 +## 1、Bonding 概览 -##### 2、mode=1(active-backup)(主-备份策略) -主备模式,只有一块网卡是active,另一块是备用的standby,所有流量都在active链路上处理,交换机配置的是捆绑的话将不能工作,因为交换机往两块网卡发包,有一半包是丢弃的。 -**特点:**只有一个设备处于活动状态,当一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见得,从外面看来,bond的MAC地址是唯一的,以避免switch(交换机)发生混乱。 -此模式只提供了容错能力;由此可见此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N +Bonding(网卡绑定)是把多块物理网卡组合成一个逻辑接口,对外通常表现为一个 IP 地址。 -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 动态链接聚合) -表示支持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模式 +是否真正实现带宽叠加,取决于 **Bond 模式**、交换机配置、流量模型等因素。 -6、mode=5(balance-tlb)(适配器传输负载均衡) -是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave。该模式要求slave接口的网络设备驱动有某种ethtool支持;而且ARP监控不可用。 -特点:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。 -必要条件: -ethtool支持获取每个slave的速率 +## 2、常见 Bond 模式 -7、mode=6(balance-alb)(适配器适应性负载均衡) -在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、配置方法 -```shell -root@jumpserver:~# vim /etc/netplan/00-installer-config.yaml +### 2.1 `mode=0` `balance-rr` + +轮询发送流量。 + +特点: + +- 负载均衡 +- 支持容错 +- 需要交换机配合链路聚合 +- 可能出现包乱序问题 + +### 2.2 `mode=1` `active-backup` + +主备模式。 + +特点: + +- 同时只有一块网卡工作 +- 一块故障时自动切换到备份网卡 +- 主要用于高可用 +- 对交换机要求较低 + +这是生产中非常常见、也相对稳妥的模式。 + +### 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: version: 2 ethernets: eth1: - addresses: [] #绑定单网卡不需要写IP地址 + addresses: [] dhcp4: no eth2: addresses: [] @@ -69,33 +135,58 @@ network: interfaces: - eth1 - eth2 - parameters: #参数 - mode: balance-alb + parameters: + mode: balance-alb ``` -```shell -/etc/sysconfig/network-scripts/ifcfg-bond0 + +### 4.2 传统 ifcfg 配置示例 + +`/etc/sysconfig/network-scripts/ifcfg-bond0` + +```ini NAME=bond0 -TYPE=bond +TYPE=Bond DEVICE=bond0 BOOTPROTO=none IPADDR=10.0.0.100 -PREFIX-8 -#miimon指定链路监测时间间隔。如果miimon=100,那么系统每100ms 监测一次链路连接状态,如果有条线路不通就转入另一条线路 -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 +PREFIX=8 +BONDING_OPTS="mode=1 miimon=100" ``` + +从接口配置中要指定: + +- `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 端,也要看交换机端是否匹配 diff --git a/运维/操作系统/Linux/笔记/25.进程.md b/运维/操作系统/Linux/笔记/25.进程.md index 412b1d8..c6e9a7e 100644 --- a/运维/操作系统/Linux/笔记/25.进程.md +++ b/运维/操作系统/Linux/笔记/25.进程.md @@ -1,71 +1,205 @@ -## 1、进程 -进程是一个具有一定独立功能的程序在一个数据及上的一次动态执行的过程。是操作系统进行资源分配的一个独立单位 -**进程的基本状态** -创建状态:进程在创建时需要申请一个空白的PCB(进程控制块),向其中填写控制和管理进程的信息,完成资源分配。 -就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行 -执行状态:进程处于就绪状态被调度后,进程进入执行状态 -阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。满足请求时进入就绪状态等待系统调用 -终止状态:进程结束,或出现错误,或系统终止,进入终止状态。无法再执行 +## 1、进程概览 -- 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 -pstree - -常用选项: --p: 显示PID --T:不显示线程,默认显示线程 --u:显示用户切换 --H:高亮显示指定进程及其前辈进程 +pstree -p ``` -##### 4.2 ps + +### 5.2 `ps` + +用于查看进程快照。 + +常见选项: + +- `a`:显示所有终端相关进程 +- `x`:显示不依赖终端的进程 +- `u`:显示用户信息 +- `f`:树状显示父子关系 + +高频示例: + ```shell -ps - -常用选项: -a:选项包括所有终端中的进程 -x:选项包括不连接终端的进程 -u:显示进程的所有者信息 -f:显示进程数 +ps aux +ps -ef +ps auxf ``` -##### 4.3 prtstat + +### 5.3 `pidof` 与 `pgrep` + ```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 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` 常用于进程控制 +- 排查问题时,通常从“进程是否存在、状态是否正常、资源占用是否异常”这条线入手 diff --git a/运维/操作系统/Linux/笔记/26.任务计划.md b/运维/操作系统/Linux/笔记/26.任务计划.md index 0303783..cbad3b9 100644 --- a/运维/操作系统/Linux/笔记/26.任务计划.md +++ b/运维/操作系统/Linux/笔记/26.任务计划.md @@ -1,26 +1,147 @@ -通过任务计划,可以让系统自动的按时间或周期性执行任务 -## 1、一次性任务 -```shell -at +## 1、任务计划概览 -常用选项: --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 +Linux 中任务计划主要分两类: -常用选项 --l:列出 --e:编辑 --r:移除所有 +- **一次性任务**:只执行一次,例如 `at` +- **周期性任务**:按固定时间重复执行,例如 `cron` / `crontab` + +常见用途: + +- 定时备份 +- 定时清理日志 +- 定时执行脚本 +- 安排未来某个时间点执行一次命令 + +## 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` 用于周期性任务 +- 定时任务最重要的是“时间表达式正确 + 命令路径明确 + 日志可排查” diff --git a/运维/操作系统/Linux/笔记/27.Systemd.md b/运维/操作系统/Linux/笔记/27.Systemd.md index 664b4ca..7c81ba3 100644 --- a/运维/操作系统/Linux/笔记/27.Systemd.md +++ b/运维/操作系统/Linux/笔记/27.Systemd.md @@ -1,85 +1,178 @@ -从CentOS7开始,使用systemd实现init进程,系统启动和服务器守护进程管理器,负责在系统启动或者运行时,激活系统资源,服务器进程和其他进程。 -## 1、Unit类型 -unit表示不同类型的systemd对象,通过配置文件进行标识和配置,文件中主要包含了系统服务、监听socket、保存的系统快照以及其他与init相关的进程 +## 1、Systemd 概览 + +从 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 -[root@centos ~]#systemctl -t help -Available unit types: -service #文件拓展名为.service,用于定义系统服务 -socket #定义进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动 -target #文件扩展名为.target,用于模拟实现运行级别 -snapshot #管理系统快照 -device #用于定义内核识别的设备 -mount #定义文件系统挂载点 -automount #文件系统的自动挂载点 -swap #用于表示swap设备 +systemctl -t help ``` + +## 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 -/usr/lib/systemd/system #每个服务最主要的启动脚本 -/lib/systemd/system #ubuntu的对应目录 - -/run/systemd/system #系统执行过程中所产生的服务脚本,比上面的目录优先运行 -/etc/systemd/system #管理员建立的执行脚本,比上面的目录优先运行 +systemctl list-units -t service ``` -## 2、unit文件格式 -/etc/systemd/system:系统管理员和用户使用 -/usr/lib/systemd/system:发行版打包者使用 + +### 5.2 查看所有 unit 文件状态 + ```shell -# /usr/lib/systemd/system/sshd.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所依赖,强依赖 - +systemctl list-unit-files -t service ``` -2、常用命令 + +### 5.3 管理服务 + ```shell -[root@centos ~]#systemctl list-units -t service -UNIT LOAD ACTIVE SUB DESCRIPTION -acpid.service loaded active running ACPI Event Daemon -atd.service loaded active running Job spooling tools -auditd.service loaded active running Security Auditing Service -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 重定向到别处 +systemctl start nginx +systemctl stop nginx +systemctl restart nginx +systemctl reload nginx +systemctl status nginx ``` + +### 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 结构和状态含义后,排查服务问题会更高效 diff --git a/运维/操作系统/Linux/笔记/28.系统引导顺序.md b/运维/操作系统/Linux/笔记/28.系统引导顺序.md index 80213ae..539ae18 100644 --- a/运维/操作系统/Linux/笔记/28.系统引导顺序.md +++ b/运维/操作系统/Linux/笔记/28.系统引导顺序.md @@ -1,17 +1,121 @@ -1. UEFI或BIOS初始化,运行POST开机自检 -2. 选择启动设备 -3. 引导装载程序 -4. 加载initramfs驱动模块 -5. 加载内核选项 -6. 内核初始化 -7. 执行initrd.target所有单元。包括挂载/etc/fstab -8. 从initramfs根文件系统切换到磁盘根目录 -9. systemd执行默认target配置,配置文件/etc/systemd/system/default.traget -10. systemd启动multi-user.target下的本机与服务器服务 -11. systemd执行multi-user.target下的/etc/rc.d/rc.local -12. systemd执行multi-user.target下的getty.target及登录服务 -13. systemd执行graphical需要的服务 +## 1、系统引导顺序概览 + +Linux 系统从开机到进入可登录状态,大致会经历一条固定链路。 + +理解这条链路后,排查“为什么机器起不来”“为什么服务没有自动启动”“为什么卡在某个阶段”会更有方向。 + +## 2、典型启动流程 + +### 2.1 固件初始化 + +- BIOS 或 UEFI 上电初始化 +- 执行 POST(开机自检) + +### 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 -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` 是分析启动耗时的高频工具 +- 明确系统卡在哪个阶段,是启动排障的第一步 diff --git a/运维/操作系统/Linux/笔记/29.防火墙.md b/运维/操作系统/Linux/笔记/29.防火墙.md index 7e2884c..fe4d8a1 100644 --- a/运维/操作系统/Linux/笔记/29.防火墙.md +++ b/运维/操作系统/Linux/笔记/29.防火墙.md @@ -1,17 +1,139 @@ -隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时有规则定义的行为进行处理的一组功能的组件。 -## 一、netfilter -Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在Linux内核中 -Netfilter在内核中选取五个位置放了五个hook(钩子)function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables、firewalld、nft)向其写入规则 -##### 1、报文流向 -![](https://cdn.nlark.com/yuque/0/2024/png/35086385/1704812963734-d016fdd5-8ddd-4003-8a8f-bb4db48b04de.png#averageHue=%23fefefe&clientId=ueda3bb65-2580-4&from=paste&id=uac75e3e7&originHeight=564&originWidth=1062&originalType=url&ratio=1.25&rotation=0&showTitle=false&status=done&style=none&taskId=u4f7a53be-369b-4c76-b603-be3b9703900&title=) -数据包沿着链传输,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项目组开发 +## 1、防火墙概览 +防火墙的核心作用是:对进出主机或网络边界的数据包按规则进行检查,并根据规则决定**允许、拒绝、丢弃、转发**等行为。 + +在 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` +- 排查防火墙问题时,先判断流量方向,再判断所用工具,再看规则是否命中 diff --git a/运维/操作系统/Linux/笔记/3.硬件管理.md b/运维/操作系统/Linux/笔记/3.硬件管理.md index 720f538..efd6727 100644 --- a/运维/操作系统/Linux/笔记/3.硬件管理.md +++ b/运维/操作系统/Linux/笔记/3.硬件管理.md @@ -1,175 +1,214 @@ -### 查看硬件信息 -##### 查看CPU -###### lscpu命令 +## 1、硬件管理概览 + +在 Linux 中查看硬件信息,常见关注点主要有三类: + +- CPU:核心数、线程数、架构、缓存、是否虚拟化 +- 内存:总量、可用量、缓存、Swap 使用情况 +- 磁盘:设备、分区、文件系统类型、挂载点 + +做系统巡检或排障时,通常也是按这个顺序查看。 + +## 2、查看 CPU 信息 + +### 2.1 使用 `lscpu` + +`lscpu` 是查看 CPU 信息最直观的命令,适合快速了解当前机器的处理器概况。 + ```shell -[root@tencentos ~]# lscpu -Architecture: x86_64 #CPU架构及位数 -CPU op-mode(s): 32-bit, 64-bit #CPU可以运行的操作系统位数 -Byte Order: Little Endian #数据存储方式 -CPU(s): 2 #系统有两个核心 -On-line CPU(s) list: 0,1 #可用的CPU列表 -Thread(s) per core: 1 #每个核心有1个线程 -Core(s) per socket: 2 #每个插槽(物理CPU)有2个核心 -Socket(s): 1 #有1个物理CPU -NUMA node(s): 1 #有1个NUMA节点 -Vendor ID: GenuineIntel #CPU的制造商是Intel -BIOS Vendor ID: Smdbmds -CPU family: 6 #CPU的家族编号是6 -Model: 85 #CPU的型号编号是85 -Model name: Intel(R) Xeon(R) Platinum 8255C CPU @ 2.50GHz #CPU的型号名称是Intel Xeon Platinum 8255C,主频为2.50GHz。 -BIOS Model name: 3.0 -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的不同级别的缓存大小 +[root@tencentos ~]# lscpu +Architecture: x86_64 +CPU op-mode(s): 32-bit, 64-bit +Byte Order: Little Endian +CPU(s): 2 +On-line CPU(s) list: 0,1 +Thread(s) per core: 1 +Core(s) per socket: 2 +Socket(s): 1 +NUMA node(s): 1 +Vendor ID: GenuineIntel +Model name: Intel(R) Xeon(R) Platinum 8255C CPU @ 2.50GHz +CPU MHz: 2494.140 +Hypervisor vendor: KVM +Virtualization type: full +L1d cache: 32K L1i cache: 32K L2 cache: 4096K 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 -[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 ~]# +[root@tencentos ~]# cat /proc/cpuinfo ``` -##### 查看内存 -###### 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 [root@tencentos ~]# free -h total used free shared buff/cache available Mem: 1.7Gi 323Mi 341Mi 35Mi 1.0Gi 1.2Gi Swap: 0B 0B 0B ``` -###### /proc/meminfo + +### 3.2 重点字段说明 + +- `total`:内存总量 +- `used`:已使用内存 +- `free`:完全空闲的内存 +- `shared`:共享内存 +- `buff/cache`:被缓冲区和页缓存占用的内存 +- `available`:当前可供应用程序使用的内存,通常比 `free` 更有参考价值 +- `Swap`:交换分区使用情况 + +### 3.3 使用 `/proc/meminfo` + +如果需要更完整的内存明细,可以查看: + ```shell -[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 +[root@tencentos ~]# cat /proc/meminfo ``` -##### 查看硬盘 -###### 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 [root@tencentos ~]# lsblk 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 / ``` -###### /proc/partitions -```shell -[root@tencentos ~]# cat /proc/partitions -major minor #blocks name - 253 0 52428800 vda - 253 1 52427759 vda1 +### 4.2 重点字段说明 + +- `NAME`:设备名称 +- `MAJ:MIN`:主设备号和次设备号 +- `RM`:是否可移动设备,`1` 表示是,`0` 表示否 +- `SIZE`:设备或分区大小 +- `RO`:是否只读 +- `TYPE`:设备类型,例如 `disk`、`part` +- `MOUNTPOINT`:挂载点 + +### 4.3 使用 `/proc/partitions` + +```shell +[root@tencentos ~]# cat /proc/partitions +major minor #blocks name +253 0 52428800 vda +253 1 52427759 vda1 ``` -###### blkid命令 + +这个文件更偏底层,适合查看系统识别到的块设备和分区情况。 + +### 4.4 使用 `blkid` + +`blkid` 可以查看设备的文件系统类型、UUID、分区 UUID 等信息。 + ```shell [root@tencentos ~]# blkid /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 中大部分基础硬件巡检场景。 diff --git a/运维/操作系统/Linux/笔记/30.Linux内核.md b/运维/操作系统/Linux/笔记/30.Linux内核.md index 22696d2..db6bc99 100644 --- a/运维/操作系统/Linux/笔记/30.Linux内核.md +++ b/运维/操作系统/Linux/笔记/30.Linux内核.md @@ -1,44 +1,143 @@ -## 1、Linux内核版本号 -源码状态:开源GPL协议 -内核版本,linux-5.4.119-19-0009 -主版本号(较大变化):5 -次版本号(较小变化):4 -末版本号(修订版本号,错误修复、漏洞修补等变化):119-19-0009 +## 1、Linux 内核概览 -## 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 -配置文件:/etc/sysctl.conf +/etc/sysctl.conf +``` -1、临时设置某参数 +常见用法: + +### 7.1 临时设置参数 + +```shell sysctl -w 参数=value +``` -2、读取配置文件设置参数 -sysctl -p 文件 +### 7.2 重新加载配置文件 -3、查看指定参数 +```shell +sysctl -p +``` + +### 7.3 查看指定参数 + +```shell sysctl 参数名 +``` -4、查看所有生效参数 +### 7.4 查看所有生效参数 + +```shell sysctl -a ``` -### 用户态 +## 8、常见运维建议 -- 简介:用户程序的运行空间 -- 作用:和内核运行空间隔离,即使用户的程序崩溃也不影响内核 -- 限制:只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(system call),才能向内核发出指令 +- 先理解“内核”和“发行版”不是同一个概念 +- 调整内核参数前,先明确业务目标 +- 临时调优先用 `sysctl -w` +- 永久调优再写入 `/etc/sysctl.conf` 或 `/etc/sysctl.d/` +- 不熟悉的内核参数不要直接在生产环境修改 -### 内核态 - -- 简介:内核的运行空间 -- 作用:调用系统资源 +## 9、小结 +- Linux 内核负责系统最底层的资源管理 +- 发行版是在内核之上封装出的完整操作系统环境 +- 用户态和内核态是 Linux 权限与执行模型的重要概念 +- `/proc` 和 `sysctl` 是观察和调整内核行为的常用入口 diff --git a/运维/操作系统/Linux/笔记/31.Linux内核参数列表.md b/运维/操作系统/Linux/笔记/31.Linux内核参数列表.md index 93451ca..3d380ae 100644 --- a/运维/操作系统/Linux/笔记/31.Linux内核参数列表.md +++ b/运维/操作系统/Linux/笔记/31.Linux内核参数列表.md @@ -1,104 +1,245 @@ -# Linux内核参数列表 +# Linux 内核参数列表 -``` -kernel.panic:在内核崩溃时自动重启系统之前等待的时间(以秒为单位)。默认值为0,表示禁用自动重启。 +## 1、说明 -kernel.core_uses_pid:控制内核是否在生成核心转储文件时包括进程ID。默认值为1,表示包括进程ID。 +这篇笔记用于记录常见 `sysctl` 内核参数,方便按类别快速查阅。它不是完整清单,而是**运维中相对高频**的一组参数索引。 -kernel.core_pattern:指定生成核心转储文件的文件名模式。默认值为“core”,可以设置为其他文件名模式。 +查看参数: -kernel.msgmax:设置系统中单个IPC消息的最大大小(以字节为单位)。默认值为8192,可以根据需要增加。 - -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 参数名 ``` +临时设置参数: + +```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.*` +- 实际调优时,要先明确目标:稳定性、吞吐量、延迟,还是安全性 diff --git a/运维/操作系统/Linux/笔记/32.Linux系统日志详解.md b/运维/操作系统/Linux/笔记/32.Linux系统日志详解.md index c249a49..ae75929 100644 --- a/运维/操作系统/Linux/笔记/32.Linux系统日志详解.md +++ b/运维/操作系统/Linux/笔记/32.Linux系统日志详解.md @@ -1,25 +1,192 @@ -# Linux系统日志详解 +# Linux 系统日志详解 -## 一、安装日志 +## 1、日志概览 -``` -/root/install.log #存储了安装在系统中的软件包及其版本信息 -/root/install.log.syslog #存储了安装过程中留下的事件记录 -/root/anaconda-ks.cfg #以Kickstart配置文件的格式记录安装过程中设置的 +Linux 系统日志主要用于记录: + +- 系统启动过程 +- 服务运行状态 +- 用户登录与认证行为 +- 定时任务执行情况 +- 内核与硬件信息 + +日志是排障时最重要的证据之一。 + +## 2、安装相关日志 + +常见安装阶段相关文件: + +```text +/root/install.log +/root/install.log.syslog +/root/anaconda-ks.cfg ``` -## 二、其他日志 +说明: -``` -/var/log/cron #记录了系统定时任务相关的日志。 -/var/log/cups/ #记录打印信息的日志 -/var/log/dmesg #记录了系统在开机时内核自检的信息。也可以使用dmesg命令直接查看内核自检信息。 -/var/log/btmp #记录错误登录的日志。这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看,命令如下: -/var/log/lastlog #记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件,不能直接vi,而要使用lastlog命令查看。 -/var/log/mailog #记录邮件信息。 -/var/log/message #记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件。 -/var/log/secure #记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录。比如说系统的登录,ssh 的登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中。 -/var/log/wtmp #永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看。 -/var/run/utmp #记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w, who,users 等命令来查询。 +- `/root/install.log`:安装期间的软件包和版本记录 +- `/root/install.log.syslog`:安装阶段事件日志 +- `/root/anaconda-ks.cfg`:安装过程生成的 Kickstart 配置参考 + +## 3、常见系统日志文件 + +### 3.1 定时任务 + +```text +/var/log/cron ``` +记录定时任务相关日志。 + +### 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` 都是偏登录审计相关的二进制日志 +- 遇到问题时,要先判断问题类型,再去对应日志位置查证据 diff --git a/运维/操作系统/Linux/笔记/33.监控指标.md b/运维/操作系统/Linux/笔记/33.监控指标.md index b6a307c..70760e5 100644 --- a/运维/操作系统/Linux/笔记/33.监控指标.md +++ b/运维/操作系统/Linux/笔记/33.监控指标.md @@ -1,185 +1,145 @@ +# Linux 监控指标 +## 1、监控指标概览 -# Linux监控指标 +做 Linux 监控时,不要只盯某一个指标,而是要结合 CPU、内存、磁盘、网络、进程等多个维度一起看。 -## 一、CPU类 +这篇先整理最常见的 CPU 指标,再补充观察思路。 -### 1、CPU idle +## 2、CPU 相关指标 -Linux CPU idle 是指 CPU 空闲的时间百分比,也就是 CPU 没有在执行任何任务的时间占总时间的比例。在 Linux 系统中,可以通过查看 /proc/stat 文件来获取 CPU idle 的信息。 +Linux 中 CPU 指标常可从 `/proc/stat` 获取,也可以通过 `top`、`sar`、`vmstat` 等工具观察。 -可以使用以下命令来查看 CPU idle 的信息: - -``` -cat /proc/stat | grep 'cpu' +```shell +cat /proc/stat | grep '^cpu ' ``` -该命令会输出类似以下的信息: +示例输出: -``` +```text 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 指标说明 -``` -echo "scale=2; $(cat /proc/stat | grep 'cpu ' | awk '{print $5}') / 2400000000 * 100" | bc +### 3.1 CPU idle + +表示 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` -``` -98.23 +```shell +vmstat 1 ``` -### 2、CPU busy user +### 5.3 `sar` -Linux CPU busy user 是指 CPU 在执行用户进程的时间百分比,也就是 CPU 在执行用户进程的时间占总时间的比例。在 Linux 系统中,可以通过查看 /proc/stat 文件来获取 CPU busy user 的信息。 - -具体来说,可以使用以下命令来查看 CPU busy user 的信息: - -``` -cat /proc/stat | grep 'cpu ' +```shell +sar -u 1 5 ``` -该命令会输出类似以下的信息: +### 5.4 `mpstat` -``` -cpu 123456 7890 123456 7890123 4567 0 0 0 0 0 +```shell +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` 也高 -``` -echo "scale=2; $(cat /proc/stat | grep 'cpu ' | awk '{print $2}') / 2400000000 * 100" | bc -``` +说明可能只是瞬时波动,或者不是 CPU 真正瓶颈。 -该命令会输出 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、小结 -``` -cpu 123456 7890 123456 7890123 4567 0 0 0 0 0 -``` - -其中,第 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 -``` \ No newline at end of file +- `/proc/stat` 中的 CPU 字段是累计值,不是直接百分比 +- 高价值指标通常包括 `idle`、`user`、`system`、`iowait`、`irq`、`softirq` +- 看监控要结合趋势、场景和其他系统指标一起分析 diff --git a/运维/操作系统/Linux/笔记/34.bash快捷键.md b/运维/操作系统/Linux/笔记/34.bash快捷键.md index 52d4d15..568cfdc 100644 --- a/运维/操作系统/Linux/笔记/34.bash快捷键.md +++ b/运维/操作系统/Linux/笔记/34.bash快捷键.md @@ -1,10 +1,43 @@ -清屏:Ctrl + l -阻止屏幕输出:Ctrl + s -允许屏幕输出:Ctrl + q -将光标移动到行首:Ctrl + a -将光标移至行尾:Ctrl + e -将光标左移动一个单词尾:Ctrl + > -将光标右移动一个单词首:Ctrl + < -从光标处删除至命令行首:Ctrl + u -将光标删除至命令行尾:Ctrl + k -删除左边单词:Alt + Backspace +## 1、Bash 快捷键概览 + +熟悉 Bash 快捷键可以显著提升终端操作效率,尤其是在频繁输入、修改长命令、排障时非常有用。 + +## 2、常用快捷键 + +### 2.1 屏幕控制 + +- `Ctrl + l`:清屏 +- `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` 也是终端操作必会快捷键 diff --git a/运维/操作系统/Linux/笔记/35.sudo配置.md b/运维/操作系统/Linux/笔记/35.sudo配置.md index 27a6e86..c7c810a 100644 --- a/运维/操作系统/Linux/笔记/35.sudo配置.md +++ b/运维/操作系统/Linux/笔记/35.sudo配置.md @@ -1,10 +1,102 @@ -sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。 +## 1、`sudo` 概览 + +`sudo` 是 Linux 中常见的权限委派机制,允许管理员授权普通用户以更高权限执行指定命令,而不必直接告诉对方 `root` 密码。 + +它的核心价值在于: + +- 最小权限授权 +- 便于审计操作记录 +- 避免多人共用 root 密码 + +## 2、基本概念 + +`sudo` 配置的核心通常写在: + ```shell -root ALL=(ALL:ALL) ALL -你的用户名 -你的连接地址 -允许用户组youuser里面的用户执行sudo命令(需要输入密码) -允许用户youuser执行sudo命令,并且在执行的时候输入密码 -允许用户组youuser里面的用户执行sudo命令,并且在执行的时候不输入密码 +/etc/sudoers ``` -瞎写的,感觉没啥用,别看了 + +也可以拆分到: + +```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` 修改配置 +- 最佳实践是最小权限、分组授权、谨慎免密 diff --git a/运维/操作系统/Linux/笔记/4.终端管理.md b/运维/操作系统/Linux/笔记/4.终端管理.md index 7801166..91ce7ba 100644 --- a/运维/操作系统/Linux/笔记/4.终端管理.md +++ b/运维/操作系统/Linux/笔记/4.终端管理.md @@ -1,45 +1,132 @@ -### 1、终端类型 -- 控制台终端:/dev/console #服务器console口,或者公有云VNC连接服务器时所用 -- 串行终端:/dev/ttyS# #服务器串口链接 -- 虚拟终端:/dev/tty# 通过Ctrl+Alt+F#切换 #Linux图形环境中的终端 -- 伪终端:/dev/pts/# #ssh连接用的 -- 图形终端:startx,xwindows +## 1、终端管理概览 + +在 Linux 中,终端管理主要围绕这几个概念展开: + +- 终端类型:当前是本地控制台、串口还是 SSH 登录 +- 图形界面与命令行界面: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 [root@tencentos ~]# tty /dev/pts/0 ``` -### 2、GUI(GraphicalUserInterface 图形用户界面) -##### GNOME -- 简介:GNOME是一款功能强大的桌面环境,它提供了丰富的应用程序和工具,支持多任务操作和自定义设置 -- 特点:对较重,需要较高的硬件配置才能运行流畅 -- github:[https://github.com/GNOME/gnome-shell](https://github.com/GNOME/gnome-shell) -##### Xfce +- `tty` 用于查看当前会话对应的终端设备 +- 如果输出是 `/dev/pts/0`,通常表示当前是远程登录或图形终端模拟器 -- 简介:Xfce是一款轻量级的桌面环境,它提供了基本的应用程序和工具,支持多任务操作和自定义设置。 -- 特点:运行速度快,占用资源少,适合老旧计算机使用。 -##### LXDE +## 3、GUI 与 CLI -- 简介:LXDE是一款极轻量级的桌面环境,它提供了基本的应用程序和工具,支持多任务操作和自定义设置。 -- 特点:运行速度非常快,占用资源极少,适合老旧计算机使用。 -##### KDE Plasma +### 3.1 GUI -- 简介:KDE Plasma是一款美观、灵活的桌面环境,它提供了丰富的应用程序和工具,支持多任务操作和自定义设置。 -- 特点:相对较重,需要较高的硬件配置才能运行流畅。 -##### MATE +GUI 全称是 Graphical User Interface,即图形用户界面。 +它适合桌面办公、图形化配置和交互式操作。 -- 简介:MATE是一款传统的桌面环境,它提供了丰富的应用程序和工具,支持多任务操作和自定义设置。 -- 特点:运行速度较快,占用资源较少,适合中低端计算机使用 -### 3、CLI(Command-lineinterface 命令行界面) -##### shell分类:(通过# echo ${shell} 查看当前shell) +常见 Linux 桌面环境有: -- sh(起源) -- bash(主流) +#### GNOME + +- **简介**:功能完整,生态成熟,常见于主流 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 -[root@tencentos ~]# echo ${shell} -bash [root@tencentos ~]# cat /etc/shells /bin/sh /bin/bash @@ -57,59 +144,159 @@ bash /usr/bin/tcsh /bin/dash ``` -##### 命令分类:(查看方式:# type COMMAND) -- 内部命令:shell自带的,用户登录后自动加载并常驻内存中 - - 查看内部命令列表(# help) -- 外部命令:在PATH路径下,执行命令时需要从磁盘加载到内存,执行完成后删除 - - 查看外部命令路径(# which -a )(# whereis) -- 内部命令使用 `help cd`这种形式获取帮助,外部命令通过`man`来获取帮助 +### 4.4 命令分类 -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 [lzc@tencentos ~]$ echo $PS1 [\u@\h \W]\$ ``` -- \e 控制符\033 -- \u 当前用户 -- \h 主机名简称 -- \H 主机名 -- \w 当前工作目录 -- \W 当前工作目录基名 -- \t 24小时时间格式 -- \T 12小时时间格式 -```shell -PS1=‘\[\e[1;41;33m\][\u@\h \W]\$\[\e[0m\]’ -``` -##### 命令别名 -命令行中仅临时有效,要想永久有效,要定义在配置文件中 +常见占位符说明: + +- `\u`:当前用户名 +- `\h`:短主机名 +- `\H`:完整主机名 +- `\w`:当前工作目录完整路径 +- `\W`:当前工作目录基名 +- `\t`:24 小时制时间 +- `\T`:12 小时制时间 +- `\e`:转义字符,常用于颜色控制 + +### 5.1 自定义提示符示例 -- 仅对当前用户:~/.bashrc -- 针对所有用户生效:/etc/bashrc ```shell -alias NAME=‘VALUE’ +PS1='\[\e[1;41;33m\][\u@\h \W]\$\[\e[0m\]' ``` + +这条配置会让提示符带颜色显示。` +\[ ... \]` 用于告诉 shell 这里是非打印字符,避免光标错位。 + +如果想永久生效,通常把它写到: + +- 当前用户:`~/.bashrc` +- 所有用户:`/etc/bashrc` + +## 6、命令别名 `alias` + +别名适合给常用长命令起一个短名字,提高输入效率。 + +### 6.1 临时设置 + ```shell -unalias -a #取消所有别名 -unalias NAME #取消别名 +alias NAME='VALUE' ``` -##### 登录提示文件 + +例如: + +```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 +``` + +这个文件常用于显示运维通知、登录提醒、版权信息等。 + +## 8、设置主机名 + +### 8.1 临时设置 -##### 设置主机名 ```shell hostname NAME ``` + +这种方式通常只对当前运行环境立即生效,重启后是否保留取决于系统配置。 + +### 8.2 推荐方式 + ```shell 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 基础,理解后对日常登录、操作和环境配置都很有帮助。 diff --git a/运维/操作系统/Linux/笔记/5.时间管理.md b/运维/操作系统/Linux/笔记/5.时间管理.md index 0d38fba..e510852 100644 --- a/运维/操作系统/Linux/笔记/5.时间管理.md +++ b/运维/操作系统/Linux/笔记/5.时间管理.md @@ -1,38 +1,310 @@ -### 日期和时间 -Linux的时钟分为两种 +## 1、时间管理概览 + +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 -参数: --r #显示文件上次修改的时间 --d #时间转换 --s #设置时间 +date +``` +### 3.2 自定义格式输出 +```shell date +"%F %T" -format:输出的时间格式。 -%F 完整的日期;等价于%+4Y-%m-%d -%Y 年 -%m 月 -%d 日 -%T 时间;等价于%H:%M:%S -%H 小时 -%M 分钟 -%S 秒 ``` + +输出示例: + ```shell -[root@tencentos ~]# clock -2023-11-26 00:12:24.485439+08:00 +2026-04-08 14:18:00 ``` + +常见格式符: + +- `%F`:完整日期,等价于 `%Y-%m-%d` +- `%Y`:四位年份 +- `%m`:月份 +- `%d`:日期 +- `%T`:完整时间,等价于 `%H:%M:%S` +- `%H`:小时 +- `%M`:分钟 +- `%S`:秒 + +### 3.3 常用参数 + +- `-r`:显示指定文件的时间戳 +- `-d`:进行时间计算或时间转换 +- `-s`:设置系统时间 + +### 3.4 常见示例 + +#### 查看文件修改时间 + ```shell -Commands: - 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 +date -r /etc/passwd ``` + +#### 时间转换 + +```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 中绝大多数基础时间问题都能快速定位。 diff --git a/运维/操作系统/Linux/笔记/6.用户管理.md b/运维/操作系统/Linux/笔记/6.用户管理.md index 3b31208..3eee5b7 100644 --- a/运维/操作系统/Linux/笔记/6.用户管理.md +++ b/运维/操作系统/Linux/笔记/6.用户管理.md @@ -1,137 +1,318 @@ -### 1、用户登录信息查看 +## 1、用户管理概览 + +Linux 是多用户操作系统,因此用户和用户组管理是日常运维的基础能力。通常会涉及以下内容: + +- 查看当前登录用户和会话信息 +- 理解 UID、GID 的含义 +- 管理用户和用户组 +- 管理密码、锁定状态、过期时间 +- 切换身份执行命令 + +这些内容和权限控制、文件归属、服务运行身份都有直接关系。 + +## 2、查看当前登录信息 + +### 2.1 `whoami` + ```shell [root@tencentos ~]# whoami root ``` + +- `whoami` 用于查看**当前有效用户名** +- 常用于快速确认自己正以哪个用户身份执行命令 + +### 2.2 `who` + ```shell [root@tencentos ~]# who root pts/0 2023-11-25 19:37 (111.201.149.21) ``` + +- `who` 用于查看当前有哪些用户登录了系统 +- 能看到登录终端、登录时间、来源地址等信息 + +### 2.3 `w` + ```shell [root@tencentos ~]# w 00:25:21 up 17:30, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT 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是管理员) -- 普通用户:1-60000 UID自动分配 - - 系统用户:1-999 UID,对守护进程获取资源进行权限分配 - - 登录用户:1000+,给用户进行交互式登录使用 +- `w` 会显示当前登录用户及其正在执行的命令 +- 排查“谁在登录系统、谁在跑什么”时很常用 -** id命令查看用户的UID,GID等信息** -## 3、用户组 -Linux中可以将一个或者多个用户加入用户组中,用户组是通过Group ID(GID)来唯一标识的,GID 同UID相同 +## 3、用户与用户组基础概念 -## 4、用户及用户组配置文件 -/etc/passwd:用户机器属性信息(名称、UID、主组ID等) -/etc/shadow:用户密码及其相关属性 -/etc/group:组及其属性信息 -/etc/gshadow:组密码机器相关属性 -##### 4.1 passwd文件格式 +### 3.1 用户 `User` -- login name:用户名(root) -- passwd:密码(X) +Linux 中每个用户都由 **UID(User ID)** 唯一标识。 + +常见范围大致如下: + +- `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 - GID -- GECOS:注释 -- home directory:用户家目录 -- shell:用户默认使用的shell -##### 4.2 shadow文件格式 +- 注释信息(GECOS) +- 家目录 +- 默认 shell + +### 4.2 `/etc/shadow` + +这个文件主要记录密码及密码过期策略,例如: - 登录名 -- 用户密码 -- 从1970年1月1日起到密码最近一次被修改的时间 -- 密码再过几天可以变更(0表示随时可变) -- 密码再过几天必须变更(99999表示永不过期) -- 密码过期前几天系统提醒用户(默认为一周) -- 密码过期几天后账号会被锁定 -##### 4.3 group文件格式 +- 加密后的密码 +- 上次修改密码时间 +- 最短修改间隔 +- 最长有效期 +- 到期前提醒天数 +- 密码过期后锁定天数 -- 群组名称 -- 群组密码 +### 4.3 `/etc/group` + +这个文件主要记录: + +- 组名 +- 组密码占位符 - GID -- 以当前组为附加组的用户列表,多个用户间用逗号分隔 +- 附加组成员列表 + ## 5、用户管理命令 -- useradd -- usermod -- userdel -##### 5.1 用户创建 -**useradd格式:** -`useradd [options] LOGIN` -**常见选项:** +### 5.1 创建用户 `useradd` -- -u:UID -- -g:GID -- -c:注释 -- -d:家目录 -- -s:shell,可用列表在/etc/shells,特殊shell /sbin/nologin -- -G:附加组 -- -r:创建系统用户 -- -M:不创建家目录 -##### 5.2 用户属性修改 -**usermod格式:** -`usermod [option] login` -**常见选项:** +```shell +useradd [options] LOGIN +``` -- -u:新UID -- -g:新GID -- -G:新附加组 -- -s:新shell -- -c:新注释 -- -d:新家目录 -- -l:新名字 -- -L:锁定用户 -- -U:解锁用户 -- -e:YYYY-MM-DD,指定用户账号过期日期 -- -f:设置宽限期 -##### 5.3 删除用户 -**userdel格式:** -`和上面一样,不多bb` -**常见选项:** +常见选项: + +- `-u`:指定 UID +- `-g`:指定主组 GID 或组名 +- `-c`:添加注释 +- `-d`:指定家目录 +- `-s`:指定默认 shell +- `-G`:指定附加组 +- `-r`:创建系统用户 +- `-M`:不创建家目录 + +示例: + +```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 su - root -c 'cat /etc/passwd' ``` -##### 5.5 设置用户密码 -passwd格式和其他一样 -**常用选项:** -- -d:删除指定用户密码 -- -l:锁定用户 -- -u:解锁 -- -e:强制用户下次登录的时候修改密码 -- -f:强制操作 -## 6、用户组管理命令 -##### 6.1 创建用户组 -**groupadd常用选项:** +这个用法表示切换到 `root` 后执行指定命令。 -- -g GID:指定GID -##### 6.2 修改用户组 -groupmod常用选项: +## 7、设置用户密码 `passwd` -- -n:新名字 -- -g GID:新GID -##### 6.3 删除组 -**groupdel常见选项:** +`passwd` 用于设置或管理用户密码。 -- -f:强制删除 -##### 6.4 管理附加组 -groupmems常见选项 +常见选项: -- -a:指定用户加入组 -- -d:从组中删除用户 -- -p:从组中清除所有成员 -- -l:显示组成员列表 +- `-d`:删除指定用户密码 +- `-l`:锁定密码 +- `-u`:解锁密码 +- `-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 和附加组 diff --git a/运维/操作系统/Linux/笔记/7.语言管理.md b/运维/操作系统/Linux/笔记/7.语言管理.md index 8c16038..faf131d 100644 --- a/运维/操作系统/Linux/笔记/7.语言管理.md +++ b/运维/操作系统/Linux/笔记/7.语言管理.md @@ -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 Commands: status Show current locale settings @@ -6,7 +85,117 @@ Commands: list-locales Show known locales 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 ``` +### 7.2 程序日志时间格式不一致 + +重点检查: + +- `LC_TIME` +- 时区配置 +- 应用程序自身语言设置 + +### 7.3 命令输出语言和预期不一致 + +重点检查: + +- `LANG` +- `LC_MESSAGES` +- 是否设置了 `LC_ALL` + +## 8、小结 + +- Linux 语言管理本质上是 Locale 管理 +- `echo $LANG` 可以快速查看当前默认语言环境 +- `locale` 比单看 `LANG` 更完整 +- `localectl` 是 systemd 系统中常用的语言环境管理工具 +- 乱码、日期格式异常、提示信息语言不对,很多时候都和 Locale 有关 diff --git a/运维/操作系统/Linux/笔记/8.文件管理.md b/运维/操作系统/Linux/笔记/8.文件管理.md index 9a6ded3..04ae8ec 100644 --- a/运维/操作系统/Linux/笔记/8.文件管理.md +++ b/运维/操作系统/Linux/笔记/8.文件管理.md @@ -1,201 +1,339 @@ -**每打开一个文件都会消耗一个fd(文件描述符)** -## 1、Linux目录 -简介:Linux目录结构是一个单根倒置的树结构,文件系统从根目录开始,用"/"表示,文件名最长255字节,包括路径在内文件名称最长4095字节。 -##### 1.1 绝对路径和相对路径 -绝对路径:你家通过卫星定位是xx东经xx北纬,体现在linux上就是开头是根目录 -相对路径:你家在小明家旁边,对应linux 就是当前目录的哪里 +## 1、文件管理概览 -##### 1.2 文件目录大全 +Linux 文件管理主要围绕以下几个方面展开: -- /:根目录 -- /boot:引导文件、内核文件(vmlinuz)、引导加载grup都存放此目录中 -- /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相关的安全策略等信息的存储位置 +- 目录结构与路径 +- 文件类型与 inode +- 常见目录和文件操作命令 +- 文件状态与时间戳 +- 通配符与链接文件 -## 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 +``` + +示例: + ```shell root@lzc:~# pwd /root - -pwd是使用PWD环境变量获取当前目录路径 ``` -##### 2.2 切换到其他目录 -cd +- `pwd` 用于显示当前工作目录 +- 常和环境变量 `PWD` 对应 -- -:上一次所在的目录,cd使用OLDPWD变量获取上一次目录路径 -- ..:父目录 -- .:当前目录 -- -P:跳转到链接至的目录 -- -S:从大到小排序 +### 3.2 `cd` -##### 2.3 列出目录内容 -ls +用于切换目录。 -- -a:包含隐藏文件 -- -l:显示大小,权限等信息 -- -R:目录递归 -- -X:按文件后缀排序 +常见用法: -##### 2.4 显示目录树 -tree +- `cd -`:回到上一次所在目录 +- `cd ..`:进入父目录 +- `cd .`:当前目录 +- `cd ~`:当前用户家目录 +- `cd -P`:按物理路径切换,避免符号链接影响 -- -d:只显示目录 -- -L:指定显示的层级数目 +### 3.3 `ls` -##### 2.5 创建目录 -mkdir +用于列出目录内容。 -- -p:递归创建 -- -m:创建时直接指定权限 +常见选项: -##### 2.6 删除目录 -rmdir +- `-a`:显示隐藏文件 +- `-l`:显示详细信息 +- `-R`:递归显示 +- `-X`:按扩展名排序 +- `-S`:按文件大小排序 +- `-h`:配合 `-l` 以易读单位显示大小 -- -p:递归删除 +### 3.4 `tree` +用于以树状结构显示目录。 -## 3、Linux文件 -##### 3.1 文件类型 +常见选项: -- -:普通文件 -- d:目录文件 -- l:符号链接文件 -- b:块设备 -- c:字符设备 -- p:管道文件 -- s:套接字文件 +- `-d`:只显示目录 +- `-L`:限制显示层级 -##### 3.2 文件数据 -metadata:源数据,属性信息,比如文件的大小,相关时间,类型,此类数据是存放在inode表中 -inode(index node)保存的信息如下: +### 3.5 `mkdir` -- 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 - GID - 链接数 -- 指向磁盘上文件的数据块指针 +- 文件大小 +- 时间戳 +- 指向数据块的指针 -**相关命令和inode的关系:** -当执行cp时,底层发生以下变化,分配一个空闲的inode号,在inode表中生成新条目,在目标目录中创建一个目录项,将新文件名称与inode编号关联,拷贝数据生成新的文件 +目录本质上也是特殊文件,它记录了“文件名”和“inode 编号”的对应关系。 -当执行rm 时,底层发生以下变化 -释放对应文件占用的inode号,把数据块放到空闲列表中,删除目录项 +### 4.3 `cp` 和 `rm` 与 inode 的关系 -目录是一个特殊的文件,目录文件保存了此目录中的文件列表以及inode number对应关系,一个目录是目录下文件名和文件inode号之间的映射 +#### 执行 `cp` -##### 3.3 文件颜色 +通常会发生: -- 蓝色:目录 -- 绿色:可执行文件 -- 红色:压缩文件 -- 浅蓝色:链接文件 -- 灰色:其他文件 +- 分配新的 inode +- 创建新的目录项 +- 复制数据块内容 + +因此复制后的文件通常拥有**不同 inode**。 + +#### 执行 `rm` + +通常会发生: + +- 删除目录项 +- 减少链接计数 +- 当链接数归零时释放 inode 和数据块 + +## 5、文件状态与时间戳 + +### 5.1 `stat` -##### 3.4 文件状态 -stat命令 ```shell -root@lzc:~# stat 1.txt +stat 1.txt +``` + +示例: + +```shell +root@lzc:~# stat 1.txt File: 1.txt Size: 210 Blocks: 8 IO Block: 4096 regular file Device: fc02h/64514d Inode: 556125 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) -Access: 2023-12-05 23:55:07.813678618 +0800 #访问时间,atime,读取文件内容时会更新 -Modify: 2023-12-05 23:55:07.005686767 +0800 #修改时间,mtine,改变文件内容时会更新 -Change: 2023-12-05 23:55:07.005686767 +0800 #改变时间,ctime,元数据发生改变时更新,例如权限、所有者、大小等改变才会更新,仅更新文件内容,此值不会更新 +Access: 2023-12-05 23:55:07.813678618 +0800 +Modify: 2023-12-05 23:55:07.005686767 +0800 +Change: 2023-12-05 23:55:07.005686767 +0800 Birth: 2023-12-04 23:44:39.861025975 +0800 ``` -##### 3.5 文件通配符 +### 5.2 三个常见时间 -- *:匹配0个或多个字符,但不匹配.开头的文件 ,即不匹配隐藏文件 -- ?:匹配任何单个字符,一个汉字也算一个字符 -- ~:当前用户家目录 -- [0-9]:匹配单个数字范围 -- [a-z]:匹配一个小写字母 -- [A-Z]:匹配一个大写字母 -- [zhengchi]:匹配列表中任何一个字符 -- [^zhengchi]:匹配列表中所有字符以外的字符 -- ~-:前一个工作目录 -- [:digit:]:任意数字 -- [:lower:]:任意小写字母 -- [:upper:]:任意大写字母 +- `atime`:访问时间,读取文件内容时更新 +- `mtime`:修改时间,文件内容变化时更新 +- `ctime`:变更时间,元数据变化时更新,例如权限、属主、链接数变化 -##### 3.6 创建文件 -touch --a:仅改变atime和ctime --m:仅改变mtime和ctime +## 6、文件名通配符 -##### 3.7 复制文件和目录 -cp +通配符常用于批量匹配文件名: -- -i:如果目标已经存在,覆盖前提示是否覆盖 -- -n:不覆盖 -- -r,R:递归复制目录及内部所有内容 -- -a:递归复制,且复制权限 -- cp -b:目标存在的话,覆盖前先备份,源文件名结尾会被加上~只保留最近一个备份 +- `*`:匹配 0 个或多个字符,不包含隐藏文件开头的 `.` +- `?`:匹配任意单个字符 +- `~`:当前用户家目录 +- `~-`:上一个工作目录 +- `[0-9]`:匹配一个数字 +- `[a-z]`:匹配一个小写字母 +- `[A-Z]`:匹配一个大写字母 +- `[abc]`:匹配列表中的任一字符 +- `[^abc]`:匹配不在列表中的任一字符 +- `[:digit:]`:数字字符类 +- `[:lower:]`:小写字母字符类 +- `[:upper:]`:大写字母字符类 -##### 3.8 移动和重命名文件 -mv --b:目标存在,覆盖前先备份,备份文件以~结尾 +## 7、常见文件操作命令 -rename -rename '原名字' '目标名字' 文件 +### 7.1 `touch` +用于创建空文件或更新时间戳。 -##### 3.9 删除文件 -rm +- `-a`:仅修改访问时间 +- `-m`:仅修改修改时间 -- -i:交互式 -- -f:强制删除 -- -r:递归 +### 7.2 `cp` -##### 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` 可用于查看文件详细状态和时间戳 +- 硬链接和软链接的差异是高频面试和实战知识点 diff --git a/运维/操作系统/Linux/笔记/9.文件查找.md b/运维/操作系统/Linux/笔记/9.文件查找.md index 6762901..2889f46 100644 --- a/运维/操作系统/Linux/笔记/9.文件查找.md +++ b/运维/操作系统/Linux/笔记/9.文件查找.md @@ -1,35 +1,228 @@ -## find -- -maxdepth:最大搜索目录深度 -- -mindepth:最小搜索目录深度 -- -name “文件名称”:根据名称查找 -- -iname “”:根据文件名和inode查找 -- inum: 按inode号查找 -- -user:按属主查找 -- -group:按数组查找 -- -uid:按uid查找 -- -gid:按gid查找 -- -type:按文件类型查找 - - d:目录文件 - - l:符号链接文件 - - s:套接字文件 - - b:块设备文件 - - c:字符设备文件 - - p:管道文件 -- -a:与 -- -o:或 -- -not:非 -- -size:根据文件大小查找 - - k - - M - - G +## 1、文件查找概览 + +Linux 中查找文件时,最常用的命令之一就是 `find`。它功能非常强,既可以按名称找文件,也可以按类型、属主、权限、时间、大小等多种条件组合查找。 + +在日常运维中,`find` 主要用于: + +- 定位某个文件或目录 +- 查找大文件、旧文件、异常权限文件 +- 结合删除、统计、打包等命令做批量处理 + +## 2、`find` 基本格式 --amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算; --anewer:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录; --atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算; --cmin<分钟>:查找在指定时间之时被更改过的文件或目录; --cnewer:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录; --ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算; -##### 范例1:查找2天内创建的文件 ```shell -find /var -type f -newermt "2 days ago" +find [路径] [条件] [动作] ``` + +例如: + +```shell +find /var/log -name "*.log" +``` + +表示在 `/var/log` 下查找所有 `.log` 文件。 + +## 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 天内创建或修改的文件,也可以用: + +```shell +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` 能帮助控制搜索范围 +- 实战中最常见的场景是找日志、大文件、旧文件、异常文件