ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Linux命令行硬件信息查询指南:从CPU到磁盘的全方位排查

Linux命令行硬件信息查询指南:从CPU到磁盘的全方位排查

1. 为什么要自己动手查硬件:比图形工具更可靠的信息源

先说个我在实际运维中经常遇到的场景。某次帮同事排查一台老服务器的性能瓶颈,打开系统监视器一看,CPU使用率曲线平滑得像心电图,内存占用也不高,但应用就是慢得让人抓狂。后来我直接在终端里敲了几条命令,才发现问题出在磁盘I/O等待和内存交换分区频繁读写上——这些细节,图形化工具要么不显示,要么藏在好几层菜单后面。

这就是我一直强调的观点:Linux下查看硬件信息,命令行永远是第一选择。不是图形工具不好用,而是它们普遍存在两个问题。一是信息聚合度低,你装一个系统监视器,能看到CPU、内存、网络的概况,但想查硬盘是SATA还是NVMe接口、内存条运行在多少频率、网卡支持多大带宽,它往往无能为力;二是有性能开销,尤其在服务器或者嵌入式设备上,图形环境本身就占用资源,为了查个参数还要跑一整套桌面组件,成本太高。

另一个容易被忽略的点是,命令行工具输出的信息更接近"原始事实"。比如CPU型号,图形工具可能只显示一个营销名称,而lscpu能告诉你架构、字节序、CPU family、型号、步进、虚拟化支持情况、缓存大小,甚至末级缓存容量。这些底层参数对性能调优、内核编译选项选择、驱动兼容性判断,都是关键依据。

这篇文章我不会只罗列命令名称,而是按实际使用场景来拆解——查CPU该怎么组合命令、查内存要注意哪些指标、查硬盘和文件系统用什么最直接、查GPU和温度有什么坑。每个场景我会说明为什么选这条命令、输出里哪些字段是必须看的,以及我踩过的那些"命令明明执行了却拿不到信息"的坑。适合刚接触Linux的初学者,也适合那些用惯了图形工具、想深入了解系统真实状态的用户。

2. CPU信息:lscpu是主菜,/proc/cpuinfo是佐料

2.1 lscpu输出里真正值得关注的几个字段

在大多数Linux发行版上,lscpu命令默认就自带,不需要额外安装,因为它来自util-linux这个基础工具包。我习惯把它当作查CPU信息的首选,原因是它的输出经过了格式化,按类目排列,比直接读/proc/cpuinfo要直观得多。

执行一下看看关键内容:

lscpu

输出会包含如下核心字段。不用每行都看,重点关注这几个:

  • Architecture:显示x86_64代表64位架构,如果是aarch64就是ARM 64位。
  • CPU(s):逻辑CPU总数,通常等于物理核数乘以每核线程数。
  • Model name:CPU型号,这是最直观的识别信息。
  • Thread(s) per core:每个物理核支持的线程数,一般为1或2。2意味着启用了超线程。
  • Core(s) per socket:每个物理插槽上的物理核心数。
  • Socket(s):物理CPU插槽数,服务器常见1路、2路。
  • NUMA node(s):非一致内存访问节点数。多路服务器或者某些大核处理器会出现多个NUMA节点,这直接影响内存访问性能。
  • Virtualization features:比如VT-x或AMD-V,做虚拟化排查时必须确认。

我举一个实际判断的例子。如果输出显示CPU(s): 8、Thread(s) per core: 2、Core(s) per socket: 4、Socket(s): 1,说明这是一颗4物理核心、支持超线程的CPU,逻辑上是8线程。很多人一看CPU(s): 8就以为是8核,这种误判在买服务器、配虚拟机资源时特别容易出问题。

2.2 用/proc/cpuinfo验证lscpu没告诉你的细节

lscpu本质上是解析/proc/cpuinfo再重新格式化,所以如果你发现两者输出有差异,以/proc/cpuinfo为准。它里面有几个字段是lscpu不直接展示的:

