Contents

从Linux命令行查找系统硬件信息

1. 简介

通常,我们需要获取有关运行系统的硬件的信息。Linux 提供了多种方法来从命令行访问有关硬件的不同类型的数据。

在本教程中,我们将了解获取 CPU、RAM、磁盘和外围设备规格的多种方法。

2. /proc伪文件系统

在 Linux 中,proc是一个挂载在*/proc*的伪文件系统。它包含有关内核参数的信息。该文件系统仅在系统运行时存在于内存中,并不持久保存在磁盘上。

在 /proc文件夹上运行ls 将为我们提供大量虚拟文件和目录:

$ ls /proc
1     buddyinfo  cpuinfo    execdomains  irq        kpagecgroup  meminfo  pagetypeinfo  stat         tty
13    bus        crypto     filesystems  kallsyms   kpagecount   misc     partitions    swaps        uptime
7     cgroups    devices    fs           kcore      kpageflags   modules  sched_debug   sys          version
8     cmdline    diskstats  interrupts   keys       loadavg      mounts   schedstat     sysvipc      vmallocinfo
9     config.gz  dma        iomem        key-users  locks        mtrr     self          thread-self  vmstat
acpi  consoles   driver     ioports      kmsg       mdstat       net      softirqs      timer_list   zoneinfo

一些值得注意的文件包括cpuinfomeminfo和 devices。这些文件包含有关系统硬件的信息,我们将在下面的部分中使用它们。

3. 处理器(CPU)

我们可以使用各种命令来获取 CPU 信息,例如:

  • 架构
  • 核心数
  • 时钟速度

有些涉及命令,而另一些则是内置的。

3.1. 使用uname

首先,**uname命令 为我们提供了有关 CPU 架构的基本信息。**通常,uname可用于获取有关操作系统、内核和处理器的各种详细信息。运行uname -a打印所有可用的详细信息:

$ uname -a
Linux dell 5.11.0-38-generic #42~20.04.1-Ubuntu SMP Tue Sep 28 20:41:07 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

为了得到我们需要的东西,我们可以使用*-p*标志,它代表“处理器”:

$ uname -p
x86_64

在这里,我们看到了 64 位 CPU 的输出。

3.2. 查询*/proc*

*我们可以读取/proc/cpuinfo*文件的内容来获取有关 CPU 的信息。**此方法列出了所有可用的 CPU 内核以及每个内核的详细信息:

$ cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 69
model name	: Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz
stepping	: 1
microcode	: 0x26
cpu MHz		: 800.000
cache size	: 3072 KB
physical id	: 0
siblings	: 4
core id		: 0
cpu cores	: 2
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts md_clear flush_l1d
vmx flags	: vnmi preemption_timer invvpid ept_x_only ept_ad ept_1gb flexpriority tsc_offset vtpr mtf vapic ept vpid unrestricted_guest ple
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds
bogomips	: 3392.19
clflush size	: 64
cache_alignment	: 64
address sizes	: 39 bits physical, 48 bits virtual
power management:
...

该系统具有 Intel i5 CPU,提供概述的功能。此外,我们还获得了有关其每个核心的信息。

3.3. 使用lscpu

**对于所有相关信息的简洁摘要,我们可以使用lscpu 命令。*它从sysfs 伪文件系统和/proc/cpuinfo*收集这些信息,并以更易读的格式组织这些信息:

$ lscpu
Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   39 bits physical, 48 bits virtual
CPU(s):                          4
On-line CPU(s) list:             0-3
Thread(s) per core:              2
Core(s) per socket:              2
Socket(s):                       1
NUMA node(s):                    1
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           69
Model name:                      Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz
Stepping:                        1
CPU MHz:                         2018.999
CPU max MHz:                     2700.0000
CPU min MHz:                     800.0000
BogoMIPS:                        3392.19
Virtualization:                  VT-x
...

我们看到有关 Architecture、  Byte OrderThread(s) per core等的信息。此外, 与*/proc/cpuinfo*的每个核心一节的格式相比, lscpu 会打印一个简短的摘要。 此外,我们可以使用grep 或其他文本处理命令来过滤输出并仅获取我们需要的内容:

$ lscpu | grep 'Model name'
Model name:                      Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz

还有一些标志可用于修改lscpu的输出。例如,  -e标志以表格格式打印输出。

4.主存储器(RAM)

有很多方法可以分析 Linux 上的内存使用情况,其中大多数方法还告诉我们系统可用的总内存。

4.1. 查询*/proc*

获取系统所看到的总可用内存的一种简单方法是读取/proc/meminfo*文件*的内容:

