Ubuntu硬件信息查询全攻略:lscpu/lsblk/lspci/dmidecode实战详解
2026/9/19 18:53:59 网站建设 项目流程

装系统、配驱动、加硬件,第一步全是同一件事:查清机器里到底装了什么。很多朋友私信问我 Ubuntu 下怎么看硬件详细信息,网上答案七零八落,有的让装第三方工具,有的给一条命令就完事,真正面对“我要装 NVIDIA 驱动,该下哪个版本”或者“服务器要加内存,还剩几个插槽”这种具体问题时,又对不上号。这篇我把平时排查硬件信息最常用、最可靠的一套方法整理出来,从命令本身到背后的原理,再到实际排查链路,一次讲透。

如果你刚接触 Ubuntu,这套内容能帮你快速上手;如果你已经用了一段时间,但每次都要现搜命令,那这篇正好能帮你把工具串成体系。文章里所有的命令都在 Ubuntu 20.04 和 22.04 上实测过,部分涉及硬件信息读取的命令需要管理员权限,我会在执行前明确标注。

1. 为什么要自己动手查硬件:装驱动、扩内存、排查故障都绕不开这一步

很多人觉得“查硬件信息”就是装个 CPU-Z 之类的图形工具点几下的事。在 Windows 上确实如此,但 Ubuntu 的生态不太一样——不是没有图形工具,而是命令行这套体系的信息密度和准确度远高于图形界面,而且排查问题的时候,你根本来不及开图形界面。

1.1 最常见的三个真实场景

先说装驱动。Ubuntu 对硬件驱动的支持已经比早年好太多了,但 NVIDIA 显卡这种闭源驱动仍然需要手动安装,装之前你至少要确认三件事:显卡具体型号是哪一代、PCI 总线位置在哪、当前系统用的是不是已经加载了 nouveau 开源驱动。这些信息靠“设置”里那个“关于”窗口根本看不全。

再看扩内存或者加硬盘。买之前你得知道当前内存是 DDR4 还是 DDR5、频率是多少、主板还剩几个内存插槽;加硬盘要看现有磁盘是 SATA 还是 NVMe、分区表是什么格式、根分区还剩多少空间。这些数据在 Ubuntu 下用一条命令就能拿全,但前提是你知道该用哪条。

最后是故障排查。我遇到过好几回,用户说“Ubuntu 开机进不了桌面”,远程过去第一条命令就是查显卡和磁盘状态;还有开发板通过 USB 转串口连不上电脑,十有八九是 USB 设备没有被系统正确识别。这种时候你不可能打开图形工具慢慢点,命令行一条dmesg | tail就能定位问题。

1.2 信息从哪里来:/proc、/sys 与用户态工具的配合

先建立一个认知:Linux 下查看硬件信息,本质上是在读内核暴露出来的虚拟文件系统。最核心的是/proc/sys两个目录。

/proc/cpuinfo直接记录 CPU 的型号、核心数、标志位;/proc/meminfo记录内存总量和使用情况;/proc/partitions记录系统识别到的磁盘分区。这些文件并不是真实存在于磁盘上,而是内核在内存中动态生成的,你每次读它们,拿到的都是当前真实状态。

/sys目录更偏向设备模型,它以目录树的形式展示了内核枚举到的每一个设备,比如/sys/block下是块设备,/sys/class/net下是网卡,/sys/bus/pci下是 PCI 总线上的设备。你可以直接cat这些目录下的文件拿到原始信息,但手写路径既繁琐又容易记错,所以出现了各种用户态工具帮你查询——比如lscpulsblklspcilsusbdmidecode

理解这层关系很重要。当你执行lscpu时,工具本质上是在读取/proc/cpuinfo以及/sys/devices/system/cpu下的文件,然后格式化成人类友好的输出。理解这一点,你以后遇到工具输出异常,就能直接去原始文件里核对,而不是干瞪眼。

2. 六个核心命令逐个拆解:每个工具分别解决什么问题

Ubuntu 默认安装的 util-linux 包里已经包含了一大半硬件查询工具,不需要额外安装。下面这几个命令是我日常使用频率最高的,按信息类别逐个展开。

2.1 用 lscpu 看 CPU 完整拓扑

命令:

lscpu