cat /proc/cpuinfo

在输出中,每个逻辑CPU会占一个块。processor编号从0开始,physical id表示物理插槽编号,core id表示物理核心编号,cpu cores表示该物理插槽上的核心数。通过对比这几个字段,你可以精确算出一台机器上真实的物理核拓扑。

比如我得出的经验是,当processor编号与core id对应关系为两个相邻编号共享同一core id时,说明超线程开启。列一个对比:

字段含义典型值
processor逻辑CPU编号0, 1, 2...
physical id物理CPU插槽编号0表示第一颗CPU
core id物理核心编号相同值表示同一核心
cpu cores每颗CPU物理核心数4, 8, 16等
flags支持的指令集特性sse4_2, avx2, vmx等

flags字段很多人忽略,但它非常有用。比如你怀疑CPU不支持某个虚拟化指令集,grep vmx /proc/cpuinfo就能快速确认。Intel的虚拟化标志是vmx,AMD是svm。查SIMD向量指令集就搜avx2、avx512f,这些对编译优化和科学计算场景很重要。

2.3 实时频率和温度:turbostat与sensors的组合

lscpu显示的是标称频率或基础频率,不是当前实时频率。想知道CPU此刻跑在多少GHz,可以用turbostat,它来自linux-tools包:

turbostat

这个命令会周期性刷新,显示每个核心的频率、C状态驻留比例、功耗估算(如果平台支持)。我压测时常用它确认CPU是否达到睿频上限,以及散热是否导致降频。

温度方面,如果安装了lm-sensors:

sensors

输出会列出每个核心温度、主板温度、风扇转速。第一次运行可能需要先执行sensors-detect进行传感器探测,一路默认回车即可。如果/sys/class/thermal下存在thermal_zone目录,也可以直接读这些文件,某些嵌入式环境下这种方式更可靠。

3. 内存信息:可用容量不是最重要的,频率和拓扑才是

3.1 free -h只能看个大概,具体型号要看dmidecode

内存是Linux系统中最容易"看着充足实际紧张"的资源。很多人第一反应是free,这个命令确实方便:

free -h

-h参数把单位转成人类易读的GB或MB。看available一列,这个数值是估算的可用于启动新应用的内存,比只看free列要准确,因为Linux会尽量用空闲内存做文件缓存,free列通常很小,容易让人误以为内存不足。

但free只告诉你用了多少,不告诉你内存本身是什么规格。想知道插了几根内存条、每根多大、频率多少、哪个插槽空着,就得用dmidecode:

sudo dmidecode -t memory

这段输出很长,重点看Memory Device和Memory Array部分。每个Memory Device代表一个物理内存插槽,看这几个字段:

  • Size:容量,如果显示No Module Installed就是空槽。
  • Type:DDR3还是DDR4或者DDR5,这决定了主板兼容性。
  • Speed:标称频率,比如2400 MT/s表示DDR4-2400。
  • Configured Memory Speed:实际运行频率。这个字段比标称更重要,因为如果插了两根不同频率的内存条,系统会以较低频率运行。
  • Manufacturer:内存颗粒或模组厂商,虽然部分产品会显示"Unknown",但能看到的通常比较可信。
  • Part Number:产品型号,用于精确查询兼容性。

3.2 结合lscpu判断内存通道是否跑满

内存性能和通道数密切相关,双通道比单通道带宽翻倍,四通道服务器配置就更讲究。判断通道是否跑满,需要把dmidecode的信息和lscpu的插槽信息结合起来。

比如一台机器有4个内存插槽,实际插了2根内存条,且分别插在通道A和通道B对应的插槽上,系统就能运行在双通道模式。如果两根插在同一个通道的两个槽位上,带宽就不会翻倍。这个信息dmidecode不会直接告诉你"当前是双通道模式",但可以通过/proc/meminfo配合dmidecode的Locator字段判断插槽位置分布,再对照主板说明书确认通道归属。

