ming's blog
Linux系统检查与故障诊断

硬件信息检查

dmesg

功能说明:显示开机信息。显示系统运行时硬件的检测或者断开连接信息。

使用前注意权限问题,内核日志是限制非管理员权限阅读的。遇到 dmesg: read kernel buffer failed: Permission denied,先修改权限,使用命令sudo sysctl -w kernel.dmesg_restrict=0

在ubuntu 20.1以上版本中,还可以更改 /etc/sysctl.d/10-kernel-hardening.conf 中的配置 kernel.dmesg_restrict=0,再执行 sudo service procps restart 使其生效。

另外如果是docker容器中,修改权限会遇到 sysctl: setting key "kernel.yama.ptrace_scope", ignoring: Read-only file system,解决办法请参考 http://fleey.cn/archives/108.html


dmesg 命令显示 linux 内核的环形缓冲区信息,我们可以从中获得诸如系统架构、cpu、挂载的硬件,RAM等多个运行级别的大量的系统信 息。当计算机启动时,系统内核(操作系统的核心部分)将会被加载到内存中。在加载的过程中会显示很多的信息,在这些信息中我们可以看到内核检测硬件设备。

dmesg 命令用于设备故障的诊断是非常重要的。进行硬件的连接或断开连接操作时,在 dmesg 命令的帮助下,我们可以看到硬件的检测或者断开连接的信息。dmesg 命令在多数基于Linux和Unix的操作系统中都可以使用。

常用

  1. 查看网卡启动信息 dmesg | grep eth
  2. 列出所有被检测到的硬件 dmesg | grep sda
  3. 清空dmesg缓冲区日志 dmesg -c, 即使清除了缓冲区数据也可以查看日志文件,文件保存在 /var/log/dmesg
  4. 监控硬件变化 dmesg | tail -20

lshw

功能说明:检查全部硬件信息

需要安装软件包

apt install -y lshw

lspci

功能说明:检查PCI设备

需要安装软件包

apt install -y lshw

lsusb

功能说明:检查USB设备


网络检查

lsof

功能说明:查看进程打开的文件、目录,以及查看进程监听的端口等 socket 相关的信息

需要安装软件包

apt install -y lsof

检查结果解释:

  1. COMMAND:程序的名称
  2. PID:进程标识符
  3. USER:进程所有者
  4. FD:文件描述符,应用程序通过文件描述符识别该文件
    FD 列中的常见内容有 cwd、rtd、txt、mem 和一些数字等等。
    其中 cwd 表示当前的工作目录;rtd 表示根目录;txt 表示程序的可执行文件;mem 表示内存映射文件;标准输入输出文件通常以数字表示。
  5. TYPE:文件类型,如 DIR、REG 等
    REG 和 DIR 分别表示普通文件和目录。
  6. DEVICE:以逗号分隔设备编号
  7. SIZE:文件的大小(bytes)
  8. NODE:索引节点(文件在磁盘上的标识)
  9. NAME:打开文件的确切名称

常用

  1. 查看哪些进程打开了某个文件或设备
    直接指定文件(设备)的名称作为 lsof 的参数就可以查看哪些进程打开了这个文件(设备),例:lsof /bin/bashlsof /dev/sda1
  2. 查看哪些进程打开了某个目录及目录下的文件
     lsof +d /var/log  #不递归查询
     lsof +D /var/log  #递归查询
  3. 查看某个进程打开的所有文件
    先用ps查询进程的PID,再用lsof查询,用bash举例
     ps -C bash
     lsof -p bash的PID
  4. 复杂查询条件
    • 使用 -a 参数,使查询组合多个条件
    • -c 使多条件为或的关系
    • 对条件取反,则直接在条件前加 ^
    • 另外也可以使用正则表达式,使用 / 包裹表达式
  5. 只列出 IPv4 或 IPv6 打开的文件
     lsof -i 4  #IPv4
     lsof -i 6  #IPv6
  6. 列出与某端口相关的文件,例:lsof -i:22
  7. 列出指定范围内被打开的 TCP 端口,例:lsof -i TCP:1-1024
  8. 查看某个用户打开的所有文件,例:lsof -u root