输出片段:

Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 16 On-line CPU(s) list: 0-15 Thread(s) per core: 2 Core(s) per socket: 8 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel Model name: Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz CPU MHz: 1200.000 CPU max MHz: 2600.0000 CPU min MHz: 800.0000 L1d cache: 256 KiB L2 cache: 1 MiB L3 cache: 12 MiB

这个命令最实用的地方在于它同时给出了三层信息:物理拓扑(几颗 CPU、每个 CPU 几核)、逻辑拓扑(超线程后系统看到几个逻辑核)、缓存结构。我们常说“8 核 16 线程”,在 lscpu 的输出里就是Core(s) per socket = 8乘以Thread(s) per core = 2

如果查 ARM 架构的开发板或服务器,输出里会有 Model name 显示为类似Cortex-A72的字段,架构变为aarch64,逻辑核与物理核的对应关系同样清晰可见。用lscpu -e还能以表格形式列出每个逻辑核对应的物理核和插槽,这在排查 NUMA 性能问题时非常关键。

2.2 用 lsblk 理清磁盘与分区树状关系

命令:

lsblk

输出片段:

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 465.8G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 465.3G 0 part └─ubuntu--vg-ubuntu--lv 253:0 0 465.3G 0 lvm /

lsblk读的是/sys/block下的设备信息,它会自动识别设备之间的父子关系,把磁盘和分区用树状结构画出来。这个命令是安装系统、做 LVM 扩容、挂载新硬盘之前必看的。

几个常用参数:

  • lsblk -f:额外显示文件系统类型和 UUID,挂载分区时可以直接复制 UUID 写 fstab。
  • lsblk -d -o NAME,SIZE,TYPE:只看磁盘本身,不显示分区,适合快速列出一台机器有几块物理盘。
  • lsblk -S:显示 SCSI 设备及其厂商信息,可以区分磁盘是不是通过 USB 转接的。

注意RO列表示是否为只读设备,RM列表示是否可移动设备。如果你插入一个 U 盘,执行lsblk会看到新增的sdb设备,RM列是 1。

2.3 用 free 和 dmidecode 分别获取内存使用量与物理硬件信息

内存这块很多人有个误区:用free -h看到总量就够了。但实际上free只是看系统当前使用情况,想看内存条本身的硬件信息必须用dmidecode

先用免费随手可得的信息:

free -h

输出片段:

total used free shared buff/cache available Mem: 31Gi 5.2Gi 20Gi 234Mi 5.5Gi 25Gi Swap: 2.0Gi 0B 2.0Gi

重点看available列,这才是系统实际可分配给新程序的物理内存,而不是简单的free列。buff/cache占用的内存在需要时可以释放给应用,所以availablefree更真实。

再看内存条物理信息:

sudo dmidecode -t memory

这段命令需要 root 权限,因为它要读取主板 SMBIOS 固件暴露的信息。输出里每个Memory Device对应一个物理插槽,关键字段是SizeType(比如 DDR4)、Speed(比如 3200 MT/s)、Locator(插槽位置)。如果某个插槽的Size显示No Module Installed,说明这个槽位是空的,加内存前数一数还剩几个空槽,再对照主板规格决定买多大的条子。

2.4 用 lspci 查看 PCI 设备:显卡、网卡、NVMe 全在里面

命令:

lspci

输出片段:

00:00.0 Host bridge: Intel Corporation 10th Gen Core Processor Host Bridge/DRAM Registers 00:01.0 PCI bridge: Intel Corporation Xeon E3-1200 v5/E3-1500 v5 v6 PCIe Root Port 01:00.0 VGA compatible controller: NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q] 01:00.1 Audio device: NVIDIA Corporation TU117M HD Audio Controller 00:14.0 USB controller: Intel Corporation 8th Gen Core Processor USB xHCI Host Controller 00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (10) I219-V

lspci遍历的是 PCI 总线上的所有设备,第 1 列是总线号、设备号、功能号,即 PCI 地址;冒号后面是设备类型和厂商描述。最典型的使用场景就是确认显卡型号——就像我上面输出里的 GTX 1650,一眼就能看到。

