干运维这些年,被问得最多的一句话不是“服务挂了怎么办”,而是“这台机器什么配置”。尤其是接手新服务器、排查故障、做资产盘点的时候,能快速摸清服务器硬件信息的Linux命令,就是运维手里最趁手的工具。我打算把 CPU、内存、磁盘、网卡、固件信息这几类最常见的查询需求,连同我实际踩过的坑一起整理出来,方便你直接抄作业。读完这篇你至少能解决三个问题:新机器到货怎么验配置、线上故障怎么快速定位是硬件还是软件、报修时怎么准确报出厂商型号和序列号。
1. 为什么硬件信息速查是运维的必修课
1.1 硬件排查的典型场景
先说说我自己的经历。刚入职那会儿,公司要做一次全机房资产盘点,一共两百多台物理机,领导要求一周内出清单。我当时第一反应是翻机柜标签、登录BMC看序列号,一台一台抄,抄到第三天整个人都是懵的。后来老同事丢给我一行命令,dmidecode | grep -i "serial number",配合循环脚本,俩小时就把所有机器的厂商、型号、序列号、CPU和内存规格全拉出来了。那之后我就明白了一件事:硬件信息速查不是“会不会敲命令”的问题,而是“能不能在合理时间内拿到准确答案”的问题。
这类需求在运维工作中非常高频:
- 新服务器到货后,要核对采购配置和实际硬件是否一致,防止被“缩水”;
- 应用出现性能问题,需要快速判断是CPU、内存还是磁盘I/O的瓶颈;
- 硬件报修时,需要提供准确的厂商、型号和序列号,避免来回扯皮;
- 做资源规划时,要统计集群里所有机器的内存总量、硬盘总量,决定还要不要扩容;
- 排查兼容性问题,比如某型号HBA卡在特定内核版本下丢盘,需要先确认卡的型号和固件版本。
这些场景的共同点是:你不能全靠眼睛看,也不能全凭记忆,必须用一套可靠、可复现的命令来获取信息。而Linux本身其实自带了一整套硬件信息查询工具,关键在于你知道去哪一层查、用哪个命令最合适。
1.2 信息层级决定命令选择
我在实际使用中发现一个特别容易绕弯的地方:Linux查询硬件信息的路子其实分好几层,不同层面对应不同工具。最底层是内核直接识别到的设备,用/proc和/sys可以看;往上一层是系统工具,比如lscpu、lsblk、lspci,它们其实是把内核信息重新整理、排版给你看;再往上一层是访问固件和BIOS数据的工具,典型的就是dmidecode和lshw。
这个分层很重要。举个最简单的例子,你想知道物理机有几个CPU插槽,不能直接数lscpu里的“CPU(s)”,因为那个数字是逻辑核数,包含了超线程。要看插槽数,得用lscpu -p或者直接看dmidecode -t processor里的“Socket Designation”。同样的道理,free -h显示的是系统当前可用的内存,但如果想确认物理内存条有没有插满、每个插槽多大容量,必须用dmidecode -t memory。层选错了,答案就是错的。
所以我按下文会按“CPU、内存、磁盘、网卡与整体固件信息”四个维度拆解,每个维度都说明该用哪些命令、输出里哪些字段是重点、哪些字段容易误导人。这样你在真实环境里遇到问题,至少能马上定位到该翻哪一层。
2. CPU信息排查:从型号到负载
2.1 查看CPU型号、核数与架构
拿到一台新服务器,第一件事就是确认CPU。最简单的就是lscpu,这个命令几乎所有发行版都自带,不需要额外安装。我通常先用它看三样东西:Architecture(架构)、Model name(型号)、CPU(s)(逻辑核数)。
别急着拿CPU(s)当物理核数。这里有经典的误区:一台机器CPU(s)显示是96,实际可能是两个48核的物理CPU,每个物理核开了超线程,真实物理核数只有48。想看得准确,我一般直接看Socket(s)和Core(s) per socket:两个值相乘就是物理核总数。至于逻辑核,再看Thread(s) per core是否等于2,结合起来就能算出超线程有没有生效。
如果系统里没有lscpu(有些精简版系统或者老系统确实没有),可以直接读/proc/cpuinfo。grep "model name" /proc/cpuinfo | sort -u能看到CPU型号,grep "physical id" /proc/cpuinfo | sort -u | wc -l能数物理CPU个数,grep "processor" /proc/cpuinfo | wc -l能数逻辑核数。这套方法不依赖任何额外工具,只要内核在就能用,关键时刻很管用。
怎么验证超线程有没有生效?可以用lscpu | grep "Thread(s) per core",如果显示2,说明每个物理核有两个逻辑核。还可以用lscpu -e查看每个逻辑核对应的CORE和SOCKET编号,加深理解物理拓扑。大多数服务器BIOS默认开启超线程,但如果之前有人动过BIOS设置,逻辑核数和物理核数就对不上,这时候就要靠这里说的方法去核实。
2.2 实时负载与进程占用
查完配置还要看运行状态。这里我习惯用top,进去按1展开所有核的负载,按P按CPU占用排序,快速定位是哪个进程在吃CPU。如果是要做压力测试或者性能分析,mpstat -P ALL 1更好用,它会每秒刷新所有核的使用率,能清楚看到负载是不是均衡分摊到每个核心上。
还有一个容易被忽略的命令是uptime。它显示的是最近1分钟、5分钟、15分钟的平均负载。很多人只看1分钟就下结论,这是不对的。1分钟负载高可能是瞬时任务,5分钟和15分钟也高才说明是持续压力。我通常这么判断:如果15分钟负载接近逻辑核数的70%以上,就要开始关注了;如果长期超过逻辑核数,那基本可以断定CPU已经饱和。
再补充一个在数据库和高性能计算场景下特别重要的概念:NUMA。用numactl --hardware可以查看CPU和内存的NUMA节点分布,用numastat可以查看各节点内存命中率。跨NUMA节点访问内存会比本地节点慢很多,如果你的应用是高并发低延迟类型,建议把CPU和内存的亲和性绑定好,taskset配合numactl可以做这件事。排查性能问题时,CPU用量高不高是一回事,内存访问是否跨节点是另一回事。
关于CPU信息,我踩过一个大坑:某次排查数据库性能问题,top里看到有个进程CPU占用高,但lscpu显示CPU型号是ES版(Engineering Sample,工程样品)。工程样片的CPU在特定指令集上可能有性能衰减,后来确认是当初采购时混入了一批测试版CPU。所以查硬件信息时不只要看核数和频率,型号后缀也很关键。grep "model name" /proc/cpuinfo就能抓到完整的CPU名称,比用lscpu截断后的信息更完整,建议核对配置时以/proc/cpuinfo为准。
3. 内存与硬盘:容量、健康度与IO瓶颈
3.1 内存容量与使用分布
内存信息第一反应就是free -h,但这里我要多说一句:free -h显示的内存总量是“当前可用内存减去部分内核占用”之后的近似值,并不等于物理内存条的标称总容量。想要精确到“每个插槽装了什么规格的内存条”,必须用dmidecode -t memory。
dmidecode -t memory输出的内容很长,我一般只关心几个字段:Size、Type、Speed、Locator、Part Number。重点看Speed,比如标称DDR4 3200的内存,dmidecode显示实际运行在2133,可能是没开XMP、也可能是主板CPU只支持到这个频率。这种信息在排查内存性能瓶颈时非常有用,一般的free命令根本看不出来。
free -h也不能白用。我习惯在排查内存泄漏时连续采几组快照:watch -n 5 free -h,观察available这一列是不是持续下降。这里特别提醒,看内存是否够用,不要盯着used,要看available。Linux会把空闲内存用作缓存(buff/cache),used很高很正常,但available才是真实可供新进程使用的内存。如果available跌到接近0,伴随swap持续增长,那就要检查是不是有进程内存泄漏了。
另外说一个现场常见的乌龙现象:你在dmidecode -t memory里看到内存条标称DDR4 2933,但lscpu里显示内存频率跑在2133,不一定就是硬件有问题。很多服务器主板在默认设置下会以较低频率运行,需要进BIOS手动调整内存分频设置。如果连续多台服务器都出现类似降频,优先怀疑BIOS默认配置,不要急着报修换条。
另外,给大家一个排查内存硬件问题的实用命令:memtester。运维现场不可能随便重启机器跑内存测试,但如果是新到货的服务器,建议在验收阶段跑一轮memtester 4G 5,测5轮4GB内存。我见过不少新机器因为内存条接触不良导致随机宕机,这种问题只有硬件层面的测试才能抓出来。
3.2 磁盘容量、分区与健康状态
磁盘信息我会用一套组合拳:lsblk看设备树,df -h看文件系统使用率,smartctl -a看物理健康状态。lsblk输出非常直观,能一眼看出哪块盘是系统盘、哪块是数据盘、哪块下面挂了几个分区。配合lsblk -f还能显示文件系统类型和UUID,做挂载和扩容的时候特别有用。
df -h就不用多说了,每家监控系统都有这张图。但我想强调一个细节:df显示的容量是文件系统层的容量,如果底层是LVM或者RAID卡做出来的虚拟磁盘,df是看不到物理盘级别的信息的。所以当df显示容量快满,你要去确认是不是某个物理磁盘组里还有其他没分区的空间,这时候用lsblk看完整拓扑比只看df要靠谱得多。
df -h只能看容量,有一个很容易踩的坑是inode耗尽。容量还有很多,但df -i显示100%使用,此时文件系统同样写不进新文件。这种情况在日志服务、消息队列、小文件很多的目录下特别常见。我遇到过一台缓存服务器,磁盘还剩几百GB,但inode用完了,服务日志完全写不进去,排查半天才发现是/var/log下的小日志文件数量太多。所以硬件资源巡检时,除了看容量,建议把df -i也纳入巡检脚本。
磁盘健康度看smartctl -a /dev/sda(前提是装了smartmontools)。重点看SMART overall-health self-assessment test result是不是PASSED,以及Reallocated_Sector_Ct、Pending_Sector、UDMA_CRC_Error_Count几个属性。这几个值一旦出现非零并且持续增长,基本可以判定盘在“物理层面”开始出问题,即使文件系统还没报错,也要尽早安排迁移数据、申请售后。这不是危言耸听,我有一次就是看到Reallocated_Sector_Ct从0涨到16没当回事,两周后整盘直接掉线,好在当时有巡检脚本提前发现了数据迁移。
提示:不要拿
df -h当磁盘健康检查的唯一依据,容量正常不等于物理盘没有故障。SMART属性才是判断物理盘寿命的重要参考。
4. 网卡与硬件整体信息:lspci、lshw与dmidecode
4.1 网卡与PCI设备识别
服务器上很多设备(网卡、HBA卡、GPU、NVMe控制器)都是PCI/PCIe设备,lspci就是干这个的。lspci | grep -i ethernet能看到网卡型号,lspci | grep -i raid能看到阵列卡型号,lspci | grep -i nvidia能看到GPU。不过lspci默认输出的设备名可能不完整,用lspci -v或者lspci -nn能显示更详细的厂商和型号信息。-nn会把厂商ID和设备ID也打出来,做驱动兼容性判断时很有用。
我排查网卡问题时最常用的确实是ethtool:ethtool eth0能看链路速度、双工模式、网卡固件驱动信息;ethtool -i eth0能看driver、version、firmware-version等。很多网卡瞬间断连的问题,查到最后都是驱动和固件版本不匹配,这时候ethtool -i的输出就是最关键的判断依据。
如果服务器上有多个网卡,还想确认哪个网卡对应哪个物理口,可以这样组合:ls -l /sys/class/net/看接口的PCI地址,再用ethtool -p eth0让对应物理口的指示灯闪烁。这个命令在做网线标签和接线排查时是神器。新机房接线的人要是没给你做标签,你靠ethtool -p从头到尾闪一遍,十分钟就能把线序搞清楚。
4.2 从固件层读取序列号与厂商信息
如果需要的是最权威、最不可篡改的硬件信息,那一线的工具是dmidecode。它能直接读取主板固件里的DMI表,拿到BIOS版本、主板型号、内存插槽信息、CPU插槽信息、机箱序列号等。资产盘点、报修、合规审计,基本都是靠它。
我常用的几组命令记住就行:
dmidecode | grep -i "serial number":快速拉出所有设备的序列号,但输出可能混入显示器、键盘等外围设备的序列号,需要眼力过滤;dmidecode -t system:看系统整体信息,包括厂商、产品名、序列号、UUID;dmidecode -t bios:看BIOS厂商、版本、发布日期;dmidecode -t memory:看内存条信息,上文已提到。
还有一个系统级的整体概览工具,lshw,可以输出非常完整的硬件清单,包括CPU、内存、总线、磁盘、网卡等。lshw -short是精简模式,适合快速扫一眼;lshw -html可以生成一份HTML报告,我整理资产文档时经常直接用它导出,再转给行政和财务做固定资产登记,比手动填Excel省事太多。不过要提醒一句:lshw在某些服务器上可能没有预装,需要yum install lshw或apt install lshw,而且部分厂商魔改的BIOS可能会让lshw读出来的型号和实际外观标签不一致,这种情况下以物理标签和BMC信息为准。
5. 实战排查案例与速查表
5.1 一次内存故障排查实录
讲一个真实案例,帮大家把这些命令串起来。有次客户报障,说某台跑MySQL的服务器每隔三周就随机重启一次,没有任何规律,系统日志里只有“Out of memory”和kernel panic。第一次遇到我以为是MySQL配置的buffer pool开太大,调低之后问题依旧。
后来我调整思路,先确认硬件层面有没有问题。第一步,登上去跑free -h,发现内存总量正常,但是dmidecode -t memory显示有一条内存的Size是“No Module Installed”(空插槽),而BIOS里明明显示插了两根16GB。我当时就怀疑是插槽接触不良,或者那条内存根本没被系统认全。
第二步,用smartctl查磁盘(排除误判),确认磁盘没问题之后,再跑memtester 8G 2,跑了不到十分钟就报错,错误地址集中在某个内存区域。这就说明物理内存确实存在问题。
后面走的流程就很顺利:记录报错内存条对应的Locator(插槽位置)和Part Number(部件号),发给厂商售后,他们直接按序列号定位保修信息,换了一条内存后机器再也没重启过。这个案例里最关键的转折点就是dmidecode -t memory发现“实际识别容量少于标称容量”,如果当时只盯着free -h和系统日志,可能会在软件配置层面绕很久。
再分享一个磁盘排查案例。有一次某台NFS服务器写入响应特别慢,应用层反复超时。我先用iostat -x 1看了每秒读写情况,发现%util接近100%但await并不高,这种状态通常意味着磁盘队列被长时间占满,可能是有进程在持续刷盘。后来用iotop看到有个备份程序在跑全量归档,原本应该闲时执行的任务因为定时器配置错误跑到了业务高峰。把任务改到凌晨后问题立刻消失。这个案例说明,硬件信息查询不只有静态配置,动态I/O指标同样重要,iostat和iotop都是排查这类问题的利器。
5.2 硬件信息速查命令对照表
平时用得多,我整理了一份速查对照表,也贴在这篇文里。它不能覆盖所有命令,但能覆盖90%的日常工作场景。
| 查询需求 | 推荐命令 | 关键字段/说明 |
|---|---|---|
| CPU型号与物理核数 | lscpu或grep "model name" /proc/cpuinfo | 看Socket(s)与Core(s) per socket,不要直接信CPU(s) |
| CPU实时占用 | top、mpstat -P ALL 1 | 按P排序找热点进程,按1展开所有核 |
| 系统平均负载 | uptime | 看15分钟负载,与逻辑核数对比 |
| 内存总容量与使用 | free -h | 重点看available,不是used |
| 内存条物理信息 | dmidecode -t memory | 看Locator、Size、Speed、Part Number |
| 内存硬件稳定性 | memtester 4G 5 | 适合新机验收、有故障且怀疑内存时使用 |
| 磁盘设备树 | lsblk或lsblk -f | 看设备层级、分区、文件系统和UUID |
| 文件系统使用率 | df -h | 判断空间是否不足,适合日常巡检 |
| 磁盘inode使用率 | df -i | 小文件过多时容量正常但inode会耗尽 |
| 磁盘物理健康 | smartctl -a /dev/sda | 看SMART状态和Reallocated_Sector_Ct等属性 |
| 磁盘I/O动态 | iostat -x 1、iotop | 看%util、await,定位持续刷盘进程 |
| 网卡型号与PCI设备 | lspci -nn | grep -i ethernet | 配合lspci -v看详细设备信息 |
| 网卡链路与驱动 | ethtool eth0、ethtool -i eth0 | 看速率、双工、驱动和固件版本 |
| 整机厂商/序列号 | dmidecode -t system | 资产盘点和报修必备 |
| 整体硬件清单 | lshw -short | 适合快速生成概览,导出HTML报告方便归档 |
这张表我每次培训新同事都会发一份,把“什么时候用哪个命令”写清楚,比让学生背命令要效率高得多。你要是在实际项目里还有别的查询需求,也可以在这张表上继续扩展。
6. 常见问题与注意事项
6.1 权限、工具缺失与厂商魔改
第一大坑是权限。dmidecode、lshw、smartctl这些命令默认都需要root权限,普通用户执行会直接提示Permission denied,或者拿到非常残缺的输出。运维环境里如果开了sudo限制,可以先量好最小权限白名单:sudo dmidecode -t system、sudo smartctl -a /dev/sda。不要图省事直接给所有用户sudo权限,能只授权这几个命令就最理想。
第二大坑是工具缺失。精简版系统、容器环境、部分国产化操作系统,很可能没有lscpu、lspci、smartctl这些工具。/proc是最后的兜底办法:cat /proc/cpuinfo、cat /proc/meminfo、cat /proc/partitions,这些文件永远存在,只是排版没有工具那么友好。必要时可以临时安装:Debian/Ubuntu用apt install util-linux pciutils smartmontools dmidecode,RedHat/CentOS系用yum install util-linux pciutils smartmontools dmidecode,装完再跑命令。
第三大坑是厂商魔改。不少服务器厂商会在BMC里调整DMI数据,导致dmidecode -t system显示的“Product Name”和机箱外观标签不一致。这时候不要盲目按DMI信息报修,可以先登录BMC确认序列号,再结合机箱上的物理标签,三者对得上才靠谱。另一个常见现象是lshw和lspci显示的网卡型号不一致,一个显示“Virtual”一个显示具体型号,这在虚拟化环境里很容易出现,正常,不用慌。
还有一点,排查硬件问题不要只盯命令输出,系统日志里往往藏着决定性线索。dmesg -T能看内核日志,内存错误、磁盘I/O错误、PCIe链路降速都会在这里留下痕迹;journalctl -k同样可以快速过滤内核消息。我遇到过一台服务器网卡频繁断连,ethtool、lspci全都正常,最后是dmesg里不断刷igb: link down事件才发现是光模块松动。硬件信息查询和系统日志配合起来,才能拼出完整的故障画面。
6.2 实操心得与建议
最后聊点自己的经验。硬件信息速查这个事,往浅了说就是几个命令轮着敲,往深了说考验的是对信息层级的理解和对输出字段的判断力。我个人的做法是:把所有硬件巡检命令写成一个脚本,部署到所有服务器上,每天定时执行并把结果推到日志平台,一旦发现CPU型号异常变化(比如被替换成低配)、内存条被拔出、磁盘SMART属性增长,立刻告警。这套做法帮我抓过好几次“硬件被悄悄改动”的异常问题,比任何资产管理系统都直接。
新到货的服务器,验收时不要只跑lscpu、free -h、df -h就完事,一定要跑一遍dmidecode -t memory核对内存条数量与容量、跑一遍smartctl -a确认磁盘初始健康状态、跑一遍memtester确认内存稳定。虽然耗时多一点,但这三件事能避免后面N次深夜被叫起来处理故障。硬件上的坑,绝大多数都在“到货验收”这个环节埋下来的。
还有一个很实用的小技巧:把关键命令的输出配上时间戳重定向到文件。比如dmidecode -t memory > meminfo_$(date +%Y%m%d).txt,这样每次变更都有据可查,尤其是报修的时候,厂商问你要“这是哪个批次的序列号”、“换了哪根内存条”,你直接翻历史文件就能回答,不用临时登录机器重新查。库存管理和变更追溯这事,报表永远比人脑靠谱。
就说这么多。命令都好记,关键是用的时候知道自己到底要查什么、从哪一层查。下次再有人问你“这台机器什么配置”,你可以从容地敲几条命令,把答案甩给他。