当前位置: 首页 > news >正文

Linux操作系统之运维常用命令

目录

一、系统监控与性能分析

vmstat命令

一、命令语法及核心参数

二、输出字段解析(关键列)

三、工作场景案例

1. 排查 CPU 瓶颈

2. 内存不足导致 Swap 频繁

3. 磁盘 I/O 性能问题

4. 系统卡顿实时监控

5. 高级用法:统计内存事件

四、总结

iostat命令

一、命令语法及核心参数

二、输出字段解析(关键指标)

1. CPU 统计(-c)

2. 磁盘统计(-x -d)

三、工作场景案例

1. 定位磁盘高负载问题

2. 排查 CPU 异常占用

3. LVM 逻辑卷性能分析

4. 云盘性能验证

5. 高并发写入瓶颈分析

四、高级技巧

五、总结

iftop命令

一、安装与基础用法

1. 安装方法

2. 基础命令

二、核心参数详解

三、交互界面操作

四、输出字段解析

五、工作场景案例

1. 定位服务器带宽跑满

2. 排查异常外联流量

3. 分析数据库主从同步延迟

4. 检测DDoS攻击

5. 多网卡流量分布不均

六、高级技巧

1. 文本模式记录流量

2. 组合过滤语法

3. 流量排序

七、总结

top/htop命令

一、top 命令详解

1. 基础语法与核心参数

2. 交互界面操作

3. 关键指标解析

二、htop 命令进阶

1. 安装与基础用法

2. 核心功能对比 top

3. 高级操作技巧

三、工作场景案例

1. CPU 使用率突增(使用 top)

2. 内存泄漏分析(使用 htop)

3. 僵尸进程清理(使用 top)

4. 磁盘 I/O 瓶颈定位(使用 htop)

5. 容器化环境资源监控(使用 htop)

四、总结与最佳实践

ps命令

一、命令语法与核心参数

1. 参数风格区分

2. 关键参数

二、输出字段解析(重点字段)

三、工作场景案例

1. 检测内存泄漏进程

2. 清理僵尸进程

3. 追踪异常网络连接

4. 分析容器内进程

5. 统计用户进程资源

四、高级用法

1. 自定义输出格式

2. 结合时间筛选进程

3. 进程状态批量操作

五、总结与最佳实践

pidstat命令

一、命令概述

二、安装与基本语法

三、核心选项及参数解析

四、工作案例场景

案例 1:CPU 使用率过高排查

案例 2:内存泄漏分析

案例 3:磁盘 I/O 瓶颈定位

案例 4:上下文切换频繁分析

案例 5:综合监控与自动化

五、高级技巧

六、注意事项

free命令

一、命令概述

二、基本语法

三、核心选项及参数解析

四、输出字段详解

五、工作案例场景

案例 1:快速检查系统内存压力

案例 2:持续监控内存使用变化

案例 3:诊断缓存(Cache)占用过高

案例 4:计算应用程序真实内存占用

案例 5:优化 Swap 使用策略

案例 6:自动化内存监控脚本

六、高级技巧

七、注意事项

smem命令

一、命令概述

二、安装方法

三、核心指标解析

四、基本语法及常用选项

五、工作案例场景

案例 1:快速定位内存占用最高的进程

案例 2:按用户统计内存消耗

案例 3:分析容器/多进程应用的真实内存占用

案例 4:生成内存使用报告(适合自动化监控)

案例 5:分析共享内存的分布

六、高级技巧

七、注意事项

pmap命令

一、命令概述

二、安装方法

三、核心字段解析

四、基本语法及常用选项

五、工作案例场景

案例 1:快速定位进程内存占用详情

案例 2:检查共享内存使用

案例 3:分析动态库内存占用

案例 4:排查内存泄漏(周期性监控)

案例 5:调试硬件设备内存映射

六、高级技巧

七、注意事项

sar命令

一、命令概述

二、安装方法

三、核心指标解析

四、基本语法及常用选项

五、工作案例场景

案例 1:实时监控 CPU 使用率

案例 2:分析历史内存使用

案例 3:诊断磁盘 I/O 瓶颈

案例 4:监控网络流量峰值

案例 5:生成综合性能报告

六、高级技巧

七、注意事项

八、字段与选项速查表

ss/netstat命令

一、命令概述

二、核心功能对比

三、ss 命令详解

1. 基本语法

2. 常用选项

3. 过滤语法

四、netstat 命令详解

1. 基本语法

2. 常用选项

五、工作案例场景

案例 1:快速检查服务端口是否监听

案例 2:分析 ESTABLISHED 连接数异常

案例 3:定位 TIME_WAIT 状态过多问题

案例 4:排查进程占用端口

案例 5:监控网络吞吐量(结合 netstat)

案例 6:分析 TCP 重传率(网络质量)

案例 7:自动化监控脚本

六、高级技巧

七、注意事项

curl/wget命令

一、核心区别与适用场景

二、curl 命令详解

1. 安装与基本语法

2. 常用选项

3. 工作案例

案例 1:快速检查服务健康状态

案例 2:调试 API 接口

案例 3:下载文件并重命名

案例 4:模拟浏览器访问

三、wget 命令详解

1. 安装与基本语法

2. 常用选项

3. 工作案例

案例 1:批量下载日志文件

案例 2:镜像静态网站

案例 3:后台下载大文件

案例 4:通过代理下载

四、安全与调试技巧

五、高级运维场景

场景 1:自动化部署脚本

场景 2:监控 API 响应时间

场景 3:分布式文件同步

六、总结对比

nc(ncat)命令

一、命令概述

二、安装方法

三、核心选项与语法

四、工作案例场景

案例 1:测试端口连通性

案例 2:临时文件传输

案例 3:远程调试与交互式Shell

案例 4:简易代理或端口转发

案例 5:UDP 服务测试

案例 6:多端口批量扫描

案例 7:网络服务存活监控

五、高级技巧

1. 结合 tar 实时压缩传输

2. 加密通信(使用 openssl 增强安全性)

3. 模拟 HTTP 请求

六、注意事项

eth-tool命令

一、命令概述

二、核心选项与参数

三、工作案例场景

案例 1:检查网卡基本状态

案例 2:修改网卡速率和双工模式

案例 3:诊断丢包或高延迟问题

案例 4:排查 Offload 功能导致的性能问题

案例 5:定位物理网卡设备

四、高级技巧

1. 自动化网卡健康检查(脚本)

2. 持久化配置(避免重启失效)

五、注意事项

六、总结

tcpdump命令

一、命令概述

二、安装与基本语法

三、核心选项与参数

四、过滤表达式语法

五、工作案例场景

案例 1:抓取 HTTP 请求内容

案例 2:检测 ICMP 不可达错误

案例 3:分析 DNS 查询请求

案例 4:捕获 TCP 三次握手与挥手

案例 5:抓取异常流量(如端口扫描)

案例 6:保存抓包数据并离线分析

六、高级技巧

七、注意事项

tshark(wireshark命令行)

一、命令概述

二、安装与基本语法

三、核心选项与参数

四、过滤语法

五、工作案例场景

案例 1:实时抓取并分析 HTTP 请求

案例 2:离线分析 TCP 重传问题

案例 3:提取 DNS 查询记录

案例 4:生成流量会话统计

案例 5:提取 HTTP 请求的 User-Agent

案例 6:检测 SSH 暴力破解行为

六、高级技巧

1. 生成 I/O 图表(流量趋势)

2. 提取 HTTPS SNI(加密前握手信息)

3. 自动化协议分析脚本

七、注意事项

三、磁盘与文件管理

df/du命令

一、命令概述

二、df 命令详解

1. 核心选项

2. 输出字段解析

3. 工作案例

案例 1:快速检查磁盘空间

案例 2:排查 inode 耗尽问题

三、du 命令详解

1. 核心选项

2. 工作案例

案例 1:定位根目录下最大子目录

案例 2:统计日志目录占用空间

案例 3:查找超过 1GB 的文件

四、综合运维场景

场景 1:自动化磁盘空间监控脚本

场景 2:清理过期日志文件

场景 3:解决 du 与 df 结果不一致问题

五、高级技巧

六、注意事项

ncdu命令

一、命令概述

二、安装方法

三、核心功能与优势

四、基本语法与常用选项

五、交互界面操作指南

六、工作案例场景

案例 1:快速分析根目录磁盘占用

案例 2:排除临时文件扫描

案例 3:离线分析与报告生成

案例 4:批量清理旧日志文件

案例 5:远程服务器磁盘分析

七、高级技巧

1. 自动化清理脚本

2. 定期扫描与对比

八、注意事项

find命令

一、命令概述

二、基本语法

三、核心选项与参数

1. 按名称/路径匹配

2. 按类型匹配

3. 按时间匹配

4. 按大小匹配

5. 按权限/用户匹配

6. 执行动作

四、工作案例场景

案例 1:清理过期日志文件

案例 2:查找并备份大文件

案例 3:审计异常权限文件

案例 4:批量修改文件所有者

案例 5:统计源码文件数量

五、高级技巧

1. 逻辑组合

2. 排除目录

3. 结合 xargs 提高效率

4. 并行处理

六、注意事项

rsync命令

一、命令概述

二、安装与基本语法

三、核心选项与参数

四、工作案例场景

案例 1:本地目录同步

案例 2:远程服务器同步(SSH 加密)

案例 3:增量备份与排除文件

案例 4:恢复误删文件(反向同步)

案例 5:大规模数据迁移(断点续传)

案例 6:差异化备份(保留历史版本)

五、高级技巧

1. 带宽限制与压缩优化

2. 保护覆盖文件(备份后缀)

3. 过滤规则文件

六、注意事项

fio命令

一、命令概述

二、安装与基本语法

三、核心参数与配置

1. 全局参数

2. I/O 模式参数

3. 输出参数

四、工作案例场景

案例 1:测试 SSD 的随机读性能(4K 块,队列深度 32)

案例 2:测试 HDD 的顺序写带宽(1M 块,单线程)

案例 3:模拟混合负载(70% 读 + 30% 写,4K 块)

案例 4:验证磁盘延迟(低队列深度,1 线程)

案例 5:多磁盘并行测试(多文件负载)

五、结果分析与调优建议

1. 关键指标解读

2. 性能瓶颈排查

3. 调优方向

六、注意事项

四、日志与文本处理

grep命令

一、命令概述

二、核心选项与参数

三、正则表达式速查

四、工作案例场景

案例 1:快速定位日志中的错误

案例 2:递归搜索代码库中的关键词

案例 3:统计接口调用次数

案例 4:提取日志中的 IP 地址

案例 5:监控服务状态

案例 6:多关键词复杂匹配

五、高级技巧

1. 结合 find 高效递归搜索

2. 高亮关键词并分页查看

3. 使用 zgrep 直接搜索压缩文件

4. 上下文关联分析

六、性能优化

七、注意事项

sed命令

一、命令概述

二、基本语法

三、核心选项与参数

四、地址定界与命令

1. 地址定界

2. 常用命令

3. 替换命令标志

五、工作案例场景

案例 1:批量替换配置文件参数

案例 2:删除日志文件中的空行

案例 3:提取特定时间段的日志

案例 4:批量注释/取消注释配置

案例 5:批量修改文件格式(DOS 转 Unix)

案例 6:动态插入配置片段

六、高级技巧

1. 多命令组合执行

2. 引用变量(Shell 脚本中)

3. 反向引用正则分组

4. 结合 find 批量处理文件

七、注意事项

awk命令

一、命令概述

二、基本语法与结构

三、核心概念与选项

1. 常用选项

2. 内置变量

3. 模式与动作

四、工作案例场景

案例 1:统计日志中 HTTP 状态码分布

案例 2:计算目录下文件总大小(MB)

案例 3:格式化输出进程信息

案例 4:分析网络连接状态

案例 5:动态修改 CSV 文件字段

案例 6:多文件关联分析

五、高级技巧

1. 使用 BEGIN/END 块

2. 自定义函数

3. 结合 Shell 管道

六、注意事项

cut命令

一、命令概述

二、基本语法

三、核心选项与参数

四、工作案例场景

案例 1:提取 /etc/passwd 的用户名和 Shell

案例 2:从日志中提取 IP 地址和时间戳

案例 3:按字符位置截取文本

案例 4:处理 CSV 文件并排除指定列

案例 5:反向提取字段(排除指定列)

案例 6:结合管道处理命令输出

五、高级技巧

1. 处理多字符分隔符

2. 动态字段提取(脚本中)

3. 处理包含空格的字段

六、注意事项

七、总结

sort和uniq命令

一、sort 命令详解

1. 核心选项

2. 工作案例

案例 1:按 CPU 使用率降序排序进程

案例 2:排序 CSV 文件并去重

案例 3:合并多个排序文件

二、uniq 命令详解

1. 核心选项

2. 工作案例

案例 1:统计日志中错误类型出现次数

案例 2:提取唯一 IP 地址

案例 3:查找重复用户

三、组合使用案例

案例 1:分析访问日志的 Top 10 IP

案例 2:清理重复配置项

案例 3:按多列排序并去重

四、注意事项

五、总结

journal命令

一、命令概述

二、核心选项与参数

三、工作案例场景

案例 1:实时跟踪系统日志

案例 2:查看指定服务的日志

案例 3:过滤错误级别日志

案例 4:按时间范围查询日志

案例 5:导出日志到文件(JSON 格式)

案例 6:查看系统启动时的日志

四、高级技巧

1. 结构化字段查询

2. 结合其他工具过滤

3. 日志持久化与清理

五、注意事项

六、总结

tail/multitail命令

一、tail 命令详解

1. 核心选项

2. 工作案例

案例 1:实时跟踪日志文件

案例 2:查看最近 50 行错误日志

案例 3:跟踪日志直到进程结束

二、multitail 命令详解

1. 核心功能

2. 安装方法

3. 工作案例

案例 1:分屏监控多个日志文件

案例 2:颜色标记关键日志

案例 3:合并日志并过滤

三、高级技巧

1. 快捷键操作

2. 动态执行命令并监控

3. 自定义颜色方案

四、注意事项

五、总结

五、系统调试与内核

strace命令

一、命令概述

二、核心选项与参数

三、工作案例场景

案例 1:诊断文件访问失败

案例 2:分析程序卡顿原因

案例 3:统计系统调用开销

案例 4:跟踪网络连接问题

案例 5:跟踪文件读写行为

四、高级技巧

1. 过滤关键系统调用

2. 跟踪子进程(多线程/多进程程序)

3. 结合管道实时分析

4. 动态附加到运行中的进程

五、注意事项

六、总结

ltrace命令

一、命令概述

二、核心选项与参数

三、工作案例场景

案例 1:分析内存泄漏

案例 2:定位第三方库崩溃

案例 3:统计函数调用开销

案例 4:跟踪文件操作异常

案例 5:跟踪多线程程序的竞态条件

四、高级技巧

1. 过滤特定函数并显示参数详情

2. 结合指令指针定位代码位置

3. 跟踪系统调用与库函数

五、注意事项

六、安装方法

七、总结

dmesg命令

一、命令概述

二、核心选项与参数

三、工作案例场景

案例 1:查看系统启动错误

案例 2:诊断 USB 设备识别问题

案例 3:监控实时内核事件

案例 4:分析内存故障

案例 5:查看硬盘健康状态

四、高级技巧

1. 按时间范围过滤日志

2. 保存日志到文件

3. 结合 journalctl 查看持久化日志

4. 解码错误码

五、注意事项

六、总结

lspci/lsusb命令

一、lspci 命令详解

1. 核心选项

2. 工作案例

案例 1:查看所有 PCI 设备列表

案例 2:查看网卡驱动信息

案例 3:生成硬件清单(JSON 格式)

二、lsusb 命令详解

1. 核心选项

2. 工作案例

案例 1:查看所有 USB 设备列表

案例 2:查看 USB 摄像头详细信息

案例 3:检查 USB 设备供电状态

三、组合使用案例

案例 1:诊断无线网卡驱动问题

案例 2:排查 USB 存储设备未挂载

案例 3:生成硬件报告(自动化脚本)

四、高级技巧

1. 解析厂商和产品 ID

2. 查看 USB 设备速度

3. 监控 USB 设备热插拔

五、总结

六、安全与审计

chattr/lsattr命令

一、命令概述

二、核心属性说明

三、chattr 命令用法

常用选项

四、lsattr 命令用法

常用选项

五、工作案例场景

案例 1:防止关键文件被误删或修改

案例 2:保护日志文件仅允许追加

案例 3:防止目录被篡改

案例 4:优化文件系统性能

六、注意事项

七、总结

getfacl/setfacl命令

一、命令概述

二、ACL 核心概念

三、getfacl 命令用法

输出示例:

四、setfacl 命令用法

常用选项:

五、工作案例场景

案例 1:为特定用户分配独立权限

案例 2:为组设置权限并限制掩码

案例 3:设置继承权限(默认 ACL)

案例 4:删除 ACL 条目

案例 5:递归恢复目录权限

六、高级技巧

1. ACL 权限备份与恢复

2. 结合 cp/rsync 保留 ACL

3. 调试权限冲突

七、注意事项

八、总结

auditd审计

一、auditd 概述

二、核心组件与配置

三、auditctl 命令用法

参数说明:

四、工作案例场景

案例 1:监控敏感文件访问(如 /etc/passwd)

案例 2:监控用户提权操作(如 sudo 或 su)

案例 3:监控网络连接(如未授权的端口访问)

案例 4:监控文件系统挂载/卸载操作

五、日志分析与报告

1. 使用 ausearch 查询日志

2. 使用 aureport 生成报告

六、高级配置

1. 日志轮转与存储

2. 永久化审计规则

七、注意事项

八、总结

lynis工具

一、Lynis 概述

二、安装与配置

1. 安装 Lynis

2. 配置文件

三、核心命令与选项

常用选项:

四、工作案例场景

案例 1:执行完整系统安全审计

案例 2:生成合规性报告(HTML)

案例 3:渗透测试模式扫描

案例 4:自动化定期审计(Cron 任务)

五、高级技巧

1. 自定义审计规则

2. 集成到 CI/CD 流程

六、注意事项

七、总结

七、软件包与服务管理

apt/dnf命令

一、apt(Debian/Ubuntu 系统包管理)

1. 核心命令与选项

2. 工作案例

案例 1:安装并固定软件版本

案例 2:清理旧内核和缓存

案例 3:处理依赖冲突

二、yum/dnf(RHEL/CentOS 系统包管理)

1. 核心命令与选项

2. 工作案例

案例 1:安装指定版本 MySQL

案例 2:配置 EPEL 仓库

案例 3:回滚失败的更新

三、通用场景与技巧

1. 系统升级

2. 安全补丁管理

3. 本地包安装

4. 仓库优先级管理

四、注意事项

五、总结

systemctl命令

一、命令概述

二、核心命令与选项

三、工作案例场景

案例 1:排查服务启动失败

案例 2:自定义服务管理

案例 3:限制服务资源

案例 4:处理服务依赖冲突

案例 5:隔离运行环境(Sandboxing)

四、高级技巧

1. 查看服务启动耗时

2. 修改默认运行级别(Target)

3. 定时重启服务

五、注意事项

六、总结

总结


一、系统监控与性能分析

vmstat命令

vmstat 是 Linux 系统性能监控的核心工具之一,主要用于实时统计 进程、内存、交换分区、I/O 和 CPU 的使用情况。


一、命令语法及核心参数

vmstat [options] [delay [count]]
  • 常用参数

    • -a:显示活跃(active)和非活跃(inactive)内存

    • -n:禁止周期性表头输出(适合脚本调用)

    • -d:显示磁盘详细统计(包括读写次数和吞吐量)

    • -s:显示内存事件统计(如内存分配、缺页异常等)

    • -t:在输出中增加时间戳(便于记录监控时间)

    • -w:宽屏模式(适配高分辨率显示器)

    • -p <分区>:监控指定分区的 I/O 活动


二、输出字段解析(关键列)

字段含义诊断场景
r等待运行的进程数CPU 过载时,此值持续 > CPU 核数
b处于不可中断睡眠的进程数I/O 阻塞时升高
swpd已使用的交换分区大小(KB)内存不足时此值快速增长
free空闲内存(KB)结合 si/so 判断是否需要扩容内存
si从交换分区读入内存的数据量(KB/s)si > 0 表示正在发生 Swap In
so从内存写入交换分区的数据量(KB/s)so > 0 表示正在发生 Swap Out
bi块设备每秒接收的块数(块/s)磁盘读取压力(如数据库高频读)
bo块设备每秒发送的块数(块/s)磁盘写入压力(如日志大量写入)
us用户态 CPU 时间占比(%)应用程序消耗 CPU 过高
sy内核态 CPU 时间占比(%)系统调用频繁或中断过多
waI/O 等待 CPU 时间占比(%)磁盘成为瓶颈时此值飙升
st虚拟机等待物理 CPU 的时间(%)虚拟化环境中宿主机资源争抢

三、工作场景案例

1. 排查 CPU 瓶颈

命令vmstat 1 5 (每秒采样一次,共5次) 观察点

  • 如果 us 持续 >70%,说明应用程序消耗大量 CPU(如 Java 应用未优化)。

  • 如果 sy 持续 >30%,可能是内核频繁处理系统调用(如大量短连接请求)。

  • 如果 wa 持续 >20%,需检查磁盘 I/O 性能(如数据库未索引导致全表扫描)。


2. 内存不足导致 Swap 频繁

命令vmstat -t 2 10 (带时间戳,每2秒采样,共10次) 分析逻辑

  • free 持续下降至接近 0,且 si/so 开始频繁波动。

  • 结论:物理内存不足,系统开始使用交换分区,需扩容内存或优化应用内存使用。


3. 磁盘 I/O 性能问题

命令vmstat -d 1 (监控磁盘 I/O 详情) 关键指标

  • bo(写入)和 bi(读取)数值突然飙升。

  • 配合 wa 列,若 wa 高且 bi/bo 数值大,可能是磁盘带宽不足或 RAID 卡缓存策略问题。


4. 系统卡顿实时监控

场景:用户反馈系统响应变慢,但 top 未发现明显异常。 操作

vmstat 1  # 每秒刷新一次

输出关键点

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st5  2 204800  15232  10240 180000    0    0  1200   800 1200 2500 30 15 40 15  0

诊断

  • r=5:有5个进程在等待 CPU,可能 CPU 核数不足。

  • b=2:2个进程因 I/O 阻塞。

  • wa=15%:I/O 等待较高,需结合 iostat 进一步分析磁盘。


5. 高级用法:统计内存事件

命令vmstat -s 输出示例

     4095996 K total memory2987340 K used memory1802304 K active memory845200 K inactive memory1108656 K free memory# 发现大量 "pages paged in" 表示频繁的缺页中断

用途: 快速查看内存总量、使用分布、缺页异常次数等,辅助判断内存泄漏或配置不合理。


四、总结

  • 动态监控vmstat 适合观察 随时间变化的趋势,静态快照(如 free)可能误导判断。

  • 组合工具:结合 sar(历史数据)、iostat(磁盘详情)、pidstat(进程级监控)深入分析。

  • 阈值经验wa > 20% 需警惕磁盘性能;si/so 持续 >100 KB/s 表明 Swap 过度使用。

iostat命令

iostat 是 Linux 系统性能监控的核心工具之一,专注于 磁盘 I/O 和 CPU 使用情况 的统计分析。作为中级运维工程师,需掌握其核心指标的组合分析能力,快速定位存储瓶颈和 CPU 负载异常。


一、命令语法及核心参数