参数方面,lspci -k可以显示内核驱动和内核模块,比如输出中会多一行Kernel driver in use: nvidia,装完 NVIDIA 驱动后可以用这行确认驱动确实加载了。lspci -v显示详细信息,lspci -nn会额外显示设备厂商 ID 和设备 ID,去网上搜索某设备是否被 Linux 兼容时,这个输出比文字描述更可靠。

2.5 用 lsusb 查 USB 设备:串口调试与外设识别的起点

命令:

lsusb

输出片段:

Bus 001 Device 004: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter Bus 002 Device 003: ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter Bus 002 Device 002: ID 8087:0026 Intel Corp. AX201 Bluetooth

第一列是 USB 总线和设备编号,第二列是厂商 ID 和产品 ID。做嵌入式开发的朋友对这个命令应该不陌生——USB 转串口模块插上去没反应,第一步就是执行lsusb看系统是否枚举到了设备。如果枚举到了但/dev/ttyUSB0没出现,问题多半出在驱动或者权限上;如果lsusb里压根没有设备,那就要查硬件连接了。

配合dmesg查看内核日志更有效:

dmesg | tail -30

插拔 USB 设备的瞬间执行这条命令,能看到内核从识别设备到分配端口的完整过程。比如ch341-uart ttyUSB0: ch341-uart converter now attached to ttyUSB0这行日志出现,说明串口已经被正确映射到了/dev/ttyUSB0

2.6 用 dmidecode 查主板序列号和 BIOS 版本:做运维资产登记时必不可少

命令:

sudo dmidecode -t bios
sudo dmidecode -t system

这两条命令分别输出 BIOS 信息和整机厂商、产品名、序列号。对于个人使用的电脑,序列号查不查影响不大;但对于公司资产盘点或者 RMA 返修,序列号是必须拿到的。sudo dmidecode -t system输出的Serial Number字段可以直接抄进工单。

dmidecode 支持的-t参数还有baseboard(主板)、chassis(机箱)、processor(处理器)等,你可以用sudo dmidecode -t processor查看 CPU 的额定频率、外频、当前倍频,这些信息在某些性能调优场景下比 lscpu 更完整。

3. 工具对比与易混淆细节:别再拿着 hwinfo 到处装

网上很多教程一上来就让你sudo apt install hwinfo,然后跑一个hwinfo把所有信息打出来。这种方法不是不能用,但 Ubuntu 官方仓库里的 hwinfo 只是包装了底层工具,而且输出非常冗长,你为了找一行显卡型号,得翻几十行无关信息。我更推荐“按需取用”的策略——不同的需求用不同的命令,又快又准。

3.1 查询工具与适用信息对照

场景首选命令备用/补充命令
CPU 型号、核心线程数lscpucat /proc/cpuinfo
内存容量与插槽位sudo dmidecode -t memoryfree -h(仅看使用量)
磁盘型号与分区布局lsblksudo lshw -class disk
显卡型号与驱动lspci -klspci -v
USB 设备识别lsusbdmesg
网卡型号lspcilsusbip link show
主板与整机序列号sudo dmidecode -t systemsudo lshw -class system
电池健康度(笔记本)cat /sys/class/power_supply/BAT0/capacityupower -i /org/freedesktop/UPower/devices/battery_BAT0

3.2 三个易混淆参数与输出解读

第一处:lspci输出里的 VGA 与 3D 控制器。不少 NVIDIA 笔记本有两个 PCI 设备,一个是VGA compatible controller,一个是3D controller,前者对应独显,后者对应核显或者相反,具体看 BIOS 设置。装驱动前两个都看一眼,确认输出里驱动加载状态是否变化。

第二处:lsblk里的TYPE列。除了常见的diskpart,你还会看到lvmromlvm表示逻辑卷管理器创建的虚拟块设备,它挂在物理分区之上,Ubuntu 桌面版默认安装时就用了 LVM,所以很多人lsblk看到ubuntu--vg-ubuntu--lv会疑惑为什么多了一层。rom则通常是光驱,服务器上常见。

第三处:free输出中的 total 小于物理内存标称值。比如你买了 32GB 内存,free -h显示 total 是 31Gi。这不是硬件有问题,而是有一部分物理内存被内核和硬件保留(比如核显占用),属于正常现象。真正的意外情况是 total 比标称值少了几个 GB,那才要怀疑是不是有一条内存没被识别——这时候回到sudo dmidecode -t memory看每个插槽的 Size 就能发现。

