linux lshw命令

提示:lshw命令用于显示系统中所有硬件组件的详细信息,包括CPU、内存、磁盘、网络设备、总线等,是硬件诊断和系统配置的重要工具。

命令简介

lshw 是Linux系统中用于显示硬件配置信息的命令。它可以显示详细的硬件信息,包括处理器架构和速度、内存配置、固件版本、主板配置、磁盘驱动器、网络接口等。lshw从/proc目录和DMI(Desktop Management Interface)表中收集信息,提供完整的硬件清单。

命令语法

lshw [选项]

常用选项

选项 说明
-short-s 显示简短的硬件列表
-businfo-b 显示设备的总线信息
-class 类别-C 类别 只显示指定类别的硬件信息
-disable 测试 禁用指定的测试(如dmi, pci, cpu等)
-enable 测试 启用指定的测试
-quiet-q 不显示状态信息
-sanitize 清理输出(移除敏感信息如序列号)
-numeric-numeric 显示数字ID(如PCI IDs)
-json 以JSON格式输出
-html 以HTML格式输出
-xml 以XML格式输出
-version-V 显示版本信息
-help-h 显示帮助信息

硬件类别

类别 说明 示例设备
system 系统信息 主机名、产品名称、序列号
bus 总线信息 PCI总线、USB总线
memory 内存 物理内存、虚拟内存
processorcpu 处理器 CPU型号、核心数、频率
bridge 桥接设备 PCI桥、ISA桥
display 显示设备 显卡、集成显卡
network 网络设备 以太网卡、无线网卡
storage 存储控制器 SATA控制器、RAID控制器
disk 磁盘驱动器 硬盘、SSD
volume 逻辑卷 分区、LVM卷
multimedia 多媒体设备 声卡、视频采集卡
input 输入设备 键盘、鼠标、触摸板
printer 打印机 本地打印机、网络打印机
power 电源设备 UPS、电池
communication 通信设备 调制解调器、串口
generic 通用设备 未分类的设备

使用示例

示例1:基本使用

显示系统硬件信息的简要列表:

# 显示简要硬件信息(需要root权限)
sudo lshw -short

# 示例输出:
# H/W path       Device      Class       Description
# ===================================================
#                           system      Laptop
# /0                         bus         Motherboard
# /0/0                       memory      128KiB BIOS
# /0/1                       memory      16GiB System Memory
# /0/1/0                     memory      8GiB SODIMM DDR4 Synchronous 2667 MHz (0.4 ns)
# /0/1/1                     memory      8GiB SODIMM DDR4 Synchronous 2667 MHz (0.4 ns)
# /0/2                       processor   Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
# /0/100                     bridge      Ice Lake-LP Processor Host Bridge/DRAM Registers
# /0/100/2                   display     Iris Plus Graphics G7
# /0/100/4                   generic     Ice Lake-LP Processor Imaging Unit
# /0/100/12                  generic     Intel Corporation
# /0/100/14                  bus         Ice Lake-LP USB 3.1 xHCI Host Controller
# /0/100/14/0    usb1        bus         xHCI Host Controller
# /0/100/14/1    usb2        bus         xHCI Host Controller
# /0/100/14.2                bus         Ice Lake-LP Serial IO I2C Controller #0
# /0/100/15                  bus         Ice Lake-LP Serial IO I2C Controller #1
# /0/100/16                  communication Ice Lake-LP Management Engine Interface
# /0/100/17                  storage     Ice Lake-LP SATA Controller [AHCI mode]
# /0/100/1c                  bridge      Ice Lake-LP PCI Express Root Port #5
# /0/100/1c/0    wlp0s20f3   network     Wi-Fi 6 AX201
# /0/100/1d                  bridge      Ice Lake-LP PCI Express Root Port #9
# /0/100/1d/0    nvme0       storage     NVMe SSD Controller SM981/PM981/PM983
# /0/100/1f                  bridge      Ice Lake-LP LPC Controller
# /0/100/1f.3                multimedia  Ice Lake-LP Smart Sound Technology Audio Controller
# /0/100/1f.4                bus         Ice Lake-LP SMBus Controller
# /0/100/1f.5                bus         Ice Lake-LP SPI Controller
# /0/1           scsi0       storage     NVMe SSD Controller SM981/PM981/PM983
# /0/1/0.0.0     /dev/nvme0n1 disk       512GB NVMe SSD
# /0/1/0.0.0/1   /dev/nvme0n1p1 volume   511MiB Windows FAT volume
# /0/1/0.0.0/2   /dev/nvme0n1p2 volume   99MiB reserved partition
# /0/1/0.0.0/3   /dev/nvme0n1p3 volume   476GiB EXT4 volume
# /0/2           scsi1       storage     AHCI Controller
# /0/2/0.0.0     /dev/sda    disk        1TB HDD
# /0/2/0.0.0/1   /dev/sda1   volume      1TB EXT4 volume

