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,命令是 bash
和 tail
。可以直接使用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 信息。