3.3 补充信息源:/proc 与 /sys 的原始文件

工具输出的终归是格式化后的数据,遇到工具本身故障或者想验证,直接读原始文件更踏实。我最常用的几个:

cat /proc/cpuinfo cat /proc/meminfo cat /proc/partitions cat /sys/class/dmi/id/product_name cat /sys/class/net/enp0s3/address

其中/sys/class/dmi/id/product_name可以直接看到整机型号,不用加 sudo;/sys/class/net/下每个目录对应一个网卡,目录里的address文件就是 MAC 地址。这类信息在写自动化脚本时特别有用,因为工具的输出格式可能随版本变化,但/sys下的文件路径和格式非常稳定。

4. 三段实战排查链路:显卡驱动、内存扩展与 USB 串口

光知道命令不行,关键是要知道“遇到问题先跑什么、后跑什么”。下面三个排查流程都是我从实际运维和日常折腾中总结出来的,照着这个顺序走,基本不会跑偏。

4.1 为 NVIDIA 显卡安装驱动前的完整确认

网络上很多“Ubuntu 安装 NVIDIA 驱动”的教程会让你直接ubuntu-drivers autoinstall,但如果你连显卡型号都没确认就装,轻则装错版本,重则和内核模块冲突导致开机黑屏。我先讲排查链路。

第一步,确认显卡硬件型号:

lspci | grep -i nvidia

输出类似:

01:00.0 VGA compatible controller: NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q]

拿到型号后,去 NVIDIA 官网对照驱动版本,或者直接用 Ubuntu 的推荐机制:

ubuntu-drivers devices

第二步,确认当前驱动加载状态:

lspci -k | grep -A 3 -i nvidia

如果看到Kernel driver in use: nouveau,说明系统正在使用开源的 nouveau 驱动,装闭源驱动前需要禁用它;如果看到Kernel driver in use: nvidia,说明闭源驱动已经在工作。

第三步,确认内核模块有没有冲突:

lsmod | grep -i nvidia

空输出表示当前没有加载任何 NVIDIA 内核模块,是干净状态。装完驱动后重新跑这条命令,看到nvidia_drmnvidia_modesetnvidia这几个模块,说明加载成功。配合nvidia-smi查看驱动版本与显存占用,整个链路就闭环了。

4.2 服务器扩内存前:插槽、规格与当前使用量三步走

给服务器扩内存是最常见的运维操作,但直接买内存插上发现点不亮的情况我也遇到过。原因是服务器内存的规格要求比台式机严格得多——频率不匹配、Rank 数不一致、甚至不同厂商混插都可能引起问题。

第一步,查当前每个插槽的内存规格:

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

关注输出中每个 Memory Device 的 Locator(如 DIMM_A1、DIMM_B1),记下已插槽位和空槽位。最关键的是Speed字段,假设当前内存是 3200 MT/s,你买了 2933 MT/s 的条子插上去,要么降频运行,要么不稳定。

第二步,查系统当前实际使用的内存频率。硬件标称频率和实际运行频率不一定一致,去 BIOS 里看最准,但系统层面也有办法:

sudo dmidecode -t memory | grep "Configured Memory Speed"

第三步,结合free -h看当前使用量,判断是否真的到了需要扩内存的地步。别笑,我确实见过内存明明还剩 40% 就喊着要加内存的。如果 available 长期低于总内存的 15%,再考虑扩容,否则先排查是不是有进程泄漏。

4.3 开发板 USB 串口无法连接:从枚举到端口权限的定位顺序

这个场景下,最常见的硬件是 CH340、CP2102、FT232 这些 USB 转 TTL 模块。连接不上时,按顺序执行以下三步。

第一步,查 USB 总线是否枚举到设备:

lsusb

如果是 CH340,输出中应包含1a86:7523。没有任何输出变化,说明模块本身没被识别,可能是线序接反、供电不足或者模块损坏。换一根线、换一个 USB 口再试。

第二步,查内核日志确认端口映射:

dmesg | tail -20

看到usb 1-2: ch341-uart converter now attached to ttyUSB0说明成功映射。如果只看到new full-speed USB device但后面没有attached,可能是驱动没加载。