示例2:显示特定类别的硬件信息

只显示指定类别的硬件信息:

# 只显示CPU信息
sudo lshw -class processor

# 只显示内存信息
sudo lshw -class memory

# 只显示网络设备信息
sudo lshw -class network

# 只显示存储设备信息
sudo lshw -class storage

# 只显示显示设备信息
sudo lshw -class display

# 显示多个类别的信息
sudo lshw -class processor -class memory

# 使用短选项
sudo lshw -C processor
sudo lshw -C memory
sudo lshw -C network

示例3:显示总线信息

显示硬件设备的总线信息:

# 显示总线信息
sudo lshw -businfo

# 示例输出:
# Bus info          Device      Class       Description
# =====================================================
#                               system     Laptop
#                               bus        Motherboard
#                               memory     128KiB BIOS
#                               memory     16GiB System Memory
#                               processor  Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
#                               bridge     Ice Lake-LP Processor Host Bridge/DRAM Registers
#                               display    Iris Plus Graphics G7
#                               generic    Ice Lake-LP Processor Imaging Unit
#                               generic    Intel Corporation
# usb@1             usb1        bus        xHCI Host Controller
# usb@2             usb2        bus        xHCI Host Controller
#                               bus        Ice Lake-LP Serial IO I2C Controller #0
#                               bus        Ice Lake-LP Serial IO I2C Controller #1
#                               communication Ice Lake-LP Management Engine Interface
#                               storage    Ice Lake-LP SATA Controller [AHCI mode]
# pci@0000:00:1c.0  wlp0s20f3   network    Wi-Fi 6 AX201
# pci@0000:00:1d.0  nvme0       storage    NVMe SSD Controller SM981/PM981/PM983
#                               bridge     Ice Lake-LP LPC Controller
#                               multimedia Ice Lake-LP Smart Sound Technology Audio Controller
#                               bus        Ice Lake-LP SMBus Controller
#                               bus        Ice Lake-LP SPI Controller
# scsi@0:0.0.0      /dev/nvme0n1 disk      512GB NVMe SSD
# scsi@1:0.0.0      /dev/sda    disk       1TB HDD

示例4:显示完整硬件信息

显示完整的硬件详细信息:

# 显示完整的硬件信息(非常详细)
sudo lshw

# 显示特定设备的详细信息
sudo lshw -c network -sanitize

# 示例输出(网络设备部分):
#   *-network
#        description: Wireless interface
#        product: Wi-Fi 6 AX201
#        vendor: Intel Corporation
#        physical id: 0
#        bus info: pci@0000:00:1c.0
#        logical name: wlp0s20f3
#        version: 1a
#        serial: [REMOVED]
#        width: 64 bits
#        clock: 33MHz
#        capabilities: pm msi pciexpress msix bus_master cap_list ethernet physical wireless
#        configuration: broadcast=yes driver=iwlwifi driverversion=5.15.0-46-generic firmware=63.c04f3485.0 QuZ-a0-jf-b0-63.ucode ip=192.168.1.100 latency=0 link=yes multicast=yes wireless=IEEE 802.11
#        resources: irq:16 memory:a421c000-a421ffff

示例5:以不同格式输出

以JSON、HTML或XML格式输出硬件信息:

# 以JSON格式输出
sudo lshw -json

# 以HTML格式输出(可保存到文件)
sudo lshw -html > hardware_info.html

# 以XML格式输出
sudo lshw -xml > hardware_info.xml

# 清理输出中的敏感信息
sudo lshw -sanitize

# 显示数字ID
sudo lshw -numeric

# 组合多个选项
sudo lshw -short -sanitize
sudo lshw -json -sanitize

示例6:在脚本中使用lshw

在脚本中提取特定的硬件信息:

#!/bin/bash

# 脚本1:系统硬件概要
echo "=== 系统硬件概要 ==="
echo "生成时间: $(date)"
echo ""

