Linux 查询硬件与系统信息

查看内核版本

使用命令uname -r可以查看当前内核版本:

[root@101c7 ~]$ uname -r
3.10.0-862.el7.x86_64

如果想要查看更详细的内核信息,可以使用uname -a命令:

[root@101c7 audit]$ uname -a
Linux 101c7 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

查看操作系统位数

使用getconf命令查看LONG_BIT变量可以得到操作系统位数:

[root@101c7 ~]$ getconf LONG_BIT
64

查看发行版本

在 CentOS 5 中,可以使用命令lsb_release -a查看发行版本。

在 CentOS 7 中,可以查看文件/etc/centos-release的内容来查看版本号:

[root@101c7 ~]$ cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)

查看当前时间

使用date命令可以查看系统中当前的时间和日期:

[root@101c7 ~]$ date
Sat Sep 11 00:16:31 EDT 2021

可以使用systemd-analyze命令查看系统启动时间:

[root@k8s-m1-pro ~]# systemd-analyze
Startup finished in 614ms (kernel) + 1.192s (initrd) + 27.889s (userspace) = 29.695s

其中,kernel 表示内核启动时间,initrd 表示 initramfs 加载时间,userspace 表示用户空间启动时间。

查看内存使用情况

使用free命令查看内存使用情况,单位默认为 KB:

[root@101c7 bin]$ free
              total        used        free      shared  buff/cache   available
Mem:        3861280      283612     2429740       11956     1147928     3272400
Swap:       2097148           0     2097148

一般来说,内存被大量buff/cache了是正常现象,但swap用量超过 20%说明物理内存不足。

系统资源占用信息

如果想要了解系统资源的运行情况,可以使用vmstat命令检测 CPU/内存/磁盘 IO 等。该命令常用参数如下:

参数 说明
-a 使用 inactive/active 替代 buffer/.cache 的内存输出信息
-f 开机到目前为止系统复制(fork)的进程数
-s 将一些事件导致的内存变化情况列表说明
-S 接单位,让显示的数据有单位
-d 列出磁盘的读写总量统计
-p 列出分区,可显示该分区的读写总量统计

例如统计目前主机 CPU 状态,每秒一次,共三次:

[root@101c7 bin]$ vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0      0 2434408  15508 1132464    0    0     0     0    4    6  0  0 100  0  0
0  0      0 2434416  15508 1132464    0    0     0     0  143  191  0  0 100  0  0
0  0      0 2434416  15508 1132464    0    0     0     0   87  113  0  0 100  0  0

下面是各字段的说明。

进程(procs)字段统计的数量越多,代表系统越繁忙:

标志 说明
r 就绪或正在运行的进程数
b 不可中断的睡眠进程数

内存字段(memory):

标志 说明
swpd 使用的虚拟内存大小(单位 KB)
free 空闲内存大小(单位 KB)
buff 用于缓存的内存大小(单位 KB)
cache 用于高速缓存的内存大小(单位 KB)

内存交换空间(swap)数值越大代表内存不太够用:

标志 说明
si 从磁盘中交换到内存的块数量
so 从内存中交换到磁盘的块数量

磁盘读写(io)数值越高代表磁盘越忙碌:

标志 说明
bi 从块设备(磁盘)读取的块数
bo 写入到块设备(磁盘)的块数

系统(system)项目计数越大,代表系统与接口设备的通信越频繁:

标志 说明
in 每秒中断次数(包括时钟中断)
cs 每秒上下文切换次数

CPU 的选项:

标志 说明
us 用户空间占用 CPU 时间的百分比
sy 内核空间占用 CPU 时间的百分比
id 空闲 CPU 时间的百分比
wa 等待 I/O 操作占用 CPU 时间的百分比
st 用于运行虚拟机的 CPU 时间的百分比

例如查看磁盘读写状态:

[root@101c7 bin]$ vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
sdb    11640  23419 1679403    3097   3013 143194  714969    2367      0      2
sda    13672     28 1219051    6501  22246   3488 1921401   17945      0     10

查询内存中内容