netstat

功能说明:显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

常用

  1. 列出所有端口 netstat -a,默认不显示监听状态栏
  2. 列出所有 tcp 端口 netstat -at
  3. 列出所有 udp 端口 netstat -au
  4. 列出所有监听端口 netstat -l
  5. 列出特定进程的使用端口 netstat -p [PID]
  6. 持续输出 netstat 信息 netstat -c
  7. 显示核心路由信息 netstat -r
  8. 显示网络接口列表 netstat -i

什么是监听端口
首先了解一下TCP/IP协议中的端口指的是什么?如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有一个或者几个门,但是一个IP地址下的端口可以有65536(即:256×256)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0到65535(256×256-1)。

在互联网上主机与主机之间通过TCP/IP协议发送和接收数据包,各个数据包根据其目的主机IP地址来进行路由。当数据包顺利的被传送到目的主机后,它要如何进入主机呢?当然是要通过端口(现实中的门)进入了。我们知道大多数操作系统都支持多应用程序(多进程)同时运行,不同的应用具有不同的处理功能,那么目的主机应该把接收到的数据包传送给哪一个应用程序呢?这就要靠端口了,一个应用对应一个或多个端口,这样我们就可以把数据包传递给对应的程序了。这就是监听端口的由来。

同一个端口只能被一个应用程序使用。如果多个应用使用了相同端口,就会出现端口冲突问题。这种情况通常我们不需要担心,因为端口冲突会导致应用程序无法启动。

tcpdump

功能说明:根据使用者的定义对网络上的数据包进行截获的包分析工具。支持与或非逻辑语句帮助筛选信息。

需要安装软件包

apt install -y tcpdump

输出信息的描述:

  • 时间精确到微秒
  • localhost.42333 > localhost.9501 表示通信的流向
  • [S] 表示这是一个SYN请求
  • [.] 表示这是一个ACK确认包,(client)SYN->(server)SYN->(client)ACK 就是3次握手过程
  • [P] 表示这个是一个数据推送,可以是从服务器端向客户端推送,也可以从客户端向服务器端推
  • [F] 表示这是一个FIN包,是关闭连接操作,client/server都有可能发起
  • [R] 表示这是一个RST包,与F包作用相同,但RST表示连接关闭时,仍然有数据未被处理。可以理解为是强制切断连接
  • win 342是指滑动窗口大小
  • length 12指数据包的大小

查看数据包的详细信息,使用 -XX -vvv -nn

  • -v 当分析和打印的时候,产生详细的输出。
  • -vv 产生比-v更详细的输出。
  • -vvv 产生比-vv更详细的输出。
  • -XX 输出包的头部数据,会以16进制和ASCII两种方式同时输出。
  • -nn 直接以IP以及PORT number显示,而非主机名与服务名称。

常用

  1. 监视指定主机的数据包 tcpdump host 主机IP
  2. 截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信 tcpdump host 210.27.48.1 and \(210.27.48.2 or 210.27.48.3 \)
  3. 获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包 tcpdump ip host 210.27.48.1 and ! 210.27.48.2
  4. 监视指定主机和端口的数据包 tcpdump tcp port 23 and host 210.27.48.1
  5. 对本机的UDP 222端口进行监视 tcpdump udp port 222
  6. 检查数据包的详细信息:

系统模块检查

lsmod

功能说明:检查当前内核已经加载的模块和驱动

需要安装软件包

apt install -y kmod

检查结果通常有三列,分别是:

  1. 模块名称(Module)
  2. 模块的大小(Size)
  3. 此模块是否被其他模块使用(Used by)

系统状态检查

du

功能说明:显示指定的目录或文件所占用的磁盘空间