# 获取系统信息
echo "1. 系统信息:"
sudo lshw -c system -short 2>/dev/null | head -5

# 获取CPU信息
echo ""
echo "2. CPU信息:"
sudo lshw -c processor 2>/dev/null | grep -E "product|vendor|clock|cores" | head -10

# 获取内存信息
echo ""
echo "3. 内存信息:"
sudo lshw -c memory 2>/dev/null | grep -E "size|description" | grep -v "BIOS"

# 获取磁盘信息
echo ""
echo "4. 磁盘信息:"
sudo lshw -c disk 2>/dev/null | grep -E "product|logical name|size"

# 获取网络设备信息
echo ""
echo "5. 网络设备:"
sudo lshw -c network 2>/dev/null | grep -E "description|logical name|product"

# 脚本2:检查硬件兼容性
check_hardware_compatibility() {
    echo "硬件兼容性检查:"
    echo "================"

    # 检查CPU虚拟化支持
    if sudo lshw -c processor 2>/dev/null | grep -q "vmx\|svm"; then
        echo "CPU虚拟化: 支持"
    else
        echo "CPU虚拟化: 不支持"
    fi

    # 检查内存大小
    MEMORY_SIZE=$(sudo lshw -c memory 2>/dev/null | grep -i "size" | grep -i "GiB" | head -1 | grep -o "[0-9]*")
    if [ -n "$MEMORY_SIZE" ] && [ "$MEMORY_SIZE" -ge 8 ]; then
        echo "内存大小: ${MEMORY_SIZE}GB ✅ 满足要求"
    else
        echo "内存大小: ${MEMORY_SIZE}GB ⚠️ 建议至少8GB"
    fi

    # 检查磁盘类型
    if sudo lshw -c disk 2>/dev/null | grep -qi "ssd\|nvme"; then
        echo "磁盘类型: SSD ✅"
    else
        echo "磁盘类型: HDD ⚠️ 建议使用SSD提升性能"
    fi
}

check_hardware_compatibility

# 脚本3:生成硬件清单
echo ""
echo "生成硬件清单..."

HARDWARE_REPORT="/tmp/hardware_report_$(date +%Y%m%d_%H%M%S).txt"

cat > $HARDWARE_REPORT << EOF
硬件清单报告
============
生成时间: $(date)

系统信息:
$(sudo lshw -c system 2>/dev/null | grep -E "product|vendor|serial" | head -5)

CPU信息:
$(sudo lshw -c processor 2>/dev/null | grep -E "product|vendor|clock|cores" | head -10)

内存信息:
$(sudo lshw -c memory 2>/dev/null | grep -E "size|description" | grep -v "BIOS" | head -10)

磁盘信息:
$(sudo lshw -c disk 2>/dev/null | grep -E "product|logical name|size" | head -10)

网络设备:
$(sudo lshw -c network 2>/dev/null | grep -E "description|logical name|product" | head -10)

显示设备:
$(sudo lshw -c display 2>/dev/null | grep -E "product|vendor|description" | head -5)
EOF

echo "硬件清单已保存到: $HARDWARE_REPORT"

示例7:硬件故障排查

# 检查未识别的硬件
echo "未识别的硬件设备:"
sudo lshw 2>/dev/null | grep -B2 -A2 "UNCLAIMED"

# 检查硬件冲突
echo "硬件资源冲突检查:"
sudo lshw -businfo 2>/dev/null | grep -E "pci@|usb@"

# 检查中断冲突
cat /proc/interrupts | sort -n

# 检查DMA通道
cat /proc/dma

# 检查I/O端口
cat /proc/ioports | head -20

示例8:与其他命令结合使用

# 结合grep过滤特定信息
sudo lshw | grep -A5 -B5 "network"
sudo lshw | grep -i "size" | grep -i "memory"

# 结合jq处理JSON输出
sudo lshw -json 2>/dev/null | jq '.children[].children[] | select(.class=="processor")'

# 结合awk提取特定字段
sudo lshw -short 2>/dev/null | awk '$3=="memory" {print $4}'

# 结合sort和uniq统计设备数量
sudo lshw -short 2>/dev/null | awk '{print $3}' | sort | uniq -c | sort -nr

# 结合tee保存输出
sudo lshw -short | tee hardware_summary.txt

# 结合less分页查看
sudo lshw | less