$ cat /proc/meminfo
MemTotal:        3929792 kB
MemFree:          662148 kB
MemAvailable:    1949468 kB
Buffers:          294628 kB
Cached:          1325680 kB
SwapCached:        93864 kB
Active:           798952 kB
...

我们在上面看到该文件包含许多细节,如BuffersSwapCached内存等。要只找到我们需要的行,我们可以使用grep

$ grep MemTotal /proc/meminfo
MemTotal:        3929792 kB

现在只 打印MemTotal行。

4.2. free使用

free 命令提供有关可用总内存和已用内存的数据。默认情况下,它以字节为单位打印输出。我们使用*-h*标志以人类可读的格式获取输出:

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          3.7Gi       1.9Gi       517Mi       282Mi       1.3Gi       1.3Gi
Swap:         2.0Gi       147Mi       1.9Gi

该系统有 3.7Gi 的 RAM,其中 1.9Gi 正在使用中。

4.3. 使用top

top 命令还可以方便地获取总内存,以及实时监控内存使用情况:

$ top
top - 07:31:46 up 43 min,  1 user,  load average: 0.25, 0.55, 0.66
Tasks: 206 total,   2 running, 204 sleeping,   0 stopped,   0 zombie
%Cpu(s):  8.7 us,  3.6 sy,  0.0 ni, 87.4 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   3837.7 total,    281.2 free,   1970.1 used,   1586.3 buff/cache
MiB Swap:   2048.0 total,   2037.2 free,     10.8 used.   1357.5 avail Mem
...

上面的输出是针对同一系统的,我们看到与free命令相似的总内存和已用内存。在这两种情况下,Swap 指的是从磁盘分配的交换内存,对于我们当前的目的可以忽略。 要打印一次输出然后退出,我们使用top和参数 -bn1-b标志代表批处理模式,而*-n1 *指示命令打印一批输出。

5. 二级存储(磁盘)

一个系统通常会连接一个或多个存储设备,这些设备包括硬盘、SSD 和 USB 存储设备。我们可以使用多种方法来列出这些设备及其分区。

5.1. 查询*/proc*

要获取有关磁盘及其分区的信息,我们可以读取/proc/partitions*文件*的内容:

$ cat /proc/partitions
major minor  #blocks  name
   8        0  117220824 sda
   8        1     524288 sda1
   8        2          1 sda2
   8        5  116694016 sda5
   8       16  976762584 sdb
   8       17       1024 sdb1
   8       18  976758784 sdb2

从上面的输出中,我们看到系统有两个连接的磁盘,sda和 sdb分别有三个和两个分区。

5.2. 使用lsblk

**运行lsblk 命令将以整齐的树形表示形式提供磁盘及其分区的列表。**该命令从sysfs和 udev db收集此信息。

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 111.8G  0 disk 
├─sda1   8:1    0   512M  0 part /boot/efi
├─sda2   8:2    0     1K  0 part 
└─sda5   8:5    0 111.3G  0 part /
sdb      8:16   0 931.5G  0 disk 
├─sdb1   8:17   0     1M  0 part 
└─sdb2   8:18   0 931.5G  0 part

输出类似于 /proc/partitions  ,但具有简洁的表格结构和人类可读的大小。

5.3. 使用hdparm

**我们还可以运行hdparm 命令来获取每个磁盘的详细信息。**它本质上提供了对与存储设备相关的内核接口的命令行访问:

$ sudo hdparm -i /dev/sda
/dev/sda:
 Model=SATA SSD, FwRev=0200Sf10, SerialNo=00000000000000000552
 Config={ Fixed }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0
 BuffType=unknown, BuffSize=unknown, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=234441648
 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
 AdvancedPM=yes: disabled (255) WriteCache=enabled
 Drive conforms to: Unspecified:  ATA/ATAPI-3,4,5,6,7
 * signifies the current active mode

输出告诉我们,  sda是一个 SATA SSD,具有给定的原始柱面扇区 (CHD) 指标等。

hdparm还可能导致文件系统发生不可逆转的变化,例如格式化,应谨慎使用。

6. PCI 设备

英特尔于 1992 年开发了用于将设备连接到主板的 PCI 标准。它代表外围组件互连。在这里,我们使用术语 PCI 设备来指代通过 PCI 总线直接连接到主板的声卡和网卡等设备。 lspci 命令打印有关连接的 PCI 设备的信息