iostat [options] [interval [count]]
  • 常用参数

    • -c:仅显示 CPU 统计信息

    • -d:仅显示磁盘统计信息

    • -x:显示扩展磁盘统计(关键参数,必须掌握

    • -p <设备>:监控指定磁盘或分区(如 -p sda

    • -m:以 MB/s 代替 KB/s 显示吞吐量

    • -t:输出中增加时间戳(便于记录监控时间)

    • -k:以 KB 为单位显示数据(默认)


二、输出字段解析(关键指标)

1. CPU 统计(-c
字段含义诊断场景
%user用户态 CPU 时间占比应用程序消耗 CPU 过高(如 Java 进程)
%system内核态 CPU 时间占比系统调用或中断过多(如网络密集型应用)
%iowaitCPU 等待 I/O 完成的时间占比存储性能瓶颈时飙升
%idleCPU 空闲时间占比持续 <20% 表示系统负载较高
2. 磁盘统计(-x -d
字段含义诊断阈值
r/s每秒读请求数机械硬盘 >200 可能成为瓶颈
w/s每秒写请求数SSD >5000 需关注
rkB/s每秒读取数据量(KB)结合带宽(如 SAS 硬盘 200MB/s)
wkB/s每秒写入数据量(KB)同上
awaitI/O 请求平均等待时间(ms)>10ms(机械盘)或 >2ms(SSD)异常
svctmI/O 请求平均服务时间(ms)接近 await 表示队列堆积
%util磁盘繁忙时间百分比>70% 表示接近饱和

三、工作场景案例

1. 定位磁盘高负载问题

场景:数据库查询变慢,怀疑磁盘 I/O 瓶颈。 命令

iostat -x -m 1 5  # 扩展模式,MB/s单位,每秒采样,共5次

输出分析

Device    r/s   w/s    rMB/s   wMB/s   await  svctm  %util
sdb      120    80     45.2    20.1    25.6   8.2    98.3

诊断结论

  • %util=98.3%:磁盘接近满载

  • await=25.6ms 远高于 svctm=8.2ms:存在严重 I/O 队列堆积

  • 解决方案:优化 SQL 查询减少全表扫描,或升级为 SSD


2. 排查 CPU 异常占用

场景:系统 CPU 使用率高,但 top 未发现异常进程。

命令

iostat -c 1

输出分析

avg-cpu:  %user   %system  %iowait  %idle12.3     45.6     32.1    10.0

诊断结论

  • %system=45.6%:内核态 CPU 占用过高

  • %iowait=32.1%:存在 I/O 等待问题

  • 根因:可能是 RAID 卡电池故障导致回写模式降级,或 NFS 挂载异常


3. LVM 逻辑卷性能分析

场景:LVM 存储的虚拟机磁盘性能下降。

命令

iostat -xp dm-0 2  # 监控 LVM 设备 dm-0

输出分析

dm-0   ...  rkB/s=32000  wkB/s=15000  await=15.2  %util=89.2

关键点

  • 高吞吐量(32MB/s读 + 15MB/s写)但 await=15ms:底层物理磁盘性能不足

  • 解决方案:检查底层磁盘 RAID 配置,或分散负载到多个 LUN


4. 云盘性能验证

场景:ECS 云主机更换云盘后应用性能未提升。

命令

iostat -dx -k 1

输出对比

# 旧云盘(普通云盘)
vda   r/s=800   await=20.3  %util=95.1
​
# 新云盘(ESSD PL3)
vdb   r/s=1200  await=2.1   %util=68.4

结论: 新云盘 await 下降 90%,%util 降低但吞吐量提升,符合预期性能升级。


5. 高并发写入瓶颈分析

场景:日志服务集群出现写入延迟告警。

命令

iostat -x 1 | grep -E "Device|sd[c-e]"

输出焦点

sdc   wkB/s=220   w/s=4500   await=50.1  %util=99.9

关键指标

  • w/s=4500:超高写 IOPS

  • wkB/s=220:每次写入仅约 49KB(220*1024/4500),存在小文件写入问题

  • 优化方向:合并写入操作,调整文件系统为更合适的小块写入策略(如 ext4 的 dir_index


四、高级技巧
  1. 组合监控

    iostat -x 1 | awk '/sd/ {if ($12 >70) print $1,$12}'  # 实时过滤高负载磁盘
  2. 历史数据分析

  3. 进程级关联

    pidstat -d 1  # 配合查看进程级别的 I/O 活动

五、总结
  • 核心指标组合

    • %util + 高 await → I/O 队列堆积

    • rkB/s/wkB/s + 低 %util → 带宽未满但可能延迟高

  • 不要孤立看数据:结合 vmstatb 列(阻塞进程数)和 topwa 值综合判断

  • 性能基准:建立业务正常时的 iostat 基准数据,便于异常对比

iftop命令

iftop 是一款实时监控网络流量的命令行工具,能够按连接(IP或端口)动态展示带宽使用情况。作为中级运维工程师,掌握其高级用法可快速定位网络瓶颈、异常流量及入侵行为。


一、安装与基础用法

1. 安装方法
# Debian/Ubuntu
sudo apt install iftop
​
# RHEL/CentOS
sudo yum install epel-release
sudo yum install iftop
2. 基础命令
sudo iftop -i eth0  # 监控指定网卡(默认eth0)
sudo iftop -nP      # 禁用DNS解析(-n)并显示端口(-P)

二、核心参数详解

参数作用场景
-i指定监控网卡(如 eth0bond0多网卡服务器定位流量入口
-n禁用DNS反向解析避免DNS延迟,快速显示IP
-P显示端口号分析具体服务流量(如MySQL 3306)
-F过滤指定网段(CIDR格式)聚焦内网或特定IP段通信
-m设置带宽比例尺调整流量显示灵敏度
-B以Bytes为单位显示(默认bits)精确计算数据量
-t文本模式(无交互界面)结合重定向保存日志

三、交互界面操作

运行界面快捷键

  • h:显示帮助菜单

  • s:显示源IP端口

  • d:显示目标IP端口

  • j/k:滚动连接列表

  • T:切换累计/实时流量显示

  • L:调整峰值流量标尺

  • p:暂停刷新

  • q:退出


四、输出字段解析

界面布局:
1. 带宽刻度条(动态调整)
2. 连接列表(源IP:端口 → 目标IP:端口)
3. 流量统计(2s/10s/40s平均)
​
关键列:
=> 发送流量(TX) | <= 接收流量(RX)
cum:当前连接累计流量
peak:峰值流量
rates:2s/10s/40s平均流量

五、工作场景案例

1. 定位服务器带宽跑满

现象:监控显示eth0出口带宽持续100%

操作

sudo iftop -i eth0 -nP

分析

  • 发现 192.168.1.10:443 => 203.0.113.5:55332 持续占用50MB/s TX流量

  • t 切换流量显示模式,确认是否为突发流量或持续占用 结论:该IP为Web服务器,存在大量文件下载请求,需优化CDN或启用限流


2. 排查异常外联流量

现象:安全告警显示服务器发起异常外网连接

操作

sudo iftop -F 0.0.0.0/0 -f "dst port 6667"  # 过滤目标端口为6667(常见木马端口)

发现:内网IP 10.0.0.5:12345 频繁连接 45.76.129.2:6667

深入

netstat -tunap | grep 12345  # 定位进程PID
lsof -p <PID>                # 查看进程详细信息

结论:该进程为恶意挖矿程序,立即隔离主机并清除


3. 分析数据库主从同步延迟

现象:MySQL从库同步延迟持续增长

操作

sudo iftop -i eth1 -nP -f "port 3306"  # 监控数据库专用网卡eth1的3306端口

观察

  • 主库 10.0.1.10:3306 => 10.0.1.20:55322 的TX流量为2MB/s

  • 40秒平均速率(rates列)波动在1.5~3MB/s 结论:网络带宽稳定,需排查从库IO性能或主库binlog生成速度


4. 检测DDoS攻击

现象:服务器无法访问,带宽监控显示异常入流量

操作

sudo iftop -i eth0 -n  # 快速查看入站连接

发现

  • 数百个不同IP向 :80 发送流量,RX速率均超过1MB/s

  • 总入流量远超正常业务量 应对:立即启用防火墙封禁来源IP段,并联系ISP清洗流量


5. 多网卡流量分布不均

现象:负载均衡器流量未按预期分发到bond0的子网卡

操作

sudo iftop -i bond0  # 查看绑定网卡总体流量
sudo iftop -i eth2   # 检查具体物理网卡

发现:bond0流量集中在eth2,eth3无流量 根因:bond模式配置错误(未启用负载均衡模式) 解决:调整bonding模式为 balance-rr802.3ad


六、高级技巧
1. 文本模式记录流量
sudo iftop -t -i eth0 -s 60 > traffic.log  # 监控60秒并保存日志
2. 组合过滤语法
# 监控来自特定IP且目标为80端口的流量
sudo iftop -f "src 192.168.1.100 and dst port 80"
3. 流量排序
  • <> 键切换按源/目标地址排序

  • o 冻结当前显示结果


七、总结
  • 核心价值:实时可视化网络连接级带宽占用,弥补 nloadvnstat 的不足

  • 排查流程iftop 定位IP/端口netstat/ss 查进程tcpdump 抓包分析

  • 性能影响:对高流量(>1Gbps)服务器可能增加CPU负载,建议短期使用

  • 替代工具

    • nethogs:按进程监控流量

    • iptraf-ng:更强大的交互式分析

top/htop命令

tophtop 是 Linux 系统性能监控的核心工具,用于实时分析 进程级资源占用(CPU、内存、线程等)。作为中级运维工程师,需掌握两者在性能瓶颈定位、异常进程排查中的灵活应用。


一、top 命令详解

1. 基础语法与核心参数
top [options]
  • 关键参数

    • -d <秒>:刷新间隔(默认3秒)

    • -p <PID>:监控指定进程

    • -u <用户>:筛选某用户的进程

    • -b:批处理模式(输出到文件)

    • -H:显示线程(需在交互界面按 H 切换)

2. 交互界面操作
快捷键功能场景
P按CPU使用率排序定位CPU密集型进程
M按内存使用率排序排查内存泄漏
N按PID排序快速查找指定进程
k终止进程强制结束异常进程
z切换颜色高亮增强可读性
1展开/折叠CPU核心统计分析多核负载均衡
V树状显示进程关系查看父子进程依赖
3. 关键指标解析
  • 顶部汇总区

    Load average: 1.02, 0.95, 0.85  # 1/5/15分钟平均负载(建议≤CPU核心数)
    %Cpu(s): 30.1 us, 10.2 sy,  0.0 ni, 59.7 id,  0.0 wa,  0.0 hi,  0.0 si
    # us=用户态CPU, sy=内核态CPU, id=空闲, wa=I/O等待
  • 进程列表区

    PID   USER    PR  NI    VIRT    RES    SHR    %CPU  %MEM     TIME+   COMMAND
    1024  mysql   20   0   12.3g   5.2g   280m    78.6  16.3   100:23.4  mysqld
    # VIRT=虚拟内存, RES=物理内存, SHR=共享内存

二、htop 命令进阶

1. 安装与基础用法
# 安装
sudo apt install htop    # Debian/Ubuntu
sudo yum install htop    # RHEL/CentOS
​
# 启动
htop -d 5 -u nginx      # 每5秒刷新,仅显示nginx用户进程
2. 核心功能对比 top
特性tophtop
交互体验基础快捷键鼠标支持、颜色高亮
视图模式单一列表树状结构、自定义列
过滤与搜索有限正则表达式过滤(F4)
进程操作仅终止进程发送任意信号(F9)
性能监控基础CPU/内存动态图形化显示(进度条)
3. 高级操作技巧
  • 进程跟踪:选中进程按 s 调用 strace 追踪系统调用

  • 资源视图:按 F2 进入设置,添加 IO_RATECGROUP

  • 批量操作:按空格标记多个进程,批量发送信号或终止


三、工作场景案例

1. CPU 使用率突增(使用 top

现象:服务器负载飙升,CPU idle 降至 5%

操作

  1. 启动 top 并按 P 排序:

    PID   USER     %CPU  COMMAND
    8871  appuser  180%  java
  2. 发现某个 Java 进程 CPU 占用异常(超过100%表示多线程占用)

  3. H 切到线程模式,定位具体线程:

    PID   USER     %CPU  COMMAND
    8872  appuser  95%   java
    8873  appuser  85%   java
  4. 结合 jstack 分析 Java 线程栈,排查死循环或锁竞争


2. 内存泄漏分析(使用 htop

现象:系统空闲内存持续下降,频繁触发 OOM

操作

  1. 启动 htop,按 F6 → 选择 %MEM 降序排序

  2. 发现某 Python 进程 RES 内存持续增长:

    PID  USER   %MEM  COMMAND
    456  dbuser 22%   python3 /opt/app/run.py
  3. F9 → 发送 SIGUSR1 信号触发应用内存快照(需应用支持)

  4. 使用 pmap -x 456 查看进程内存分布,定位未释放的堆内存


3. 僵尸进程清理(使用 top

现象top 显示大量 Z 状态进程

操作

  1. top 中观察进程列表,筛选 Z 状态:

    PID   USER    S  %CPU  %MEM  COMMAND
    1234  orphan  Z  0.0   0.0   [sh]
  2. 记录僵尸进程的父进程 PID(如PPID=1000)

  3. 向父进程发送 SIGCHLD 信号要求回收子进程:

    kill -s SIGCHLD 1000
  4. 若父进程无响应,强制终止父进程:

    kill -9 1000

4. 磁盘 I/O 瓶颈定位(使用 htop

现象:应用响应延迟高,%wa 持续超过 30%

操作

  1. htop 中按 F2 → 添加 IO_READ_RATEIO_WRITE_RATE

  2. 发现某日志采集进程(filebeat)写速率高达 120MB/s:

    PID  USER   IO_READ_RATE  IO_WRITE_RATE  COMMAND
    789  root   0.00B/s       122.4MB/s      filebeat
  3. s 跟踪进程 I/O 操作,确认写入目标文件系统

  4. 优化方案:将日志写入独立磁盘或启用异步写入模式


5. 容器化环境资源监控(使用 htop

现象:Docker 容器性能下降,怀疑资源争抢

操作

  1. 启用 htop 的 CGroup 视图:

    htop --tree --sort-key=PERCENT_CPU
  2. 展开容器进程树,检查子进程资源总和:

    PID   USER   %CPU  CGROUP        COMMAND
    1122  root   15%   /docker/abcd  containerd-shim
    ├─1133 appuser 12%               node server.js
    └─1150 appuser 3%                node worker.js
  3. 对比容器配额:docker stats <container_id>

  4. 确认容器 CPU 限制是否过低,调整 --cpus 参数


四、总结与最佳实践

  • 工具选择

    • 快速故障排查:优先使用 top(无需安装)

    • 深度分析:使用 htop(交互更高效)

  • 性能分析流程

    1. top/htop 定位高负载进程

    2. pidstatperf 分析进程细节

    3. strace/jstack/gdb 跟踪代码行为

  • 监控增强

    • 配置 ~/.config/htop/htoprc 自定义视图

    • 使用 glances 整合多维度监控数据

  • 自动化报警

    # 检测CPU持续超阈值的进程
    top -b -n 1 | awk '/^%Cpu/ {if ($2 > 90) print "Alert: High CPU"}'

ps命令

ps 是 Linux 进程管理的核心工具,能够以 静态快照 形式展示系统进程状态。作为中级运维工程师,需掌握其高级过滤、输出格式化和与其他工具的协同使用,精准定位进程级问题。


一、命令语法与核心参数

ps [options]
1. 参数风格区分
  • BSD 风格(无短横线):ps aux

  • Unix 风格(带短横线):ps -ef

  • GNU 长格式ps --pid 1234

2. 关键参数
参数作用常用场景
-e / -A显示所有进程全局进程监控
-f完整格式输出(包含CMD、PPID等)查看进程启动命令
-u <user>按用户过滤进程排查特定用户资源占用
-p <PID>按PID过滤进程跟踪指定进程状态
--sort=-%mem按内存使用降序排序定位内存泄漏进程
-L显示线程(LWP列表)分析多线程应用
-o <字段>自定义输出字段(支持50+字段)定制化监控视图
--forest树状显示进程父子关系分析进程派生关系

二、输出字段解析(重点字段)

字段含义诊断价值
PID进程ID进程操作(kill、优先级调整)
PPID父进程ID分析僵尸进程来源
%CPUCPU使用率定位CPU密集型进程
%MEM内存使用率发现内存泄漏
VSZ虚拟内存大小(KB)评估进程内存需求
RSS物理内存占用(KB)真实内存消耗分析
START进程启动时间排查异常时段启动的进程
STAT进程状态代码识别僵尸(Z)、睡眠(S)等状态
COMMAND完整启动命令确认进程来源与行为

进程状态代码扩展

  • R:运行中

  • S:可中断睡眠

  • D:不可中断睡眠(通常与I/O相关)

  • Z:僵尸进程

  • T:已停止

  • <:高优先级

  • N:低优先级

  • L:内存锁页

  • s:会话领导者


三、工作场景案例

1. 检测内存泄漏进程
# 按内存使用率降序,显示前10进程
ps -eo pid,%mem,rss,comm --sort=-%mem | head -n 10

输出分析

  PID %MEM   RSS COMMAND1234 22.3 1823456 java5678 15.2 1245678 python3

操作

  • 结合 jstat -gcutil 1234(Java进程)分析GC情况

  • 使用 pmap -x 1234 查看内存分布

  • 最终定位为缓存未释放导致RSS持续增长


2. 清理僵尸进程
# 查找僵尸进程及其父进程
ps -A -o stat,pid,ppid,comm | grep -w 'Z'

输出

Z   1234    5678   [sh] <defunct>

操作

  1. 杀死父进程强制回收僵尸:kill -9 5678

  2. 若父进程为关键进程不可杀,重启相关服务


3. 追踪异常网络连接
# 查找所有开启80端口的进程
ps -eo pid,cmd | grep -E ':80\b'

输出

1234 /usr/sbin/apache2 -k start
5678 /opt/malware -listen :80

结论:发现非 Apache 进程监听 80 端口,疑似恶意程序


4. 分析容器内进程
# 显示Docker容器进程的映射关系
ps -e -o pid,user,cmd --forest | grep -A 3 'docker-containerd'

输出

1234 root  \_ docker-containerd --config /var/run/docker/containerd/containerd.toml5678 root      \_ containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/abcd6789 1001       \_ node server.js

用途:确认容器进程树结构,排查资源未释放问题


5. 统计用户进程资源
# 显示nginx用户进程的CPU和内存总消耗
ps -u nginx -o %cpu,%mem --no-header | awk '{cpu+=$1; mem+=$2} END{print "CPU:", cpu, "% MEM:", mem, "%"}'

输出

CPU: 78.3% MEM: 12.5%

结论:Nginx 进程资源占用合理,排除用户级资源超限


四、高级用法

1. 自定义输出格式
# 显示进程的cgroup信息(容器环境关键字段)
ps -eo pid,user,cgroup,cmd --width 200
2. 结合时间筛选进程
# 查找最近1小时启动的进程
ps -eo pid,lstart,cmd --sort=-start_time | awk '$2 >= "2023-09-20 14:00:00"'
3. 进程状态批量操作
# 批量杀死所有sleep状态的进程
ps -eo pid,stat | awk '$2 ~ /S/ {print $1}' | xargs kill -9

五、总结与最佳实践

  1. 组合工具链

    • 实时监控:ps + watch(如 watch -n 1 'ps -eo %mem,pid,comm --sort=-%mem | head'

    • 深度分析:ps 定位 PID → strace/perf 跟踪行为

  2. 自动化监控

    # 每5分钟记录高CPU进程
    */5 * * * * ps -eo pid,%cpu,comm --sort=-%cpu | head -n 10 >> /var/log/high_cpu.log
  3. 避坑指南

    • VSZ 包含共享库内存,优先关注 RSS

    • 僵尸进程无法直接 kill,需处理其父进程

    • ps auxps -ef 输出差异:BSD vs Unix格式

  4. 性能影响ps 在进程数 >1万时可能变慢,生产环境建议结合 /proc 文件系统直接分析。

pidstat命令

一、命令概述

pidstatsysstat 工具集的一部分,用于监控进程及线程的资源使用情况,包括 CPU、内存、磁盘 I/O、上下文切换 等。它是 Linux 系统性能排查和调优的重要工具。


二、安装与基本语法

1. 安装方法

# Debian/Ubuntu
apt-get install sysstat
​
# RHEL/CentOS
yum install sysstat
​
# 启动数据收集服务(默认每10分钟采集一次系统状态)
systemctl enable sysstat && systemctl start sysstat

2. 基本语法

pidstat [选项] [间隔时间] [次数]

三、核心选项及参数解析
选项作用关键指标说明
-u监控 CPU 使用率%usr(用户态CPU)、%system(内核态CPU)、%guest(虚拟机CPU)、%CPU(总使用率)
-r监控内存minflt/s(次缺页错误)、majflt/s(主缺页错误)、%MEM(内存占比)
-d监控磁盘 I/OkB_rd/s(读取速度)、kB_wr/s(写入速度)
-w监控上下文切换cswch/s(主动切换)、nvcswch/s(被动切换)
-t显示线程级数据TGID(主进程ID)、TID(线程ID)
-p PID指定进程 ID可搭配其他选项过滤特定进程

四、工作案例场景
案例 1:CPU 使用率过高排查

场景:服务器 CPU 使用率持续 90% 以上,快速定位问题进程。

命令

pidstat -u 1 5  # 每1秒采样,共5次

输出关键点

03:15:01 PM   UID       PID    %usr %system  %CPU   CPU  Command
03:15:02 PM     0     10456   85.00    5.00  90.00     1  java

分析:进程 java (PID 10456) 占用了 90% CPU,需进一步检查其线程或堆栈。


案例 2:内存泄漏分析

场景:系统内存使用率持续增长,疑似内存泄漏。

命令

pidstat -r -p 12345 2 10  # 监控PID 12345的内存,每2秒一次,共10次

输出关键点

03:20:01 PM   UID       PID  minflt/s  majflt/s    VSZ    RSS   %MEM  Command
03:20:03 PM  1001     12345    500.00      0.20   10G    8.5G   25.3%  python

分析minflt/s(次缺页)高达 500/秒,RSS 内存占用 8.5G,可能存在内存泄漏。


案例 3:磁盘 I/O 瓶颈定位

场景:磁盘 I/O 使用率高,系统响应缓慢。

命令

pidstat -d 2  # 每2秒采样一次磁盘I/O

输出关键点

03:25:01 PM   UID       PID   kB_rd/s   kB_wr/s  Command
03:25:03 PM     0     9876      0.00    1200.00  mysqld

分析mysqld 进程写入速度达 1200kB/s,需检查是否大量写操作或慢查询。


案例 4:上下文切换频繁分析

场景:系统上下文切换频繁(context switch 过高)。

命令

pidstat -w -t 1 5  # 监控线程级上下文切换

输出关键点

03:30:01 PM   UID      TGID       TID   cswch/s  nvcswch/s  Command
03:30:02 PM     0     11247         -     200.0      150.0  nginx
03:30:02 PM     0         -     11248     180.0      120.0  |__nginx-worker

分析nginx-worker 线程主动切换 (cswch/s) 180次/秒,可能因频繁系统调用或锁竞争。


案例 5:综合监控与自动化

场景:长期监控关键进程,生成性能报告。

命令

# 每5分钟记录一次MySQL进程的CPU、内存、I/O
pidstat -urd -p $(pgrep mysqld) 300 -h >> /var/log/mysql_perf.log

自动化配置: 将命令写入 crontab,实现定时监控:

*/5 * * * * /usr/bin/pidstat -urd -p $(pgrep mysqld) 300 1 -h >> /var/log/mysql_perf.log

五、高级技巧
  1. 线程级监控: 使用 -t 参数并配合 -p PID,定位多线程应用的资源争用问题。

  2. 与其他工具联动

    # 结合 awk 快速提取CPU占用Top3进程
    pidstat -u 1 3 | awk '{print $6,$8}' | sort -k2 -nr | head -n 4
  3. 对比历史数据

    # 使用 sar 查看历史CPU数据(依赖sysstat)
    sar -u -s 10:00:00 -e 12:00:00

六、注意事项
  1. 权限要求:部分指标(如内核态 CPU)需 root 权限。

  2. 版本差异:不同 Linux 发行版的 pidstat 选项可能略有差异,建议通过 man pidstat 确认。

  3. 数据解读:需结合系统整体负载(如 vmstatiostat)综合分析,避免单一指标误判。

通过以上方法,pidstat 可快速定位 CPU 瓶颈、内存泄漏、I/O 争用等问题,是运维工程师性能调优的利器。

free命令


一、命令概述

free 是 Linux 系统内置工具,用于快速查看 内存(RAM)和交换空间(Swap) 的使用情况。它能显示总内存、已用内存、空闲内存、缓存(Cache)和缓冲区(Buffer)的详细信息,是排查内存瓶颈和性能调优的核心工具。


二、基本语法
free [选项]

三、核心选项及参数解析
选项作用
-h以人类可读格式显示(自动转换单位,如 GB/MB)
-s N每 N 秒刷新一次数据(持续监控)
-t显示 总计行(物理内存 + Swap 的总和)
-g以 GB 为单位显示
-m以 MB 为单位显示
-w分离缓存(Cache)和缓冲区(Buffer)显示
--si使用 1000 进制(默认 1024 进制,如 1K=1024)

四、输出字段详解

执行 free -h 输出示例:

              total        used        free      shared  buff/cache   available  
Mem:           15Gi        4.2Gi       2.1Gi       0.2Gi        8.7Gi        10Gi  
Swap:          2.0Gi       0.5Gi       1.5Gi  
  • total:总内存大小(包括物理内存和 Swap)。

  • used:已使用的内存(计算公式:used = total - free - buff/cache)。

  • free:完全未使用的内存。

  • shared:被共享内存占用的部分(如 tmpfs)。

  • buff/cache缓冲区(Buffer)和缓存(Cache) 占用的内存(可被快速回收)。

  • available:系统可分配给新进程的预估可用内存(关键指标,包含 free + 可回收的 buff/cache)。


五、工作案例场景
案例 1:快速检查系统内存压力

场景:服务器响应变慢,怀疑内存不足。

命令

free -h  

输出分析

  • 如果 available 接近 free,说明缓存未被有效利用,可能存在内存瓶颈。

  • Swapused 持续增长,表明物理内存不足,系统正在频繁使用交换空间。


案例 2:持续监控内存使用变化

场景:排查内存泄漏问题,观察内存占用趋势。

命令

free -h -s 5  # 每5秒刷新一次  

关键指标

  • 持续观察 usedavailable 的变化,若 available 持续下降,可能存在内存泄漏。


案例 3:诊断缓存(Cache)占用过高

场景:发现 buff/cache 占用 70% 内存,用户误认为内存不足。

命令

free -h -w  # 分离显示 Buffer 和 Cache  

输出示例

              total        used        free      shared     buffers       cache   available  
Mem:           15Gi        4Gi        2Gi       0.2Gi        1Gi         7Gi        10Gi  

分析

  • cache 是内核缓存的文件数据(如频繁读取的文件),可被快速释放。

  • 无需手动清理,除非遇到极端性能问题(通过 echo 3 > /proc/sys/vm/drop_caches 清理)。


案例 4:计算应用程序真实内存占用

场景:Java 应用启动后,free 显示 used 增加 2GB,但监控工具显示应用仅占用 1GB。

原理

  • freeused 包含所有内存分配,而应用监控工具可能只统计堆内存。

  • 验证方法

# 1. 记录初始可用内存  
available_init=$(free -m | awk '/Mem:/ {print $7}')  
​
# 2. 启动 Java 应用  
​
# 3. 再次检查可用内存  
available_now=$(free -m | awk '/Mem:/ {print $7}')  
​
# 计算差值  
echo "应用实际占用内存: $((available_init - available_now)) MB"  

案例 5:优化 Swap 使用策略

场景:物理内存充足,但 Swap 频繁使用,导致磁盘 I/O 升高。

诊断步骤

  1. cat /proc/sys/vm/swappiness  

    查看 Swap 使用情况:

    free -h | grep Swap  
  2. 检查 swappiness 参数(默认值 60,范围 0-100):

    cat /proc/sys/vm/swappiness  
  3. 降低 Swap 使用倾向(临时生效):

    sysctl vm.swappiness=10  
  4. 永久生效:

    echo "vm.swappiness=10" >> /etc/sysctl.conf  

案例 6:自动化内存监控脚本

场景:定时记录内存状态,用于生成性能报告。

脚本示例

#!/bin/bash  
LOG_FILE="/var/log/mem_usage.log"  
echo "$(date '+%Y-%m-%d %H:%M:%S')" >> $LOG_FILE  
free -h | awk '/Mem:/ {print "Mem Available:", $7}' >> $LOG_FILE  
free -h | awk '/Swap:/ {print "Swap Used:", $3}' >> $LOG_FILE  
echo "------------------------" >> $LOG_FILE  

定时任务配置(每 30 分钟执行):

crontab -e  
*/30 * * * * /path/to/script.sh  

六、高级技巧
  1. 结合 vmstat 分析内存瓶颈

    vmstat 1 5  # 查看内存、Swap、I/O 和 CPU 的综合情况  
  2. 通过 /proc/meminfo 获取更详细信息

    cat /proc/meminfo  # free 命令的数据来源  
  3. 快速释放缓存(仅限紧急情况)

    sync; echo 1 > /proc/sys/vm/drop_caches  # 释放页缓存  
    sync; echo 2 > /proc/sys/vm/drop_caches  # 释放目录项和 inode  
    sync; echo 3 > /proc/sys/vm/drop_caches  # 释放所有缓存  

七、注意事项
  1. 不要迷信 free:Linux 会尽可能利用空闲内存作为缓存,available 才是可用内存的真实指标。

  2. Swap 使用不一定是问题:少量 Swap 使用可能属于正常现象,但持续增长需警惕。

  3. 区分 Buffer 和 Cache

    • Buffer:内核缓冲区,用于暂存磁盘 I/O 的原始数据块。

    • Cache:文件系统缓存,用于加速文件读取。


通过灵活使用 free 命令,运维工程师可以快速定位内存不足、Swap 滥用、缓存异常等问题,并结合其他工具(如 topvmstat)进行深度分析。

smem命令


一、命令概述

smem 是 Linux 系统内存分析工具,专注于提供更精准的进程内存占用统计。它通过计算 USS(Unique Set Size)PSS(Proportional Set Size)RSS(Resident Set Size) 等指标,帮助运维工程师准确评估进程的真实内存消耗,尤其适用于多进程共享内存的场景(如 Apache/Nginx 多线程服务)。


二、安装方法
# Debian/Ubuntu
apt-get install smem
​
# RHEL/CentOS(需启用 EPEL 仓库)
yum install epel-release && yum install smem
​
# 验证安装
smem --version

三、核心指标解析
指标说明
USS进程独占的物理内存(不包含共享内存)
PSS共享内存按进程数均摊后的内存值(USS + 共享内存/进程数)
RSS进程实际占用的物理内存(包含共享内存)
Swap进程使用的交换空间

适用场景

  • USS:评估进程独立占用的内存(内存泄漏排查)。

  • PSS:更公平地统计多进程共享内存的总消耗(如容器化环境)。

  • RSS:传统内存统计指标(与 top/ps 一致)。


四、基本语法及常用选项
smem [选项] [过滤条件]
选项说明
-k以 KB 为单位显示
-m以 MB 为单位显示
-u按用户统计内存使用
-p显示内存占比(百分比)
-r按内存降序排序
-t显示总计行
-c "列名"自定义输出列(如 -c "name uss pss rss"
-H隐藏表头(便于脚本处理)
-P <正则>按进程名过滤(如 -P "nginx"
-U <用户>按用户过滤(如 -U www-data

五、工作案例场景
案例 1:快速定位内存占用最高的进程

场景:服务器内存使用率超过 90%,需快速找出问题进程。

命令

smem -s uss -r -m -t

输出示例

  PID User     Command                         USS      PSS      RSS     Swap  
12345 mysql   /usr/sbin/mysqld             1204M    1320M    1450M     50M  6789 java    /opt/jdk/bin/java             890M     910M    1000M    200M  
----------------------------------------------  
Total:                                  24910M   26520M   28000M   1200M  

分析

  • mysqld 的 USS 高达 1204MB,可能是内存泄漏或配置不合理。

  • java 进程的 Swap 使用较多,需检查 JVM 堆配置或物理内存是否不足。


案例 2:按用户统计内存消耗

场景:多用户服务器需统计各用户的内存使用量。

命令

smem -u -k -p -t | awk '{printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4}'

输出示例

User       USS(%)    PSS(%)    RSS(%)  
root       45%       50%       55%  
www-data   30%       25%       20%  
postgres   15%       20%       18%  
-----------------------------  
Total:     100%      100%      100%  

分析

  • root 用户占用 45% 的 USS,需检查系统服务(如 MySQL、Docker)。

  • www-data 用户 PSS 较低但 RSS 较高,可能因共享内存(如 PHP-FPM 进程池)。


案例 3:分析容器/多进程应用的真实内存占用

场景:某 Docker 容器疑似内存超限,需精确统计其内存消耗。

命令

# 获取容器内所有进程的 PID  
CONTAINER_PIDS=$(docker inspect --format='{{.State.Pid}}' my_container)  
pgrep -P $CONTAINER_PIDS | xargs smem -c "name uss pss rss" -k -P  

输出示例

Command                  USS      PSS      RSS  
python3 app.py          1200K    1500K    1800K  
nginx: worker process    800K    1000K    1200K  

分析

  • 容器总 PSS = 1500K + 1000K = 2500KB,更接近真实内存占用(传统 RSS 统计会重复计算共享内存)。


案例 4:生成内存使用报告(适合自动化监控)

场景:定时记录内存使用情况并生成 CSV 报告。

脚本

#!/bin/bash  
DATE=$(date '+%Y-%m-%d %H:%M:%S')  
smem -H -c "name uss pss rss" -t -m | awk -v date="$DATE" '{print date "," $0}' >> /var/log/mem_report.csv  

定时任务(每 30 分钟执行):

crontab -e  
*/30 * * * * /path/to/script.sh  

CSV 示例

2023-10-01 14:00:00,apache2,120,150,200  
2023-10-01 14:00:00,mysqld,300,320,350  
2023-10-01 14:00:00,total,420,470,550  

案例 5:分析共享内存的分布

场景:某服务多个进程共享内存,需评估资源分配是否合理。

命令

smem -c "command uss pss rss" -m -k -P "nginx"  

输出示例

Command              USS     PSS     RSS  
nginx: master        5M      6M      8M  
nginx: worker        4M      5M      7M  
nginx: worker        4M      5M      7M  
nginx: worker        4M      5M      7M  

分析

  • 每个 worker 进程的 PSS 为 5MB(USS=4MB + 共享内存 1MB),总 PSS = 6MB(master) + 3*5MB = 21MB。

  • 传统 RSS 统计会显示 8MB + 3*7MB = 29MB,高估了实际内存消耗。


六、高级技巧
  1. 生成图形化报告

    smem --pie=command -s pss  # 生成按进程 PSS 占比的饼图(需图形界面支持)
  2. 结合 watch 实时监控

    watch -n 1 'smem -s pss -r -m | head -n 10'
  3. 过滤特定进程并排序

    smem -P "java" -s swap -r  # 按 Java 进程的 Swap 使用降序排序

七、注意事项
  1. 权限要求:查看其他用户进程的内存信息需 sudo 权限。

  2. 内核支持:部分指标依赖 /proc/<pid>/smaps 文件,需内核版本 ≥ 2.6.14。

  3. 数据解读

    • USS 是进程独占内存,直接释放需终止进程。

    • PSS 是评估多进程共享内存场景的关键指标。

    • 高 Swap 使用可能因物理内存不足或 swappiness 配置不当。


通过 smem,运维工程师可精准识别内存泄漏、优化多进程应用资源分配,并为容器化环境提供更真实的内存监控数据。结合 topfree 等工具,可构建完整的内存分析体系。

pmap命令

一、命令概述

pmap 是 Linux 系统中用于分析进程内存映射的实用工具,可显示进程的虚拟内存布局、内存区域权限、映射文件及内存占用详情。其核心价值在于诊断内存泄漏、分析共享内存分配,并帮助开发者理解进程的内存使用结构(如堆、栈、动态库等)。


二、安装方法

pmap 通常预装在大多数 Linux 发行版中,属于 procpsprocps-ng 工具包。若系统未内置,可通过以下方式安装:

# Debian/Ubuntu
apt-get install procps
​
# RHEL/CentOS
yum install procps-ng
​
# 验证安装
pmap --version

三、核心字段解析
字段说明
Address内存区域的起始虚拟地址(十六进制)。
Kbytes虚拟内存大小(KB)。
RSS驻留物理内存大小(KB),即实际使用的物理内存。
Dirty脏页大小(被修改但未写入磁盘的内存,KB),需 -x 选项显示。
Mode权限标记:r(读)、w(写)、x(执行)、s(共享)、p(私有)。
Mapping内存区域类型或关联文件,如 [heap][stack]libc.so.6 等。

适用场景

  • Dirty:分析频繁修改的内存区域(如缓存或缓冲区)。

  • RSS:评估进程实际物理内存占用。

  • Mapping:定位内存泄漏的模块或异常映射。


四、基本语法及常用选项
pmap [选项] <PID>
选项说明
-x显示扩展信息(RSS、Dirty、内存模式等)。
-d显示内存映射的设备信息(主设备号:次设备号)。
-q安静模式,省略头尾统计行。
-A <范围>仅显示指定地址范围内的内存映射(如 -A 0x55*)。
-c显示完整路径(动态库或文件的绝对路径)。
-p显示内存保护标志(需 -x 配合)。

五、工作案例场景
案例 1:快速定位进程内存占用详情

场景:某 Java 服务内存占用异常,需分析其内存分配细节。

命令

pmap -x 1234  # 1234 为进程 PID

输出示例

Address           Kbytes     RSS   Dirty Mode  Mapping  
0000555555554000       4       4       0 r-x-- java  
00007ffff7a00000   102400   51200   25600 rw--- [heap]  
00007ffff7bd0000    10240       0       0 ----- [anon]  
...
----------------  -------  ------  ------  
total kB:         1048576  524288   25600

分析

  • [heap] 区域 Dirty 页高达 25600KB,可能因对象频繁创建/修改。

  • 匿名内存([anon])占用 10240KB,需检查是否未释放临时缓冲区。


案例 2:检查共享内存使用

场景:多进程服务共享内存异常,需验证共享段映射。

命令

pmap -x 5678 | grep -E 'shm|SYSV'

输出示例

00007fffe0000000   16384   16384   16384 rw-s- SYSV00000000  # 共享内存段

分析

  • 共享内存段(SYSV 标记)的 RSS 和 Dirty 均为 16384KB,表明所有进程共享同一物理内存。


案例 3:分析动态库内存占用

场景:某进程加载了异常动态库,需确认其路径及内存占用。

命令

pmap -c 9012 | grep .so  # 过滤动态库

输出示例

00007ffff7de1000     256     128       0 r-x-- /usr/lib/x86_64-linux-gnu/libz.so.1.2.11

分析

  • 动态库 libz.so 占用 128KB RSS,验证是否为预期版本。


案例 4:排查内存泄漏(周期性监控)

场景:服务运行后内存持续增长,需定期抓取内存快照。

脚本

#!/bin/bash  
PID=$(pgrep my_service)  
pmap -x $PID > /tmp/mem_snapshot_$(date +%s).log  

分析方法

  • 对比多次快照中 [heap][anon] 区域的 RSS 增长趋势。


案例 5:调试硬件设备内存映射

场景:GPU 加速服务异常,需检查设备内存映射。

命令

pmap -d 6789 | grep -i 'nvidia'

输出示例

0000700000000000   65536       0       0 rw--- nvidia-uvm:0  # GPU 设备内存

分析

  • 设备内存映射成功,但 RSS 为 0,表明数据暂未加载到物理内存。


六、高级技巧
  1. 结合 gdb 调试内存地址

    pmap -x 1234 | grep [heap]  # 获取堆地址
    gdb -p 1234 -ex "x/10x 0x7ffff7a00000"  # 查看堆内存内容
  2. 统计内存类型分布

    pmap -x 1234 | awk '/\[heap\]/ {heap+=$2} /\[stack\]/ {stack+=$2} END {print "Heap:", heap, "Stack:", stack}'
  3. 监控脏页变化(需 root)

    watch -n 1 'pmap -x 1234 | grep "rw---" | awk "{sum+=\$4} END {print sum}"'

七、注意事项
  1. 权限要求

    • 查看其他用户进程需 sudo 或 root 权限。

    • 部分内核版本可能限制 /proc/<pid>/smaps 访问。

  2. 数据解读

    • Dirty 页:可能因写时复制(Copy-on-Write)机制虚高,需结合业务逻辑判断。

    • 匿名内存:可能包含线程栈或 malloc 分配的内存,需进一步分析。

  3. 性能影响

    • 频繁执行 pmap 可能对高负载进程产生性能扰动。


通过 pmap,可深入分析进程内存布局,快速定位内存泄漏、异常映射或硬件资源冲突问题。结合 smemvalgrind 等工具,可构建全面的内存优化体系。

sar命令


一、命令概述

sar(System Activity Reporter)是 Linux 系统性能监控工具,属于 sysstat 工具包。它用于收集、报告和保存系统资源使用情况,涵盖 CPU、内存、磁盘、网络、进程队列等核心指标,支持实时监控历史数据分析,是运维工程师进行性能调优和故障排查的核心工具。


二、安装方法
# Debian/Ubuntu
apt-get install sysstat
​
# RHEL/CentOS(需启用 EPEL 仓库)
yum install epel-release && yum install sysstat
​
# 启动数据收集服务(默认每10分钟收集一次)
systemctl enable --now sysstat
​
# 验证安装
sar -V

三、核心指标解析
子系统关键指标说明
CPU%user, %system用户态/内核态 CPU 使用率
%iowaitCPU 等待 I/O 操作的时间占比
%idleCPU 空闲时间占比
内存kbmemfree, kbmemused空闲/已用物理内存(KB)
%memused内存使用率
kbswpfree, kbswpused空闲/已用交换分区(KB)
磁盘tps每秒 I/O 传输次数(Transfers Per Second)
rkB/s, wkB/s每秒读/写数据量(KB)
网络rxkB/s, txkB/s每秒接收/发送数据量(KB)
rxpck/s, txpck/s每秒接收/发送的网络包数量
进程队列runq-sz运行队列中的进程数(等待 CPU 的进程)
plist-sz系统进程总数

四、基本语法及常用选项
sar [选项] [间隔时间] [次数]
选项说明
-u显示 CPU 使用率(默认报告)
-r显示内存和交换分区使用情况
-d显示磁盘 I/O 统计(需 root 权限)
-n DEV显示网络接口流量统计
-n TCP显示 TCP 连接状态(如重传率、连接数)
-b显示块设备(磁盘)活动
-q显示进程队列和负载
-p人性化显示磁盘名称(如 sda 而非 dev8-0
-s <时间>指定历史数据的开始时间(格式:HH:MM:SS
-e <时间>指定历史数据的结束时间
-f <文件>从指定文件读取历史数据(默认路径:/var/log/sa/saXX,XX 为日期)

五、工作案例场景
案例 1:实时监控 CPU 使用率

场景:服务器 CPU 使用率突增,需快速定位高负载原因。

命令

sar -u 2 5  # 每2秒采样一次,共5次

输出示例

Linux 5.4.0-91-generic (hostname)  10/01/2023  _x86_64_  (4 CPU)
​
14:30:00     CPU     %user     %nice   %system   %iowait    %steal     %idle
14:30:02     all     85.20      0.00      8.50      5.30      0.00      1.00
14:30:04     all     90.10      0.00      7.80      1.90      0.00      0.20
...
Average:     all     87.65      0.00      8.15      3.60      0.00      0.60

分析

  • %user 长期高于 85%,表明用户态进程(如应用代码)是 CPU 瓶颈。

  • %iowait 偶尔较高,需结合磁盘 I/O 分析是否有存储延迟。


案例 2:分析历史内存使用

场景:凌晨服务出现内存不足告警,需回溯历史数据。

命令

sar -r -s 02:00:00 -e 04:00:00 -f /var/log/sa/sa01  # 查看1号凌晨2点到4点的数据

输出示例

02:00:01 AM kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached
02:10:01 AM   1024000   1502000   3072000     75.00     20480    512000
02:20:01 AM    512000    901000   3584000     87.50     10240    256000
...
03:50:01 AM    256000    614000   3840000     94.00      5120    128000

分析

  • kbmemused 从 75% 增长至 94%,可能存在内存泄漏或未释放缓存。

  • kbcached 下降,表明系统尝试释放缓存以缓解内存压力。


案例 3:诊断磁盘 I/O 瓶颈

场景:数据库写入缓慢,怀疑磁盘性能不足。

命令

sar -d -p 1 10  # 每1秒采样一次,共10次

输出示例

14:35:01    DEV       tps  rkB/s  wkB/s  %util
14:35:02    sda    1200.00 8000.00 40000.00  99.80
14:35:03    sda    1150.00 7500.00 38000.00  98.50
...
Average:    sda    1100.00 7000.00 39000.00  99.00

分析

  • %util 接近 100%,表明磁盘满负荷运行。

  • wkB/s 高达 39MB/s,需检查是否写入负载过高或磁盘硬件性能不足。

14:40:01    IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s
14:40:02    eth0    2500.00   1800.00    1200.00     900.00
14:40:03    eth0    3000.00   2000.00    1500.00    1000.00
...
Average:    eth0    2800.00   1900.00    1350.00     950.00

案例 4:监控网络流量峰值

场景:网络带宽突增,需定位流量来源。

命令

sar -n DEV 1 5  # 每1秒采样一次,共5次

输出示例

14:40:01    IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s
14:40:02    eth0    2500.00   1800.00    1200.00     900.00
14:40:03    eth0    3000.00   2000.00    1500.00    1000.00
...
Average:    eth0    2800.00   1900.00    1350.00     950.00

分析

  • rxkB/stxkB/s 持续高于 1MB/s,可能因大文件传输或 DDoS 攻击。

  • 结合 -n TCP 分析是否有异常连接(如 sar -n TCP 1 5)。


案例 5:生成综合性能报告

场景:生成全天性能摘要,用于周期性健康检查。

命令

sar -A -f /var/log/sa/sa01  # -A 显示所有统计

输出示例(部分):

...(包含 CPU、内存、磁盘、网络等全量数据)

分析

  • 全面分析系统瓶颈,如 CPU、内存、磁盘 I/O 的关联性。


六、高级技巧
  1. 自定义历史数据收集间隔

    sed -i 's/^INTERVAL=600/INTERVAL=60/' /etc/sysstat/sysstat  # 修改为每1分钟收集一次
    systemctl restart sysstat
  2. 生成图形化报告

    sar -u -f /var/log/sa/sa01 | awk '/^[0-9]/ {print $1, $3}' > cpu.csv
    # 使用 Excel 或 Python matplotlib 绘制折线图
  3. 过滤特定时间点数据

    sar -u -s 14:00:00 -e 15:00:00  # 仅分析下午2点到3点的数据

七、注意事项
  1. 数据存储

    • 历史数据保存在 /var/log/sa/saXX(XX 为日期),默认保留 30 天。

    • 需定期清理旧数据防止磁盘占满(如 find /var/log/sa -mtime +30 -delete)。

  2. 权限要求

    • 实时监控磁盘和网络需 root 权限。

    • 历史数据文件默认属主为 root:sadm,普通用户可能无法直接读取。

  3. 数据解读

    • %iowait 高:可能是磁盘瓶颈,但也可能因进程频繁等待锁。

    • %idle 低:若 %user 高,需优化应用代码;若 %system 高,需排查内核或驱动问题。


八、字段与选项速查表
报告类型关键字段说明常用选项示例
CPU%user, %system用户态/内核态 CPU 使用率sar -u 1 5
内存kbmemused, %memused内存使用量及百分比sar -r 1 5
磁盘 I/Otps, %util每秒 I/O 次数,设备利用率sar -d -p 1 5
网络流量rxkB/s, txkB/s接收/发送数据速率sar -n DEV 1 5
进程队列runq-sz等待 CPU 的进程数sar -q 1 5
交换分区kbswpfree空闲交换空间sar -S 1 5

通过 sar,可全面掌握系统资源使用趋势,快速定位性能瓶颈,并为容量规划提供数据支持。结合 topiostatnetstat 等工具,可构建高效的运维监控体系。

ss/netstat命令


一、命令概述
  • ss(Socket Statistics):Linux 新一代网络工具,用于替代 netstat,性能更高(直接读取内核数据),支持更丰富的过滤和显示选项。

  • netstat:传统网络工具,用于显示网络连接、路由表、接口统计等信息,逐渐被 ss 取代,但在旧系统中仍可能使用。


二、核心功能对比
功能ss 命令支持netstat 命令支持
显示 TCP/UDP 连接
显示监听端口
按协议/状态过滤✅(有限)
显示进程信息(PID/程序名)
显示内核路由表
显示网络接口统计
显示内存使用统计

三、ss 命令详解
1. 基本语法
ss [选项] [过滤条件]
2. 常用选项
选项说明
-t显示 TCP 连接
-u显示 UDP 连接
-l显示监听端口
-n禁用域名解析(显示 IP 和端口号)
-p显示进程信息(需 root 权限)
-s显示汇总统计(总连接数、内存使用等)
-o显示计时器信息(如连接保持时间)
-4仅显示 IPv4 连接
-6仅显示 IPv6 连接
-a显示所有连接(包括监听和非监听)
-i显示 TCP 内部详细信息(如拥塞窗口)
3. 过滤语法
  • 按状态过滤state <状态名>(如 established, time-wait, listen

  • 按端口/IP 过滤src <IP>:<端口>dst <IP>:<端口>

  • 组合过滤and/or 连接多个条件


四、netstat 命令详解
1. 基本语法
netstat [选项]
2. 常用选项
选项说明
-t显示 TCP 连接
-u显示 UDP 连接
-l显示监听端口
-n禁用域名解析
-p显示进程信息(需 root 权限)
-r显示路由表
-i显示网络接口统计
-s显示协议统计汇总(如 TCP 重传数)
-a显示所有连接

五、工作案例场景

案例 1:快速检查服务端口是否监听

场景:部署 Nginx 后,验证 80 端口是否正常监听。

使用 ss

ss -tln | grep ':80'

输出示例

LISTEN 0      128         0.0.0.0:80        0.0.0.0:*

关键字段

  • LISTEN 表示端口处于监听状态。

  • 0.0.0.0:80 表示监听所有 IPv4 地址的 80 端口。

使用 netstat

netstat -tln | grep ':80'

案例 2:分析 ESTABLISHED 连接数异常

场景:服务器连接数激增,怀疑遭受 DDoS 攻击或程序 Bug。

使用 ss 统计每个 IP 的连接数

ss -t -n state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

输出示例

   50 192.168.1.10010 203.0.113.5

分析:IP 192.168.1.100 建立了 50 个连接,需检查是否为正常业务流量。


案例 3:定位 TIME_WAIT 状态过多问题

场景:服务器 TIME_WAIT 连接堆积,导致端口耗尽。

使用 ss 统计各状态连接数

ss -s  # 查看汇总信息

输出示例

Total: 450
TCP:   38 (estab 10, closed 20, orphaned 0, timewait 15)

进一步分析

ss -tan state time-wait | awk '{print $5}' | cut -d: -f1 | sort | uniq -c

解决方案:优化 TCP 参数(如 net.ipv4.tcp_tw_reuse)。


案例 4:排查进程占用端口

场景:启动服务时提示端口已被占用。

使用 ss 查找占用端口的进程

ss -tlnp | grep ':8080'

输出示例

LISTEN 0      128         0.0.0.0:8080       0.0.0.0:*    users:(("java",pid=1234,fd=15))

关键信息:进程 java(PID 1234)占用了 8080 端口。

使用 netstat

netstat -tlnp | grep ':8080'

案例 5:监控网络吞吐量(结合 netstat

场景:分析网络接口是否达到带宽瓶颈。

使用 netstat 查看接口统计

netstat -i  # 显示接口列表
netstat -e  # 显示详细统计(收发包、错误数)

输出示例

Kernel Interface table
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0      1500 1234567      0      0 0        987654      0      0      0 BMRU

分析

  • RX-OK/TX-OK 表示收/发包总数。

  • RX-ERRTX-ERR 不为零时,可能存在网络硬件问题。


案例 6:分析 TCP 重传率(网络质量)

使用 ss 查看 TCP 内部指标

ss -ti  # 显示 TCP 内部信息

输出示例

ESTAB      0      0      192.168.1.10:ssh    192.168.1.100:56789cubic wscale:7,7 rto:208 rtt:1.2/0.8 ato:40 mss:1448 cwnd:10 retrans:0/5

关键字段

  • retrans:0/5:总重传次数为 5,当前连接重传 0 次。

  • 高重传率可能因网络拥塞或丢包。


案例 7:自动化监控脚本

场景:定时记录服务器连接数并告警。

脚本示例

#!/bin/bash
CONN_COUNT=$(ss -s | awk '/^TCP:/ {print $2}')  # 获取总 TCP 连接数
if [ $CONN_COUNT -gt 10000 ]; thenecho "警告:TCP 连接数过高 ($CONN_COUNT)" | mail -s "网络告警" admin@example.com
fi

定时任务(每 5 分钟执行):

crontab -e
*/5 * * * * /path/to/script.sh

六、高级技巧
  1. ss 过滤组合

    # 查找来自 192.168.1.100 且目标端口 80 的连接
    ss -t -n src 192.168.1.100 and dst :80
  2. netstat 路由表分析

    netstat -rn  # 显示内核路由表(等效于 `route -n`)
  3. 统计 UDP 丢包

    netstat -su  # 显示 UDP 协议统计信息

七、注意事项
  1. 权限要求:查看进程信息(-p 选项)需 root 权限。

  2. 性能差异ss 处理海量连接时性能远优于 netstat

  3. 状态解释

    • ESTABLISHED:已建立的连接。

    • TIME_WAIT:等待关闭的连接(正常关闭后保留 2MSL 时间)。

    • CLOSE_WAIT:应用未主动关闭连接(可能代码 Bug)。


通过 ssnetstat,运维工程师可以快速诊断端口占用、连接状态异常、网络性能瓶颈等问题。建议优先使用 ss,在需要路由或接口统计时结合 netstat

curl/wget命令


一、核心区别与适用场景
工具核心特点典型场景
curl支持 60+ 协议,侧重数据传输/调试,无递归下载功能API 测试、HTTP 请求调试、流式数据传输
wget专注 HTTP/HTTPS/FTP,支持递归下载和断点续传批量下载文件、网站镜像、离线资源备份

二、curl 命令详解
1. 安装与基本语法
# 安装(一般系统已内置)
apt-get install curl   # Debian/Ubuntu
yum install curl       # RHEL/CentOS
​
# 基本语法
curl [选项] <URL>
2. 常用选项
选项说明
-I仅显示响应头(快速检查 HTTP 状态码)
-X <METHOD>指定 HTTP 方法(如 GET/POST/PUT/DELETE
-H "Header:Value"添加请求头(如 -H "Content-Type: application/json"
-d "data"发送 POST 数据(支持 JSON/表单)
-o <文件名>输出到文件(保留远程文件名用 -O
-u user:pass基本认证(或使用 -n 读取 .netrc
-k忽略 SSL 证书验证(生产环境慎用)
-v显示详细通信过程(调试用)
--limit-rate 100K限速下载(避免占用带宽)
-x <代理IP:端口>通过代理发送请求
3. 工作案例
案例 1:快速检查服务健康状态
# 检查 Web 服务是否返回 200
curl -s -o /dev/null -w "%{http_code}" http://api.example.com/health
# 输出:200

选项解析

  • -s:静默模式(不显示进度)

  • -o /dev/null:丢弃响应内容

  • -w "%{http_code}":仅输出 HTTP 状态码


案例 2:调试 API 接口
# 发送 JSON 格式的 POST 请求
curl -X POST \-H "Content-Type: application/json" \-H "Authorization: Bearer token123" \-d '{"user": "admin", "action": "restart"}' \https://api.example.com/v1/endpoint

关键点

  • 使用 -H 指定 JSON 头和认证令牌

  • -d 发送 JSON 数据(自动设置 Content-Length


案例 3:下载文件并重命名
# 下载文件并保存为指定名称(限速 1MB/s)
curl -o backup.tar.gz --limit-rate 1M https://example.com/files/backup.tar

案例 4:模拟浏览器访问
# 伪装 User-Agent 和 Referer
curl -A "Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0" \-e "https://google.com" \http://target-site.com

三、wget 命令详解
1. 安装与基本语法
# 安装
apt-get install wget   # Debian/Ubuntu
yum install wget       # RHEL/CentOS
​
# 基本语法
wget [选项] <URL>
2. 常用选项
选项说明
-c断点续传(自动检测已下载部分)
-r递归下载(镜像网站)
-np不追溯父目录(配合 -r 使用)
-l <深度>递归下载深度(如 -l 3
-P <目录>指定下载目录
-O <文件名>指定输出文件名
-q静默模式(无输出日志)
-b后台下载
--limit-rate=200k限速下载
--user=<用户>设置认证用户名
--password=<密码>设置认证密码(不安全,建议用 --ask-password
3. 工作案例
案例 1:批量下载日志文件
# 下载所有匹配的日志文件(限速 500KB/s)
wget -c -r -np -l 1 -A "access_*.log" --limit-rate=500k http://logs.example.com/

选项解析

  • -A "access_*.log":仅下载匹配文件名的文件

  • -l 1:只递归一级目录


案例 2:镜像静态网站
# 完整镜像网站(转换链接适配本地浏览)
wget -mk -w 2 --random-wait -e robots=off https://static-site.example.com

选项解析

  • -m:镜像模式(等价于 -r -N -l inf

  • -k:转换链接为本地可访问

  • -w 2:每次请求间隔 2 秒

  • -e robots=off:忽略 robots.txt 限制


案例 3:后台下载大文件
# 后台下载 ISO 文件并记录日志
wget -b -c -o download.log -P /iso https://mirror.example.com/ubuntu-22.04.iso

验证下载状态

tail -f download.log  # 实时跟踪日志

案例 4:通过代理下载
# 使用代理服务器下载(需认证)
wget -e use_proxy=yes -e http_proxy=10.1.1.1:8080 \--proxy-user=user --proxy-password=pass \https://secured.example.com/data.zip
# 使用环境变量代替明文密码
export PASS="secret"
curl -u admin:$PASS https://api.example.com

四、安全与调试技巧
  1. HTTPS 证书验证

    # 强制校验证书(curl 默认开启,wget 需配置)
    curl --cacert /path/to/ca-bundle.crt https://secure-site.com
    wget --ca-certificate=/path/to/ca-bundle.crt https://secure-site.com
  2. 敏感信息保护

    # 使用环境变量代替明文密码
    export PASS="secret"
    curl -u admin:$PASS https://api.example.com
  3. 调试 TLS 握手

    curl -v --tlsv1.3 --tls-max 1.3 https://example.com

五、高级运维场景
场景 1:自动化部署脚本
# 下载最新版本并触发部署
LATEST_URL=$(curl -s https://api.github.com/repos/org/repo/releases/latest | grep "browser_download_url" | cut -d'"' -f4)
wget -q $LATEST_URL -O /tmp/release.tar.gz
tar xzf /tmp/release.tar.gz -C /opt/app
systemctl restart app
场景 2:监控 API 响应时间
# 测量 API 响应时间(毫秒)
curl -o /dev/null -s -w "Connect: %{time_connect} TTFB: %{time_starttransfer} Total: %{time_total}\n" https://api.example.com
场景 3:分布式文件同步
# 从多个源并行下载分片
wget https://mirror1.example.com/file.part1 &
wget https://mirror2.example.com/file.part2 &
wait
cat file.part1 file.part2 > complete.iso

六、总结对比
操作curl 方案wget 方案
简单文件下载curl -O URLwget URL
断点续传curl -C - -O URLwget -c URL
递归下载需配合脚本wget -r URL
提交表单数据curl -d "key=val" URL不支持
流量控制--limit-rate 1M--limit-rate=1M
后台执行需配合 nohup&wget -b URL

选择建议

  • API 交互/调试 → 优先使用 curl

  • 批量下载/镜像 → 优先使用 wget

nc(ncat)命令


一、命令概述

nc(netcat)是 Linux 系统中的“网络瑞士军刀”,支持 TCP/UDP 端口监听、数据传输、端口扫描、代理转发 等场景。它不加密通信内容,适用于快速调试和临时传输,但敏感场景需配合加密工具(如 openssl)。


二、安装方法
# Debian/Ubuntu
apt-get install netcat
​
# RHEL/CentOS
yum install nmap-ncat
​
# 验证安装
nc -h

三、核心选项与语法
nc [选项] <目标IP> <目标端口>
选项说明
-l监听模式(服务端)
-v显示详细输出(-vv 更详细)
-u使用 UDP 协议(默认 TCP)
-z端口扫描模式(不发送数据)
-k客户端断开后保持监听(配合 -l
-n禁用 DNS 解析(直接使用 IP)
-p指定本地源端口
-w <秒>超时时间
-e <命令>连接成功后执行命令(高危操作)

四、工作案例场景
案例 1:测试端口连通性

场景:检查目标主机 80 端口是否开放。

nc -zv 192.168.1.100 80

输出解析

  • Connection to 192.168.1.100 80 port [tcp/http] succeeded! → 端口开放

  • nc: connect to 192.168.1.100 port 80 (tcp) failed: Connection refused → 端口关闭


案例 2:临时文件传输

场景:跨服务器快速传输文件(无需 SCP/FTP)。

接收端(服务端)

nc -l -p 8080 > received_file.tar

发送端(客户端)

nc -n 192.168.1.100 8080 < send_file.tar

验证

md5sum send_file.tar received_file.tar  # 确保哈希一致

案例 3:远程调试与交互式Shell

场景:临时调试应用程序的 TCP 服务。

连接服务并发送测试数据

nc 192.168.1.100 3306
# 输入模拟 MySQL 握手包(需根据协议构造数据)

反向Shell(谨慎使用)攻击端(监听)

nc -lvnp 4444

目标端(执行)

nc -e /bin/bash 192.168.1.200 4444  # 连接后获得目标 Shell

⚠️ 注意:此操作存在安全风险,需仅在授权环境中使用。


案例 4:简易代理或端口转发

场景:将本地 8080 端口流量转发到远程主机的 80 端口。

mkfifo /tmp/fifo
nc -l -p 8080 < /tmp/fifo | nc 192.168.1.100 80 > /tmp/fifo

原理

  • 使用命名管道 /tmp/fifo 实现双向数据流转发。


案例 5:UDP 服务测试

场景:验证 DNS 服务器 UDP 53 端口响应。

# 发送 DNS 查询请求(需构造二进制数据)
echo -n "DNS查询二进制数据" | nc -u 8.8.8.8 53

案例 6:多端口批量扫描

场景:扫描目标主机 20-100 端口的开放状态。

nc -zv 192.168.1.100 20-100 2>&1 | grep succeeded

输出示例

Connection to 192.168.1.100 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.100 80 port [tcp/http] succeeded!

案例 7:网络服务存活监控

场景:定时检测 Nginx 服务端口是否存活。

脚本

#!/bin/bash
if ! nc -z -w 3 localhost 80; thenecho "Nginx 服务异常!" | mail -s "服务告警" admin@example.comsystemctl restart nginx
fi

定时任务(每 5 分钟执行):

crontab -e
*/5 * * * * /path/to/script.sh

五、高级技巧
1. 结合 tar 实时压缩传输

发送端

tar czf - /data | nc -l -p 8080

接收端

nc 192.168.1.100 8080 | tar xzf - -C /backup
2. 加密通信(使用 openssl 增强安全性)

服务端

openssl s_server -quiet -cert server.pem -port 8080

客户端

nc -c openssl s_client -quiet -connect 192.168.1.100:8080
3. 模拟 HTTP 请求
echo -e "GET / HTTP/1.1\nHost: example.com\n\n" | nc example.com 80

六、注意事项
  1. 安全风险

    • nc 不加密数据,敏感数据传输应使用 scprsyncopenssl

    • 避免在生产环境使用 -e 参数执行反向 Shell。

  2. 防火墙限制

    • 确保目标端口在防火墙中放行(TCP/UDP)。

  3. 性能局限

    • 大文件传输时效率低于专用工具(如 rsync)。


通过灵活运用 nc,运维工程师可快速完成网络调试、数据传输和临时服务部署,但需严格遵循安全规范。

eth-tool命令


一、命令概述

ethtool 是 Linux 下用于 查看和配置网络接口(网卡)参数 的核心工具,支持查询驱动信息、调整速度和双工模式、诊断丢包问题等,是网络性能调优和故障排查的必备工具。


二、核心选项与参数
选项说明
-i <接口>显示网卡驱动信息(驱动版本、固件版本等)
-k <接口>查看网卡 Offload 功能状态(如 TCP 分段、校验和计算)
-S <接口>显示统计信息(收发包计数、错误计数等)
-a <接口>查看自动协商(Auto-negotiation)和流控(Flow Control)状态
-s <接口>修改网卡参数(速度、双工模式等)
--show-ring <接口>显示环形缓冲区(Ring Buffer)大小
--set-ring <接口>调整环形缓冲区大小(影响吞吐量和延迟)
--identify <接口>让网卡物理指示灯闪烁(用于定位物理设备)
--reset <接口>重置网卡硬件和驱动状态

三、工作案例场景
案例 1:检查网卡基本状态

场景:验证网卡 eth0 的连接状态和驱动信息。

ethtool eth0  

输出示例

Settings for eth0:  Supported ports: [ TP ]  Supported link modes:   10baseT/Half 10baseT/Full  100baseT/Half 100baseT/Full  1000baseT/Full  Speed: 1000Mb/s  Duplex: Full  Auto-negotiation: on  Port: Twisted Pair  PHYAD: 1  Transceiver: internal  Link detected: yes  

关键信息

  • Speed/Duplex:当前速率和双工模式(若显示 Half 或非预期值,可能需手动配置)。

  • Link detected:物理连接是否正常。


案例 2:修改网卡速率和双工模式

场景:强制 eth0 以 100 Mbps 全双工模式运行(禁用自动协商)。

sudo ethtool -s eth0 speed 100 duplex full autoneg off  

验证配置

ethtool eth0 | grep -E "Speed|Duplex|Auto-negotiation"  

输出示例

Speed: 100Mb/s  
Duplex: Full  
Auto-negotiation: off  

案例 3:诊断丢包或高延迟问题

场景:检查 eth0 的统计信息和环形缓冲区设置。

# 查看统计信息(错误包、丢包计数)  
ethtool -S eth0  
​
# 查看环形缓冲区大小  
ethtool --show-ring eth0  
​
# 调整环形缓冲区(增大 RX/TX 缓冲区减少丢包)  
sudo ethtool --set-ring eth0 rx 4096 tx 4096  

关键字段

  • rx_dropped/tx_dropped:接收/发送丢包计数。

  • rx_missed_errors:因缓冲区不足导致的丢包。


案例 4:排查 Offload 功能导致的性能问题

场景:禁用 TCP 分段 Offload(TSO)以解决虚拟机网络性能问题。

# 查看当前 Offload 状态  
ethtool -k eth0  
​
# 关闭 TSO  
sudo ethtool -K eth0 tso off  
​
# 持久化配置(写入启动脚本)  
echo "ethtool -K eth0 tso off" >> /etc/rc.local  

输出示例

Offload parameters for eth0:  
tcp-segmentation-offload: off  
udp-fragmentation-offload: off  
generic-segmentation-offload: on  

案例 5:定位物理网卡设备

场景:在服务器机架中通过指示灯闪烁确认 eth0 对应的物理端口。

sudo ethtool --identify eth0 10  # 闪烁 10 秒  

操作后:观察服务器网卡指示灯是否按设定频率闪烁。


四、高级技巧
1. 自动化网卡健康检查(脚本)
#!/bin/bash  
INTERFACE="eth0"  
SPEED=$(ethtool $INTERFACE | grep Speed | awk '{print $2}')  
DUPLEX=$(ethtool $INTERFACE | grep Duplex | awk '{print $2}')  
LINK=$(ethtool $INTERFACE | grep "Link detected" | awk '{print $3}')  
​
if [ "$LINK" != "yes" ]; then  echo "ERROR: $INTERFACE link down!"  
elif [ "$SPEED" != "1000Mb/s" ]; then  echo "WARNING: $INTERFACE speed is $SPEED (expected 1Gbps)"  
fi  
2. 持久化配置(避免重启失效)
# 编辑 NetworkManager 配置(如使用 NetworkManager)  
vim /etc/NetworkManager/dispatcher.d/99-ethtool  
​
# 内容示例:  
#!/bin/bash  
if [ "$1" == "eth0" ] && [ "$2" == "up" ]; then  ethtool -s eth0 speed 1000 duplex full autoneg on  
fi  
​
# 添加执行权限  
chmod +x /etc/NetworkManager/dispatcher.d/99-ethtool  

五、注意事项
  • 权限要求:修改网卡参数需 root 权限(使用 sudo)。

  • 硬件兼容性:部分设置依赖网卡驱动支持(如调整环形缓冲区大小)。

  • 自动协商冲突:手动设置速率/双工模式时需关闭自动协商(autoneg off)。

  • 生产环境慎用:修改关键参数前需在测试环境验证,避免网络中断。


六、总结

通过 ethtool,运维工程师可以:

  • 快速诊断物理层问题(连接状态、速率/双工模式)。

  • 优化网络性能(调整 Offload 功能、环形缓冲区)。

  • 定位硬件设备(通过指示灯闪烁)。

  • 持久化配置(确保重启后参数生效)。

核心口诀

速率双工查 ethtool,  
Offload 功能用 -K 调,  
统计信息 -S 看,  
物理定位 --identify。  

tcpdump命令


一、命令概述

tcpdump 是 Linux 系统下的 网络抓包分析工具,通过捕获网络接口的数据包,帮助运维工程师诊断网络连接问题、分析协议交互、定位异常流量等。它支持灵活的 BPF(Berkeley Packet Filter)过滤语法,可精准抓取目标流量。


二、安装与基本语法
# 安装(大多数系统已预装)
apt-get install tcpdump   # Debian/Ubuntu
yum install tcpdump       # RHEL/CentOS
​
# 基本语法
tcpdump [选项] [过滤表达式]

三、核心选项与参数
选项说明
-i <接口>指定网卡(如 eth0,默认抓取第一个非 loopback 接口)
-n禁用域名解析(显示 IP 和端口号)
-nn禁用端口号解析(如显示 80 而非 http
-s <长度>设置抓包长度(如 -s 0 抓取完整数据包)
-w <文件>保存抓包数据到文件(.pcap 格式)
-r <文件>读取保存的抓包文件
-c <数量>限制抓包数量(如 -c 100
-v显示详细输出(-vv-vvv 更详细)
-A以 ASCII 格式显示数据包内容(适合 HTTP 分析)
-X同时以 HEX 和 ASCII 显示数据内容
-e显示数据链路层信息(如 MAC 地址)

四、过滤表达式语法

BPF 过滤器支持按协议、IP、端口、标志位等组合过滤:

  • 协议tcpudpicmparp

  • IP 地址host 192.168.1.100src 10.0.0.1dst 172.16.0.2

  • 端口port 80src port 22dst port 53

  • 逻辑组合andornot

  • 标志位tcp[tcpflags] & (tcp-syn|tcp-ack) != 0


五、工作案例场景
案例 1:抓取 HTTP 请求内容

场景:分析 Web 服务的请求响应数据。

GET /api/v1/data HTTP/1.1  
Host: example.com  
User-Agent: curl/7.68.0  

选项解析

  • tcp port 80:抓取 TCP 80 端口的流量

  • 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420':匹配 TCP 负载中以 GET 开头的请求(HEX 值 47455420 对应 "GET ") 输出示例

GET /api/v1/data HTTP/1.1  
Host: example.com  
User-Agent: curl/7.68.0  

案例 2:检测 ICMP 不可达错误

场景:排查网络连通性问题(如防火墙拦截)。

tcpdump -ni eth0 icmp and icmp[0] == 3  

选项解析

  • icmp[0] == 3:匹配 ICMP 类型为 3(Destination Unreachable) 输出示例

IP 192.168.1.100 > 10.0.0.1: ICMP 10.0.0.1 udp port 1234 unreachable  

案例 3:分析 DNS 查询请求

场景:验证 DNS 解析是否正常。

tcpdump -ni eth0 -nn udp port 53  

输出示例

11:22:33.445 IP 192.168.1.100.45232 > 8.8.8.8.53: 12345+ A? example.com. (28)  
11:22:33.447 IP 8.8.8.8.53 > 192.168.1.100.45232: 12345 1/0/0 A 93.184.216.34 (44)  

案例 4:捕获 TCP 三次握手与挥手

场景:验证 TCP 连接建立是否正常。

tcpdump -ni eth0 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'  

输出示例

# 三次握手 SYN  
11:25:01.001 IP 192.168.1.100.54321 > 10.0.0.1.80: Flags [S], seq 123456789  
11:25:01.002 IP 10.0.0.1.80 > 192.168.1.100.54321: Flags [S.], seq 987654321, ack 123456790  
11:25:01.003 IP 192.168.1.100.54321 > 10.0.0.1.80: Flags [.], ack 987654322  
​
# 四次挥手 FIN  
11:30:01.004 IP 192.168.1.100.54321 > 10.0.0.1.80: Flags [F.], seq 123456800  
11:30:01.005 IP 10.0.0.1.80 > 192.168.1.100.54321: Flags [F.], seq 987654400  
11:30:01.006 IP 192.168.1.100.54321 > 10.0.0.1.80: Flags [.], ack 987654401  

案例 5:抓取异常流量(如端口扫描)

场景:检测网络中的 SYN 洪水攻击或端口扫描。

tcpdump -ni eth0 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack = 0'  

输出分析

  • 大量来自同一 IP 的 SYN 包且无后续 ACK,可能为 SYN 洪水攻击。


案例 6:保存抓包数据并离线分析

步骤

  1. 抓包保存

    tcpdump -ni eth0 -w traffic.pcap tcp port 443  
  2. 使用 Wireshark 分析

    wireshark traffic.pcap  
  3. 命令行解析

    tcpdump -r traffic.pcap -nn 'src 192.168.1.100'  

六、高级技巧
  1. 统计 TCP 重传率

    tcpdump -ni eth0 -c 1000 'tcp[tcpflags] & tcp-ack != 0' | grep 'retransmission' | wc -l  
  2. 提取 HTTP 请求的 Host 头

    tcpdump -ni eth0 -s 0 -A tcp port 80 | grep -oE 'Host: .*'  
  3. 实时监控 SSH 登录尝试

    tcpdump -ni eth0 'tcp port 22 and (tcp[20:4] = 0x5353482D)'  # 匹配 SSH 协议标识 "SSH-"  

七、注意事项
  1. 权限要求:抓包需要 root 权限(建议使用 sudo)。

  2. 性能影响:高速网络环境下,限制抓包数量(-c)或长度(-s)避免资源耗尽。

  3. 敏感信息:HTTP 明文传输的密码、Cookie 可能被捕获,需结合加密协议(HTTPS)使用。


通过 tcpdump,运维工程师可精准定位网络丢包、服务无响应、协议交互异常等问题,是网络故障排查的必备工具。结合 Wireshark 图形化分析,可进一步提升效率。

tshark(wireshark命令行)


一、命令概述

tshark 是 Wireshark 的命令行版本,提供 网络协议深度解析流量统计离线分析 能力。相比 tcpdump,它支持更友好的显示过滤语法(类似 Wireshark)和丰富的协议解码功能,适合复杂网络问题排查和自动化分析。


二、安装与基本语法
# 安装(Wireshark 套件的一部分)
apt-get install tshark   # Debian/Ubuntu
yum install wireshark    # RHEL/CentOS
​
# 基本语法
tshark [选项] [捕获过滤] [显示过滤]

三、核心选项与参数
选项说明
-i <接口>指定抓包网卡(如 eth0
-f "捕获过滤"设置 BPF 捕获过滤器(类似 tcpdump)
-Y "显示过滤"设置 Wireshark 显示过滤器(更强大的过滤能力)
-r <文件>读取离线抓包文件(.pcap.pcapng
-w <文件>保存抓包数据到文件
-n禁用域名解析(显示原始 IP/端口)
-T fields -e <字段>提取指定协议字段(如 -e http.host
-z <统计模块>生成流量统计报告(如 io,conv,endpoints
-q静默模式(仅输出统计结果)
-a <自动停止条件>设置自动停止捕获(如 duration:60 抓包 60 秒)

四、过滤语法
  1. 捕获过滤(BPF 语法):

    tshark -i eth0 -f "tcp port 80 and host 192.168.1.100"
  2. 显示过滤(Wireshark 语法):

    tshark -r traffic.pcap -Y "http.request.method == GET && ip.src == 10.0.0.1"

五、工作案例场景
案例 1:实时抓取并分析 HTTP 请求

场景:统计访问量最高的 HTTP 域名

tshark -i eth0 -Y "http.host" -T fields -e http.host | \
sort | uniq -c | sort -nr | head -n 10

输出示例

   1200 www.example.com800 api.example.com500 cdn.example.org

案例 2:离线分析 TCP 重传问题

场景:从抓包文件中分析 TCP 重传率

tshark -r traffic.pcap -Y "tcp.analysis.retransmission" -q -z io,phs

输出解析

Protocol Hierarchy Statistics
tcp    frames:1000 bytes:1000000|--http    frames:800 bytes:800000|--tcp.analysis.retransmission frames:50 bytes:50000  # 重传率 5%

案例 3:提取 DNS 查询记录

场景:从抓包文件中提取所有 DNS 查询的域名

tshark -r dns.pcap -Y "dns.flags.response == 0" -T fields -e dns.qry.name

输出示例

www.google.com
api.github.com
cdn.amazonaws.com

案例 4:生成流量会话统计

场景:分析抓包文件中的流量 TopN 会话

tshark -r traffic.pcap -q -z conv,tcp

输出示例

TCP Conversations
Filter:<No Filter>
|       <-      |                ->       |               Total      |
| Frames  Bytes | Frames  Bytes           | Frames  Bytes            |
| 100     50000 | 80      40000           | 180     90000           | 192.168.1.100:5000 <-> 10.0.0.1:80

案例 5:提取 HTTP 请求的 User-Agent

场景:分析爬虫或异常客户端

tshark -r http.pcap -Y "http.user_agent" -T fields -e http.user_agent | \
sort | uniq -c | sort -nr

输出示例

  300 Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.050 python-requests/2.31.05 curl/7.88.1

案例 6:检测 SSH 暴力破解行为

场景:分析 SSH 登录尝试频率

tshark -i eth0 -Y "tcp.port == 22 && ssh.protocol == 2" -c 1000 -q -z io,phs

关键指标

  • 大量 ssh.protocol 数据包来自同一 IP → 可能为暴力破解攻击。


六、高级技巧
1. 生成 I/O 图表(流量趋势)
tshark -r traffic.pcap -q -z io,stat,60,"SUM(frame.len)frame.len" > traffic_report.txt

输出解析

Time            | SUM(frame.len)
2024-01-01 10:00:00 | 1000000
2024-01-01 10:01:00 | 1200000
2. 提取 HTTPS SNI(加密前握手信息)
tshark -r https.pcap -Y "tls.handshake.extensions_server_name" -T fields -e tls.handshake.extensions_server_name
3. 自动化协议分析脚本
#!/bin/bash
tshark -r $1 -Y "dns" -T json | jq '[.[] | {time: ._source.layers.frame[0], query: ._source.layers.dns[0].dns.qry_name}]' > dns_report.json

七、注意事项
  1. 权限要求:抓包需要 root 权限(使用 sudo)。

  2. 性能优化

    • 使用 -c-a 限制抓包规模,避免内存溢出。

    • 优先使用显示过滤(-Y)替代捕获过滤(-f)减少内存占用。

  3. 敏感数据处理

    • 避免在日志中明文存储敏感信息(如 Cookie、密码)。

    • 使用 -P--disable-protocol 禁用特定协议解析。


通过 tshark,运维工程师可以快速实现协议级流量分析、异常行为检测和自动化报告生成,尤其在处理加密协议(如 TLS/SSL)和复杂网络交互时,其深度解析能力远超传统工具。

三、磁盘与文件管理

df/du命令


一、命令概述
  • df(Disk Free):显示文件系统的磁盘空间使用情况,快速定位分区空间不足问题。

  • du(Disk Usage):统计文件或目录的磁盘使用量,精准定位大文件/目录。


二、df 命令详解
1. 核心选项
df [选项] [文件或目录]
选项说明
-h人类可读格式(自动转换单位,如 GB/MB)
-i显示 inode 使用情况(文件数量限制)
-T显示文件系统类型(如 ext4/xfs)
-x <类型>排除指定文件系统类型(如 -x tmpfs
--total显示总使用量汇总
2. 输出字段解析
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   30G   20G  60% /
  • Use%:使用率 ≥80% 需告警

  • Avail:剩余可用空间

3. 工作案例
案例 1:快速检查磁盘空间
df -Th

输出示例

Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda1      ext4       50G   40G   10G  80% /
tmpfs          tmpfs     3.9G     0  3.9G   0% /dev/shm

分析:根分区 / 使用率 80%,需关注。

案例 2:排查 inode 耗尽问题
df -i /data

输出示例

Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sdb1      1.2M   1.1M   100K   92% /data

结论:inode 使用率 92%,可能因小文件过多导致,需清理或扩容。


三、du 命令详解
1. 核心选项
du [选项] [文件或目录]
选项说明
-h人类可读格式
-s显示总用量(不递归子目录)
--max-depth=N限制目录深度(如 --max-depth=1
--exclude="模式"排除匹配的文件/目录
-a显示所有文件(包括隐藏文件)
-c显示总计(结合 -s 使用)
2. 工作案例
案例 1:定位根目录下最大子目录
du -h --max-depth=1 / | sort -hr

输出示例

50G  /var
30G  /home
10G  /usr
案例 2:统计日志目录占用空间
du -sh /var/log

输出示例

12G  /var/log
案例 3:查找超过 1GB 的文件
du -ah / | grep -E '[0-9]+G' | sort -hr

输出示例

5.0G  /var/log/app/error.log
3.5G  /home/user/backup.tar

四、综合运维场景
场景 1:自动化磁盘空间监控脚本
#!/bin/bash
THRESHOLD=80
OUTPUT=$(df -h | awk '0+$5 >= '$THRESHOLD' {print $6 ": " $5}')
if [ -n "$OUTPUT" ]; thenecho "警告:以下分区使用率超过 ${THRESHOLD}%"echo "$OUTPUT" | mail -s "磁盘空间告警" admin@example.com
fi

定时任务(每日检查):

crontab -e
0 9 * * * /path/to/script.sh
场景 2:清理过期日志文件
# 查找 30 天前的日志文件并删除
find /var/log -name "*.log" -type f -mtime +30 -exec du -sh {} \;
find /var/log -name "*.log" -type f -mtime +30 -exec rm -fv {} \;
场景 3:解决 dudf 结果不一致问题

原因:文件被删除但仍有进程占用(空间未释放)。

排查方法

lsof +L1 /data  # 查看 /data 分区中已删除但未释放的文件

解决方案:重启相关进程或清空文件句柄。


五、高级技巧
  1. 快速统计目录大小并排序

    du -h --max-depth=1 /data/* | sort -hr
  2. 排除特定目录分析

    du -sh --exclude="*.cache" /home
  3. 监控指定目录增长趋势

    watch -n 60 'du -sh /var/log'

六、注意事项
  1. 谨慎删除文件du 找到大文件后,确认无用再删除。

  2. inode 限制:云盘或对象存储挂载时可能限制 inode 数量。

  3. NFS 延迟:远程文件系统的 du 统计可能有缓存延迟。

ncdu命令


一、命令概述

ncdu(NCurses Disk Usage)是一款基于 交互式文本界面 的磁盘空间分析工具,相比传统 du 命令,它提供 可视化导航快速扫描动态排序 功能,特别适合快速定位大文件或目录,是运维工程师清理磁盘空间的利器。


二、安装方法
# Debian/Ubuntu
apt-get install ncdu
​
# RHEL/CentOS(需启用 EPEL)
yum install epel-release && yum install ncdu
​
# macOS
brew install ncdu

三、核心功能与优势
  • 交互式界面:支持键盘导航(方向键、快捷键)。

  • 快速扫描:比 du 更快生成目录树。

  • 动态排序:按大小、名称、修改时间排序。

  • 批量操作:删除、导出扫描结果。

  • 排除文件/目录:支持正则表达式过滤。


四、基本语法与常用选项
ncdu [选项] [目录路径]
选项说明
-x仅分析同一文件系统(不跨挂载点)
--exclude "PATTERN"排除匹配文件/目录(如 --exclude "*.log"
-o 文件导出扫描结果到文件(便于后续分析)
-f 文件从文件加载扫描结果(结合 -o 实现离线分析)
--exclude-firnore忽略 .gitignore.ncduignore 中的文件
-q静默模式(不显示进度条)

五、交互界面操作指南
快捷键功能
/导航目录条目
/Enter进入子目录
返回上级目录
d删除当前文件/目录
n按名称排序
s按大小排序
t按修改时间排序
g切换百分比/绝对值显示
?查看帮助菜单

六、工作案例场景
案例 1:快速分析根目录磁盘占用

场景:根分区 / 使用率超过 90%,需快速定位大文件。

ncdu -x /

操作流程

  1. 使用 键定位到占用最大的目录(如 /var)。

  2. 进入 /var,发现 log 目录占 80%。

  3. 进入 /var/log,按 s 排序,找到 app_error.log(10GB)。

  4. d 删除日志文件(需确认权限)。


案例 2:排除临时文件扫描

场景:分析 /data 目录,但排除 .cache 和临时文件。

ncdu --exclude ".cache" --exclude "*.tmp" /data

案例 3:离线分析与报告生成

场景:扫描生产服务器磁盘,导出结果供团队分析。

# 在服务器上生成扫描文件
ncdu -xo /tmp/ncdu-scan.log /opt
​
# 下载文件到本地分析
ncdu -f ncdu-scan.log

离线操作

  • s 排序后,发现 backup_old.tar(50GB)可清理。


案例 4:批量清理旧日志文件

场景:清理 /var/log 中 30 天前的日志。

ncdu /var/log

操作流程

  1. 进入 /var/logt 按时间排序。

  2. 定位到 30 天前的日志目录(如 nginx/access.log.2023)。

  3. d 删除整个目录(需确认无在用日志)。


案例 5:远程服务器磁盘分析

场景:通过 SSH 分析远程服务器的磁盘使用。

ssh user@remote-server "ncdu -o - /" | ncdu -f -

原理

  • 远程生成扫描结果并通过管道传输到本地 ncdu 加载。


七、高级技巧
1. 自动化清理脚本
# 查找大于 1GB 的文件并交互式确认删除
ncdu -r / | grep -E '^[0-9\.]+G' | awk '{print $2}' | xargs -I {} sh -c 'read -p "Delete {}? (y/n) " ans; [ "$ans" = "y" ] && rm -rf "{}"'
2. 定期扫描与对比
# 每周扫描并保存结果
ncdu -xo /var/ncdu-scan-$(date +%Y%m%d).log /
​
# 对比两次扫描差异
diff <(cat scan1.log | awk '{print $2}') <(cat scan2.log | awk '{print $2}')

八、注意事项
  1. 谨慎删除d 键直接删除文件,需确认路径无误。

  2. 权限要求:分析系统目录需 root 权限(sudo ncdu)。

  3. 隐藏文件:默认显示隐藏文件(以 . 开头的文件)。


通过 ncdu,运维工程师可快速定位磁盘空间瓶颈,结合交互式操作和过滤规则,大幅提升清理效率,尤其适合处理日志膨胀、临时文件堆积等常见问题。

find命令


一、命令概述

find 是 Linux 系统中最强大的文件搜索工具,支持按 名称、类型、时间、大小、权限 等多维度条件查找文件,并支持对搜索结果执行操作(删除、修改权限、复制等)。它是运维工程师进行文件管理、日志清理、权限审计的核心工具。


二、基本语法
find [搜索路径] [匹配条件] [执行动作]

三、核心选项与参数
1. 按名称/路径匹配
参数说明
-name "模式"按文件名匹配(区分大小写,支持 * ? 通配符)
-iname "模式"按文件名匹配(不区分大小写)
-path "模式"按路径匹配(支持通配符)
-regex "正则"按正则表达式匹配完整路径

示例

find /var/log -name "*.log"          # 查找 /var/log 下所有 .log 文件  
find /etc -iname "*.conf"            # 查找 /etc 下所有 .conf(不区分大小写)  
find . -regex ".*/error_[0-9]+.log"  # 匹配 error_数字.log 文件  

2. 按类型匹配
参数说明
-type [f/d/l/s]按文件类型筛选(f-文件,d-目录,l-符号链接,s-套接字)

示例

find /tmp -type f             # 查找 /tmp 下的普通文件  
find /home -type d -empty     # 查找 /home 下的空目录  

3. 按时间匹配
参数说明
-mtime [+-]n按文件修改时间筛选(n 天前,+7 表示超过7天)
-atime [+-]n按文件访问时间筛选
-newermt "日期"查找比指定日期更新的文件(如 "2023-10-01"

示例

find /var/log -mtime +30       # 查找 30 天前修改过的文件  
find /backup -newermt "2023-09-01"  # 查找 2023-09-01 之后修改的文件  

4. 按大小匹配
参数说明
-size [+-]n[c/k/M/G]按文件大小筛选(默认512B块,+10M 表示大于10MB)

示例

find /data -size +500M        # 查找大于 500MB 的文件  
find /home -size -1k          # 查找小于 1KB 的文件  

5. 按权限/用户匹配
参数说明
-perm [mode]按权限匹配(如 644-u+x 表示用户可执行)
-user [name]按所有者匹配
-group [name]按所属组匹配

示例

find / -user www-data         # 查找所有者为 www-data 的文件  
find . -perm 777              # 查找权限为 777 的文件  
find /etc -perm -u=r          # 查找用户可读的文件  

6. 执行动作
参数说明
-print默认动作,打印完整路径
-delete删除匹配的文件
-exec command {} \;对每个文件执行命令({} 代表文件名)
-ok command {} \;交互式执行命令(需确认)

示例

find /tmp -name "*.tmp" -delete                  # 删除所有 .tmp 文件  
find /var/log -mtime +30 -exec gzip {} \;         # 压缩 30 天前的日志  
find . -type f -perm 777 -ok chmod 755 {} \;     # 交互式修改权限  

四、工作案例场景
案例 1:清理过期日志文件
# 删除 /var/log 下 30 天前的 .log 文件  
find /var/log -name "*.log" -mtime +30 -exec rm -fv {} \;  
案例 2:查找并备份大文件
# 查找 /data 下大于 1GB 的文件并复制到备份目录  
find /data -type f -size +1G -exec cp {} /backup \;  
案例 3:审计异常权限文件
# 查找所有权限为 777 的文件并记录路径  
find / -type f -perm 777 -print > /audit/777_files.txt  
案例 4:批量修改文件所有者
# 将 /home/user 下所有文件所有者改为 newuser  
find /home/user -exec chown newuser:newgroup {} \+  
案例 5:统计源码文件数量
# 统计当前目录下 .c 和 .h 文件数量  
find . -type f \( -name "*.c" -o -name "*.h" \) | wc -l  

五、高级技巧
1. 逻辑组合
# 查找 .log 文件且 (大于 100MB 或 修改时间超过 60 天)  
find /var -name "*.log" \( -size +100M -o -mtime +60 \)  
2. 排除目录
# 查找 / 下所有 .conf 文件,排除 /proc 和 /sys  
find / -path /proc -prune -o -path /sys -prune -o -name "*.conf"  
3. 结合 xargs 提高效率
# 查找所有空文件并删除(比 -exec 更高效)  
find /tmp -type f -empty | xargs rm -f  
4. 并行处理
# 使用 parallel 并行压缩文件  
find /data -type f -name "*.csv" | parallel gzip {}  

六、注意事项
  1. 权限与路径:

    • 系统目录搜索需 root 权限(使用 sudo)。

    • 避免全盘搜索(如 find /),尽量指定具体路径。

  2. 符号链接处理:

    • 默认不跟踪符号链接,需用 -L 选项启用。

  3. 性能优化:

    • 优先使用 -name 缩小范围,减少不必要的全盘扫描。

    • 复杂条件组合时,将高筛选率条件放在前面。

  4. 删除操作风险:

    • 使用 -ok 替代 -exec 进行确认,或先通过 -print 检查结果。


通过 find,运维工程师可以快速定位问题文件、实现批量操作,并构建自动化清理/审计脚本,是日常运维工作中不可或缺的利器。

rsync命令


一、命令概述

rsync(Remote Synchronization)是 Linux 下 高效的文件同步工具,支持 增量传输断点续传跨平台同步。其核心优势是通过差异算法仅传输变化部分,大幅节省带宽和时间,广泛用于备份、部署、数据迁移等场景。


二、安装与基本语法
# 安装
apt-get install rsync   # Debian/Ubuntu
yum install rsync       # RHEL/CentOS
​
# 基本语法
rsync [选项] 源路径 目标路径

三、核心选项与参数
选项说明
-a归档模式(保留权限、时间戳、递归同步目录)
-v显示详细输出(-vv 更详细)
-z压缩传输数据(节省带宽)
--delete删除目标端多余文件(严格同步)
--exclude="模式"排除指定文件/目录(支持通配符)
-e "ssh"指定远程 Shell(如 ssh -p 2222 指定端口)
-P显示进度并支持断点续传(等效 --partial --progress
-n模拟执行(不实际传输,用于测试)
-b备份覆盖文件(生成后缀 ~
--bwlimit=KBPS限制传输带宽(如 --bwlimit=1000 限速 1000KB/s)

四、工作案例场景
案例 1:本地目录同步

场景:将 /data/app 同步到备份目录 /backup,保留权限并删除多余文件。

rsync -av --delete /data/app/ /backup/

关键点

  • 源路径末尾的 / 表示同步目录内容(不含目录本身)。

  • --delete 确保目标与源完全一致。


案例 2:远程服务器同步(SSH 加密)

场景:将本地 /var/www 同步到远程服务器的 /opt/web 目录,使用非标准 SSH 端口。

rsync -avz -e "ssh -p 2222" /var/www/ user@remote-host:/opt/web/

验证命令

ssh -p 2222 user@remote-host ls /opt/web  # 检查同步结果

案例 3:增量备份与排除文件

场景:每日备份 /home 目录到 /backup/daily,排除缓存文件和日志。

rsync -avz --exclude=".cache/" --exclude="*.log" /home/ /backup/daily/

自动化脚本(每日凌晨执行):

crontab -e
0 3 * * * /usr/bin/rsync -avz --exclude=".cache/" /home/ /backup/daily/

案例 4:恢复误删文件(反向同步)

场景:从备份服务器恢复误删的 /etc/nginx 配置。

rsync -avz user@backup-host:/etc/nginx/ /etc/nginx/

案例 5:大规模数据迁移(断点续传)

场景:迁移 1TB 数据到新存储服务器,网络不稳定需支持断点续传。

rsync -avzP --bwlimit=50000 /bigdata/ user@new-host:/storage/

说明

  • -P 显示进度,中断后可重新执行命令继续传输。

  • --bwlimit=50000 限速 50MB/s 避免挤占带宽。


案例 6:差异化备份(保留历史版本)

场景:每周全量备份,每日增量备份,保留 7 天历史。

# 全量备份(每周日)
rsync -av --delete /data/ /backup/full-$(date +%Y%m%d)/
​
# 增量备份(其他日期)
rsync -av --delete --link-dest=/backup/full-20231001 /data/ /backup/incr-$(date +%Y%m%d)/

原理

  • --link-dest 引用全量备份的硬链接,仅存储变化文件。


五、高级技巧
1. 带宽限制与压缩优化
rsync -avz --bwlimit=1000 -e "ssh -C" /src/ user@host:/dst/
  • -C 启用 SSH 压缩,与 -z 叠加优化传输效率。

2. 保护覆盖文件(备份后缀)
rsync -avb --backup-dir=/backup/old --suffix=.bak /src/ /dst/
  • 被覆盖的文件会移动到 /backup/old 并添加 .bak 后缀。

3. 过滤规则文件
rsync -av --exclude-from='exclude-list.txt' /src/ /dst/

exclude-list.txt 内容:

*.tmp
.cache/
logs/

六、注意事项
  1. 权限问题:

    • 同步系统文件需 sudo 权限(rsync -av -e "ssh" --rsync-path="sudo rsync")。

  2. 路径陷阱:

    • 源路径带 / 同步内容,不带 / 同步目录本身。

  3. 测试先行:

    • 使用 -n 模拟执行(如 rsync -avn)。

  4. 日志记录:

    • 重定向输出到文件(rsync -av > sync.log 2>&1)。


通过 rsync,运维工程师可实现高效、可靠的数据同步,尤其适合自动化备份、跨数据中心迁移和持续部署场景。其灵活的过滤和增量机制,结合 SSH 加密,成为企业级数据管理的核心工具。

fio命令


一、命令概述

fio(Flexible I/O Tester)是 Linux 下 专业级磁盘性能测试工具,可模拟多种 I/O 负载(顺序/随机读写、混合负载),用于评估存储设备的 IOPS、带宽、延迟 等关键指标。适用于运维工程师进行存储性能调优、磁盘故障排查及硬件选型验证。


二、安装与基本语法
# 安装
apt-get install fio   # Debian/Ubuntu
yum install fio       # RHEL/CentOS
​
# 基本语法
fio [选项] <任务配置文件>

三、核心参数与配置
1. 全局参数
参数说明
--name=<任务名>定义任务名称
--filename=<路径>测试文件路径(如 /dev/sdb/data/testfile
--direct=1绕过缓存(直接 I/O,避免内存干扰)
--ioengine=<引擎>I/O 引擎(libaio 异步,sync 同步,psync 等)
--runtime=<秒>测试持续时间(默认无限)
--time_based按时间而非数据量运行测试
--size=<大小>每个线程操作的数据总量(如 10G
--group_reporting汇总所有线程的统计结果
2. I/O 模式参数
参数说明
--rw=<模式>读写模式(read/write/randread/randwrite/rw/randrw
--bs=<块大小>单次 I/O 块大小(如 4k1M
--iodepth=<队列深度>I/O 队列深度(模拟并发请求数)
--numjobs=<线程数>并发线程数(模拟多客户端负载)
--rwmixread=<百分比>混合读写中读操作的占比(如 70 表示 70% 读)
3. 输出参数
参数说明
--output=<文件>将结果保存到文件
--output-format=<格式>输出格式(normal/json/terse

四、工作案例场景
案例 1:测试 SSD 的随机读性能(4K 块,队列深度 32)

场景:评估 SSD 在数据库场景下的随机读 IOPS。

fio --name=ssd_randread \--filename=/dev/nvme0n1 \--ioengine=libaio \--direct=1 \--rw=randread \--bs=4k \--iodepth=32 \--numjobs=4 \--runtime=60 \--group_reporting

输出关键指标:

read: IOPS=98k, BW=383MiB/s (402MB/s)  lat (usec): min=40, max=2100, avg=130.25  

案例 2:测试 HDD 的顺序写带宽(1M 块,单线程)
场景:验证机械硬盘在大文件写入场景的吞吐量。
fio --name=hdd_seqwrite \--filename=/data/testfile \--ioengine=sync \--direct=1 \--rw=write \--bs=1M \--size=10G \--runtime=120 \--group_reporting

输出关键指标

write: IOPS=180, BW=180MiB/s (189MB/s)  

案例 3:模拟混合负载(70% 读 + 30% 写,4K 块)

场景:测试存储系统在虚拟化环境中的混合负载能力。

fio --name=mixed_4k \--filename=/dev/sdb \--ioengine=libaio \--direct=1 \--rw=randrw \--rwmixread=70 \--bs=4k \--iodepth=16 \--numjobs=8 \--runtime=300 \--group_reporting

输出关键指标

read: IOPS=12k, BW=48.8MiB/s  
write: IOPS=5.3k, BW=21.1MiB/s  lat (usec): min=50, max=9500, avg=210.3  

案例 4:验证磁盘延迟(低队列深度,1 线程)

场景:测试 NVMe 盘的响应延迟是否达标。

fio --name=latency_test \--filename=/dev/nvme0n1 \--ioengine=libaio \--direct=1 \--rw=randread \--bs=4k \--iodepth=1 \--numjobs=1 \--runtime=30 \--group_reporting

理想结果:平均延迟(lat)应低于 200 微秒(usec)。


案例 5:多磁盘并行测试(多文件负载)

场景:评估 RAID 0 阵列在多线程下的性能扩展性。

fio --name=raid0_test \--filename=/dev/sda:/dev/sdb \--ioengine=libaio \--direct=1 \--rw=randwrite \--bs=64k \--iodepth=8 \--numjobs=16 \--runtime=180 \--group_reporting

预期效果:IOPS 和带宽应接近单盘性能的 2 倍(RAID 0 理论值)。


五、结果分析与调优建议
1. 关键指标解读
  • IOPS:每秒 I/O 操作数,反映随机访问性能。

  • Bandwidth (BW):吞吐量(MB/s),反映顺序访问性能。

  • Latency (lat):延迟(微秒或毫秒),衡量响应速度。

2. 性能瓶颈排查
  • IOPS 低:检查队列深度(iodepth)是否不足,或磁盘已达性能上限。

  • 带宽不达标:确认块大小(bs)是否合理(如 HDD 适合大块顺序 I/O)。

  • 延迟过高:降低队列深度,检查磁盘健康状态(smartctl)或 RAID 卡缓存策略。

3. 调优方向
  • 文件系统优化:调整 ext4/xfs 的挂载参数(如 noatimediscard)。

  • 内核参数:优化 vm.dirty_ratiovm.swappiness、I/O 调度器(mq-deadline/kyber)。

  • 硬件配置:升级磁盘类型(如 NVMe 替换 SATA SSD)、增加 RAID 冗余或缓存。


六、注意事项
  1. 数据安全

    • 测试裸设备(如 /dev/sdb)会 覆盖数据,务必提前备份。

    • 使用文件路径(如 /data/testfile)时,确保有足够空间。

  2. 缓存干扰

    • 必须添加 --direct=1 绕过系统缓存,否则测试结果反映的是内存速度。

  3. 生产环境慎用

    • 高并发测试可能导致服务中断,建议在维护窗口期执行。


通过 fio,运维工程师可以精准量化存储性能,为容量规划、故障排查及硬件升级提供数据支撑。结合不同参数组合,可模拟数据库、虚拟化、大数据等真实场景负载,是存储调优不可或缺的工具。

四、日志与文本处理

grep命令


一、命令概述

grep(Global Regular Expression Print)是 Linux 下最核心的 文本搜索工具,支持正则表达式匹配,用于快速定位日志关键词、过滤命令输出、处理文本数据流。运维工程师几乎每天都会用它排查问题、分析日志、构建自动化脚本。


二、核心选项与参数
grep [选项] "模式" [文件/目录]
选项说明
-i忽略大小写
-v反向匹配(排除匹配项)
-E启用扩展正则表达式(等效 egrep
-r/-R递归搜索目录
-n显示匹配行号
-C NUM显示匹配行的上下 NUM 行(如 -C 2
-A NUM显示匹配行及后 NUM 行(After)
-B NUM显示匹配行及前 NUM 行(Before)
-o仅显示匹配的字符串(非整行)
-c统计匹配行数
-l仅显示包含匹配项的文件名
-w精确匹配单词(避免部分匹配)
--color=auto高亮显示匹配内容
--exclude/--include按文件名模式排除/包含文件
-m NUM最多匹配 NUM 行后停止
-q静默模式(不输出,用于脚本条件判断)

三、正则表达式速查
表达式说明
^匹配行首
$匹配行尾
.匹配任意单个字符
*前导字符出现 0 次或多次
+前导字符出现 1 次或多次(需 -E
?前导字符出现 0 次或 1 次(需 -E
[abc]匹配 a、b、c 中的任意一个
[^abc]匹配非 a、b、c 的任意字符
{n,m}前导字符出现 n 到 m 次(需 -E
\b单词边界
\|逻辑或(需 -E

四、工作案例场景
案例 1:快速定位日志中的错误

场景:在 Nginx 日志中查找 HTTP 500 错误

grep -n --color=auto ' 500 ' /var/log/nginx/access.log

输出示例

102:192.168.1.100 - - [10/Oct/2023:14:30:22 +0800] "GET /api/data HTTP/1.1" 500 1234 "-" "curl/7.68.0"

案例 2:递归搜索代码库中的关键词

场景:在项目中查找所有使用 getUserInfo 函数的文件

grep -rnw --include="*.js" 'getUserInfo' /opt/myapp/

选项解析

  • -r 递归搜索

  • -w 精确匹配单词

  • --include="*.js" 仅检查 JS 文件


案例 3:统计接口调用次数

场景:统计 /api/login 接口在日志中的调用次数

grep -c '/api/login' /var/log/api.log

输出

1429

案例 4:提取日志中的 IP 地址

场景:从日志中提取所有访问过 /admin 页面的 IP

grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' /var/log/access.log | sort | uniq

正则解析

  • -E 启用扩展正则

  • \b 匹配 IP 地址边界


案例 5:监控服务状态

场景:检查 Nginx 是否正在运行

ps aux | grep -v grep | grep -q nginx && echo "Running" || echo "Not Running"

原理

  • grep -v grep 排除 grep 自身进程

  • -q 静默模式,配合条件判断


案例 6:多关键词复杂匹配

场景:查找包含 ERRORFATAL 的日志,且不包含 test.log 文件

grep -E --exclude="test.log" 'ERROR|FATAL' /var/log/*.log

五、高级技巧
1. 结合 find 高效递归搜索
find /var/log -type f -name "*.log" -exec grep -Hn 'error' {} \;
  • -H 显示文件名(即使只有一个文件)

2. 高亮关键词并分页查看
grep --color=always 'ERROR' /var/log/syslog | less -R
3. 使用 zgrep 直接搜索压缩文件
zgrep -i 'connection timeout' /var/log/nginx/access.log.1.gz
4. 上下文关联分析
grep -C 3 'OutOfMemory' /var/log/app.log  # 显示错误前后 3 行

六、性能优化
  1. 避免大文件全扫描

    grep -m 100 'error' large.log  # 找到 100 条后停止
  2. 使用 LC_ALL=C 加速(禁用本地化):

    LC_ALL=C grep 'ERROR' huge.log
  3. 并行搜索(结合 xargs

    find . -type f | xargs -P 4 grep 'pattern'

七、注意事项
  1. 正则转义

    • 特殊字符(如 $*)需用 \ 转义,或使用单引号包裹模式。

  2. 二进制文件

    • 默认跳过二进制文件,强制检查用 -a 选项。

  3. 符号链接

    • -r 会跟随符号链接,使用 -r --no-dereference 禁用。


通过 grep,运维工程师可以快速定位故障、分析日志趋势、提取关键数据,是文本处理领域的瑞士军刀。结合正则表达式和管道操作,能解决 80% 的日常文本处理需求。

sed命令


一、命令概述

sed(Stream Editor)是 Linux 下 流式文本处理工具,支持正则表达式匹配、替换、删除、插入等操作,尤其适合 非交互式批量文本处理。运维工程师常用其进行日志清洗、配置批量修改、数据格式化等任务。


二、基本语法
sed [选项] '指令' 文件  
sed [选项] -f 脚本文件 文件

三、核心选项与参数
选项说明
-n静默模式(仅显示处理后的行,常与 p 命令配合)
-i[后缀]直接修改文件(-i.bak 修改前备份原文件)
-e指定多条编辑指令(如 -e 's/a/A/' -e 's/b/B/'
-r启用扩展正则表达式(支持 + ? \| 等语法)
-f 脚本从脚本文件读取指令

四、地址定界与命令
1. 地址定界
格式说明
n第 n 行(如 5s/old/new/ 修改第 5 行)
n,m第 n 到 m 行
$最后一行
/正则表达式/匹配正则的行
n~m从第 n 行开始,每隔 m 行(如 1~2 处理奇数行)
2. 常用命令
命令说明
s/原内容/替换内容/标志替换操作(核心命令)
d删除行
p打印行(常与 -n 配合)
a\text在行后追加文本
i\text在行前插入文本
c\text替换整行
y/原字符/新字符/字符转换(类似 tr 命令)
r 文件将文件内容插入到匹配行后
w 文件将匹配行写入文件
3. 替换命令标志
标志说明
g全局替换(一行中所有匹配项)
p打印替换后的行
w 文件将替换后的行写入文件
i忽略大小写(需结合 I 标志,如 s/pattern/replace/gi

五、工作案例场景
案例 1:批量替换配置文件参数

场景:将 Nginx 配置中所有 worker_processes 2; 改为 worker_processes auto;

sed -i.bak 's/worker_processes\s\+2;/worker_processes auto;/g' /etc/nginx/nginx.conf  

说明

  • \s\+ 匹配一个或多个空白符

  • -i.bak 修改前生成备份文件 nginx.conf.bak


案例 2:删除日志文件中的空行

场景:清理 /var/log/app.log 中的空行

sed -i '/^$/d' /var/log/app.log  

解析

  • /^$/ 匹配空行

  • d 命令删除匹配行


案例 3:提取特定时间段的日志

场景:提取 2023-10-10 09:00 至 10:00 的日志

sed -n '/2023-10-10 09:00:00/,/2023-10-10 10:00:00/p' /var/log/app.log  

说明

  • -n 配合 p 仅输出匹配范围


案例 4:批量注释/取消注释配置

场景:注释 Apache 配置中所有 LogLevel

sed -i '/^LogLevel/ s/^/#/' /etc/httpd/conf/httpd.conf 

取消注释

sed -i '/^#LogLevel/ s/^#//' /etc/httpd/conf/httpd.conf  

案例 5:批量修改文件格式(DOS 转 Unix)

场景:删除文件中的 ^M 字符(Windows 换行符)

sed -i 's/\r$//' *.txt  

案例 6:动态插入配置片段

场景:在 </VirtualHost> 前插入 SSL 配置

sed -i '/<\/VirtualHost>/i \\nSSLEngine on\nSSLCertFile /path/to/cert.pem' httpd.conf  

输出效果

SSLEngine on  
SSLCertFile /path/to/cert.pem  
</VirtualHost>  

六、高级技巧
1. 多命令组合执行
sed -e 's/foo/bar/g' -e '/baz/d' input.txt  
2. 引用变量(Shell 脚本中)
new_value="PROD"  
sed -i "s/ENV=.*/ENV=$new_value/" config.env  
3. 反向引用正则分组

场景:交换日志中日期和时间的位置

sed -r 's/([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}:[0-9]{2})/\2 \1/' app.log 
4. 结合 find 批量处理文件
find /etc/nginx/conf.d/ -name "*.conf" -exec sed -i 's/old_domain/new_domain/g' {} \;  

七、注意事项
  1. 备份原则

    • 使用 -i.bak 保留原文件,避免误操作不可逆

  2. 定界符选择

    • 若替换内容包含 /,可改用其他符号(如 s@old@new@

  3. 性能优化

    • 处理大文件时避免使用 sed 全量加载到内存,可用 awk 替代

  4. 正则贪婪匹配

    • sed 默认贪婪匹配,.* 会匹配到行尾,需谨慎使用


通过 sed,运维工程师可以快速完成文本批处理任务,尤其适合需要 自动化、可重复执行 的场景。结合正则表达式和 Shell 脚本,能显著提升日常工作效率。

awk命令


一、命令概述

awk 是 Linux 下 高级文本处理工具,以 字段(列) 为核心处理结构化数据,支持条件判断、循环、数学运算和自定义函数。运维工程师常用其进行日志分析、数据统计、报表生成等任务,尤其擅长处理复杂文本格式(如 CSV、日志文件)。


二、基本语法与结构
awk [选项] '模式 {动作}' 文件  
awk -f 脚本文件 文件

三、核心概念与选项
1. 常用选项
选项说明
-F指定字段分隔符(默认空格,如 -F':'
-v var=val定义变量(用于脚本内外传值)
-f从脚本文件读取命令
2. 内置变量
变量说明
FS输入字段分隔符(等价 -F 选项)
OFS输出字段分隔符(默认空格)
NR当前处理的总行号(从1开始)
NF当前行的字段总数
$0当前行的完整内容
$1~$n第1到第n个字段
FILENAME当前处理的文件名
RS输入行分隔符(默认换行符)
ORS输出行分隔符(默认换行符)
3. 模式与动作
  • 模式:可以是正则表达式、条件判断(如 NR > 10)或 BEGIN/END 块。

  • 动作:用 {} 包裹的代码块,支持 ifforwhile 等控制结构。


四、工作案例场景
案例 1:统计日志中 HTTP 状态码分布

场景:统计 Nginx 访问日志中不同状态码(如 200、404、500)的出现次数。

awk '{status[$9]++} END {for (code in status) print code, status[code]}' access.log

输出示例

200 1200  
404 23  
500 5  

解析

  • $9 是日志中状态码所在的字段。

  • status 为关联数组,键为状态码,值为出现次数。


案例 2:计算目录下文件总大小(MB)

场景:统计 /var/log 下所有文件的磁盘占用总和。

ls -l /var/log | awk 'NR>1 {sum+=$5} END {print sum/1024/1024 " MB"}'

解析

  • NR>1 跳过 ls -l 的首行(总用量)。

  • $5 是文件大小字段。


案例 3:格式化输出进程信息

场景:提取 ps 命令输出中的 PID、CPU 和进程名,按 CPU 降序排序。

ps aux | awk 'NR>1 {printf "PID: %-6s CPU: %-5s %s\n", $2, $3, $11}' | sort -k3 -nr

输出示例

PID: 1234   CPU: 30.2  /usr/bin/python3  
PID: 5678   CPU: 15.7  /usr/sbin/nginx  

案例 4:分析网络连接状态

场景:统计 ss -tun 输出中各端口的 TCP 连接数。

ss -tun | awk '/^tcp/ {split($4, arr, ":"); port[arr[2]]++} END {for (p in port) print p, port[p]}'

解析

  • split($4, arr, ":") 分割本地地址字段,提取端口号。


案例 5:动态修改 CSV 文件字段

场景:将 CSV 文件的第3列(价格)增加 10%,并生成新文件。

awk -F',' -v OFS=',' 'NR==1 {print; next} {$3 *= 1.1; print}' data.csv > updated.csv

解析

  • NR==1 {print; next} 保留标题行。

  • OFS 设置输出字段分隔符为逗号。


案例 6:多文件关联分析

场景:合并 users.txtscores.txt,按用户 ID 输出总分。

users.txt

1,Alice  
2,Bob  

scores.txt

1,85  
2,90  
1,78  

命令

awk -F',' 'NR==FNR {score[$1]+=$2; next} {print $0, score[$1]}' scores.txt users.txt

输出

1,Alice 163  
2,Bob 90  

解析

  • NR==FNR 仅在第一个文件(scores.txt)处理时生效。

  • next 跳过后续动作,直接处理下一行。


五、高级技巧
1. 使用 BEGIN/END

场景:输出前添加表头和结尾统计。

awk 'BEGIN {print "Start Processing..."} {sum+=$1} END {print "Total:", sum}' data.txt
2. 自定义函数

场景:计算字段的 SHA1 哈希值。

awk 'function sha1(str) {cmd="echo -n \"" str "\" | sha1sum"; cmd | getline result; close(cmd); return substr(result,1,40)} {print sha1($1)}' input.txt
3. 结合 Shell 管道

场景:提取日志中访问频率最高的前 5 个 IP。

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n5

六、注意事项
  1. 性能优化

    • 避免在循环中频繁调用外部命令(如 system())。

    • 处理大文件时优先使用原生 awk 操作,而非正则表达式。

  2. 字段索引

    • 确保字段存在(如 NF >=3 时再访问 $3)。

  3. 正则表达式

    • 使用 ~ 进行正则匹配(如 $0 ~ /error/)。


通过 awk,运维工程师可以高效处理结构化数据,结合其脚本能力,能快速实现复杂分析任务,是日志处理、系统监控和自动化运维的核心工具。

cut命令


一、命令概述

cut 是 Linux 下用于 按列提取文本内容 的工具,支持通过 字段分隔符字符位置 切割数据。它适用于处理结构化文本(如 CSV、日志文件、系统配置文件等),快速提取指定列或固定位置的数据,是运维工程师处理文本流的常用工具。


二、基本语法
cut [选项] [文件]

三、核心选项与参数
选项说明
-d指定字段分隔符(默认 TAB,不可省略)
-f指定提取的字段编号(支持范围,如 1-31,3,5
-c按字符位置提取(如 1-51,3,5
--complement反向选择(提取未指定的字段)
-s仅处理包含分隔符的行(默认输出无分隔符的行)

四、工作案例场景
案例 1:提取 /etc/passwd 的用户名和 Shell

场景:从用户配置文件中提取所有用户的登录 Shell(第 7 列)。

cut -d':' -f1,7 /etc/passwd

输出示例

root:/bin/bash  
nginx:/sbin/nologin  
mysql:/bin/false  

案例 2:从日志中提取 IP 地址和时间戳

场景:Nginx 日志格式为 IP - - [时间] "请求" 状态码 大小,提取 IP(第 1 列)和时间(第 4 列)。

cut -d' ' -f1,4 access.log

输出示例

192.168.1.100 [10/Oct/2023:14:30:22  
192.168.1.101 [10/Oct/2023:14:31:15  

案例 3:按字符位置截取文本

场景:提取固定格式日志中的日期部分(前 10 个字符)。

cut -c1-10 /var/log/app.log

输出示例

2023-10-10  
2023-10-10  

案例 4:处理 CSV 文件并排除指定列

场景:提取 CSV 文件的第 2、4 列(跳过第 1 和 3 列)。

cut -d',' -f2,4 data.csv

文件内容

id,name,age,department  
1,Alice,25,IT  
2,Bob,30,HR  

输出示例

name,department  
Alice,IT  
Bob,HR  

案例 5:反向提取字段(排除指定列)

场景:提取 /etc/passwd 中除用户 ID(第 3 列)外的所有字段。

cut -d':' -f3 --complement /etc/passwd

输出示例

root:x:0:0:root:/root:/bin/bash  
nginx:x:1000:1000::/home/nginx:/sbin/nologin  

案例 6:结合管道处理命令输出

场景:统计当前目录下文件名长度超过 10 个字符的文件数量。

ls | cut -c1-10 | awk '{print length($0)}' | grep -c '^10$'

五、高级技巧
1. 处理多字符分隔符

cut 默认仅支持单字符分隔符,若需处理多字符分隔符(如 ||),需结合 tr 预处理:

echo "A||B||C" | tr -s '|' ',' | cut -d',' -f2  # 输出 B  
2. 动态字段提取(脚本中)

在 Shell 脚本中,通过变量指定字段:

COLUMN=3  
cut -d',' -f$COLUMN data.csv  
3. 处理包含空格的字段

若字段包含空格(如 "San Francisco"),需确保分隔符唯一或使用其他工具(如 awk):

awk -F',' '{print $2}' cities.csv  # 更可靠  

六、注意事项
  1. 分隔符限制

    • -d 仅支持单字符,无法使用正则表达式或多字符分隔符。

    • 若字段内容包含分隔符,需预处理或改用 awk(如 awk -F',')。

  2. 字段编号规则

    • 字段从 1 开始计数(非 0)。

    • 范围 1-3 包含第 1、2、3 列。

  3. 性能优化

    • 处理大文件时,cut 性能优于 awk,但功能有限。


七、总结
  • 适用场景:快速提取固定格式文本的指定列(如日志、CSV、系统配置文件)。

  • 替代方案:复杂字段处理(如多分隔符、正则匹配)优先使用 awk

通过 cut,运维工程师可以高效完成结构化文本的列提取任务,尤其在处理日志分析和数据清洗时,结合管道操作能大幅提升工作效率。

sort和uniq命令


一、sort 命令详解

sort 用于 对文本行进行排序,支持按数值、字典序、时间等多种规则排序,是处理日志、配置文件、数据集的必备工具。

1. 核心选项
选项说明
-n按数值大小排序(默认按字符串排序)
-r降序排序(默认升序)
-k N指定按第 N 列排序(可指定范围 -k 3,5
-t C指定字段分隔符(如 -t ':'
-u去重(保留唯一行,等效 sort | uniq
-M按月份缩写排序(如 JANFEB
-o 文件将结果输出到文件(可覆盖原文件)
-T 目录指定临时文件目录(处理大文件时避免磁盘空间不足)
2. 工作案例
案例 1:按 CPU 使用率降序排序进程
ps aux | sort -rnk 3  

输出示例

user     1234  30.0  0.5  /usr/bin/python3  
user     5678  25.5  1.2  /usr/sbin/nginx  

解析

  • -rnk 3:按第 3 列(CPU%)数值降序排序。

案例 2:排序 CSV 文件并去重
sort -t ',' -k2,2n -u data.csv  

文件内容

1,30,Alice  
2,25,Bob  
3,30,Alice  

输出

2,25,Bob  
1,30,Alice  

解析

  • -t ',':以逗号分隔字段。

  • -k2,2n:按第 2 列数值升序排序。

  • -u:去除重复行(保留唯一行)。

案例 3:合并多个排序文件
sort -m file1.txt file2.txt -o merged.txt  

说明

  • -m:合并已排序的文件(效率高于重新排序)。


二、uniq 命令详解

uniq 用于 过滤或统计连续重复的行,需注意:输入必须先排序(通常与 sort 结合使用)。

1. 核心选项
选项说明
-c统计重复次数(常用)
-d仅显示重复行
-u仅显示唯一行(不重复的行)
-i忽略大小写
-f N跳过前 N 个字段(结合 -t 使用)
2. 工作案例
案例 1:统计日志中错误类型出现次数
grep 'ERROR' app.log | sort | uniq -c | sort -nr  

输出示例

  12 ERROR: Connection timeout  5 ERROR: Disk full  3 ERROR: Permission denied  

解析

  • sort | uniq -c:排序后统计重复行。

  • sort -nr:按错误次数降序排序。

案例 2:提取唯一 IP 地址
cut -d ' ' -f1 access.log | sort | uniq  

说明

  • 从日志中提取 IP(第 1 列),去重后输出所有唯一 IP。

案例 3:查找重复用户
cut -d ':' -f1 /etc/passwd | sort | uniq -d  

解析

  • 若输出为空,表示所有用户唯一;否则显示重复用户名。


三、组合使用案例
案例 1:分析访问日志的 Top 10 IP
cut -d ' ' -f1 access.log | sort | uniq -c | sort -nr | head -n10  

输出示例

 1500 192.168.1.100  1200 10.0.0.1  800  172.16.0.5  

步骤分解

  1. 提取 IP 列 → 排序 → 统计次数 → 按次数降序排序 → 取前 10 行。

案例 2:清理重复配置项
sort -u nginx.conf > nginx_clean.conf  

说明

  • 直接通过 sort -u 删除重复配置行(无需 uniq)。

案例 3:按多列排序并去重
sort -t ',' -k2,2n -k3,3r data.csv | uniq  

文件内容

1,30,Alice  
2,25,Bob  
3,30,Alice  

输出

2,25,Bob  
1,30,Alice  
3,30,Alice  

解析

  • 先按第 2 列数值升序,再按第 3 列字母降序,最后去重。


四、注意事项
  1. uniq 依赖排序

    # 错误!未排序直接使用 uniq 可能失效  
    cat log.txt | uniq -c  
    # 正确用法  
    cat log.txt | sort | uniq -c  
  2. 字段处理

    • 使用 -t-k 处理复杂格式(如 CSV/TSV)。

    • 示例:sort -t ':' -k3n /etc/passwd 按 UID 排序用户。

  3. 性能优化

    • 对大文件使用 -T /tmp 避免 /tmp 空间不足:

      sort -T /mnt/bigdisk/ largefile.txt  


五、总结
  • sort:核心排序工具,支持多列、多规则排序,去重。

  • uniq:依赖排序结果,用于统计、过滤重复行。

  • 组合场景:日志分析、数据清洗、配置管理、资源监控。

通过灵活组合 sortuniq,可高效完成大多数文本处理任务,成为运维工程师的日常必备技能。

journal命令


一、命令概述

journalctl 是 Linux 下用于 查询和管理 systemd 日志 的核心工具,能够查看系统服务、内核、应用程序的日志记录。相比传统 syslogjournalctl 支持结构化日志、时间范围过滤、多字段查询等高级功能,是运维工程师排查系统问题的关键工具。


二、核心选项与参数
选项说明
-u <服务名>查看指定 systemd 服务的日志
-k/--dmesg仅显示内核日志
-b [ID]查看指定启动周期的日志(-b -1 表示上次启动)
-f实时跟踪最新日志(类似 tail -f
-n <行数>显示最近 N 行日志(默认 10 行)
-p <优先级>按日志优先级过滤(emerg, alert, crit, err, warning, notice, info, debug
-S <起始时间>/-U <结束时间>按时间范围过滤(格式:"YYYY-MM-DD HH:MM:SS"
--since/--until相对时间过滤(如 --since "1 hour ago"
-o <格式>指定输出格式(short, verbose, json, json-pretty, export
--disk-usage显示日志占用的磁盘空间
--vacuum-size=<大小>清理日志,限制总大小(如 --vacuum-size=500M

三、工作案例场景
案例 1:实时跟踪系统日志

场景:监控系统实时日志,快速发现异常事件。

sudo journalctl -f  

输出示例

Oct 15 14:30:22 server systemd[1]: Started nginx.service.  
Oct 15 14:30:25 server kernel: USB device disconnected (port 3).  

说明

  • -f 持续输出新日志,按 Ctrl+C 退出。


案例 2:查看指定服务的日志

场景:排查 Nginx 服务启动失败的原因。

sudo journalctl -u nginx.service --since "10 minutes ago"  

输出示例

Oct 15 14:25:10 server systemd[1]: Starting nginx...  
Oct 15 14:25:10 server nginx[1234]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)  

解析

  • -u nginx.service 过滤 Nginx 服务日志。

  • --since 限制时间范围为最近 10 分钟。


案例 3:过滤错误级别日志

场景:快速定位系统中的错误(error 及以上优先级)。

sudo journalctl -p err -b  

输出示例

Oct 15 14:20:15 server systemd[1]: Failed to start MySQL database server.  
Oct 15 14:22:30 server kernel: EXT4-fs error (device sda1): ext4_find_entry:1436: inode #12345: comm nginx: reading directory lblock 0  

说明

  • -p err 显示错误及以上优先级(err, crit, alert, emerg)。

  • -b 仅当前启动周期的日志。


案例 4:按时间范围查询日志

场景:分析系统在特定时间段内的所有活动。

sudo journalctl -S "2023-10-15 09:00:00" -U "2023-10-15 10:00:00"  

说明

  • -S-U 精确指定起始和结束时间。


案例 5:导出日志到文件(JSON 格式)

场景:将日志导出供开发团队分析。

sudo journalctl -u mysql.service -o json-pretty > mysql_errors.json  

输出示例

{  "__MONOTONIC_TIMESTAMP" : "123456789",  "MESSAGE" : "InnoDB: Database page corruption detected",  "PRIORITY" : "2",  "_SYSTEMD_UNIT" : "mysql.service",  ...  
}  

案例 6:查看系统启动时的日志

场景:诊断系统启动失败问题。

sudo journalctl -b -0 | grep "Failed to mount"  

说明

  • -b -0 查看当前启动周期的日志。

  • 结合 grep 过滤关键错误信息。


四、高级技巧
1. 结构化字段查询
# 查看所有包含特定字段的日志(如设备路径)  
sudo journalctl _KERNEL_DEVICE="/dev/sda1"  
​
# 查询指定进程 ID 的日志  
sudo journalctl _PID=1234  
2. 结合其他工具过滤
# 统计 SSH 登录失败次数  
sudo journalctl -u sshd.service | grep "Failed password" | wc -l  
​
# 提取日志中的 IP 地址  
sudo journalctl -u nginx.service | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'  
3. 日志持久化与清理
# 检查日志占用的磁盘空间  
sudo journalctl --disk-usage  
​
# 清理日志,保留最近 500MB  
sudo journalctl --vacuum-size=500M  
​
# 手动删除早于 1 周的日志  
sudo journalctl --vacuum-time=1weeks  

五、注意事项
  1. 权限要求

    • 查看系统级日志需 sudo 权限,用户级日志使用 journalctl --user

  2. 日志存储位置

    • 默认存储在 /var/log/journal/,确保磁盘空间充足。

  3. 时间同步

    • 若系统时间异常,使用 timedatectl set-ntp true 同步时间。


六、总结

通过 journalctl,运维工程师可以:

  • 快速定位服务故障(如启动失败、端口冲突)。

  • 监控实时系统状态(硬件错误、服务异常)。

  • 分析历史事件(安全审计、性能瓶颈)。

  • 自动化日志处理(导出、统计、清理)。

结合结构化查询和过滤技巧,journalctl 是维护 Linux 系统稳定性和安全性的核心工具。

tail/multitail命令


一、tail 命令详解

tail 用于查看文件的 末尾内容,默认显示最后 10 行,支持实时追踪文件变化(如日志轮转后自动切换新文件)。

1. 核心选项
选项说明
-n <行数>显示末尾 N 行(如 -n 20
-f实时跟踪文件变化(默认持续输出新增内容)
-F实时跟踪,且文件被删除/轮转后自动重试(处理日志轮转场景)
--pid=<PID>当指定进程终止后,停止跟踪
-q不显示文件名标题(多文件时静默模式)
-s <秒>调整监控间隔时间(默认 1 秒)
-c <字节>显示末尾 N 字节(如 -c 1K
2. 工作案例
案例 1:实时跟踪日志文件

场景:监控 Nginx 访问日志的实时更新。

tail -F /var/log/nginx/access.log  

输出示例

192.168.1.100 - [15/Oct/2023:14:30:22] "GET /api/data HTTP/1.1" 200 1234  
192.168.1.101 - [15/Oct/2023:14:30:23] "POST /login HTTP/1.1" 401 567  

说明

  • 当日志轮转(如 access.log 重命名为 access.log.1)时,-F 会自动追踪新文件。

案例 2:查看最近 50 行错误日志

场景:快速定位应用启动失败原因。

tail -n 50 /var/log/app/error.log  
案例 3:跟踪日志直到进程结束

场景:监控临时进程的日志,进程结束后自动停止。

tail -f /tmp/debug.log --pid=$(pgrep -f my_script.sh)  

二、multitail 命令详解

multitail 是增强版日志监控工具,支持 多窗口分屏、颜色标记、正则过滤,可同时监控多个文件或命令输出。

1. 核心功能
功能说明
多窗口分屏同时监控多个文件(横向/纵向分割)
颜色高亮根据正则表达式标记不同颜色
合并视图将多个日志合并为单一窗口(类似 tail -f file1 file2
交互式操作支持快捷键切换窗口、搜索、过滤
2. 安装方法
# Debian/Ubuntu  
apt-get install multitail  
​
# RHEL/CentOS  
yum install multitail  
3. 工作案例
案例 1:分屏监控多个日志文件

场景:同时查看 Nginx 访问日志和错误日志。

multitail -s 2 /var/log/nginx/access.log /var/log/nginx/error.log  

效果

  • 屏幕横向分割为 2 个窗口,分别显示 access.logerror.log

案例 2:颜色标记关键日志

场景:高亮显示错误(ERROR)和警告(WARN)。

multitail -cS app_log /var/log/app.log  

配置高亮规则(~/.multitailrc

colorscheme:app_log  
cs_re:magenta:ERROR  
cs_re:yellow:WARN  
案例 3:合并日志并过滤

场景:将多个服务的日志合并显示,并过滤出含 HTTP 500 的行。

multitail -I /var/log/service1.log /var/log/service2.log -ev "HTTP 500"  

说明

  • -I 合并日志到单一窗口。

  • -ev "HTTP 500" 仅显示匹配正则的行。


三、高级技巧
1. 快捷键操作
快捷键功能
q退出当前窗口
b切换窗口布局(横向/纵向)
/搜索关键词
Space暂停/恢复滚动
2. 动态执行命令并监控

场景:监控 ping 命令的输出和系统日志。

multitail -l "ping google.com" -l "tail -f /var/log/syslog"  
3. 自定义颜色方案

步骤

  1. 编辑 ~/.multitailrc

colorscheme:my_scheme  
cs_re:green:SUCCESS  
cs_re:red:FAILED  
  1. 应用配置:

multitail -cS my_scheme /var/log/app.log  

四、注意事项
  1. 日志轮转处理

    • tail -F 能自动处理轮转,而 multitail 需手动重启或配置脚本。

  2. 性能影响

    • 同时监控过多文件可能导致资源占用过高,建议限制窗口数量。

  3. 权限问题

    • 监控系统日志(如 /var/log/syslog)需 sudo 权限。


五、总结
  • tail:轻量级工具,适合快速查看或跟踪单个日志文件。

  • multitail:功能强大,适合同时监控多日志、复杂过滤和高亮场景。

适用场景对比

场景推荐工具
快速查看文件末尾tail
实时跟踪单个日志tail -f
同时监控多日志 + 高亮multitail
日志轮转环境tail -F
合并多个日志并过滤multitail -I

通过灵活使用 tailmultitail,运维工程师可高效完成日志监控、故障排查和实时数据分析任务。

五、系统调试与内核

strace命令


一、命令概述

strace 是 Linux 下用于 跟踪进程的系统调用和信号 的调试工具。通过监控程序与内核的交互,运维工程师可以诊断程序崩溃、性能瓶颈、权限问题、文件访问异常等底层行为,是分析复杂问题的核心工具。


二、核心选项与参数
strace [选项] <命令>     # 跟踪新启动的进程  
strace -p <PID>         # 附加到正在运行的进程  
选项说明
-p <PID>附加到指定 PID 的进程
-f跟踪子进程(多线程/多进程程序)
-e <表达式>过滤系统调用(如 -e open,read
-o <文件>输出结果到文件
-s <长度>限制字符串参数显示长度(默认 32 字节)
-c统计系统调用耗时和次数(性能分析)
-y显示文件描述符对应的路径
-t显示时间戳(-tt 微秒级)
-T显示系统调用耗时

三、工作案例场景
案例 1:诊断文件访问失败

场景:程序报错 Permission denied,但文件权限看似正常。

strace -e open,openat,access ./myapp 2>&1 | grep "myfile.txt"  

输出示例

openat(AT_FDCWD, "myfile.txt", O_RDONLY) = -1 EACCES (Permission denied)  

解析

  • 发现程序尝试以 O_RDONLY 模式打开文件,但实际权限不足。

  • 检查文件所在目录的 父目录权限(例如 execute 权限缺失)。


案例 2:分析程序卡顿原因

场景:应用程序间歇性无响应,疑似死锁或阻塞。

strace -p $(pidof myapp) -T -f  

输出关键点

poll([{fd=3, events=POLLIN}], 1, 1000) = 0 (Timeout) <1.001s>  
read(3, "data\n", 1024)               = 5 <0.000003s>  

结论

  • poll 系统调用阻塞 1 秒,说明程序在等待某个文件描述符(fd=3)的数据。

  • 检查 fd=3 对应的网络连接或管道是否正常。


案例 3:统计系统调用开销

场景:优化程序性能,定位高耗时系统调用。

strace -c -f ./myapp  

输出示例

% time     seconds  usecs/call     calls    errors syscall  
------ ----------- ----------- --------- --------- ----------------  45.3    0.100000         200       500      12    futex  30.1    0.066667         333       200         open  

优化方向

  • futex 调用耗时占比高(45.3%),说明存在锁竞争或多线程问题。

  • open 调用次数过多,考虑缓存文件句柄或合并操作。


案例 4:跟踪网络连接问题

场景:程序无法连接到远程服务,检查网络交互细节。

strace -e connect,sendto,recvfrom ./myapp  

输出示例

connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("10.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)  

解析

  • 程序尝试连接 10.0.0.1:80,但返回 EINPROGRESS(非阻塞 Socket 正常状态)。

  • 若后续无数据交互,需检查防火墙、DNS 解析或服务端状态。


案例 5:跟踪文件读写行为

场景:排查日志文件未正确写入的原因。

strace -e write,fsync -y ./myapp  

输出示例

write(3</var/log/app.log>, "error: disk full\n", 16) = 16  
fsync(3</var/log/app.log>)          = -1 ENOSPC (No space left on device)  

结论

  • 写入日志时磁盘已满(ENOSPC),需清理磁盘空间。


四、高级技巧
1. 过滤关键系统调用
# 只跟踪文件相关调用  
strace -e trace=file ./myapp  
​
# 跟踪进程信号处理  
strace -e signal=all ./myapp  
2. 跟踪子进程(多线程/多进程程序)
strace -f -ff -o trace.log ./myapp 
  • -ff:为每个子进程生成独立日志(如 trace.log.<PID>)。

3. 结合管道实时分析
strace ./myapp 2>&1 | grep "ETIMEDOUT"  
4. 动态附加到运行中的进程
strace -p $(pidof nginx) -o nginx_trace.log  

五、注意事项
  1. 性能影响

    • strace 会显著降低程序性能(尤其是高频系统调用的程序),生产环境慎用。

    • 替代方案:使用 perfbpftrace 进行低开销分析。

  2. 权限要求

    • 附加到其他用户的进程需 root 权限(sudo strace -p PID)。

  3. 日志管理

    • 使用 -o 保存日志,避免终端输出刷屏。


六、总结

通过 strace,运维工程师可以:

  • 定位文件权限、路径错误、资源不足等系统调用级问题。

  • 分析程序阻塞、性能瓶颈、死锁等多线程问题。

  • 跟踪网络连接、信号处理、进程间通信(IPC)等底层行为。

结合 -e 过滤和 -c 统计功能,能快速缩小问题范围,是解决“明明代码没问题,但程序行为异常”类问题的终极武器。

ltrace命令


一、命令概述

ltrace 是 Linux 下用于 跟踪进程的库函数调用 的调试工具,能够显示程序调用的动态链接库函数(如 mallocfopenstrcmp)及其参数和返回值。相比 strace(跟踪系统调用),ltrace 更关注用户空间函数,适合分析 内存泄漏、第三方库异常、性能瓶颈 等问题。


二、核心选项与参数
ltrace [选项] <命令>     # 跟踪新启动的进程  
ltrace -p <PID>        # 附加到正在运行的进程  
选项说明
-p <PID>附加到指定 PID 的进程
-e <表达式>过滤函数(如 -e malloc -e free
-c统计函数调用次数和耗时
-o <文件>输出结果到文件
-S同时跟踪系统调用(相当于 strace 功能)
-n <次数>限制显示参数的数量(默认显示前 32 字节)
-i显示指令指针(用于定位调用位置)
-f跟踪子进程(多线程/多进程程序)

三、工作案例场景
案例 1:分析内存泄漏

场景:程序运行后内存持续增长,疑似未释放堆内存。

ltrace -e malloc -e free ./myapp  

输出示例

malloc(1024)               = 0x55a1a2b2e260  
malloc(2048)               = 0x55a1a2b2e670  
free(0x55a1a2b2e260)       = <void>  
malloc(4096)               = 0x55a1a2b2f000  

结论

  • malloc 次数远多于 free,可能存在内存泄漏。

  • 检查未配对的 malloc 地址(如 0x55a1a2b2f000 未释放)。


案例 2:定位第三方库崩溃

场景:程序调用 OpenSSL 库时崩溃,日志无明确错误信息。

ltrace -e SSL_* ./myapp  

输出示例

SSL_CTX_new(0x7f8d5c0038c0, 0) = 0x55a1a2b2e260  
SSL_new(0x55a1a2b2e260)         = 0x55a1a2b2e670  
SSL_connect(0x55a1a2b2e670)     = -1  

解析

  • SSL_connect 返回 -1,说明 TLS 握手失败。

  • 结合 ERR_get_error 函数进一步分析错误代码。


案例 3:统计函数调用开销

场景:优化程序性能,定位高耗时库函数。

ltrace -c ./myapp  

输出示例

% time     seconds  usecs/call     calls      function  
------ ----------- ----------- --------- --------------------  45.3    0.100000        200        500     malloc  30.1    0.066667        333        200     json_parse  

优化方向

  • malloc 调用频繁,考虑内存池或批量分配。

  • json_parse 耗时占比高,检查 JSON 解析逻辑或换用高效库。


案例 4:跟踪文件操作异常

场景:程序无法读取配置文件,权限和路径均正常。

ltrace -e fopen -e fclose ./myapp  

输出示例

fopen("config.yml", "r")         = 0x55a1a2b2e260  
fclose(0x55a1a2b2e260)          = 0  
fopen("/etc/app/config.yml", "r") = NULL  

结论

  • 程序尝试打开 /etc/app/config.yml 失败(返回 NULL),检查路径是否存在。


案例 5:跟踪多线程程序的竞态条件

场景:多线程程序偶发崩溃,疑似线程安全问题。

ltrace -f -e pthread_mutex_* ./myapp  

输出示例

pthread_mutex_lock(0x55a1a2b2e260) = 0  
pthread_mutex_unlock(0x55a1a2b2e260) = 0  
pthread_mutex_lock(0x55a1a2b2e260) = 0  

分析

  • 若发现未配对的 pthread_mutex_lock(如多次加锁未解锁),可能触发死锁。


四、高级技巧
1. 过滤特定函数并显示参数详情
ltrace -e "fopen" -e "printf" -s 256 ./myapp  
  • -s 256:显示完整字符串参数(避免截断)。

2. 结合指令指针定位代码位置
ltrace -i ./myapp  

输出示例

[0x401234] malloc(1024) = 0x55a1a2b2e260  
  • 使用 addr2line -e myapp 0x401234 转换为代码行号。

3. 跟踪系统调用与库函数
ltrace -S -e malloc ./myapp  

说明

  • -S 同时显示系统调用(类似 strace),适合全链路分析。


五、注意事项
  1. 性能影响

    • ltrace 会显著降低程序性能(尤其是高频函数调用),生产环境慎用。

  2. 动态链接限制

    • 只能跟踪动态链接库(.so),静态链接函数无法显示。

  3. 权限要求

    • 附加到其他用户的进程需 root 权限(sudo ltrace -p PID)。


六、安装方法
# Debian/Ubuntu  
apt-get install ltrace  
​
# RHEL/CentOS  
yum install ltrace  

七、总结

通过 ltrace,运维工程师可以:

  • 诊断内存泄漏malloc/free 不匹配)。

  • 分析第三方库问题(如加密库、JSON 解析库)。

  • 优化性能瓶颈(高频函数调用统计)。

  • 定位用户态崩溃(空指针、参数错误)。

结合 strace(系统调用分析)和 gdb(源码级调试),能构建完整的程序行为分析体系。

dmesg命令


一、命令概述

dmesg(Display Message)是 Linux 下用于 查看和控制内核环形缓冲区 的核心工具,记录系统启动过程、硬件设备检测、驱动加载、内核事件等重要信息。运维工程师常用其诊断 硬件故障、驱动问题、系统启动失败 等底层问题。


二、核心选项与参数
选项说明
-T显示人类可读的时间戳(需 sudo
-H分页显示(类似 less
-w实时监控新内核消息(类似 tail -f
-k仅显示内核消息(默认行为)
-l <级别>按日志级别过滤(emerg, alert, crit, err, warn, notice, info, debug
-s <缓冲区大小>设置缓冲区大小(默认依赖内核配置)
-c清空缓冲区(查看后清除日志)
--follow持续输出新日志(类似 tail -f
-d显示时间差(自上次启动以来的秒数)
-t不显示时间戳

三、工作案例场景
案例 1:查看系统启动错误

场景:系统启动后无法进入图形界面,排查驱动或硬件问题。

sudo dmesg -T | grep -i -A10 -B10 "error\|failed" 

输出示例

[Sun Oct 15 14:30:22 2023] ACPI Error: Could not resolve symbol [\_SB.PCI0.GFX0.DD02._BCM]  
[Sun Oct 15 14:30:22 2023] nouveau 0000:01:00.0: Direct firmware load for nouveau/nv108_fuc409d failed  

结论

  • ACPI 电源管理模块错误。

  • NVIDIA 显卡驱动 nouveau 加载固件失败,需更换驱动或更新固件。


案例 2:诊断 USB 设备识别问题

场景:插入 USB 设备后无反应,确认是否被系统识别。

sudo dmesg -w | grep -i "usb"  

输出示例

[+5.123456] usb 3-1: new high-speed USB device number 5 using xhci_hcd  
[+5.234567] usb 3-1: device descriptor read/64, error -110  

结论

  • USB 设备描述符读取失败(错误码 -110),可能是硬件损坏或供电不足。


案例 3:监控实时内核事件

场景:排查系统偶发性卡顿,观察是否有硬件中断风暴。

sudo dmesg --follow | grep -i "irq"  

输出示例

[+120.456789] irq 16: nobody cared (try booting with the "irqpoll" option)  

解析

  • 中断请求(IRQ)未被处理,需调整内核参数或排查硬件冲突。


案例 4:分析内存故障

场景:系统频繁崩溃,怀疑内存条接触不良或损坏。

sudo dmesg -l err,crit | grep -i "memory"  

输出示例

[Sun Oct 15 14:30:22 2023] EDAC MC0: UE memory read error on CPU_SrcID#0_Ha#0_Chan#0_DIMM#0  

结论

  • 内存条(DIMM#0)不可纠正错误(UE),需更换内存。


案例 5:查看硬盘健康状态

场景:磁盘性能下降,检查是否有 S.M.A.R.T 告警。

sudo dmesg | grep -i "sata\|ata\|sector"  

输出示例

[Sun Oct 15 14:30:22 2023] ata1.00: revalidation failed (errno=-5)  
[Sun Oct 15 14:30:22 2023] sd 0:0:0:0: [sda] 15628053168 512-byte logical blocks: (7.46 TB/6.78 TiB)  
[Sun Oct 15 14:30:22 2023] print_req_error: I/O error, dev sda, sector 12345678  

解析

  • sda 磁盘出现 I/O 错误(坏道或连接问题)。


四、高级技巧
1. 按时间范围过滤日志
# 显示最近 10 分钟内的内核日志  
sudo dmesg -T | grep -A1000 "$(date -d '10 minutes ago' +'%a %b %d %H:%M')"  
2. 保存日志到文件
sudo dmesg -T > /var/log/kernel.log  
3. 结合 journalctl 查看持久化日志
journalctl --dmesg --since "2023-10-15 14:00:00"  
4. 解码错误码
dmesg | grep -i "error" | perl -n -e '/error code (-?\d+)/ && print "Error $1: " . `man 2 $1`'  

五、注意事项
  1. 权限要求

    • 部分日志需 sudo 权限访问(如 -T 显示时间戳)。

  2. 日志循环

    • 默认缓冲区大小有限,长时间运行的系统可能覆盖旧日志。

    • 使用 -s 1048576 增大缓冲区或通过 sysctl -w kernel.dmesg_restrict=0 解除限制。

  3. 时间戳精度

    • -T 依赖系统时钟,若启动后时钟未同步,时间可能有偏差。


六、总结

通过 dmesg,运维工程师可以:

  • 诊断硬件故障(内存、硬盘、USB 设备)。

  • 分析驱动兼容性(加载失败、固件缺失)。

  • 监控内核事件(中断错误、ACPI 问题)。

  • 排查启动问题(初始化失败、设备未识别)。

结合过滤工具(grepawk)和实时监控(--follow),能快速定位系统底层异常,是维护系统稳定性的关键工具。

lspci/lsusb命令


一、lspci 命令详解

lspci 用于 查看 PCI(Peripheral Component Interconnect)总线及设备信息,包括显卡、网卡、存储控制器等硬件信息,是排查硬件兼容性、驱动问题的核心工具。

1. 核心选项
选项说明
-v显示详细信息(-vv-vvv 更详细)
-k显示设备使用的内核驱动
-n以数字形式显示厂商 ID 和设备 ID
-nn显示厂商 ID、设备 ID 及名称
-t以树状图显示设备层次结构
-s <总线:设备.功能>指定设备位置(如 -s 00:1f.2
-m以机器友好格式输出(适合脚本处理)
--json输出 JSON 格式数据
2. 工作案例
案例 1:查看所有 PCI 设备列表
lspci  

输出示例

00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers  
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 630  
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)  
案例 2:查看网卡驱动信息
lspci -v -s 01:00.0  

输出示例

01:00.0 Ethernet controller: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)  Subsystem: ASRock Incorporation RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller  Flags: bus master, fast devsel, latency 0, IRQ 19  I/O ports at 3000 [size=256]  Memory at a1204000 (64-bit, non-prefetchable) [size=4K]  Memory at a1200000 (64-bit, non-prefetchable) [size=16K]  Capabilities: [40] Power Management version 3  Capabilities: [50] MSI: Enable+ Count=1/1 Maskable- 64bit+  Kernel driver in use: r8169  Kernel modules: r8169  
案例 3:生成硬件清单(JSON 格式)
lspci --json > pci_devices.json  

二、lsusb 命令详解

lsusb 用于 查看 USB 总线及设备信息,包括 U 盘、摄像头、外置网卡等 USB 设备,适合排查 USB 设备识别问题或供电问题。

1. 核心选项
选项说明
-v显示详细信息(-vv 更详细)
-t以树状图显示设备层次结构
-s <总线:设备>指定设备位置(如 -s 1:2
-d <厂商ID:产品ID>按厂商和产品 ID 过滤(如 -d 8086:1e31
--json输出 JSON 格式数据
2. 工作案例
案例 1:查看所有 USB 设备列表
lsusb  

输出示例

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub  
Bus 001 Device 004: ID 046d:c52b Logitech USB Receiver  
Bus 001 Device 002: ID 8087:0029 Intel Corp.  
案例 2:查看 USB 摄像头详细信息
lsusb -v -d 046d:0825  

输出示例

Device Descriptor:  idVendor           0x046d Logitech, Inc.  idProduct          0x0825 Webcam C270  bcdDevice          1.00  iManufacturer      1  iProduct           2  iSerial            3  bNumConfigurations 1  Configuration Descriptor:  bLength         9  bDescriptorType 2  wTotalLength    200  bNumInterfaces   1  ...  
案例 3:检查 USB 设备供电状态
lsusb -v | grep -E "(Bus|MaxPower)"  

输出示例

Bus 001 Device 002: ID 8087:0029 Intel Corp.  MaxPower                0mA  
Bus 001 Device 004: ID 046d:c52b Logitech USB Receiver  MaxPower                98mA  

结论

  • 若设备 MaxPower 显示 0mA,可能因供电不足导致设备无法识别。


三、组合使用案例
案例 1:诊断无线网卡驱动问题
# 1. 查找无线网卡 PCI 地址  
lspci -nn | grep -i "network"  
# 输出:03:00.0 Network controller: Intel Corporation Wi-Fi 6 AX200 (rev 1a)  
​
# 2. 查看驱动信息  
lspci -v -s 03:00.0  
# 输出:Kernel driver in use: iwlwifi  
​
# 3. 检查驱动是否加载  
dmesg | grep iwlwifi  
案例 2:排查 USB 存储设备未挂载
# 1. 确认设备是否被识别  
lsusb | grep "SanDisk"  
# 输出:Bus 001 Device 005: ID 0781:5588 SanDisk Corp. Ultra  
​
# 2. 查看内核日志  
dmesg | grep "sdb"  
# 输出:sd 2:0:0:0: [sdb] 625142448 512-byte logical blocks: (320 GB/298 GiB)  
案例 3:生成硬件报告(自动化脚本)
#!/bin/bash  
echo "=== PCI Devices ===" > hardware_report.txt  
lspci -v >> hardware_report.txt  
echo "=== USB Devices ===" >> hardware_report.txt  
lsusb -v >> hardware_report.txt  

四、高级技巧
1. 解析厂商和产品 ID
lspci -nn | grep -i "nvidia"  
# 输出:01:00.0 VGA [0300]: NVIDIA Corporation GP106 [10de:1c03] (rev a1)  
​
lsusb -d 046d:c52b  
# 输出:Bus 001 Device 004: ID 046d:c52b Logitech, Inc.  
2. 查看 USB 设备速度
lsusb -t  
# 输出:  
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M  |__ Port 2: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M  
3. 监控 USB 设备热插拔
watch -n1 lsusb  

五、总结
  • lspci:核心用于 PCI/PCIe 设备管理(显卡、网卡、存储控制器)。

  • lsusb:核心用于 USB 设备管理(外设、摄像头、存储设备)。

  • 联合工具:结合 dmesg(内核日志)、sysctl(内核参数)进行硬件问题深度诊断。

适用场景

  • 硬件兼容性验证(驱动是否加载)。

  • 设备识别问题排查(是否被系统检测到)。

  • 硬件性能调优(IRQ 冲突、DMA 配置)。

  • 自动化硬件清单生成(JSON/文本报告)。

六、安全与审计

chattr/lsattr命令


一、命令概述
  • chattr 用于修改文件或目录的 扩展属性(Extended Attributes),这些属性控制文件系统的底层行为(如不可删除、不可修改、仅追加等)。

  • lsattr 用于查看文件或目录的扩展属性。

  • 适用场景:防止文件被误删、保护关键配置文件、限制日志文件修改等。


二、核心属性说明
属性作用
a仅允许追加内容(不可修改或删除已有内容)
i文件不可修改、删除、重命名或创建硬链接(不可变)
A禁用文件的 atime 更新(减少磁盘 I/O)
c启用透明压缩(需文件系统支持,如 btrfs
u删除文件后保留数据块以便恢复(需专业工具)
e表示文件使用 ext4 的 extent 格式(默认启用,不可修改)

三、chattr 命令用法
# 添加属性  
chattr +[属性] <文件或目录>  
​
# 移除属性  
chattr -[属性] <文件或目录>  
​
# 递归操作目录  
chattr -R +[属性] <目录>  
常用选项
选项说明
-R递归处理目录及子目录内容
-v显示详细操作信息

四、lsattr 命令用法
lsattr <文件或目录>  
lsattr -R <目录>  # 递归查看目录属性  
常用选项
选项说明
-R递归列出目录及子目录属性
-a显示隐藏文件属性
-d显示目录本身属性(非内容)

五、工作案例场景
案例 1:防止关键文件被误删或修改
# 保护 /etc/passwd 文件(禁止所有修改)  
sudo chattr +i /etc/passwd  
​
# 验证属性  
lsattr /etc/passwd  
# 输出:----i---------e-- /etc/passwd  
​
# 尝试删除或修改(会失败)  
sudo rm /etc/passwd  
# 报错:rm: cannot remove '/etc/passwd': Operation not permitted  
案例 2:保护日志文件仅允许追加
# 允许向日志文件追加新内容,但禁止修改已有内容  
sudo chattr +a /var/log/nginx/access.log  
​
# 验证属性  
lsattr /var/log/nginx/access.log  
# 输出:-----a----------e-- /var/log/nginx/access.log  
​
# 尝试覆盖写入(会失败)  
echo "test" > /var/log/nginx/access.log  
# 报错:bash: access.log: Operation not permitted  
​
# 允许追加新日志  
echo "test" >> /var/log/nginx/access.log  
案例 3:防止目录被篡改
# 递归保护 /etc/nginx 目录(禁止任何修改)  
sudo chattr -R +i /etc/nginx  
​
# 验证属性  
lsattr -d /etc/nginx  
# 输出:----i---------e-- /etc/nginx  
​
# 尝试添加新配置文件  
sudo touch /etc/nginx/new.conf  
# 报错:touch: cannot touch '/etc/nginx/new.conf': Permission denied  
案例 4:优化文件系统性能
# 禁用文件的 atime 更新(减少磁盘 I/O)  
sudo chattr -R +A /data  
​
# 验证属性  
lsattr /data/file.txt  
# 输出:-------A--------e-- /data/file.txt  

六、注意事项
  1. 权限要求

    • 修改属性需 root 权限(使用 sudo)。

  2. 属性优先级

    • ia 属性会覆盖文件权限(即使 chmod 777 也无法修改)。

  3. 恢复文件操作

    • 若误锁文件,需先移除属性(如 chattr -i)。

  4. 备份与恢复

    • 使用 i 属性前确保有备份,避免系统更新或服务重启失败。


七、总结
  • chattr 是系统安全的最后一道防线,适用于保护核心配置、日志和敏感数据。

  • lsattr 用于调试文件不可修改、删除等异常问题。

  • 常用组合

    • 防误删chattr +i

    • 日志保护chattr +a

    • 性能优化chattr +A

  • 风险提示:误用 i 属性可能导致系统服务崩溃,操作前务必确认影响范围。

getfacl/setfacl命令


一、命令概述
  • getfacl:查看文件或目录的 访问控制列表(ACL),显示详细的权限配置。

  • setfacl:设置或修改 ACL,实现 细粒度权限控制(如为特定用户/组分配独立权限)。

  • 适用场景:传统 Unix 权限(用户/组/其他)无法满足复杂权限需求时(如多用户协作、共享目录权限继承)。


二、ACL 核心概念
  • ACL 条目类型

    • 用户条目user:username:权限

    • 组条目group:groupname:权限

    • 掩码(mask):限制有效权限(类似 umask

    • 默认 ACL:目录的默认 ACL 会被其子文件和目录继承。

  • 权限符号

    • r(读)、w(写)、x(执行)、-(无权限)。


三、getfacl 命令用法
getfacl <文件或目录>  
getfacl -R <目录>  # 递归查看目录及子内容  
输出示例
# file: test.txt  
# owner: root  
# group: staff  
user::rw-  
user:alice:r--  
group::r--  
mask::r--  
other::r--  
  • 解析

    • user:alice:r--:用户 alice 有读权限。

    • mask::r--:有效权限掩码为读(限制用户/组最大权限)。


四、setfacl 命令用法
# 添加/修改 ACL 条目  
setfacl -m <条目> <文件或目录>  
​
# 删除 ACL 条目  
setfacl -x <条目> <文件或目录>  
​
# 删除所有 ACL 条目  
setfacl -b <文件或目录>  
​
# 设置默认 ACL(仅目录有效)  
setfacl -d -m <条目> <目录>  
常用选项
选项说明
-m修改 ACL 条目
-x删除指定 ACL 条目
-b清除所有 ACL 条目
-R递归操作目录内容
-d设置默认 ACL(影响新创建的文件/目录)
-k删除所有默认 ACL 条目

五、工作案例场景
案例 1:为特定用户分配独立权限

场景:目录 /data/shared 需要允许用户 alice 读写,但不影响其他用户。

# 添加用户 ACL  
sudo setfacl -m u:alice:rwx /data/shared  
​
# 验证权限  
getfacl /data/shared  
# 输出:user:alice:rwx  
​
# 检查权限是否生效  
su - alice -c "touch /data/shared/test.txt"  # 应成功 

案例 2:为组设置权限并限制掩码

场景:允许组 developers 读写文件 app.conf,但掩码限制为只读。

# 添加组 ACL 并设置掩码  
sudo setfacl -m g:developers:rw- app.conf  
sudo setfacl -m m::r-- app.conf  
​
# 验证结果  
getfacl app.conf  
# 输出:  
# group:developers:rw-    # 有效权限被掩码限制为 r--  
# mask::r--  

案例 3:设置继承权限(默认 ACL)

场景:目录 /backup 下所有新文件自动继承组 backup-team 的读写权限。

# 设置默认 ACL  
sudo setfacl -d -m g:backup-team:rw /backup  
​
# 创建子文件验证  
touch /backup/newfile  
getfacl /backup/newfile  
# 输出:group:backup-team:rw-  

案例 4:删除 ACL 条目

场景:移除用户 bob 对文件 report.txt 的写权限。

sudo setfacl -x u:bob report.txt  

案例 5:递归恢复目录权限

场景:清除 /var/www 目录及其子项的所有 ACL 设置。

sudo setfacl -Rb /var/www  

六、高级技巧
1. ACL 权限备份与恢复
# 备份 ACL  
getfacl -R /data > /backup/data_acls.txt  
​
# 恢复 ACL  
setfacl --restore=/backup/data_acls.txt  
2. 结合 cp/rsync 保留 ACL
cp --preserve=all source.txt dest.txt      # 保留 ACL  
rsync -A source_dir/ dest_dir/            # 同步 ACL  
3. 调试权限冲突
# 查看有效权限(mask 的影响)  
getfacl file.txt  

七、注意事项
  • 文件系统支持:确保挂载时启用 ACL(如 ext4 挂载选项含 acl)。

  • 权限优先级:ACL 条目优先级高于传统组权限。

  • SELinux 影响:若启用 SELinux,需确保上下文与 ACL 不冲突。


八、总结
  • getfacl:快速查看复杂权限配置,验证 ACL 是否生效。

  • setfacl:实现灵活权限分配(用户/组/默认继承),突破传统 Unix 权限限制。

  • 核心场景:多团队协作、共享目录、精细化权限管理。

通过合理使用 ACL,运维工程师可高效管理企业级文件系统的访问控制,增强数据安全性和协作灵活性。

auditd审计


一、auditd 概述

auditd 是 Linux 内核的 审计框架守护进程,用于监控和记录系统级事件(如文件访问、用户操作、系统调用、网络连接等)。其主要功能包括:

  • 安全合规:满足 GDPR、HIPAA 等安全审计要求。

  • 入侵检测:追踪异常行为(如敏感文件篡改、提权操作)。

  • 故障排查:记录系统关键操作日志,用于事后分析。


二、核心组件与配置
  • 守护进程auditd 服务,负责收集和存储审计日志。

  • 控制工具

    • auditctl:动态管理审计规则。

    • ausearch:查询审计日志。

    • aureport:生成审计报告。

  • 配置文件

    • /etc/audit/auditd.conf:审计守护进程配置(日志路径、轮转策略等)。

    • /etc/audit/rules.d/audit.rules:审计规则定义文件(持久化规则)。


三、auditctl 命令用法
# 临时添加规则  
auditctl -w <监控路径> -p <权限> -k <关键字标签>  
​
# 查看当前规则  
auditctl -l  
​
# 删除所有规则  
auditctl -D  
​
# 永久保存规则  
auditctl -R /etc/audit/rules.d/audit.rules  
参数说明
  • -w:监控文件或目录路径。

  • -p:监控的操作权限(r读、w写、x执行、a属性修改)。

  • -k:自定义关键字,用于日志筛选。


四、工作案例场景
案例 1:监控敏感文件访问(如 /etc/passwd

目标:记录任何对 /etc/passwd 的读写或属性修改操作。

# 添加规则  
auditctl -w /etc/passwd -p wa -k passwd_change  
​
# 验证规则  
auditctl -l  
# 输出:-w /etc/passwd -p wa -k passwd_change  
​
# 测试触发日志  
echo "test" >> /etc/passwd  # 故意触发写入(需 root 权限)  
​
# 查询日志  
ausearch -k passwd_change -i  

日志输出

time->Fri Oct 15 14:30:22 2023  
type=PROCTITLE msg=audit(1697370622.123:456): proctitle="sh -c echo test >> /etc/passwd"  
type=SYSCALL msg=audit(1697370622.123:456): arch=c000003e syscall=open success=yes exit=3 ...  

案例 2:监控用户提权操作(如 sudosu

目标:记录所有用户执行 sudo 或切换用户(su)的行为。

# 添加规则  
auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k sudo_usage  
auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/bin/su -k su_usage  
​
# 查询日志  
ausearch -k "sudo_usage\|su_usage" -i  

案例 3:监控网络连接(如未授权的端口访问)

目标:记录所有对 22 端口(SSH)的访问尝试。

# 添加规则  
auditctl -a always,exit -F arch=b64 -S connect -F a2=22 -k ssh_connection  
​
# 查询日志  
ausearch -k ssh_connection -i  

日志输出

type=SYSCALL msg=audit(1697370622.123:456): arch=c000003e syscall=connect success=no exit=-13 ...  

案例 4:监控文件系统挂载/卸载操作

目标:记录所有 mountumount 命令的执行。

# 添加规则  
auditctl -w /usr/bin/mount -p x -k mount_operation  
auditctl -w /usr/bin/umount -p x -k mount_operation  
​
# 查询日志  
ausearch -k mount_operation -i  

五、日志分析与报告
1. 使用 ausearch 查询日志
# 按关键字搜索  
ausearch -k passwd_change  
​
# 按时间范围搜索  
ausearch -ts "14:30:00" -te "15:00:00"  
​
# 按用户搜索  
ausearch -ui root  
2. 使用 aureport 生成报告
# 生成用户活动摘要  
aureport -u  
​
# 生成文件访问报告  
aureport -f  
​
# 生成所有事件汇总  
aureport -summary  

六、高级配置
1. 日志轮转与存储

编辑 /etc/audit/auditd.conf

max_log_file = 50     # 单个日志文件最大 50MB  
num_logs = 5          # 保留 5 个历史日志  

重启服务生效:

systemctl restart auditd  
2. 永久化审计规则

将规则写入 /etc/audit/rules.d/audit.rules

-w /etc/passwd -p wa -k passwd_change  
-a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k sudo_usage  

加载规则:

auditctl -R /etc/audit/rules.d/audit.rules  

七、注意事项
  • 性能影响:高频事件(如监控所有 execve 调用)可能导致日志爆炸,需合理配置规则。

  • 日志安全:审计日志需严格权限控制(root 只读),防止篡改。

  • SELinux 集成:确保审计规则与 SELinux 策略不冲突。

  • 规则调试:使用 auditctl -lausearch 验证规则是否生效。


八、总结

通过 auditd,运维工程师可以:

  • 实现合规审计:满足安全标准对日志记录的要求。

  • 主动防御入侵:检测异常文件操作、非法提权、可疑网络连接。

  • 精准故障排查:通过事件回溯定位系统问题根源。

结合 ausearchaureport 工具,能高效分析海量日志数据,是企业级系统安全的核心组件。

lynis工具


一、Lynis 概述

Lynis 是一款开源的 自动化安全审计工具,用于扫描 Linux 系统和类 Unix 系统,检测潜在安全漏洞和配置问题,提供合规性检查和修复建议。其核心功能包括:

  • 系统弱点扫描:检查内核参数、文件权限、服务配置等。

  • 合规性审计:支持 CIS、HIPAA、PCI-DSS 等标准。

  • 自动化修复建议:提供详细的问题描述和解决方案。

  • 报告生成:生成 HTML 或 JSON 格式的审计报告。


二、安装与配置
1. 安装 Lynis
# Debian/Ubuntu  
sudo apt install lynis  
​
# RHEL/CentOS  
sudo yum install epel-release  
sudo yum install lynis  
​
# 从源码安装(最新版本)  
git clone https://github.com/CISOfy/lynis  
cd lynis  
sudo ./lynis audit system  
2. 配置文件

Lynis 配置文件位于 /etc/lynis/default.prf,可自定义扫描范围和规则。

# 自定义排除路径  
SKIP_FILES="/tmp/example"  
​
# 调整扫描深度  
VERBOSE=1  

三、核心命令与选项
lynis [选项] [审计类型]  
常用选项
选项说明
audit system执行完整系统审计(默认操作)
--quick快速扫描(跳过耗时检查)
--pentest渗透测试模式(模拟攻击者视角)
--report-file指定报告输出路径(如 --report-file /tmp/report.txt
--no-log禁止写入日志文件
--cronjob静默模式(适合定时任务)

四、工作案例场景
案例 1:执行完整系统安全审计

场景:检查服务器是否符合 CIS 基准规范,生成详细报告。

sudo lynis audit system --report-file /var/log/lynis-report.txt  

输出关键项

[+] Boot and services  - Check UEFI Secure Boot [FOUND]  - Check for presence GRUB2 password [WARNING]  
​
[+] Suggestions  * Set a password for GRUB2 boot loader [LYNIS]  * Harden the system by restricting core dumps [KRNL-5830]  

后续操作

  1. 根据报告中的 WARNINGSUGGESTION 修复问题(如设置 GRUB 密码)。

  2. 重新扫描验证修复效果:

    sudo lynis audit system --quick  

案例 2:生成合规性报告(HTML)

场景:为安全团队生成可视化审计报告,用于合规性审查。

sudo lynis audit system --report-file /tmp/lynis.html --format html  

报告内容

  • 风险等级分布(高/中/低)。

  • 合规性检查结果(CIS、PCI-DSS)。

  • 详细修复步骤和参考链接。


案例 3:渗透测试模式扫描

场景:模拟攻击者视角,检测系统中可能被利用的弱点。

sudo lynis audit system --pentest  

重点检测项

  • 未加密的敏感文件(如 /etc/passwd 权限)。

  • 弱密码策略(密码最小长度、过期时间)。

  • 开放的高风险端口(如匿名 FTP、未加密的 Telnet)。


案例 4:自动化定期审计(Cron 任务)

场景:每周自动扫描并邮件通知管理员。

# 创建脚本 /opt/lynis-scan.sh  
#!/bin/bash  
sudo lynis audit system --cronjob --report-file /var/log/lynis-$(date +%Y%m%d).log  
​
# 设置每周日 3:00 AM 执行  
(crontab -l ; echo "0 3 * * 0 /opt/lynis-scan.sh") | crontab -  

五、高级技巧
1. 自定义审计规则

/etc/lynis/custom.prf 中添加自定义测试项:

# 检查 SSH 端口是否为非标准端口  
test="SSH-7408"  
category="security"  
description="Check if SSH is running on non-default port"  
command="netstat -tuln | grep -q ':22'"  
expected_result="1"  

运行自定义测试:

sudo lynis audit system --tests-from-category security  
2. 集成到 CI/CD 流程

在 Jenkins/GitLab CI 中添加 Lynis 扫描阶段:

stages:  - security_audit  
​
lynis_audit:  stage: security_audit  script:  - sudo lynis audit system --quick --no-log  - lynis_audit_exit_code=$?  - if [ $lynis_audit_exit_code -ne 0 ]; then exit 1; fi  

六、注意事项
  • 权限要求:大部分扫描需 root 权限(使用 sudo)。

  • 误报处理:部分警告可能不适用当前环境,需人工确认。

  • 资源占用:完整扫描可能耗时较长,建议在低峰期执行。


七、总结

通过 Lynis,运维工程师可以:

  • 快速定位系统弱点(如未加密服务、权限配置错误)。

  • 满足合规性要求(生成符合审计标准的报告)。

  • 自动化安全加固(结合脚本定期扫描和修复)。

核心价值:将复杂的手动安全检查转化为自动化流程,提升运维效率和系统安全性。

七、软件包与服务管理

apt/dnf命令


一、apt(Debian/Ubuntu 系统包管理)
1. 核心命令与选项
命令说明
apt update更新软件包索引(同步仓库元数据)
apt upgrade升级所有可升级的软件包
apt install <包名>安装指定软件包
apt remove <包名>卸载软件包(保留配置文件)
apt purge <包名>彻底卸载软件包(删除配置文件)
apt autoremove删除自动安装且不再需要的依赖包
apt search <关键词>搜索软件包
apt show <包名>显示软件包详细信息
apt list --installed列出所有已安装的软件包
apt-cache policy <包名>查看软件包版本和优先级
2. 工作案例
案例 1:安装并固定软件版本
# 安装指定版本的 Nginx
sudo apt install nginx=1.18.0-0ubuntu1
​
# 禁止自动升级(避免意外升级到新版本)
sudo apt-mark hold nginx
​
# 解除固定
sudo apt-mark unhold nginx
案例 2:清理旧内核和缓存
# 删除旧内核(保留最新 2 个)
sudo apt autoremove --purge
​
# 清理下载缓存
sudo apt clean
案例 3:处理依赖冲突
# 强制安装(忽略依赖问题,谨慎使用)
sudo apt install -f <包名>
​
# 手动修复依赖(示例:修复损坏的 Python3 环境)
sudo apt install --reinstall python3-minimal python3-pip

二、yum/dnf(RHEL/CentOS 系统包管理)
1. 核心命令与选项
命令说明
yum check-update检查可用更新(不执行升级)
yum update升级所有软件包
yum install <包名>安装指定软件包
yum remove <包名>卸载软件包
yum search <关键词>搜索软件包
yum info <包名>显示软件包详细信息
yum list installed列出已安装的软件包
yum history查看操作历史(可撤销特定事务)
yum-config-manager管理仓库配置(需安装 yum-utils
2. 工作案例
案例 1:安装指定版本 MySQL
# 查看可用版本
yum list mysql-community-server --showduplicates
​
# 安装 5.7 版本
sudo yum install mysql-community-server-5.7.38-1.el7
​
# 锁定版本(防止意外升级)
sudo yum versionlock add mysql-community-server
案例 2:配置 EPEL 仓库
# 安装 EPEL 仓库
sudo yum install epel-release
​
# 手动添加第三方仓库(示例:Remi 仓库)
sudo rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
​
# 启用特定仓库(如 PHP 8.0)
sudo yum-config-manager --enable remi-php80
案例 3:回滚失败的更新
# 查看操作历史(获取事务 ID)
sudo yum history
​
# 撤销事务(示例:回滚 ID 为 6 的操作)
sudo yum history undo 6

三、通用场景与技巧
1. 系统升级
# Debian/Ubuntu
sudo apt update && sudo apt upgrade -y
​
# RHEL/CentOS
sudo yum update -y && sudo yum clean all
2. 安全补丁管理
# Debian:仅安装安全更新
sudo apt update && sudo apt upgrade --only-upgrade-security
​
# RHEL:使用 yum-plugin-security
sudo yum update --security
3. 本地包安装
# Debian:安装本地 .deb 包
sudo apt install ./package.deb
​
# RHEL:安装本地 .rpm 包
sudo yum localinstall package.rpm
4. 仓库优先级管理
# Debian:设置优先级(编辑 /etc/apt/preferences)
Package: nginx
Pin: version 1.18.*
Pin-Priority: 1001
​
# RHEL:配置优先级插件(安装 yum-plugin-priorities)
# 编辑仓库文件(如 /etc/yum.repos.d/epel.repo),添加 priority=1

四、注意事项
  • 权限要求:所有包管理操作需 sudo 权限。

  • 依赖冲突:避免强制安装(-f),优先手动解决依赖。

  • 版本锁定:生产环境建议锁定关键软件版本(如数据库、运行时环境)。

  • 仓库信任:仅添加可信第三方仓库,防止供应链攻击。


五、总结
  • apt:适合 Debian/Ubuntu 系统,强在版本管理和自动依赖处理。

  • yum/dnf:适合 RHEL/CentOS 系统,支持事务回滚和细粒度仓库控制。

  • 通用原则

    • 更新前备份:关键系统升级前使用快照或备份工具。

    • 最小化变更:避免频繁升级生产环境核心组件。

    • 审计仓库:定期检查仓库配置,删除无效或高风险源。

systemctl命令


一、命令概述

systemctl 是管理 systemd 系统和服务管理器 的核心工具,用于控制服务(守护进程)、挂载点、设备、套接字等单元(Unit)。作为现代 Linux 系统(CentOS 7+、Ubuntu 16.04+ 等)的标配工具,其核心功能包括:

  • 服务生命周期管理(启动、停止、重启)

  • 服务状态监控(运行状态、日志、依赖关系)

  • 开机自启配置

  • 系统运行级别(Target)管理

  • 单元文件(Unit File)编辑与重载


二、核心命令与选项
命令说明
systemctl start <服务名>启动服务
systemctl stop <服务名>停止服务
systemctl restart <服务名>重启服务
systemctl reload <服务名>重新加载配置(不中断服务)
systemctl status <服务名>查看服务状态(含进程ID、日志片段)
systemctl enable <服务名>启用开机自启
systemctl disable <服务名>禁用开机自启
systemctl is-enabled <服务名>检查服务是否已启用开机自启
systemctl list-units --type=service列出所有已加载的服务单元
systemctl list-dependencies <服务名>查看服务的依赖关系树
systemctl daemon-reload重新加载单元文件(修改配置后必须执行)
systemctl mask <服务名>禁止服务启动(创建符号链接到 /dev/null,彻底禁用)
systemctl unmask <服务名>解除服务禁用
systemctl show <服务名>显示服务的详细属性(如内存占用、启动参数)
systemctl kill <服务名>强制终止服务进程(默认发送 SIGTERM,可指定信号如 -s SIGKILL

三、工作案例场景
案例 1:排查服务启动失败

场景:Nginx 服务启动失败,查看详细日志和依赖关系。

# 查看服务状态  
systemctl status nginx  
​
# 输出关键信息示例:  
● nginx.service - A high performance web server and a reverse proxy server  Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)  Active: failed (Result: exit-code) since Wed 2023-10-18 14:30:22 CST; 2min ago  Process: 1234 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)  
​
# 查看完整日志  
journalctl -u nginx --since "5 minutes ago"  
​
# 检查依赖项  
systemctl list-dependencies nginx  

可能原因

  • 配置文件语法错误(nginx -t 验证)

  • 端口被占用(ss -tuln | grep :80

  • 依赖服务未启动(如 systemd-networkd-wait-online.service


案例 2:自定义服务管理

场景:将 Python 脚本部署为系统服务,实现开机自启和日志管理。

# 创建服务文件  
sudo vim /etc/systemd/system/myapp.service  
​
# 内容示例:  
[Unit]  
Description=My Python Application  
After=network.target  
​
[Service]  
User=appuser  
WorkingDirectory=/opt/myapp  
ExecStart=/usr/bin/python3 /opt/myapp/main.py  
Restart=always  
RestartSec=30  
StandardOutput=syslog  
StandardError=syslog  
SyslogIdentifier=myapp  
​
[Install]  
WantedBy=multi-user.target  
​
# 重载配置并启用服务  
sudo systemctl daemon-reload  
sudo systemctl enable myapp  
sudo systemctl start myapp  
​
# 验证日志  
journalctl -u myapp -f  

案例 3:限制服务资源

场景:限制 MySQL 服务的内存使用,防止 OOM(Out-Of-Memory)崩溃。

# 编辑服务单元文件  
sudo systemctl edit mysql  
​
# 添加以下内容(会生成片段文件,无需修改原文件):  
[Service]  
MemoryLimit=4G  
CPUQuota=80%  
​
# 重载配置并重启服务  
sudo systemctl daemon-reload  
sudo systemctl restart mysql  
​
# 验证资源限制  
systemctl show mysql | grep -E "MemoryLimit|CPUQuota"  

案例 4:处理服务依赖冲突

场景:Docker 服务因依赖的 containerd 服务未启动而失败。

# 查看 Docker 依赖  
systemctl list-dependencies docker  
​
# 手动启动 containerd  
systemctl start containerd  
​
# 设置 containerd 开机自启  
systemctl enable containerd  
​
# 重启 Docker  
systemctl restart docker  

案例 5:隔离运行环境(Sandboxing)

场景:增强服务安全性,限制 Web 服务访问系统资源。

# 编辑服务单元文件  
sudo systemctl edit nginx  
​
# 添加沙盒配置:  
[Service]  
ProtectHome=yes  
ProtectSystem=full  
PrivateTmp=yes  
NoNewPrivileges=yes  
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX  
​
# 重载配置并重启服务  
sudo systemctl daemon-reload  
sudo systemctl restart nginx  

四、高级技巧
1. 查看服务启动耗时
systemd-analyze blame        # 查看各服务启动时间  
systemd-analyze critical-chain nginx  # 分析指定服务启动链  
2. 修改默认运行级别(Target)
# 切换到图形界面模式  
systemctl isolate graphical.target  
​
# 设置默认启动目标  
systemctl set-default multi-user.target  
3. 定时重启服务
# 创建定时器单元文件  
sudo vim /etc/systemd/system/myapp-timer.timer  
​
# 内容示例:  
[Unit]  
Description=Daily restart of MyApp  
​
[Timer]  
OnCalendar=daily  
Persistent=true  
​
[Install]  
WantedBy=timers.target  
​
# 启动定时器  
systemctl enable myapp-timer.timer  
systemctl start myapp-timer.timer  

五、注意事项
  • 谨慎使用 systemctl mask:被禁用的服务无法通过任何方式启动,需确保不影响系统关键功能。

  • 避免直接修改单元文件:优先使用 systemctl edit <服务名>,生成 /etc/systemd/system/<服务名>.d/override.conf 片段文件。

  • 日志管理:结合 journalctl 的过滤选项(如 -u--since)快速定位问题。


六、总结

通过 systemctl,运维工程师可以:

  • 高效管理服务生命周期,确保服务稳定运行。

  • 深度调试服务问题,结合 journalctl 分析日志。

  • 实现资源隔离与安全加固,限制服务的系统权限。

  • 定制化服务配置,满足复杂业务场景需求。

核心口诀

启停重启用 start/stop/restart,  
状态日志看 status/journalctl,  
开机自启 enable/disable,  
依赖分析 list-dependencies,  
配置修改 edit + daemon-reload。  

总结

掌握以上命令足以应对生产环境中的 99%的运维需求,真正的难点在于:

  • 灵活组合命令(如 awk + grep + sort 分析日志)。

  • 理解系统原理(如内存Page Cache、TCP三次握手)。

  • 自动化思维(用Shell/Python编写巡检脚本)。 建议将命令分类整理成Cheat Sheet,在实战中反复练习!

http://www.xdnf.cn/news/1036027.html

相关文章:

  • 华为OD机试_2025 B卷_字符串分割(Python,100分)(附详细解题思路)
  • aflplusplus:开源的模糊测试工具!全参数详细教程!Kali Linux教程!(四)
  • 22 - PSA模块
  • 解惑1、为何大容量电容滤低频,小容量电容滤高频
  • 数据库资源帖
  • 同旺科技 USB TO SPI / I2C适配器(专业版)--EEPROM读写——A
  • 代码随想录算法训练营day4
  • (15)python+ selenium自动化测试 - 回顾2
  • 采用微服务的预期收益是什么?我们如何衡量成功?
  • 大IPD之——学习华为市场洞察,为战略找到方向(四)
  • FastGPT实战:从0搭建AI知识库与MCP AI Agent系统
  • Java求职者面试题解析:Spring、Spring Boot、MyBatis框架与源码原理
  • SpringBoot自动化部署实战指南
  • 【Photoshop】使用内容识别去除水印文字
  • Vue3 + TypeScript + Element Plus 表格实例null检查方法
  • Java设计题:如何设计一个线程池
  • 浅拷贝 与 深拷贝
  • HTTP1.1
  • JUC核心解析系列(四)——同步工具类 (Synchronizers)深度解析
  • 芯片测试之trim详解
  • Linux02
  • apt-get等操作依赖关系总报错?试一试aptitude
  • 高压接地电阻柜组装前的准备工作
  • nacos-作为注册中心与springcloud整合(三)
  • 【Elasticsearch】数据预处理(含实战案例)
  • Spring MVC扩展消息转换器-->格式化时间信息
  • 有些植物果实结在土里,但是花开在枝叶上,果不结在花上,花需要授粉才能结果吗?不用授粉的话,开花的意义在哪里?
  • 【MATLAB例程】追踪法制导的程序,适用于三维平面,目标是运动的,带绘图和捕获时间|附下载链接
  • 【CSS-14】深入解析CSS定位:从基础到高级应用
  • 【硬件】相机的硬件测试