内存中的数据都写入到目录/proc/*中(不占用实际硬盘空间)。查看目录/proc中的内容:

[root@101c7 bin]$ ll /proc | head 
total 0
dr-xr-xr-x.  9 root    root                  0 Sep  9 15:08 1
dr-xr-xr-x.  9 root    root                  0 Sep  9 15:08 10
dr-xr-xr-x.  9 root    root                  0 Sep 14 00:31 10025
dr-xr-xr-x.  9 root    root                  0 Sep 14 00:31 10026
dr-xr-xr-x.  9 root    root                  0 Sep 14 00:31 10139

可以看到,各个进程的 PID 都是以目录的形式存在于 /proc 中。

进一步查看进程在内存中写入的内容,以 PID=1 的 init 程序为例:

[root@101c7 bin]$ ll /proc/1
total 0
dr-xr-xr-x. 2 root root 0 Sep 10 01:44 attr
-rw-r--r--. 1 root root 0 Sep 10 01:44 autogroup
-r--------. 1 root root 0 Sep 10 01:44 auxv
-r--r--r--. 1 root root 0 Sep  9 15:08 cgroup
--w-------. 1 root root 0 Sep 10 01:44 clear_refs
-r--r--r--. 1 root root 0 Sep  9 15:08 cmdline
-rw-r--r--. 1 root root 0 Sep  9 15:08 comm
-rw-r--r--. 1 root root 0 Sep 10 01:44 coredump_filter
-r--r--r--. 1 root root 0 Sep 10 01:44 cpuset
lrwxrwxrwx. 1 root root 0 Sep 10 01:44 cwd -> /
-r--------. 1 root root 0 Sep  9 15:08 environ
lrwxrwxrwx. 1 root root 0 Sep  9 15:08 exe -> /usr/lib/systemd/systemd

其中 cmdline 定义了 init 被启动的命令串,environ 定义了这个进程的环境变量。

以下是在 /proc 目录下常见文件的内容:

文件名 文件内容
cmdline 加载 kernel 时所执行的相关参数
cpuinfo 本机 CPU 的相关信息,包括频率、类型和运算功能等
devices 记录各个主要设备的主要设备代号,与 mknod 有关
filesystems 目前系统已经加载的文件系统
interrupts 目前系统上的 IRQ 分配状态
ioports 目前系统上各个设备所配置的 I/O 地址
kcore 内存的大小
loadavg 系统负载情况
meminfo 内存信息
modules 已经加载的模块列表,主要是驱动程序
mounts 系统已挂载的数据
swaps 系统加载的内存使用的分区记录
partitions 记录系统分区信息
pci 在 PCI 总线上每个设备的详细情况,可用 lspci 查询
uptime 系统运行时长记录
version 内核版本
bus/* 一些总线设备,包括 USB 记录设备

/proc 下的文件进行修改后,修改将立即生效。

查询使用中的文件

查询文件正在被什么程序使用可以使用 fuser命令查询(使用 yum install psmisc 安装)。可用参数:

参数 说明
-u 列出进程所有者
-m 列出占用文件系统的进程
-v 列出文件与程序还有命令的完整相关性
-k 找出使用文件的 PID,并试图强制结束程序
-i 结束程序前询问用户

例如找到当前目录正在使用它的 PID/所属账户/权限:

[root@101c7 bin]$ fuser -uv .
            USER      PID   ACCESS COMMAND
/root/bin:  root      40090 ..c.. (root)bash
            root      40855 ..c.. (root)tail

结果显示有两个 PID 为 40090 和 40855 的程序在使用该目录,程序所属为 root,命令是 bashtail。可以直接使用fuser -k命令来终止使用该目录的进程:

[root@server1 ~]$ fuser -k /root/bin

ACCESS 选项代表的意义为:

字符 说明
c 此进程在当前目录下(非子目录)
e 可被触发为执行状态
f 是一个被打开的文件
r 代表顶层目录
F 该文件被打开了,不过在等待回应中
m 可能为分享的动态函数库

查询程序打开的文件

要查询某个程序正在使用的文件,可以使用 lsof 命令。命令参数如下:

选项 说明
-a 多项数据需要同时成立才显示出结果时
-p 指定进程 PID
-U 仅列出 Unix like 系统的 socket 文件类型
-u 接 username,列出该用户相关进程所打开的文件
+d 接目录,找出某个目录下面已经被打开的文件

例如,列出关于 root 的所有进程打开的 socket 文件(-a 表示逻辑与,限定了必须为 root 用户和 socket 文件):

[root@101c7 bin]$ lsof -u root -a -U
COMMAND     PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
systemd       1 root   12u  unix 0xffff9ac438950000      0t0  20565 /run/systemd/private
systemd       1 root   13u  unix 0xffff9ac438b14400      0t0 605204 socket
systemd       1 root   18u  unix 0xffff9ac4b5ec8440      0t0     29 /run/systemd/notify

例如,查询属于 root 的 tail 命令所打开的文件:

[root@101c7 bin]$ lsof -u root | grep tail
tail       40855 root  cwd       DIR      253,0       246   33607964 /root/bin
tail       40855 root  rtd       DIR      253,0       253         64 /
tail       40855 root  txt       REG      253,0     66816   50333754 /usr/bin/tail
tail       40855 root    0w      CHR        1,3       0t0       1028 /dev/null
tail       40855 root    1w      REG      253,0       236   33607951 /root/bin/nomarl.log
tail       40855 root    2w      REG      253,0        54   33607959 /root/bin/error.log
tail       40855 root    3r      REG      253,0       236   33607979 /root/bin/sh01.sh
tail       40855 root    4r  a_inode      0,10         0       8534 inotify

显示结果字段含义如下:

  • COMMAND:正在运行的命令名前 9 个字符。
  • PID:进程的 PID。
  • USER:进程属主的登录名。
  • FD:文件描述符号以及访问类型。r 读,w 写,u 代表读写。
  • TYPE:文件的类型。CHR 字符型,BLK 块型,DIR 目录,REG 代表常规文件。
  • DEVICE:设备的设备号。
  • SIZE:文件的大小。
  • NODE:本地文件的 inode 号。
  • NAME:文件名。

查询硬件信息

使用 dmidecode 命令可以查询当前计算机的硬件配置。使用 -t 参数来选择查看的硬件设备类型。对应类型如下表:

编号 信息
0 BIOS 信息
2 主板信息
4 CPU 信息
9 插槽信息
10 板载设备
17 内存信息
41 板载设备

例如查看 CPU 信息:

[root@101c7 ~]$ dmidecode -t 4 | head -n 50
# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 2.7 present.

Handle 0x0004, DMI type 4, 42 bytes
Processor Information
        Socket Designation: CPU #000
        Type: Central Processor
        Family: Unknown
        Manufacturer: AuthenticAMD
        ID: 82 0F 80 00 FF FB 8B 17
        Version: AMD Ryzen Threadripper 2990WX 32-Core Processor
        Voltage: 3.3 V
        External Clock: Unknown
        Max Speed: 30000 MHz
        Current Speed: 3200 MHz

可以使用dmesg来输出所有的内核运行时的记录日志:

[root@101c7 bin]$ dmesg | less
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct

配合 grep ATA过滤掉无关的信息,查询 SATA 接口硬盘信息:

[root@s55 ~]$ dmesg | grep ATA
[    3.367870] ata6.00: ATA-10: HGST HUS722T1TALA604, RAGNWA09, max UDMA/133
[    3.369145] ata5.00: ATA-10: HGST HUS722T1TALA604, RAGNWA09, max UDMA/133

以下是一些常用的 Linux 系统硬件信息查询命令:

  • gdisk/fdisk:查询分区信息。
  • vmstat:分析系统状态。
  • lscpu:查询 CPU 相关信息。
  • lspci:查询 PCI 接口设备。
  • lsusb:查询 USB 接口状态。
  • iostat:查询系统 I/O 状态。
  • smartctl:查询硬盘 S.M.A.R.T 信息。