ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu硬件信息查询全攻略:lscpu/lsblk/lspci/dmidecode实战详解

Ubuntu硬件信息查询全攻略:lscpu/lsblk/lspci/dmidecode实战详解 装系统、配驱动、加硬件第一步全是同一件事查清机器里到底装了什么。很多朋友私信问我 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这些目录下的文件拿到原始信息但手写路径既繁琐又容易记错所以出现了各种用户态工具帮你查询——比如lscpu、lsblk、lspci、lsusb、dmidecode。理解这层关系很重要。当你执行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占用的内存在需要时可以释放给应用所以available比free更真实。再看内存条物理信息sudo dmidecode -t memory这段命令需要 root 权限因为它要读取主板 SMBIOS 固件暴露的信息。输出里每个Memory Device对应一个物理插槽关键字段是Size、Type比如 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-Vlspci遍历的是 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 biossudo 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 -vUSB 设备识别lsusbdmesg网卡型号lspci或lsusbip link show主板与整机序列号sudo dmidecode -t systemsudo lshw -class system电池健康度笔记本cat /sys/class/power_supply/BAT0/capacityupower -i /org/freedesktop/UPower/devices/battery_BAT03.2 三个易混淆参数与输出解读第一处lspci输出里的 VGA 与 3D 控制器。不少 NVIDIA 笔记本有两个 PCI 设备一个是VGA compatible controller一个是3D controller前者对应独显后者对应核显或者相反具体看 BIOS 设置。装驱动前两个都看一眼确认输出里驱动加载状态是否变化。第二处lsblk里的TYPE列。除了常见的disk和part你还会看到lvm和rom。lvm表示逻辑卷管理器创建的虚拟块设备它挂在物理分区之上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_drm、nvidia_modeset、nvidia这几个模块说明加载成功。配合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 userserver 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% 的场景剩下的都是遇到具体型号疑问时再按需查。希望这套方法也能帮你少走弯路。
返回列表