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

目录

一、系统监控与性能分析

vmstat命令

一、命令语法及核心参数

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

三、工作场景案例

[1. 排查 CPU 瓶颈](#1. 排查 CPU 瓶颈)

[2. 内存不足导致 Swap 频繁](#2. 内存不足导致 Swap 频繁)

[3. 磁盘 I/O 性能问题](#3. 磁盘 I/O 性能问题)

[4. 系统卡顿实时监控](#4. 系统卡顿实时监控)

[5. 高级用法:统计内存事件](#5. 高级用法:统计内存事件)

四、总结

iostat命令

一、命令语法及核心参数

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

[1. CPU 统计(-c)](#1. CPU 统计(-c))

[2. 磁盘统计(-x -d)](#2. 磁盘统计(-x -d))

三、工作场景案例

[1. 定位磁盘高负载问题](#1. 定位磁盘高负载问题)

[2. 排查 CPU 异常占用](#2. 排查 CPU 异常占用)

[3. LVM 逻辑卷性能分析](#3. LVM 逻辑卷性能分析)

[4. 云盘性能验证](#4. 云盘性能验证)

[5. 高并发写入瓶颈分析](#5. 高并发写入瓶颈分析)

四、高级技巧

五、总结

iftop命令

一、安装与基础用法

[1. 安装方法](#1. 安装方法)

[2. 基础命令](#2. 基础命令)

二、核心参数详解

三、交互界面操作

四、输出字段解析

五、工作场景案例

[1. 定位服务器带宽跑满](#1. 定位服务器带宽跑满)

[2. 排查异常外联流量](#2. 排查异常外联流量)

[3. 分析数据库主从同步延迟](#3. 分析数据库主从同步延迟)

[4. 检测DDoS攻击](#4. 检测DDoS攻击)

[5. 多网卡流量分布不均](#5. 多网卡流量分布不均)

六、高级技巧

[1. 文本模式记录流量](#1. 文本模式记录流量)

[2. 组合过滤语法](#2. 组合过滤语法)

[3. 流量排序](#3. 流量排序)

七、总结

top/htop命令

[一、top 命令详解](#一、top 命令详解)

[1. 基础语法与核心参数](#1. 基础语法与核心参数)

[2. 交互界面操作](#2. 交互界面操作)

[3. 关键指标解析](#3. 关键指标解析)

[二、htop 命令进阶](#二、htop 命令进阶)

[1. 安装与基础用法](#1. 安装与基础用法)

[2. 核心功能对比 top](#2. 核心功能对比 top)

[3. 高级操作技巧](#3. 高级操作技巧)

三、工作场景案例

[1. CPU 使用率突增(使用 top)](#1. CPU 使用率突增(使用 top))

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

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

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

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

四、总结与最佳实践

ps命令

一、命令语法与核心参数

[1. 参数风格区分](#1. 参数风格区分)

[2. 关键参数](#2. 关键参数)

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

三、工作场景案例

[1. 检测内存泄漏进程](#1. 检测内存泄漏进程)

[2. 清理僵尸进程](#2. 清理僵尸进程)

[3. 追踪异常网络连接](#3. 追踪异常网络连接)

[4. 分析容器内进程](#4. 分析容器内进程)

[5. 统计用户进程资源](#5. 统计用户进程资源)

四、高级用法

[1. 自定义输出格式](#1. 自定义输出格式)

[2. 结合时间筛选进程](#2. 结合时间筛选进程)

[3. 进程状态批量操作](#3. 进程状态批量操作)

五、总结与最佳实践

pidstat命令

一、命令概述

二、安装与基本语法

三、核心选项及参数解析

四、工作案例场景

[案例 1:CPU 使用率过高排查](#案例 1:CPU 使用率过高排查)

[案例 2:内存泄漏分析](#案例 2:内存泄漏分析)

[案例 3:磁盘 I/O 瓶颈定位](#案例 3:磁盘 I/O 瓶颈定位)

[案例 4:上下文切换频繁分析](#案例 4:上下文切换频繁分析)

[案例 5:综合监控与自动化](#案例 5:综合监控与自动化)

五、高级技巧

六、注意事项

free命令

一、命令概述

二、基本语法

三、核心选项及参数解析

四、输出字段详解

五、工作案例场景

[案例 1:快速检查系统内存压力](#案例 1:快速检查系统内存压力)

[案例 2:持续监控内存使用变化](#案例 2:持续监控内存使用变化)

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

[案例 4:计算应用程序真实内存占用](#案例 4:计算应用程序真实内存占用)

[案例 5:优化 Swap 使用策略](#案例 5:优化 Swap 使用策略)

[案例 6:自动化内存监控脚本](#案例 6:自动化内存监控脚本)

六、高级技巧

七、注意事项

smem命令

一、命令概述

二、安装方法

三、核心指标解析

四、基本语法及常用选项

五、工作案例场景

[案例 1:快速定位内存占用最高的进程](#案例 1:快速定位内存占用最高的进程)

[案例 2:按用户统计内存消耗](#案例 2:按用户统计内存消耗)

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

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

[案例 5:分析共享内存的分布](#案例 5:分析共享内存的分布)

六、高级技巧

七、注意事项

pmap命令

一、命令概述

二、安装方法

三、核心字段解析

四、基本语法及常用选项

五、工作案例场景

[案例 1:快速定位进程内存占用详情](#案例 1:快速定位进程内存占用详情)

[案例 2:检查共享内存使用](#案例 2:检查共享内存使用)

[案例 3:分析动态库内存占用](#案例 3:分析动态库内存占用)

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

[案例 5:调试硬件设备内存映射](#案例 5:调试硬件设备内存映射)

六、高级技巧

七、注意事项

sar命令

一、命令概述

二、安装方法

三、核心指标解析

四、基本语法及常用选项

五、工作案例场景

[案例 1:实时监控 CPU 使用率](#案例 1:实时监控 CPU 使用率)

[案例 2:分析历史内存使用](#案例 2:分析历史内存使用)

[案例 3:诊断磁盘 I/O 瓶颈](#案例 3:诊断磁盘 I/O 瓶颈)

[案例 4:监控网络流量峰值](#案例 4:监控网络流量峰值)

[案例 5:生成综合性能报告](#案例 5:生成综合性能报告)

六、高级技巧

七、注意事项

八、字段与选项速查表

ss/netstat命令

一、命令概述

二、核心功能对比

[三、ss 命令详解](#三、ss 命令详解)

[1. 基本语法](#1. 基本语法)

[2. 常用选项](#2. 常用选项)

[3. 过滤语法](#3. 过滤语法)

[四、netstat 命令详解](#四、netstat 命令详解)

[1. 基本语法](#1. 基本语法)

[2. 常用选项](#2. 常用选项)

五、工作案例场景

[案例 1:快速检查服务端口是否监听](#案例 1:快速检查服务端口是否监听)

[案例 2:分析 ESTABLISHED 连接数异常](#案例 2:分析 ESTABLISHED 连接数异常)

[案例 3:定位 TIME_WAIT 状态过多问题](#案例 3:定位 TIME_WAIT 状态过多问题)

[案例 4:排查进程占用端口](#案例 4:排查进程占用端口)

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

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

[案例 7:自动化监控脚本](#案例 7:自动化监控脚本)

六、高级技巧

七、注意事项

curl/wget命令

一、核心区别与适用场景

[二、curl 命令详解](#二、curl 命令详解)

[1. 安装与基本语法](#1. 安装与基本语法)

[2. 常用选项](#2. 常用选项)

[3. 工作案例](#3. 工作案例)

[案例 1:快速检查服务健康状态](#案例 1:快速检查服务健康状态)

[案例 2:调试 API 接口](#案例 2:调试 API 接口)

[案例 3:下载文件并重命名](#案例 3:下载文件并重命名)

[案例 4:模拟浏览器访问](#案例 4:模拟浏览器访问)

[三、wget 命令详解](#三、wget 命令详解)

[1. 安装与基本语法](#1. 安装与基本语法)

[2. 常用选项](#2. 常用选项)

[3. 工作案例](#3. 工作案例)

[案例 1:批量下载日志文件](#案例 1:批量下载日志文件)

[案例 2:镜像静态网站](#案例 2:镜像静态网站)

[案例 3:后台下载大文件](#案例 3:后台下载大文件)

[案例 4:通过代理下载](#案例 4:通过代理下载)

四、安全与调试技巧

五、高级运维场景

[场景 1:自动化部署脚本](#场景 1:自动化部署脚本)

[场景 2:监控 API 响应时间](#场景 2:监控 API 响应时间)

[场景 3:分布式文件同步](#场景 3:分布式文件同步)

六、总结对比

nc(ncat)命令

一、命令概述

二、安装方法

三、核心选项与语法

四、工作案例场景

[案例 1:测试端口连通性](#案例 1:测试端口连通性)

[案例 2:临时文件传输](#案例 2:临时文件传输)

[案例 3:远程调试与交互式Shell](#案例 3:远程调试与交互式Shell)

[案例 4:简易代理或端口转发](#案例 4:简易代理或端口转发)

[案例 5:UDP 服务测试](#案例 5:UDP 服务测试)

[案例 6:多端口批量扫描](#案例 6:多端口批量扫描)

[案例 7:网络服务存活监控](#案例 7:网络服务存活监控)

五、高级技巧

[1. 结合 tar 实时压缩传输](#1. 结合 tar 实时压缩传输)

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

[3. 模拟 HTTP 请求](#3. 模拟 HTTP 请求)

六、注意事项

eth-tool命令

一、命令概述

二、核心选项与参数

三、工作案例场景

[案例 1:检查网卡基本状态](#案例 1:检查网卡基本状态)

[案例 2:修改网卡速率和双工模式](#案例 2:修改网卡速率和双工模式)

[案例 3:诊断丢包或高延迟问题](#案例 3:诊断丢包或高延迟问题)

[案例 4:排查 Offload 功能导致的性能问题](#案例 4:排查 Offload 功能导致的性能问题)

[案例 5:定位物理网卡设备](#案例 5:定位物理网卡设备)

四、高级技巧

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

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

五、注意事项

六、总结

tcpdump命令

一、命令概述

二、安装与基本语法

三、核心选项与参数

四、过滤表达式语法

五、工作案例场景

[案例 1:抓取 HTTP 请求内容](#案例 1:抓取 HTTP 请求内容)

[案例 2:检测 ICMP 不可达错误](#案例 2:检测 ICMP 不可达错误)

[案例 3:分析 DNS 查询请求](#案例 3:分析 DNS 查询请求)

[案例 4:捕获 TCP 三次握手与挥手](#案例 4:捕获 TCP 三次握手与挥手)

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

[案例 6:保存抓包数据并离线分析](#案例 6:保存抓包数据并离线分析)

六、高级技巧

七、注意事项

tshark(wireshark命令行)

一、命令概述

二、安装与基本语法

三、核心选项与参数

四、过滤语法

五、工作案例场景

[案例 1:实时抓取并分析 HTTP 请求](#案例 1:实时抓取并分析 HTTP 请求)

[案例 2:离线分析 TCP 重传问题](#案例 2:离线分析 TCP 重传问题)

[案例 3:提取 DNS 查询记录](#案例 3:提取 DNS 查询记录)

[案例 4:生成流量会话统计](#案例 4:生成流量会话统计)

[案例 5:提取 HTTP 请求的 User-Agent](#案例 5:提取 HTTP 请求的 User-Agent)

[案例 6:检测 SSH 暴力破解行为](#案例 6:检测 SSH 暴力破解行为)

六、高级技巧

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

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

[3. 自动化协议分析脚本](#3. 自动化协议分析脚本)

七、注意事项

三、磁盘与文件管理

df/du命令

一、命令概述

[二、df 命令详解](#二、df 命令详解)

[1. 核心选项](#1. 核心选项)

[2. 输出字段解析](#2. 输出字段解析)

[3. 工作案例](#3. 工作案例)

[案例 1:快速检查磁盘空间](#案例 1:快速检查磁盘空间)

[案例 2:排查 inode 耗尽问题](#案例 2:排查 inode 耗尽问题)

[三、du 命令详解](#三、du 命令详解)

[1. 核心选项](#1. 核心选项)

[2. 工作案例](#2. 工作案例)

[案例 1:定位根目录下最大子目录](#案例 1:定位根目录下最大子目录)

[案例 2:统计日志目录占用空间](#案例 2:统计日志目录占用空间)

[案例 3:查找超过 1GB 的文件](#案例 3:查找超过 1GB 的文件)

四、综合运维场景

[场景 1:自动化磁盘空间监控脚本](#场景 1:自动化磁盘空间监控脚本)

[场景 2:清理过期日志文件](#场景 2:清理过期日志文件)

[场景 3:解决 du 与 df 结果不一致问题](#场景 3:解决 du 与 df 结果不一致问题)

五、高级技巧

六、注意事项

ncdu命令

一、命令概述

二、安装方法

三、核心功能与优势

四、基本语法与常用选项

五、交互界面操作指南

六、工作案例场景

[案例 1:快速分析根目录磁盘占用](#案例 1:快速分析根目录磁盘占用)

[案例 2:排除临时文件扫描](#案例 2:排除临时文件扫描)

[案例 3:离线分析与报告生成](#案例 3:离线分析与报告生成)

[案例 4:批量清理旧日志文件](#案例 4:批量清理旧日志文件)

[案例 5:远程服务器磁盘分析](#案例 5:远程服务器磁盘分析)

七、高级技巧

[1. 自动化清理脚本](#1. 自动化清理脚本)

[2. 定期扫描与对比](#2. 定期扫描与对比)

八、注意事项

find命令

一、命令概述

二、基本语法

三、核心选项与参数

[1. 按名称/路径匹配](#1. 按名称/路径匹配)

[2. 按类型匹配](#2. 按类型匹配)

[3. 按时间匹配](#3. 按时间匹配)

[4. 按大小匹配](#4. 按大小匹配)

[5. 按权限/用户匹配](#5. 按权限/用户匹配)

[6. 执行动作](#6. 执行动作)

四、工作案例场景

[案例 1:清理过期日志文件](#案例 1:清理过期日志文件)

[案例 2:查找并备份大文件](#案例 2:查找并备份大文件)

[案例 3:审计异常权限文件](#案例 3:审计异常权限文件)

[案例 4:批量修改文件所有者](#案例 4:批量修改文件所有者)

[案例 5:统计源码文件数量](#案例 5:统计源码文件数量)

五、高级技巧

[1. 逻辑组合](#1. 逻辑组合)

[2. 排除目录](#2. 排除目录)

[3. 结合 xargs 提高效率](#3. 结合 xargs 提高效率)

[4. 并行处理](#4. 并行处理)

六、注意事项

rsync命令

一、命令概述

二、安装与基本语法

三、核心选项与参数

四、工作案例场景

[案例 1:本地目录同步](#案例 1:本地目录同步)

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

[案例 3:增量备份与排除文件](#案例 3:增量备份与排除文件)

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

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

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

五、高级技巧

[1. 带宽限制与压缩优化](#1. 带宽限制与压缩优化)

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

[3. 过滤规则文件](#3. 过滤规则文件)

六、注意事项

fio命令

一、命令概述

二、安装与基本语法

三、核心参数与配置

[1. 全局参数](#1. 全局参数)

[2. I/O 模式参数](#2. I/O 模式参数)

[3. 输出参数](#3. 输出参数)

四、工作案例场景

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

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

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

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

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

五、结果分析与调优建议

[1. 关键指标解读](#1. 关键指标解读)

[2. 性能瓶颈排查](#2. 性能瓶颈排查)

[3. 调优方向](#3. 调优方向)

六、注意事项

四、日志与文本处理

grep命令

一、命令概述

二、核心选项与参数

三、正则表达式速查

四、工作案例场景

[案例 1:快速定位日志中的错误](#案例 1:快速定位日志中的错误)

[案例 2:递归搜索代码库中的关键词](#案例 2:递归搜索代码库中的关键词)

[案例 3:统计接口调用次数](#案例 3:统计接口调用次数)

[案例 4:提取日志中的 IP 地址](#案例 4:提取日志中的 IP 地址)

[案例 5:监控服务状态](#案例 5:监控服务状态)

[案例 6:多关键词复杂匹配](#案例 6:多关键词复杂匹配)

五、高级技巧

[1. 结合 find 高效递归搜索](#1. 结合 find 高效递归搜索)

[2. 高亮关键词并分页查看](#2. 高亮关键词并分页查看)

[3. 使用 zgrep 直接搜索压缩文件](#3. 使用 zgrep 直接搜索压缩文件)

[4. 上下文关联分析](#4. 上下文关联分析)

六、性能优化

七、注意事项

sed命令

一、命令概述

二、基本语法

三、核心选项与参数

四、地址定界与命令

[1. 地址定界](#1. 地址定界)

[2. 常用命令](#2. 常用命令)

[3. 替换命令标志](#3. 替换命令标志)

五、工作案例场景

[案例 1:批量替换配置文件参数](#案例 1:批量替换配置文件参数)

[案例 2:删除日志文件中的空行](#案例 2:删除日志文件中的空行)

[案例 3:提取特定时间段的日志](#案例 3:提取特定时间段的日志)

[案例 4:批量注释/取消注释配置](#案例 4:批量注释/取消注释配置)

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

[案例 6:动态插入配置片段](#案例 6:动态插入配置片段)

六、高级技巧

[1. 多命令组合执行](#1. 多命令组合执行)

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

[3. 反向引用正则分组](#3. 反向引用正则分组)

[4. 结合 find 批量处理文件](#4. 结合 find 批量处理文件)

七、注意事项

awk命令

一、命令概述

二、基本语法与结构

三、核心概念与选项

[1. 常用选项](#1. 常用选项)

[2. 内置变量](#2. 内置变量)

[3. 模式与动作](#3. 模式与动作)

四、工作案例场景

[案例 1:统计日志中 HTTP 状态码分布](#案例 1:统计日志中 HTTP 状态码分布)

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

[案例 3:格式化输出进程信息](#案例 3:格式化输出进程信息)

[案例 4:分析网络连接状态](#案例 4:分析网络连接状态)

[案例 5:动态修改 CSV 文件字段](#案例 5:动态修改 CSV 文件字段)

[案例 6:多文件关联分析](#案例 6:多文件关联分析)

五、高级技巧

[1. 使用 BEGIN/END 块](#1. 使用 BEGIN/END 块)

[2. 自定义函数](#2. 自定义函数)

[3. 结合 Shell 管道](#3. 结合 Shell 管道)

六、注意事项

cut命令

一、命令概述

二、基本语法

三、核心选项与参数

四、工作案例场景

[案例 1:提取 /etc/passwd 的用户名和 Shell](#案例 1:提取 /etc/passwd 的用户名和 Shell)

[案例 2:从日志中提取 IP 地址和时间戳](#案例 2:从日志中提取 IP 地址和时间戳)

[案例 3:按字符位置截取文本](#案例 3:按字符位置截取文本)

[案例 4:处理 CSV 文件并排除指定列](#案例 4:处理 CSV 文件并排除指定列)

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

[案例 6:结合管道处理命令输出](#案例 6:结合管道处理命令输出)

五、高级技巧

[1. 处理多字符分隔符](#1. 处理多字符分隔符)

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

[3. 处理包含空格的字段](#3. 处理包含空格的字段)

六、注意事项

七、总结

sort和uniq命令

[一、sort 命令详解](#一、sort 命令详解)

[1. 核心选项](#1. 核心选项)

[2. 工作案例](#2. 工作案例)

[案例 1:按 CPU 使用率降序排序进程](#案例 1:按 CPU 使用率降序排序进程)

[案例 2:排序 CSV 文件并去重](#案例 2:排序 CSV 文件并去重)

[案例 3:合并多个排序文件](#案例 3:合并多个排序文件)

[二、uniq 命令详解](#二、uniq 命令详解)

[1. 核心选项](#1. 核心选项)

[2. 工作案例](#2. 工作案例)

[案例 1:统计日志中错误类型出现次数](#案例 1:统计日志中错误类型出现次数)

[案例 2:提取唯一 IP 地址](#案例 2:提取唯一 IP 地址)

[案例 3:查找重复用户](#案例 3:查找重复用户)

三、组合使用案例

[案例 1:分析访问日志的 Top 10 IP](#案例 1:分析访问日志的 Top 10 IP)

[案例 2:清理重复配置项](#案例 2:清理重复配置项)

[案例 3:按多列排序并去重](#案例 3:按多列排序并去重)

四、注意事项

五、总结

journal命令

一、命令概述

二、核心选项与参数

三、工作案例场景

[案例 1:实时跟踪系统日志](#案例 1:实时跟踪系统日志)

[案例 2:查看指定服务的日志](#案例 2:查看指定服务的日志)

[案例 3:过滤错误级别日志](#案例 3:过滤错误级别日志)

[案例 4:按时间范围查询日志](#案例 4:按时间范围查询日志)

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

[案例 6:查看系统启动时的日志](#案例 6:查看系统启动时的日志)

四、高级技巧

[1. 结构化字段查询](#1. 结构化字段查询)

[2. 结合其他工具过滤](#2. 结合其他工具过滤)

[3. 日志持久化与清理](#3. 日志持久化与清理)

五、注意事项

六、总结

tail/multitail命令

[一、tail 命令详解](#一、tail 命令详解)

[1. 核心选项](#1. 核心选项)

[2. 工作案例](#2. 工作案例)

[案例 1:实时跟踪日志文件](#案例 1:实时跟踪日志文件)

[案例 2:查看最近 50 行错误日志](#案例 2:查看最近 50 行错误日志)

[案例 3:跟踪日志直到进程结束](#案例 3:跟踪日志直到进程结束)

[二、multitail 命令详解](#二、multitail 命令详解)

[1. 核心功能](#1. 核心功能)

[2. 安装方法](#2. 安装方法)

[3. 工作案例](#3. 工作案例)

[案例 1:分屏监控多个日志文件](#案例 1:分屏监控多个日志文件)

[案例 2:颜色标记关键日志](#案例 2:颜色标记关键日志)

[案例 3:合并日志并过滤](#案例 3:合并日志并过滤)

三、高级技巧

[1. 快捷键操作](#1. 快捷键操作)

[2. 动态执行命令并监控](#2. 动态执行命令并监控)

[3. 自定义颜色方案](#3. 自定义颜色方案)

四、注意事项

五、总结

五、系统调试与内核

strace命令

一、命令概述

二、核心选项与参数

三、工作案例场景

[案例 1:诊断文件访问失败](#案例 1:诊断文件访问失败)

[案例 2:分析程序卡顿原因](#案例 2:分析程序卡顿原因)

[案例 3:统计系统调用开销](#案例 3:统计系统调用开销)

[案例 4:跟踪网络连接问题](#案例 4:跟踪网络连接问题)

[案例 5:跟踪文件读写行为](#案例 5:跟踪文件读写行为)

四、高级技巧

[1. 过滤关键系统调用](#1. 过滤关键系统调用)

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

[3. 结合管道实时分析](#3. 结合管道实时分析)

[4. 动态附加到运行中的进程](#4. 动态附加到运行中的进程)

五、注意事项

六、总结

ltrace命令

一、命令概述

二、核心选项与参数

三、工作案例场景

[案例 1:分析内存泄漏](#案例 1:分析内存泄漏)

[案例 2:定位第三方库崩溃](#案例 2:定位第三方库崩溃)

[案例 3:统计函数调用开销](#案例 3:统计函数调用开销)

[案例 4:跟踪文件操作异常](#案例 4:跟踪文件操作异常)

[案例 5:跟踪多线程程序的竞态条件](#案例 5:跟踪多线程程序的竞态条件)

四、高级技巧

[1. 过滤特定函数并显示参数详情](#1. 过滤特定函数并显示参数详情)

[2. 结合指令指针定位代码位置](#2. 结合指令指针定位代码位置)

[3. 跟踪系统调用与库函数](#3. 跟踪系统调用与库函数)

五、注意事项

六、安装方法

七、总结

dmesg命令

一、命令概述

二、核心选项与参数

三、工作案例场景

[案例 1:查看系统启动错误](#案例 1:查看系统启动错误)

[案例 2:诊断 USB 设备识别问题](#案例 2:诊断 USB 设备识别问题)

[案例 3:监控实时内核事件](#案例 3:监控实时内核事件)

[案例 4:分析内存故障](#案例 4:分析内存故障)

[案例 5:查看硬盘健康状态](#案例 5:查看硬盘健康状态)

四、高级技巧

[1. 按时间范围过滤日志](#1. 按时间范围过滤日志)

[2. 保存日志到文件](#2. 保存日志到文件)

[3. 结合 journalctl 查看持久化日志](#3. 结合 journalctl 查看持久化日志)

[4. 解码错误码](#4. 解码错误码)

五、注意事项

六、总结

lspci/lsusb命令

[一、lspci 命令详解](#一、lspci 命令详解)

[1. 核心选项](#1. 核心选项)

[2. 工作案例](#2. 工作案例)

[案例 1:查看所有 PCI 设备列表](#案例 1:查看所有 PCI 设备列表)

[案例 2:查看网卡驱动信息](#案例 2:查看网卡驱动信息)

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

[二、lsusb 命令详解](#二、lsusb 命令详解)

[1. 核心选项](#1. 核心选项)

[2. 工作案例](#2. 工作案例)

[案例 1:查看所有 USB 设备列表](#案例 1:查看所有 USB 设备列表)

[案例 2:查看 USB 摄像头详细信息](#案例 2:查看 USB 摄像头详细信息)

[案例 3:检查 USB 设备供电状态](#案例 3:检查 USB 设备供电状态)

三、组合使用案例

[案例 1:诊断无线网卡驱动问题](#案例 1:诊断无线网卡驱动问题)

[案例 2:排查 USB 存储设备未挂载](#案例 2:排查 USB 存储设备未挂载)

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

四、高级技巧

[1. 解析厂商和产品 ID](#1. 解析厂商和产品 ID)

[2. 查看 USB 设备速度](#2. 查看 USB 设备速度)

[3. 监控 USB 设备热插拔](#3. 监控 USB 设备热插拔)

五、总结

六、安全与审计

chattr/lsattr命令

一、命令概述

二、核心属性说明

[三、chattr 命令用法](#三、chattr 命令用法)

常用选项

[四、lsattr 命令用法](#四、lsattr 命令用法)

常用选项

五、工作案例场景

[案例 1:防止关键文件被误删或修改](#案例 1:防止关键文件被误删或修改)

[案例 2:保护日志文件仅允许追加](#案例 2:保护日志文件仅允许追加)

[案例 3:防止目录被篡改](#案例 3:防止目录被篡改)

[案例 4:优化文件系统性能](#案例 4:优化文件系统性能)

六、注意事项

七、总结

getfacl/setfacl命令

一、命令概述

[二、ACL 核心概念](#二、ACL 核心概念)

[三、getfacl 命令用法](#三、getfacl 命令用法)

输出示例:

[四、setfacl 命令用法](#四、setfacl 命令用法)

常用选项:

五、工作案例场景

[案例 1:为特定用户分配独立权限](#案例 1:为特定用户分配独立权限)

[案例 2:为组设置权限并限制掩码](#案例 2:为组设置权限并限制掩码)

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

[案例 4:删除 ACL 条目](#案例 4:删除 ACL 条目)

[案例 5:递归恢复目录权限](#案例 5:递归恢复目录权限)

六、高级技巧

[1. ACL 权限备份与恢复](#1. ACL 权限备份与恢复)

[2. 结合 cp/rsync 保留 ACL](#2. 结合 cp/rsync 保留 ACL)

[3. 调试权限冲突](#3. 调试权限冲突)

七、注意事项

八、总结

auditd审计

[一、auditd 概述](#一、auditd 概述)

二、核心组件与配置

[三、auditctl 命令用法](#三、auditctl 命令用法)

参数说明:

四、工作案例场景

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

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

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

[案例 4:监控文件系统挂载/卸载操作](#案例 4:监控文件系统挂载/卸载操作)

五、日志分析与报告

[1. 使用 ausearch 查询日志](#1. 使用 ausearch 查询日志)

[2. 使用 aureport 生成报告](#2. 使用 aureport 生成报告)

六、高级配置

[1. 日志轮转与存储](#1. 日志轮转与存储)

[2. 永久化审计规则](#2. 永久化审计规则)

七、注意事项

八、总结

lynis工具

[一、Lynis 概述](#一、Lynis 概述)

二、安装与配置

[1. 安装 Lynis](#1. 安装 Lynis)

[2. 配置文件](#2. 配置文件)

三、核心命令与选项

常用选项:

四、工作案例场景

[案例 1:执行完整系统安全审计](#案例 1:执行完整系统安全审计)

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

[案例 3:渗透测试模式扫描](#案例 3:渗透测试模式扫描)

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

五、高级技巧

[1. 自定义审计规则](#1. 自定义审计规则)

[2. 集成到 CI/CD 流程](#2. 集成到 CI/CD 流程)

六、注意事项

七、总结

七、软件包与服务管理

apt/dnf命令

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

[1. 核心命令与选项](#1. 核心命令与选项)

[2. 工作案例](#2. 工作案例)

[案例 1:安装并固定软件版本](#案例 1:安装并固定软件版本)

[案例 2:清理旧内核和缓存](#案例 2:清理旧内核和缓存)

[案例 3:处理依赖冲突](#案例 3:处理依赖冲突)

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

[1. 核心命令与选项](#1. 核心命令与选项)

[2. 工作案例](#2. 工作案例)

[案例 1:安装指定版本 MySQL](#案例 1:安装指定版本 MySQL)

[案例 2:配置 EPEL 仓库](#案例 2:配置 EPEL 仓库)

[案例 3:回滚失败的更新](#案例 3:回滚失败的更新)

三、通用场景与技巧

[1. 系统升级](#1. 系统升级)

[2. 安全补丁管理](#2. 安全补丁管理)

[3. 本地包安装](#3. 本地包安装)

[4. 仓库优先级管理](#4. 仓库优先级管理)

四、注意事项

五、总结

systemctl命令

一、命令概述

二、核心命令与选项

三、工作案例场景

[案例 1:排查服务启动失败](#案例 1:排查服务启动失败)

[案例 2:自定义服务管理](#案例 2:自定义服务管理)

[案例 3:限制服务资源](#案例 3:限制服务资源)

[案例 4:处理服务依赖冲突](#案例 4:处理服务依赖冲突)

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

四、高级技巧

[1. 查看服务启动耗时](#1. 查看服务启动耗时)

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

[3. 定时重启服务](#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 时间占比(%) 系统调用频繁或中断过多
wa I/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 st
 5  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 memory
     2987340 K used memory
     1802304 K active memory
      845200 K inactive memory
      1108656 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 时间占比 系统调用或中断过多(如网络密集型应用)
%iowait CPU 等待 I/O 完成的时间占比 存储性能瓶颈时飙升
%idle CPU 空闲时间占比 持续 <20% 表示系统负载较高
2. 磁盘统计(-x -d
字段 含义 诊断阈值
r/s 每秒读请求数 机械硬盘 >200 可能成为瓶颈
w/s 每秒写请求数 SSD >5000 需关注
rkB/s 每秒读取数据量(KB) 结合带宽(如 SAS 硬盘 200MB/s)
wkB/s 每秒写入数据量(KB) 同上
await I/O 请求平均等待时间(ms) >10ms(机械盘)或 >2ms(SSD)异常
svctm I/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  %idle
           12.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
特性 top htop
交互体验 基础快捷键 鼠标支持、颜色高亮
视图模式 单一列表 树状结构、自定义列
过滤与搜索 有限 正则表达式过滤(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 分析僵尸进程来源
%CPU CPU使用率 定位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 COMMAND
 1234 22.3 1823456 java
 5678 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.toml
 5678 root      \_ containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/abcd
   6789 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/O kB_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 升高。

诊断步骤

复制代码
   cat /proc/sys/vm/swappiness  

查看 Swap 使用情况:

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

    复制代码
    cat /proc/sys/vm/swappiness  
  2. 降低 Swap 使用倾向(临时生效):

    复制代码
    sysctl vm.swappiness=10  
  3. 永久生效:

    复制代码
    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 使用率
%iowait CPU 等待 I/O 操作的时间占比
%idle CPU 空闲时间占比
内存 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/O tps, %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.100
   10 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:56789
 cubic 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 ]; then
    echo "警告:TCP 连接数过高 ($CONN_COUNT)" | mail -s "网络告警" [email protected]
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 URL wget URL
断点续传 curl -C - -O URL wget -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; then
    echo "Nginx 服务异常!" | mail -s "服务告警" [email protected]
    systemctl 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.com
    800 api.example.com
    500 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.0
   50 python-requests/2.31.0
    5 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" ]; then
    echo "警告:以下分区使用率超过 ${THRESHOLD}%"
    echo "$OUTPUT" | mail -s "磁盘空间告警" [email protected]
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
-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

  2. 应用配置:

    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,在实战中反复练习!