接手一台服务器或者刚装好一套Linux系统,很多人第一件事就是到处找命令看配置:内核版本多少、CPU几核、内存多大、磁盘什么型号、网卡速率多少。这些“查系统信息”的操作听起来基础,但真到了排查故障、性能分析、买配件扩容的时候,你会发现很多坑其实都藏在命令输出里。与其每次百度“linux 查看硬件信息”,不如完整掌握一套常用的查看系统与硬件信息的命令体系,随手一敲就能把机器底细摸清。
这篇文章我基于自己多年运维和折腾Linux的经验,把这些命令按场景拆开讲,不光是告诉你“敲什么”,更会把每条命令输出里的关键字段、适合用什么场景、容易踩的坑一起说清楚。不管是刚入门的新手,还是已经干活几年的老手,都能在这篇里找到能直接用的东西。
1. 快速摸清系统底细:内核、发行版与开机时长
拿到一台Linux机器,第一件事永远是先确认“这到底是个什么系统”。这里说的不只是发行版名称,还包括内核版本、系统架构、运行了多久。排查问题时,对方经常说“我用的是某某系统”,但具体到内核小版本、补丁级别,就说不清了。实际上系统本身已经提供了很完整的答案。
1.1 uname:一条命令看内核全貌
uname 是我用得最频繁的命令之一,它全称是 “Unix name”,用来打印当前系统的内核信息。你也许只知道 uname -a,但它的每个参数背后都有独立用途。
bash复制uname -s # 内核名称,几乎所有Linux都返回 Linux
uname -r # 完整内核版本号,比如 5.15.0-91-generic
uname -m # 机器硬件架构,比如 x86_64、aarch64
uname -n # 主机名
uname -v # 内核编译时间及gcc版本信息
最常用的是 uname -a,它会一次性把所有信息打出来。看到 x86_64 代表是64位Intel/AMD架构,看到 aarch64 则是ARM架构,比如大部分国产服务器芯片、树莓派、飞腾等平台。这个信息直接决定了你安装软件包时要选哪个版本。
我习惯把 uname -r 作为内核版本的“标准答案”,因为它在所有Linux发行版上输出格式统一。排查内核模块问题时,这个版本号要完整记录,比如 5.15.0-91 和 5.15.0-90 之间就差一个补丁,却可能导致某些驱动行为不同。
1.2 hostnamectl与/etc/os-release:发行版信息
如果你只知道“我这个是Ubuntu”或者“是CentOS”,那还不够。同一个Ubuntu还有20.04、22.04、24.04之分,它们使用的库版本、默认内核都不同,软件源的配置方式也不同。
hostnamectl 是systemd时代的统一查看命令,它同时展示主机名、操作系统、内核、架构等信息。
bash复制hostnamectl
输出里关键的几行:
- Operating System:发行版名称及版本号,比如 Ubuntu 22.04.3 LTS
- Kernel:和
uname -r一致的内核版本 - Architecture:硬件架构
- Chassis:机器类型,比如 desktop、server、vm
不过有些发行版默认没装 hostnamectl,比如精简版容器里。这时候最可靠的方式是直接读文件:
bash复制cat /etc/os-release
这个文件是几乎所有Linux发行版都遵循规范提供的。其中 PRETTY_NAME 是人类可读的完整名称,VERSION_ID 是版本号,ID 是发行版标识符,比如 ubuntu、centos、kylin。写自动化脚本时用 VERSION_ID 做判断比直接读 PRETTY_NAME 更靠谱,因为后者可能包含多余文字。
另外,cat /etc/redhat-release 专门用在RHEL系(如CentOS、Rocky、AlmaLinux)上,只看这个文件就能确定具体小版本。
1.3 uptime:开机时长与平均负载
系统稳定不稳定,uptime 一眼就能看个大概。
bash复制uptime
输出示例:
text复制 10:24:36 up 68 days, 4:12, 1 user, load average: 0.08, 0.03, 0.01
中间那段 up 68 days, 4:12 表示系统已经连续运行了68天4小时12分钟。这本身不是判断好坏的标准,但如果一个服务长期不重启,内核和库可能积累一些状态问题。重启后发现某个服务起不来,先看看 uptime 就能确认是不是“好几个月没重启过,一旦重启就露馅”的情况。
最后的 load average 是1分钟、5分钟、15分钟的平均负载。这里的“负载”不是CPU使用率,而是处于可运行状态和不可中断状态的进程平均数量。一个简单的判断方式是:对于N核CPU,持续负载接近N说明CPU已经饱和;超过N说明任务在排队。比如一台8核机器,负载长期7-8属于满载运行,负载超过16就是明显排队了。新手容易误把负载当CPU百分比,这两者在排查时要分清楚。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件清单逐个看:CPU、内存、磁盘的常用命令
系统信息摸清了,接下来就是硬件。这一部分是出现频率最高的需求场景:有人问你“这机器内存多大”、“CPU是几核的”、“磁盘还剩多少”,与其含糊地说“好像是”,不如敲几条命令给出准确数字。
2.1 CPU信息:lscpu与/proc/cpuinfo
查看CPU信息,首选 lscpu。这条命令不是直接读硬件,而是从 /proc/cpuinfo 等内核接口汇总后以更清晰的表格展示。
bash复制lscpu
关键字段:
- Architecture:架构,x86_64 或 aarch64
- CPU(s):逻辑CPU总数(包括超线程)
- On-line CPU(s) list:当前在线的CPU编号列表
- Socket(s):物理CPU插槽数,也就是“几颗CPU”
- Core(s) per socket:每颗CPU的物理核心数
- Thread(s) per core:每个核心的线程数,2表示开启超线程
- Model name:CPU型号全称
- CPU max MHz:最大频率
- NUMA node(s):NUMA节点数,多路服务器常见
这几个字段组合起来能算出很多信息:逻辑CPU总数 = Socket数 × 每颗物理核心数 × 每核心线程数。比如一台机器显示 Socket(s): 2、Core(s) per socket: 8、Thread(s) per core: 2,那逻辑CPU就是 2 × 8 × 2 = 32。
在国产化服务器上,你还会看到 Model name 是 Phytium、Kunpeng、Hygon 这类芯片型号,架构通常是 aarch64 或 x86_64 混合生态。要注意的是,ARM架构下 lscpu 显示的部分字段含义会有细微差别,但不影响大体判断。
如果 lscpu 反馈的信息不够细,直接看原始文件:
bash复制cat /proc/cpuinfo
这个文件会为每个逻辑CPU打印一段信息。通过 grep "physical id" /proc/cpuinfo | sort -u | wc -l 可以统计物理CPU个数,通过 grep "processor" /proc/cpuinfo | wc -l 可以统计逻辑CPU个数。和 lscpu 的输出对得上。物理机、虚拟机、容器里看到的 /proc/cpuinfo 可能有差异,虚拟机通常显示的是宿主机CPU型号,但逻辑核数可能被限制。
2.2 内存信息:free与/proc/meminfo
内存信息用 free 查看。我用的时候一定会加 -h 参数,这样输出以人类可读的G/M为单位,而不是以字节为单位让人换算半天。
bash复制free -h
输出示例:
text复制 total used free shared buff/cache available
Mem: 31Gi 1.2Gi 27Gi 12Mi 2.6Gi 29Gi
Swap: 2.0Gi 0B 2.0Gi
这里有个重要常识:free 显示为0不一定说明内存用光了。Linux会把空闲内存用作文件缓存(buff/cache),这部分内存在程序需要时可以被回收。所以真正判断内存是否紧张要看 available(可用内存)这一列,它估算的是“在不触发交换的前提下还能分配给应用程序多少内存”。用 free 看内存,优先看 available,这是很多新手和老手都可能误解的点。
打开 /proc/meminfo 可以看到更详细的数据。MemTotal 和 MemAvailable 是两个最常用的字段。值得留意的是,MemTotal 显示的总内存通常会比物理内存条标称容量小一些,因为内核和部分固件会占用一部分地址空间。比如插了32GB内存,显示31Gi并不是坏了,这是正常情况。
bash复制cat /proc/meminfo | head -5
关于Swap(交换分区),free -h 能直接看出 swap 的总量和使用量。如果 available 内存长期很低、swap 持续增长,通常说明内存存在压力,需要考虑优化应用或扩容内存,而不是等到系统卡到无法操作再查。
2.3 磁盘与分区:lsblk、df、du、fdisk
磁盘这块需要拆成两个维度来看:一个是物理磁盘和分区结构,另一个是文件系统层面的使用空间。
查看磁盘和分区结构,lsblk 是最好用的。它从块设备层读取信息,输出让人一目了然。
bash复制lsblk
输出示例:
text复制NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
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 /
这里的 sda 是整块物理磁盘,sda1、sda2 是它下面的分区。MOUNTPOINT 列显示分区挂载到了哪里。如果看到 disk 类型下面还有 lvm 或 md,说明用了LVM逻辑卷或软RAID,lsblk 会以树状结构把它们之间的关系展示出来。
df -h 是查看文件系统空间使用率的命令行标配。
bash复制df -h
df -hT 还会额外显示文件系统类型(如 ext4、xfs、nfs),在判断“这个目录是不是网络存储”时很有用。看 df 的输出,重点关注 Use% 是否接近100%。当分区满了,很多服务会出现莫名其妙的故障,比如日志写不进去、临时文件创建失败。
du 则是用来统计目录占用空间。-sh 参数适合快速看某个目录的总大小,--max-depth=1 适合一层一层找谁占的空间大。
bash复制du -sh /var/log
du -h --max-depth=1 /var | sort -h
排查“磁盘满了但不知道谁占的”这种情况,用 du -h --max-depth=1 加 sort -h 从大到小排序,是最直接有效的方式。
如果你需要看更底层的分区表、起始扇区、分区分区类型,用 fdisk -l。注意这个命令通常需要root权限,输出里能看到每块磁盘的总扇区数和每个分区的起始、结束位置。
bash复制fdisk -l
另外还有个快速查看块设备UUID和文件系统类型的命令是 blkid,在配置 fstab 自动挂载时会特别有用。比如新加了一块数据盘,格式化后记下它的UUID,然后在 /etc/fstab 里按UUID挂载,比写 /dev/sdb1 这种设备节点路径稳妥得多,因为设备名在重启后顺序可能变化。
3. 更深一层:主板、网卡、外设与传感器信息
前三项只是“基础三件套”。做服务器运维、二手硬件选购、故障硬件排查时,你还得知道主板型号、BIOS版本、网卡类型、硬盘健康状态这些更底层的数据。这一层的信息靠操作系统自带命令也能拿到,只是需要多了解几个工具。
3.1 dmidecode读取硬件底层数据
dmidecode 是读取DMI(Desktop Management Interface)表的工具,DMI表里保存了主板、BIOS、内存插槽、机箱等硬件信息。它是所有查看硬件底层信息的命令里信息量最大的一个。
直接用会输出一大堆内容,所以一般配合关键词过滤:
bash复制dmidecode -t bios # BIOS信息,包括厂商、版本、发布日期
dmidecode -t system # 系统信息,包括厂商、产品名、序列号
dmidecode -t baseboard # 主板信息
dmidecode -t memory # 内存插槽和每根内存条的详细信息
dmidecode -t processor # CPU底层信息
其中 dmidecode -t memory 特别有用。它能列出每个内存插槽是否有内存条,频率是多少,容量多大,类型是DDR4还是DDR5。拿到一台新机器,一条命令就能确认“能不能再加内存、加什么规格的内存”,比拆机箱方便多了。
需要注意,dmidecode 在部分精简安装或容器环境中可能不存在,需要安装 dmidecode 软件包。另外某些虚拟机平台不会完全暴露DMI信息,这时部分字段可能显示为“Not Specified”或“To be filled by OEM”,属于正常现象。
在国产化环境中,dmidecode -t system 输出的厂商可能是Kylin、Great Wall、Huawei等整机厂商名称,产品型号也能对上。这些信息对驱动选型和固件升级非常关键:同一个Linux发行版在不同固件版本上的硬件兼容行为可能不同。
3.2 PCI/USB设备与网卡详情
查看PCI设备用 lspci,它是查看网卡、显卡、RAID卡、NVMe固态硬盘等外接设备的主要方式。直接运行输出比较乱,建议加 -nn 显示设备厂商和设备ID:
bash复制lspci -nn
比如输出里看到 Ethernet controller [0200]: Intel Corporation I210 Gigabit Network Connection [8086:1533],代表这是一块Intel I210千兆网卡,设备ID是 8086:1533。这个信息在Linux下确认网卡驱动是否加载时很有价值。
查看网卡更详细的链路状态,用 ethtool:
bash复制ethtool eth0
输出里重点看 Speed(当前协商速率)和 Link detected(物理链路是否正常)。如果网卡是千兆口但速率显示100Mb/s,大概率是网线、交换机端口或协商问题。网卡名称不一定叫 eth0,现在很多系统使用 eno1、ens33、enp0s3 这种命名,先通过 ip a 或 nmcli device status 确认网卡名称。
查看USB设备用 lsusb:
bash复制lsusb
键盘、鼠标、U盾、加密狗都挂在USB总线上。排查USB设备识别异常时,lsusb 能确认设备是否被系统看到,配合 dmesg | grep usb 能找到插拔时的内核日志。USB设备通电有问题时,lsusb 可能什么都看不到,这时就要检查供电和线缆了。
3.3 温度、硬盘健康与功耗
硬件跑着跑着突然死机、性能下降,温度是头号嫌疑。查看CPU温度,最常用的是 sensors 工具,它来自 lm_sensors 软件包。
bash复制sensors
输出能看到每个CPU核心的温度、主板温度、风扇转速。如果温度持续接近85-90°C,就该考虑清灰、换硅脂、改善散热了。注意不是所有机器都有完整的传感器芯片,虚拟机上执行 sensors 往往没有有效输出。
硬盘健康状态要看S.M.A.R.T.数据,工具有 smartctl,来自 smartmontools 软件包。
bash复制smartctl -a /dev/sda
重点关注 Reallocated_Sector_Ct(重映射扇区数)、Pending_Sector(待映射扇区数)、UDMA_CRC_Error_Count(传输错误计数)这几个指标。重映射扇区数持续增长,意味着盘片已经有物理坏道,需要尽快备份数据。smartctl -H /dev/sda 可以快速查看健康状态摘要。
NVMe固态硬盘也有对应的健康查询命令:
bash复制smartctl -a /dev/nvme0
或者读 nvme 工具:
bash复制nvme smart-log /dev/nvme0
里面能看到 percentage_used(寿命使用百分比)、temperature、data_units_written 这些关键信息。如果是二手盘,这些数据能帮你判断这块盘到底被写入了多少数据。
4. 一键汇总与实战:组合命令、脚本与系统日志验证
单项命令拆开来看都很简单,真正体现功力的是根据需要把多条命令组合成一套信息收集方案。尤其是接手新环境、做资产台账、售前报价评估性能时,手工一条条跑太慢了,不如用组合命令一把梭。
4.1 用lshw做硬件总览
lshw 是Linux下的硬件信息列举工具,能一次性输出系统、主板、CPU、内存、磁盘、网络等几乎所有硬件信息,格式比 lsblk、lspci 单独看更完整。
bash复制lshw -short
输出是一张缩略清单表格,非常直观,包括硬件路径、类别、设备描述。想要HTML报告用于存档或者发给同事排查,可以运行:
bash复制lshw -html > hardware.html
注意 lshw 最好加 sudo 运行,非root情况下部分底层信息会缺失,比如内存序列号、固件版本等。
4.2 系统日志dmesg中的硬件线索
dmesg 是内核环形缓冲区的读取命令,里面保存了从开机到现在内核打印的所有日志,其中大量内容与硬件相关。排查硬件问题时,它比任何工具都更能反映硬件真实状态。
bash复制dmesg | grep -i error
dmesg | grep -i usb
dmesg | grep -i sda
dmesg | grep -i eth
比如新插了一块硬盘但 lsblk 里看不到,运行 dmesg | tail -20 往往能看到类似 Buffer I/O error on device sdb 或者 unable to enumerate USB device 这样的关键报错,直接定位问题。
很多发行版默认不把 dmesg 输出保存到文件,但 /var/log/dmesg 在某些系统上存在。如果重启后想回看上次开机的日志,可以执行 journalctl -k -b -1(表示上一次启动的内核日志),这是systemd环境下的标准方式。
4.3 组合成小脚本,形成巡检习惯
我每次给新服务器做主机信息登记,都会跑一段收集脚本。核心命令其实就是把上面那些串起来,加个时间戳追加到文件里:
bash复制#!/bin/bash
echo "===== $(date) ====="
echo "--- OS ---"
cat /etc/os-release | grep PRETTY_NAME
uname -r
echo "--- CPU ---"
lscpu | grep -E "Model name|^CPU\(s\)|Socket|Core|Thread"
echo "--- Memory ---"
free -h
echo "--- Disk ---"
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
df -h
echo "--- Network ---"
ip -br a
echo "--- DMI ---"
sudo dmidecode -t system | grep -E "Manufacturer|Product Name|Serial Number"
脚本跑完,一台机器的基础配置就形成一张速查表。装新系统、换机器、做资产清点,这个脚本可以直接复用。脚本里我特意加了 sudo dmidecode,因为DMI信息通常需要root权限,不加 sudo 那两行会空白,新手容易误以为命令失效。
另外,把当前系统初始配置备份下来,对后续排障也有用。比如过了一个月系统变卡了,你有当时 free -h 和 dmesg | grep -i error 的基线记录,对比现在的结果,很快能判断是内存被吃光了、还是磁盘掉了、还是硬件开始报错。
4.4 从命令结果反推:物理机还是虚拟机?国产化系统的差异
systemd-detect-virt 是一个特别适合用来判断机器类型的命令,它会输出当前运行环境是物理机还是某种虚拟化平台。
bash复制systemd-detect-virt
输出为 none 说明是物理机,输出 kvm、vmware、qemu 等则是对应虚拟机平台。另外也可以看 lshw -short 里有没有 VirtualBox、VMware Virtual Platform 等字样。结合 dmesg | grep -i hypervisor 也能找到虚拟化痕迹。
判断物理机还是虚拟机,在排查性能问题和驱动兼容性时至关重要。虚拟机的CPU型号显示可能和物理机相同,但实际性能分配受宿主机限制;虚拟机看不到真实的传感器温度;虚拟机磁盘通常是虚拟磁盘,S.M.A.R.T.数据也不一定是真实的。
在国产化环境下,信息查看命令的整体语法和标准Linux一致,lscpu、free、lsblk、dmidecode 都是可用的。差异更多体现在细节字段上:比如基于openEuler的麒麟系统,/etc/os-release 里的 ID 是 kylin,uname -r 后面可能带 (ky10) 这样的标识;ARM架构下 lscpu 输出的部分字段描述不同。这不算什么大问题,只要不把通用命令“想当然”,多跑一条 cat /etc/os-release 确认发行版,就能减少很多不必要的困惑。
5. 常见问题与排查技巧实录
这部分整理几个大家实际用这些命令时几乎都会遇到的疑问和坑。很多问题不亲自踩一遍,看文档是看不出来的。
5.1 为什么free看到的内存和标称不符
新买一台32GB内存的机器,装完系统运行 free -h,发现total只有31Gi,容易觉得自己被坑了。其实不是。Gi是二进制单位,内存条容量标称通常用十进制GB,而操作系统用二进制GiB显示,32GB标称换算后大约是29.8GiB,加上内核保留的一部分,显示31Gi或30Gi都很正常。
解决办法:不用纠结这个差异,重点看 available 数值和实际应用的内存压力。如果内存损坏或者一个内存条没被识别,free -h 的total会明显小于预期。不放心可以用 dmidecode -t memory 看看是否每个插槽的内存条都被识别到。
5.2 为什么df和du统计的大小不一致
删除文件后,df -h 显示的空间没有释放,但用 du 统计目录时发现实际占用不大,这是很长见的疑问。原因是:某个进程仍然持有被删除文件的文件句柄,文件虽然在目录中看不到,但磁盘空间要等进程关闭该文件或重启进程后才释放。
排查方式:
bash复制lsof | grep deleted
找到持有已删除文件句柄的进程,重启或让其重新打开日志文件,空间通常就回来了。这个问题在日志文件上尤其常见,比如 rm -f /var/log/nginx/access.log 之后,nginx如果不重新打开日志文件,磁盘空间就一直不释放。
5.3 为什么dmidecode提示权限不足
dmidecode 直接执行通常会提示类似 /dev/mem: Permission denied。这是正常的,因为读取DMI表需要访问物理内存映射的设备文件,必须用root权限。
bash复制sudo dmidecode -t system
另外部分容器和云服务器出于安全考虑禁用了DMI访问,即使加了sudo也可能拿不到信息。遇到这种情况不要折腾,换用云控制台或虚拟化管理平台查看就可以了。
5.4 lscpu显示的CPU数量如何理解
看到逻辑CPU数很多,不代表物理核心数就多。开启超线程后,逻辑CPU数会是物理核心数的两倍。对大多数应用来说,超线程能提升吞吐,但高并发计算密集型任务未必有线性提升。
把三者的关系记牢:逻辑CPU数 = Socket数 × 每Socket物理核心数 × 每核心线程数。判断物理核心资源是否充足,优先看Socket和Core的数值;判断系统能并发跑多少线程,看CPU(s)总数。
5.5 一些容易忽略的小细节
- 中文系统或中文locale下,某些命令输出可能包含中文,比如
lsblk、free通常不受影响,但df -h在个别发行版会本地化字段名。用LC_ALL=C df -h可以强制英文输出,脚本里解析更稳定。 - 解压Windows传来的zip文件出现中文文件名乱码,不是因为信息查看命令问题,而是编码不匹配。用
unzip -O CP936指定编码解压,或者安装p7zip后用 7z 解压。 - 某些信息命令依赖额外的软件包,比如
sensors需要lm_sensors,smartctl需要smartmontools,lshw需要lshw。在最小化安装的Linux上,默认可能都没有。用发行版包管理器安装后就能正常使用。 - 在写自动化脚本时,尽量避免解析
ls的输出,而优先用lsblk -J(JSON格式)、free -b(固定字节单位)、lscpu -J(JSON格式)这类机器可读的输出。我们上面用的lsblk -o指定列,也是为了避免不同系统列顺序不一致的问题。
根据个人经验,查看系统和硬件信息这件事,最重要的不是背下所有参数,而是建立一套“排查流程”:先看系统,再看CPU,然后内存、磁盘、网络,最后根据异常追日志。熟练之后,从敲下第一条命令到定位问题,整个过程会非常顺畅。希望这套命令组合和方法能帮你在实际工作中少走弯路。