$ lspci
00:00.0 Host bridge: Intel Corporation Haswell-ULT DRAM Controller (rev 0b)
00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 0b)
00:03.0 Audio device: Intel Corporation Haswell-ULT HD Audio Controller (rev 0b)
00:14.0 USB controller: Intel Corporation 8 Series USB xHCI HC (rev 04)
00:16.0 Communication controller: Intel Corporation 8 Series HECI #0 (rev 04)
00:1b.0 Audio device: Intel Corporation 8 Series HD Audio Controller (rev 04)
00:1c.0 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 1 (rev e4)
00:1c.2 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 3 (rev e4)
00:1c.4 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 5 (rev e4)
00:1d.0 USB controller: Intel Corporation 8 Series USB EHCI #1 (rev 04)
00:1f.0 ISA bridge: Intel Corporation 8 Series LPC Controller (rev 04)
00:1f.2 SATA controller: Intel Corporation 8 Series SATA Controller 1 [AHCI mode] (rev 04)
00:1f.3 SMBus: Intel Corporation 8 Series SMBus Controller (rev 04)
06:00.0 Network controller: Intel Corporation WiFi Link 5100
08:00.0 3D controller: NVIDIA Corporation GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M] (rev a1)

我们从上面的输出中看到了各种连接的设备,例如网络控制器、显卡、音频设备等。 有关每个设备的更详细输出,我们可以添加-v*标志*:

$ lspci -v
00:00.0 Host bridge: Intel Corporation Haswell-ULT DRAM Controller (rev 0b)
	Subsystem: Dell Haswell-ULT DRAM Controller
	Flags: bus master, fast devsel, latency 0
	Capabilities: <access denied>
	Kernel driver in use: hsw_uncore
00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 0b) (prog-if 00 [VGA controller])
	Subsystem: Dell Haswell-ULT Integrated Graphics Controller
	Flags: bus master, fast devsel, latency 0, IRQ 53
	Memory at f7400000 (64-bit, non-prefetchable) [size=4M]
	Memory at d0000000 (64-bit, prefetchable) [size=256M]
	I/O ports at f000 [size=64]
	Expansion ROM at 000c0000 [virtual] [disabled] [size=128K]
	Capabilities: <access denied>
	Kernel driver in use: i915
	Kernel modules: i915
...

在命令中包含 -v标志后,我们看到每个设备有多行输出,还包含一些设备的内存地址。此外,使用*-vv和 -vvv标志而不是-v*将使我们在输出中逐渐提高详细程度。

7. USB 设备

通用串行总线或 USB 是将外部设备连接到计算机的另一种标准,以外部端口的形式更容易访问。与 PCI 设备类似,lsusb 命令打印有关连接的 USB 设备的信息

$ lsusb
Bus 001 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Bus 001 Device 004: ID 0bda:5756 Realtek Semiconductor Corp. 
Bus 001 Device 007: ID 2e04:c026  
Bus 001 Device 006: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
Bus 001 Device 002: ID 8087:8000 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 003: ID 1c4f:0034 SiGma Micro Usb Mouse
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

在上面的输出中,我们看到了通常通过 USB 连接到系统的外部键盘和鼠标等设备。 -v标志也适用于 lsusb ,如果我们需要详细的 输出:

$ lsusb -v
Bus 001 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass       255 Vendor Specific Subclass
  bDeviceProtocol       255 Vendor Specific Protocol
  bMaxPacketSize0        64
  idVendor           0x0bda Realtek Semiconductor Corp.
  idProduct          0x0129 RTS5129 Card Reader Controller
  bcdDevice           39.60
  iManufacturer           1 
  iProduct                2 
  iSerial                 3 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
...

上面的输出显示了每个设备的非常详细的信息,而不仅仅是我们之前看到的设备名称。在这里,我们看到了我们的RTS5129 读卡器控制器的供应商 ( Realtek Semiconductor Corp. ) 。

当然,在连接和不连接特定设备的情况下比较lsusb命令的输出对于调试设备和端口非常有用。

8. 列出所有设备的命令

在前面的部分中,我们看到了列出不同类型硬件设备的不同方法。现在,我们将研究一些使用单个命令列出所有设备的方法。

8.1. 使用lshw

最后,**lshw 命令列出所有硬件设备。*-short*标志一起使用,它会打印一个简短的列表。否则,它会打印详细信息。超级用户权限确保信息完整准确:

$ sudo lshw -short
H/W path         Device     Class          Description
======================================================
                            system         Inspiron 3542 (0652)