我常用的快速命令是:

sudo dmidecode -t memory | grep -E "Size|Locator|Speed|Part Number"

这样能在一屏内看到所有内存条型号和插槽位置,排查扩容问题时非常高效。

3.3 一个容易踩的坑:32位系统的内存识别上限

虽然现在64位系统很普及,但嵌入式设备、老旧笔记本上仍然可能跑着32位内核。32位系统能识别的物理内存上限通常是4GB,即便你插了8GB内存条,系统也可能只认到3.x GB。遇到这种情况,先确认内核是否支持PAE(Physical Address Extension):

uname -m

如果输出i686,可以查看内核配置:

zgrep PAE /proc/config.gz 2>/dev/null || grep PAE /boot/config-$(uname -r)

出现CONFIG_X86_PAE=y说明支持PAE,理论上可以识别超过4GB内存,但需要内核开启该选项。这是排查"内存少了一半"问题时常被忽略的原因。

4. 硬盘与文件系统:lsblk看结构,smartctl查健康

4.1 lsblk三分钟看懂磁盘拓扑

lsblk是我最常用的磁盘查看工具,它用树状结构展示磁盘、分区以及挂载关系,一目了然:

lsblk

常见的输出里,NAME列显示设备名,sda、sdb这类表示SCSI/SATA/NVMe磁盘,nvme0n1表示NVMe SSD;SIZE列是容量;TYPE列区分disk(物理磁盘)、part(分区)、lvm(逻辑卷)、crypt(加密卷);MOUNTPOINT是挂载点。

如果想看到更底层的传输速度和接口类型,加一个-d -o参数:

lsblk -d -o NAME,SIZE,TRAN,MODEL,ROTA

TRAN列显示传输类型,比如sata、nvme或usb;ROTA如果是1,表示这是机械硬盘(旋转设备),0则是SSD。这个字段帮你快速区分磁盘类型,不用拆机箱。

有一个细节经验:判断磁盘是不是固态盘,除了看ROTA,还要看MODEL里有没有SSD字样,某些USB外接硬盘盒会虚拟化传输类型,导致TRAN显示为usb。这时以型号信息为准更可靠。

4.2 fdisk -l、df -h和blkid的分工

lsblk看的是结构,但具体到分区表类型和磁盘大小,fdisk -l更权威:

sudo fdisk -l

它显示磁盘的总扇区数、扇区大小以及分区表类型(DOS还是GPT)。如果你要重装系统、调整分区,先跑这条命令确认分区表格式。

文件系统的使用率用df:

df -h

-h转成人类易读格式。/dev/sda1这类设备文件旁会跟着挂载点、总容量、已用、可用和挂载模式。注意Use%这一列达到90%以上时,即使还有几GB空间,某些日志服务、数据库也可能出现写入异常,因为文件系统需要保留一定比例的空间给root用户和关键进程做紧急写入(默认ext4是5%)。

要查看分区的UUID和文件系统类型,用blkid:

sudo blkid

UUID对/etc/fstab配置特别重要。我修复启动问题时常靠它确认根分区对应关系,避免挂错设备。

4.3 smartctl:提前发现硬盘故障的唯一可靠途径

机械硬盘和SSD都会在内部记录大量自我监测数据,这些数据通过SMART接口读取。smartmontools包提供了smartctl命令:

sudo smartctl -a /dev/sda

输出中的SMART overall-health self-assessment test result如果显示PASSED,说明设备自检通过。除法之外,关键看几个属性值:

  • Reallocated_Sector_Ct(重映射扇区数):物理坏道发生后,硬盘用备用扇区替代的计数。这个值缓慢增长还能接受,如果突然暴涨,基本可以准备备份了。
  • Current_Pending_Sector(待映射扇区):正在等待处理的异常扇区。大于0就要高度警惕。
  • UDMA_CRC_Error_Count(接口错误计数):数值升高通常意味着数据线接触不良或接口不稳定。
  • Wear_Leveling_Count(磨损均衡计数):SSD专用,反映闪存单元的擦除次数。