第三步,确认端口权限。Ubuntu 下/dev/ttyUSB0通常属于dialout组,普通用户不在这个组里就没有读写权限,表现就是串口工具能打开端口但收不到数据。解决方案是把用户加进组并重新登录:

sudo usermod -aG dialout $USER

执行后注销重进,再用id确认自己已经在dialout组里。这一步能解决八成“串口连不上”的假故障。

5. 把检查动作脚本化:一条命令生成硬件概览报告

单条命令适合临时查询,但如果要经常检查(比如远程服务器、多台设备巡检),写个小脚本把信息汇总成一份报告,会省下大量重复劳动。下面我给出一个简单的 Bash 脚本,把前面讲的命令组合起来,输出一份可读性很好的硬件概览。

5.1 单行汇总:快速打印关键信息

如果你只是想登录服务器后快速扫一眼机器配置,可以贴这段:

echo "== CPU ==" && lscpu | grep -E "Model name|^CPU\(s\)|Thread|Core|Socket" && echo "== MEM ==" && sudo dmidecode -t memory | grep -E "Size|Speed" | grep -v "No Module" && echo "== DISK ==" && lsblk -d -o NAME,SIZE,MODEL && echo "== GPU ==" && lspci | grep -i -E "vga|3d"

这段代码会依次输出 CPU 主要参数、已插内存条规格、物理磁盘列表、显卡型号。注意内存部分用了 sudo,需要提前配置好当前用户的 sudo 权限或者使用免密 sudo,否则脚本运行到一半会卡住等待密码。

5.2 生成带时间戳的硬件报告脚本

下面是完整脚本,保存为hw_report.sh,赋予执行权限后即可运行:

#!/bin/bash REPORT_DIR="$HOME/hw_reports" mkdir -p "$REPORT_DIR" STAMP=$(date +%Y%m%d_%H%M%S) REPORT="$REPORT_DIR/hw_$STAMP.txt" { echo "================ Hardware Report ================" echo "Generated: $(date)" echo "Hostname: $(hostname)" echo echo "---------------- CPU ----------------" lscpu | grep -E "Model name|^CPU\(s\)|Thread|Core|Socket|Architecture" echo echo "---------------- Memory ----------------" free -h echo echo "---- Memory Slots (requires sudo) ----" sudo dmidecode -t memory | grep -E "Locator|Size|Speed|Manufacturer" | grep -v "No Module" echo echo "---------------- Disk ----------------" lsblk -o NAME,SIZE,TYPE,MOUNTPOINTS,MODEL echo echo "---------------- PCI Devices ----------------" lspci | grep -E "VGA|Ethernet|Network|SATA|NVMe" echo echo "---------------- USB Devices ----------------" lsusb echo "================ End of Report ================" } > "$REPORT" echo "Report saved to: $REPORT"

脚本思路是先创建报告目录,然后以当前时间戳命名输出文件,最后把各命令的输出重定向进同一个文件。你可以用crontab -e添加定时任务,比如每周一早上生成一次,再配合scp拉取到本地存档,一套简单的硬件状态跟踪机制就完成了。

5.3 远程机器排查技巧:组合使用 at 与屏幕回显

碰到远程服务器,一般不会直接登录进去跑上面那一长串脚本,两个更高效的办法。

办法一:用ssh远程执行单条命令,比如:

ssh user@server "lscpu | grep 'Model name'"

办法二:把报告脚本放到服务器上,用sudo ./hw_report.sh执行生成报告,然后只拉取报告文件。因为脚本里已经做了 sudo 处理,远程非交互式执行时要确保 sudo 不提示密码,或者提前给用户配置 NOPASSWD 权限(注意这有安全隐患,仅限受管环境使用)。

还有一种新玩法:如果机器上配置了 systemd,可以用systemd-analyze查看开机时硬件初始化的耗时,对排查“开机慢”问题有帮助。不过这属于延伸话题,和查看硬件详细信息关系不大,这里就不展开了。

我自己平时用得最多的组合是:登录机器后先lsblk看一眼磁盘心跳,然后lspci -k | grep -A 3 -i -E "vga|ethernet"检查驱动状态,最后sudo dmidecode -t memory | grep Locator确认内存插槽。这三条命令覆盖了日常 80% 的场景,剩下的都是遇到具体型号疑问时再按需查。希望这套方法也能帮你少走弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询