# 结合wc统计信息量
sudo lshw | wc -l

lshw输出字段详解

字段 说明 示例
description 设备描述 Wireless interface
product 产品名称/型号 Wi-Fi 6 AX201
vendor 厂商名称 Intel Corporation
physical id 物理ID 0
bus info 总线信息 pci@0000:00:1c.0
logical name 逻辑名称(设备文件) wlp0s20f3
version 版本号 1a
serial 序列号 00:11:22:33:44:55
size 大小/容量 16GiB
capacity 容量 512GB
width 总线宽度 64 bits
clock 时钟频率 33MHz
capabilities 设备能力/特性 pm msi pciexpress msix bus_master cap_list ethernet physical wireless
configuration 配置信息 broadcast=yes driver=iwlwifi driverversion=5.15.0-46-generic
resources 资源分配 irq:16 memory:a421c000-a421ffff

在脚本中使用lshw的高级示例

#!/bin/bash

# 脚本1:硬件变化检测
PREV_HW_HASH="/tmp/lshw_hash.prev"
CURRENT_HW_HASH="/tmp/lshw_hash.current"

# 生成当前硬件哈希
sudo lshw -short -sanitize 2>/dev/null | md5sum > $CURRENT_HW_HASH

if [ -f "$PREV_HW_HASH" ]; then
    if cmp -s "$PREV_HW_HASH" "$CURRENT_HW_HASH"; then
        echo "硬件配置未发生变化"
    else
        echo "⚠️ 硬件配置已发生变化!"
        echo "变化摘要:"
        # 这里可以添加更详细的比较逻辑
        diff -u "$PREV_HW_HASH" "$CURRENT_HW_HASH" | head -20
    fi
else
    echo "首次运行,已保存硬件配置快照"
fi

# 保存当前哈希作为下一次比较的基准
cp "$CURRENT_HW_HASH" "$PREV_HW_HASH"

# 脚本2:硬件兼容性检查(针对特定应用)
echo ""
echo "Docker兼容性检查:"
echo "================="

# 检查CPU虚拟化扩展
CPU_VIRT=$(sudo lshw -c processor 2>/dev/null | grep -o "vmx\|svm" | head -1)
if [ -n "$CPU_VIRT" ]; then
    echo "✅ CPU支持硬件虚拟化 ($CPU_VIRT)"
else
    echo "❌ CPU不支持硬件虚拟化"
fi

# 检查内存大小(Docker建议至少2GB)
TOTAL_MEM=$(sudo lshw -c memory 2>/dev/null | grep -i "size:" | grep -i "GiB" | head -1 | grep -o "[0-9]*")
if [ -n "$TOTAL_MEM" ] && [ "$TOTAL_MEM" -ge 2 ]; then
    echo "✅ 内存大小: ${TOTAL_MEM}GB"
else
    echo "⚠️ 内存可能不足: ${TOTAL_MEM}GB (建议至少2GB)"
fi

# 检查存储空间(Docker建议至少20GB)
TOTAL_DISK=$(sudo lshw -c disk 2>/dev/null | grep -i "size:" | head -1 | grep -o "[0-9]*")
if [ -n "$TOTAL_DISK" ] && [ "$TOTAL_DISK" -ge 20 ]; then
    echo "✅ 磁盘空间充足: ${TOTAL_DISK}GB"
else
    echo "⚠️ 磁盘空间可能不足: ${TOTAL_DISK}GB (建议至少20GB)"
fi

# 脚本3:生成服务器资产清单
echo ""
echo "生成服务器资产清单..."

ASSET_REPORT="/tmp/server_assets_$(date +%Y%m%d_%H%M%S).csv"

# 创建CSV文件头
echo "Category,Type,Manufacturer,Model,Serial,Size,Location" > $ASSET_REPORT

# 提取系统信息
SYSTEM_INFO=$(sudo lshw -c system 2>/dev/null)
SYSTEM_MANUFACTURER=$(echo "$SYSTEM_INFO" | grep "vendor" | head -1 | cut -d: -f2 | xargs)
SYSTEM_MODEL=$(echo "$SYSTEM_INFO" | grep "product" | head -1 | cut -d: -f2 | xargs)
SYSTEM_SERIAL=$(echo "$SYSTEM_INFO" | grep "serial" | head -1 | cut -d: -f2 | xargs)
echo "System,Server,$SYSTEM_MANUFACTURER,$SYSTEM_MODEL,$SYSTEM_SERIAL,N/A,Data Center A" >> $ASSET_REPORT