新买的硬盘我建议先跑一遍smartctl -a看看初始状态,数值全零或者只有正常计数说明出厂状态良好。运维中我养成了一个习惯:每天巡检脚本固定检查这几个字段,异常就报警。

4.4 查看NVMe固态盘:用nvme-cli

对NVMe盘,smartctl也能读,但有些NVMe特有的信息,比如温度、磨损、通电时间,用nvme-cli更友好(部分系统需要单独安装):

nvme smart-log /dev/nvme0

输出包含temperature、percentage_used(寿命消耗百分比)、data_units_written等字段。percentage_used是厂家估算的寿命损耗,看到接近100%就该认真考虑更换了。这个命令输出不依赖SMART属性编号,而是NVMe标准化的字段,可读性更高。

5. 显卡与显示输出:lspci初筛,nvidia-smi精查

5.1 lspci:一切硬件识别的根源

Linux下几乎所有PCI/PCIe设备信息都能通过lspci获取,显卡自然不例外:

lspci

输出中每行以总线地址开头,[VGA controller]或[3D controller]字样后面就是显卡型号。如果内容太多,用grep过滤:

lspci | grep -i vga lspci | grep -i nvidia lspci | grep -i amd

我第一次在一台无头服务器上确认GPU是否被系统识别,就是用这条命令。注意lspci显示的是设备ID和厂商,不一定显示完整的"RTX 3060"这种营销名称,查详细型号可以加-v:

lspci -v -s 01:00.0

其中01:00.0是设备的BDF(总线:设备.功能)编号,输出的Subsystem字段可能会显示更具体的型号信息。另外lspci -k会显示内核驱动绑定情况,这对排查"N卡驱动没加载"的问题非常有用。

5.2 NVIDIA卡必须单独看的nvidia-smi

如果你的机器装了NVIDIA显卡且驱动正常,nvidia-smi是绕不开的工具:

nvidia-smi

输出顶部是驱动版本和CUDA版本,下面每个GPU块包含温度、利用率、显存占用、功耗。做深度学习训练时,我基本靠它确认显存是否够用、GPU是否跑满。只更新时间片的利用率可以用watch -n 1 nvidia-smi,每1秒刷新一次。

有一个小技巧:nvidia-smi --query-gpu=name,memory.total,temperature.gpu --format=csv可以输出纯文本格式,方便脚本解析。巡检脚本里我用这条命令把GPU状态存成CSV日志,出问题时直接翻日志就能定位是显存溢出还是温度过高导致的降频。

5.3 纯核显或AMD卡怎么办

如果你的机器只有核显,lspci | grep -i vga能看到Intel或AMD的集成显卡信息。想确认当前使用的显示驱动,可以查/sys/class/drm下的目录:

ls /sys/class/drm/

出现card0-DP-1、card0-HDMI-A-1这类条目,说明对应的显示接口已被内核识别。内核日志也能提供线索:

dmesg | grep drm dmesg | grep i915

AMD卡在较新内核中通常使用amdgpu驱动模块,Intel核显是i915。如果你自己编译内核,经常需要确认这些模块是否正确编译进内核或作为模块加载。

6. 网络、主板与其他外设:一通百通的lspci和lsusb

6.1 网卡型号与速率确认

服务器网卡信息可以通过lspci看到:

lspci | grep -i ethernet

这会显示网卡品牌和型号。但要确认链路实际速率,用ethtool更直接(部分系统需要安装net-tools或ethtool):

ethtool eth0

输出中Speed字段显示当前协商速率,比如10000Mb/s就是万兆,1000Mb/s是千兆。Link detected: yes表示链路正常。注意如果插的网线或交换机端口只支持千兆,网卡即使支持万兆也会协商到千兆,这是排查带宽瓶颈时常见的盲点。查看IP地址则用ip addr或更简单的hostname -I。