常用:

  1. du -h 将空间大小换算成更易读的k、m、g
  2. du -D 显示链接文件的原文件大小

df

功能说明:显示目前在 Linux 系统上的文件系统磁盘使用情况统计

常用:

  1. df -h 将空间大小换算成更易读的k、m、g
  2. du -a 输出所有文件的磁盘用量,不仅仅是目录
  3. du -d 仅当目录(或在 –all 选项启用时包括文件)层级不高于命令行参数指定的 N 层时输出对应目录或文件的对应大小
  4. du --time 显示目录中或其子目录下所有文件的最后修改时间

tree

功能说明:以树状图形式列出目录的内容

常用

  1. tree -a 列出所有文件
  2. tree -d 仅列出目录
  3. tree -f 列出每个文件的完整路径
  4. tree -L 数字 列出的目录深度
  5. tree --charset UTF8 设置字符集,将来用于终端或HTML展示
  6. -u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码
    -g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码
  7. tree -p 列出文件权限
  8. tree -h 将空间大小换算成更易读的k、m、g
  9. tree -D 显示上次修改或状态更改的日期
    --timefmt 根据格式打印并格式化时间,例如:’%F %T’ 或 ‘%c’
  10. -v 按字母排序
    -t 按最后修改的时间排序
    -c 按上次状态更改时间对文件排序
    -r 反转排序的顺序
    --dirsfirst 在文件之前列出目录
  11. 输出:
    -X 打印出树的XML表示
    -J 打印出树的 JSON 表示
    -H 根名 输出为网页表示,参数为根名,会影响超链接,建议用 .-T 标题 替换默认的 HTML 标题和 H1 标题,--nolinks 关闭 HTML 输出中的超链接

iostat

功能说明:动态监视系统的磁盘操作活动

常用

  1. -c 显示CPU资源情况
  2. -d 显示磁盘使用情况
  3. -h 改变显示单位,使其更加易读
  4. iostat delay count delay表示每隔几秒刷新一次,count表示总共输出几次

cpu属性值说明:
%user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU空闲时间百分比。

disk属性值说明:
rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
r/s: 每秒完成的读 I/O 设备次数。即 rio/s
w/s: 每秒完成的写 I/O 设备次数。即 wio/s
rsec/s: 每秒读扇区数。即 rsect/s
wsec/s: 每秒写扇区数。即 wsect/s
rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s: 每秒写K字节数。是 wsect/s 的一半。
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
avgqu-sz: 平均I/O队列长度。
await: 平均每次设备I/O操作的等待时间 (毫秒)。
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
%util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比

vmstat

功能说明:实时动态监视操作系统的虚拟内存、进程、CPU活动

常用:

  1. -n 表示在周期性循环输出时,输出的头部信息仅显示一次
  2. vmstat delay count delay表示每隔几秒刷新一次,count表示总共输出几次

字段说明

Procs(进程):

  • r: 运行队列中进程数量
  • b: 等待IO的进程数量

Memory(内存):

  • swpd: 使用虚拟内存大小
  • free: 可用内存大小
  • buff: 用作缓冲的内存大小
    -cache: 用作缓存的内存大小

Swap:

  • si: 每秒从交换区写到内存的大小
  • so: 每秒写入交换区的内存大小

IO:(现在的Linux版本块的大小为1024bytes)

  • bi: 每秒读取的块数
  • bo: 每秒写入的块数

system:

  • in: 每秒中断数,包括时钟中断
  • cs: 每秒上下文切换数

CPU(以百分比表示)

  • us: 用户进程执行时间(user time)
  • sy: 系统进程执行时间(system time)
  • id: 空闲时间(包括IO等待时间)
  • wa: 等待IO时间

free

功能说明:显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等

常用:

  1. -h 改变显示单位,使其更加易读
  2. -t 显示总和
  3. free -s delay -c count -s后面delay表示每隔几秒刷新一次,-c后面count表示总共输出几次