# 提取CPU信息
sudo lshw -c processor 2>/dev/null | while read -r line; do
    if echo "$line" | grep -q "product:"; then
        CPU_MODEL=$(echo "$line" | cut -d: -f2 | xargs)
        CPU_VENDOR=$(echo "$line" | grep "vendor" | cut -d: -f2 | xargs)
        echo "Processor,CPU,$CPU_VENDOR,$CPU_MODEL,N/A,N/A,Mainboard" >> $ASSET_REPORT
    fi
done

# 提取内存信息
sudo lshw -c memory 2>/dev/null | while read -r line; do
    if echo "$line" | grep -q "size:" && echo "$line" | grep -q "GiB"; then
        MEM_SIZE=$(echo "$line" | grep -o "size:[^ ]*" | cut -d: -f2)
        MEM_DESC=$(echo "$line" | grep "description:" | cut -d: -f2 | xargs)
        echo "Memory,DIMM,Unknown,$MEM_DESC,N/A,$MEM_SIZE,DIMM Slot" >> $ASSET_REPORT
    fi
done

# 提取磁盘信息
sudo lshw -c disk 2>/dev/null | while read -r line; do
    if echo "$line" | grep -q "product:"; then
        DISK_MODEL=$(echo "$line" | cut -d: -f2 | xargs)
        DISK_VENDOR=$(echo "$line" | grep "vendor" | cut -d: -f2 | xargs)
        DISK_SIZE=$(echo "$line" | grep "size:" | cut -d: -f2 | xargs)
        DISK_LOGICAL=$(echo "$line" | grep "logical name:" | cut -d: -f2 | xargs)
        echo "Storage,Disk,$DISK_VENDOR,$DISK_MODEL,N/A,$DISK_SIZE,$DISK_LOGICAL" >> $ASSET_REPORT
    fi
done

echo "资产清单已保存到: $ASSET_REPORT"

注意事项

  1. lshw命令通常需要root权限才能显示完整的硬件信息
  2. 某些硬件信息可能因内核版本、驱动状态或硬件本身而无法获取
  3. lshw的输出可能包含敏感信息(如序列号、MAC地址),在生产环境中使用-sanitize选项
  4. 不同Linux发行版的lshw版本可能略有差异,输出格式可能不同
  5. 虚拟化环境中的硬件信息可能与物理硬件不同
  6. lshw收集的信息来自多个源,可能存在信息不一致的情况
  7. 某些硬件可能需要特定的内核模块加载后才能被lshw识别
  8. 对于企业环境,建议定期运行lshw并保存硬件配置快照
  9. lshw不会显示实时硬件状态(如温度、风扇速度),需要其他工具

故障排查

# 1. lshw命令不存在
# 检查是否安装
which lshw
# 安装(如果需要)
# Ubuntu/Debian: sudo apt-get install lshw
# RHEL/CentOS: sudo yum install lshw

# 2. 权限不足
# 使用sudo运行
sudo lshw

# 或添加用户到sudoers(不推荐生产环境)
# sudo visudo
# 添加: username ALL=(ALL) NOPASSWD: /usr/bin/lshw

# 3. 信息不完整
# 检查DMI表访问权限
sudo dmidecode -t 1
# 如果dmidecode失败,检查BIOS设置中的DMI选项

# 检查内核消息
dmesg | grep -i "dmi\|acpi"

# 4. 特定硬件未显示
# 检查内核模块是否加载
lsmod | grep -i "相关的模块名"

# 加载可能需要的模块
sudo modprobe pci-stub
sudo modprobe usb-storage

# 5. 更新硬件数据库
# 某些发行版有硬件数据库
sudo update-pciids  # 更新PCI设备数据库
sudo update-usbids  # 更新USB设备数据库

# 6. 使用详细模式调试
sudo lshw -debug

# 7. 检查硬件是否被内核识别
cat /proc/cpuinfo
cat /proc/meminfo
lspci -vv
lsusb -v

# 8. 检查ACPI表
sudo acpidump
# 或安装acpica-tools后使用
sudo acpixtract -a

# 9. 比较不同硬件检测工具
sudo dmidecode
sudo lspci -vv
sudo lsusb -v
sudo lscpu
sudo lsblk
# 比较这些命令的输出

相关命令