/0                          bus            0926J6
/0/0                        memory         64KiB BIOS
/0/1                        memory         4GiB System memory
/0/1/0                      memory         4GiB SODIMM DDR3 Synchronous 1600 MHz (0.6 ns)
/0/6                        memory         3MiB L3 cache
/0/5                        memory         512KiB L2 cache
/0/4                        memory         128KiB L1 cache
/0/24                       processor      Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz
/0/100                      bridge         Haswell-ULT DRAM Controller
/0/100/2                    display        Haswell-ULT Integrated Graphics Controller
/0/100/3                    multimedia     Haswell-ULT HD Audio Controller
/0/100/14                   bus            8 Series USB xHCI HC
/0/100/14/0      usb2       bus            xHCI Host Controller
/0/100/14/0/1               input          Usb Mouse
/0/100/14/1      usb3       bus            xHCI Host Controller
/0/100/16                   communication  8 Series HECI #0
/0/100/1b                   multimedia     8 Series HD Audio Controller
/0/100/1c                   bridge         8 Series PCI Express Root Port 1
/0/100/1c.2                 bridge         8 Series PCI Express Root Port 3
/0/100/1c.2/0    wlp6s0     network        WiFi Link 5100
/0/100/1c.4                 bridge         8 Series PCI Express Root Port 5
/0/100/1c.4/0               display        GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M]
/0/100/1d                   bus            8 Series USB EHCI #1
/0/100/1d/1      usb1       bus            EHCI Host Controller
/0/100/1d/1/1               bus            USB hub
/0/100/1d/1/1/2             input          USB Keyboard
/0/100/1d/1/1/3             generic        Nokia 2.3
/0/100/1d/1/1/5             multimedia     Integrated_Webcam_HD
/0/100/1d/1/1/8             generic        USB2.0-CRW
/0/100/1f                   bridge         8 Series LPC Controller
/0/100/1f.2                 storage        8 Series SATA Controller 1 [AHCI mode]
/0/100/1f.3                 bus            8 Series SMBus Controller
/0/2                        system         PnP device PNP0c01
/0/3                        system         PnP device PNP0c02
/0/7                        system         PnP device PNP0b00
/0/8                        generic        PnP device INT3f0d
/0/9                        system         PnP device PNP0c02
/0/a                        input          PnP device PNP0303
/0/b                        system         PnP device PNP0c02
/0/c                        system         PnP device PNP0c02
/0/d             scsi0      storage        
/0/d/0.0.0       /dev/sda   disk           120GB SATA SSD
/0/d/0.0.0/1     /dev/sda1  volume         512MiB Windows FAT volume
/0/d/0.0.0/2     /dev/sda2  volume         111GiB Extended partition
/0/d/0.0.0/2/5   /dev/sda5  volume         111GiB EXT4 volume
/0/e             scsi1      storage        
/0/e/0.0.0       /dev/sdb   disk           1TB ST1000LM024 HN-M
/0/e/0.0.0/1     /dev/sdb1  volume         1023KiB EFI partition
/0/e/0.0.0/2     /dev/sdb2  volume         931GiB EXT4 volume
/1                          power          DELL 49VTP27

在上面的输出中,我们看到上述部分中的所有设备——CPU、RAM、磁盘和外围设备都组合在一个列表中。

8.2. 使用dmidecode

获得类似输出的另一个选项是**dmidecode 命令,它列出了 DMI 接口看到的所有硬件。**DMI 代表桌面管理界面。计算机存储一个低级 DMI 表,其中包含有关硬件的信息。dmidecode命令以简洁的格式转储此 DMI 表的内容:

$ sudo dmidecode | head -n 20
# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 2.8 present.
45 structures occupying 2092 bytes.
Table at 0x000EC720.
Handle 0xDA00, DMI type 218, 251 bytes
OEM-specific Type
	Header and Data:
		DA FB 00 DA B2 00 0D 5F 0F 37 40 7D 00 00 00 00
		00 7E 00 01 00 00 00 75 01 01 80 01 00 76 01 02
		80 01 00 2D 01 03 80 01 00 2E 01 04 80 00 00 4F
		02 05 80 01 00 50 02 06 80 00 00 E2 01 02 00 00
...

从上面的输出中,我们看到dmidecode命令包含的信息不是很可读,例如标头。

dmidecode的输出 非常冗长,最好在调试时使用。要获取特定类型设备的输出,我们可以使用*-t*标志,后跟类型号或类型名称:

$ sudo dmidecode -t 22
# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 2.8 present.
Handle 0x0015, DMI type 22, 26 bytes
Portable Battery
	Location: Sys. Battery Bay
	Manufacturer: LGC-LGC3.0         
	Serial Number: 14057        
	Name: DELL 49VTP27
	Chemistry: Lithium Ion
	Design Capacity: 44000 mWh
	Design Voltage: 11100 mV
	SBDS Version: 1.0                
	Maximum Error: 2%
	SBDS Manufacture Date: 2018-06-29
	OEM-specific Information: 0x00000001

上面的示例显示了“便携式电池”的输出,即类型编号 22。每个类型名称都有一个分配的类型编号。