6.2 主板序列号、BIOS版本和厂商

整机信息、主板信息和BIOS版本都集中在dmidecode里:

sudo dmidecode -t baseboard sudo dmidecode -t bios sudo dmidecode -t system

分别是主板信息、BIOS信息和整机信息。其中BIOS版本决定你是否能支持某些新型CPU或者是否需要更新固件修复安全漏洞。我遇到过一台机器频繁自动重启,排查到最后发现是BIOS微码太老,与CPU步进不匹配导致虚拟化指令集异常,更新BIOS后才稳定。这类问题,没有dmidecode的信息做对照,很难定位。

查看整个系统的基础硬件信息,dmidecode比任何图形工具都全。包含制造厂商、产品名称、序列号、UUID等字段,这些在做资产台账管理时是标准字段。

6.3 USB设备全家桶

USB外设用lsusb:

lsusb

输出显示总线号和设备号,以及厂商ID和设备ID。大部分消费级USB设备都会显示品牌名,比如U盘、键鼠接收器。如果要看更详细的产品描述,加-v参数,但输出比较冗长,建议配合grep过滤:

lsusb -v 2>/dev/null | grep -E "idVendor|idProduct|iProduct"

有一种常见场景:Linux下USB摄像头不工作,先lsusb确认设备是否被枚举,再dmesg | tail查看内核日志有没有报错。如果设备根本没出现在lsusb里,大概率是硬件问题或USB口供电不足;出现了但无法使用,才是驱动或权限问题。

6.4 内核日志与硬件探测:dmesg是最后一道防线

上述所有命令都依赖内核正确识别硬件。如果某个硬件在lspci或lsusb里看不到,dmesg就是排查入口:

dmesg | grep -i error dmesg | grep -i fail dmesg | grep -i usb dmesg | grep -i sda

内核启动时探测硬件的过程会输出大量信息,dmesg直接读取内核环形缓冲器中的消息。新插入设备后立即执行dmesg | tail -20,能看到内核是否枚举到设备、加载了什么驱动、有没有资源冲突。我修过很多"开机偶尔不识别某个硬盘"的奇怪问题,最终都是靠dmesg日志发现是SATA链路training失败,然后确认是线缆质量不行。

7. 把这些命令组合成自己的"硬件速查单"

7.1 一条命令收集整机配置摘要

单条命令单独查很容易记混,我建议维护一个组合命令,输出一份精简的硬件摘要,方便快速存档:

echo "===== CPU =====" && lscpu | grep -E "Model name|^CPU\(s\)|Thread|Core|Socket|NUMA" echo "===== 内存 =====" && sudo dmidecode -t memory | grep -E "Size|Speed|Manufacturer|Part Number" echo "===== 磁盘 =====" && lsblk -d -o NAME,SIZE,TRAN,MODEL,ROTA echo "===== 网卡 =====" && lspci | grep -i ethernet echo "===== 显卡 =====" && lspci | grep -i vga echo "===== 系统 =====" && uname -a && cat /etc/os-release | head -2

把这段保存成脚本文件,比如hwinfo.sh,需要时执行一下,整个系统的骨架配置就都在屏幕上了。做新服务器验收、写资产文档时特别省事。

7.2 我常用的组合思路:按场景而非按命令记忆

我自己的经验是把命令按场景分成三组,而不是死记每条命令的选项:

第一组:新机器验收场景。开箱后依次跑lscpu确认CPU型号和核心数,sudo dmidecode -t memory确认内存型号,lsblk确认磁盘容量和类型,sudo smartctl -a /dev/sda确认硬盘初始健康度,lspci | grep -i vga确认显卡。对比采购清单一项一项打勾。

第二组:性能问题排查场景。先free -h看内存压力,df -h看磁盘余量,top或htop看CPU负载,iostat看磁盘I/O等待,nvidia-smi看GPU利用率。这类问题往往是复合原因,需要这几条命令的信息交叉验证。

第三组:驱动或兼容性排查场景。lspci -k看驱动绑定,dmesg | grep -i error看内核报错,modprobe相关模块看加载结果,配合/var/log/Xorg.0.log(图形界面问题)或journalctl -u服务日志追根溯源。

7.3 权限和缺失命令的处理

多数查询命令无需root权限,lscpu、free、lsblk、df这些普通用户就能跑。但dmidecode、smartctl、fdisk -l需要sudo。如果执行sudo: dmidecode: command not found,说明这个基础工具没装,Debian/Ubuntu系用:

sudo apt install dmidecode smartmontools lm-sensors nvme-cli

RHEL/CentOS系(或兼容的发行版)用:

sudo yum install dmidecode smartmontools lm_sensors nvme-cli

注意包名差异:Red Hat系把lm-sensors写作lm_sensors,下划线和连字符有区别。turbostat在linux-tools-$(uname -r)包里,需要匹配当前内核版本号,不过大多数场景不装它也能完成排查。

补充一个现实中的教训:如果/usr/sbin不在普通用户的PATH里,输入smartctl会提示找不到命令,但加了sudo之后又能找到。这是因为root用户的PATH包含了/usr/sbin。遇到这种"明明装了却命令不存在"的情况,先检查PATH环境变量。

8. 常见问题速查:命令没输出或报错时的应对思路

8.1 lscpu不存在或被限制

某些精简版容器、极小化安装的系统可能没有lscpu,此时直接读/proc/cpuinfo,或安装util-linux包。在容器里,/proc/cpuinfo显示的是宿主机的CPU信息,因为容器共享宿主机内核和硬件视图。如果在容器内跑lscpu发现CPU型号和宿主机不同,别慌,那是容器隔离的显示逻辑不同。

8.2 dmidecode在虚拟机里显示的是虚拟硬件

在虚拟机里跑dmidecode,看到的内存型号、主板厂商往往是虚拟化平台模拟出来的,比如显示"VMware"或"KVM"或"QEMU"字样,这很正常。这时不要拿它去判断物理内存条规格,必须到宿主机上用物理机命令查。判断自己是否在虚拟机里,可以看system-product-name字段。

8.3 lspci没有显示显卡

lspci输出里找不到显卡,先确认执行时没有加| grep过滤掉了关键词。另外某些ARM开发板或小型设备的显卡不是PCIe设备,而是SoC内部集成,lspci自然看不到,需要查/sys/kernel/debug下相关目录或厂商专有工具。内核日志里通常也能找到显示控制器初始化信息。

8.4 smartctl提示"SCSI device"或"Unknown"

机械硬盘用smartctl -a /dev/sda通常没问题,但NVMe SSD在某些旧版本smartmontools上可能显示为Unknown。升级smartmontools到较新版本,或者改用nvme smart-log。另外有些USB硬盘盒不支持SMART透传,导致命令显示设备不支持,这是硬件限制,不是命令问题。

8.5 温度传感器没有任何输出

lm-sensors装上后必须先执行sensors-detect,否则sensors可能输出空。在笔记本上,可能存在多个温度传感器,比如coretemp负责Intel CPU温度,thinkpad_acpi负责笔记本整体温度。如果sensors没有任何输出,试着加载对应模块:

sudo modprobe coretemp

服务器上可能还有环境温度、硬盘温度传感器,分别对应不同的内核模块。加载模块后重新执行sensors,一般就能看到数据了。

这些坑我几乎全踩过一遍,现在排查硬件问题时的思路已经非常固定:先lspci/lsusb确认设备被系统识别,再dmesg看驱动加载是否正常,然后用lscpu/dmidecode/smartctl读详细参数。按这个顺序走,绝大多数硬件信息都能快速拿到。记住,图形工具能给你的,命令行都能给你;命令行能给你的,图形工具往往给不了全。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进