从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
一些值得注意的文件包括cpuinfo、meminfo和 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 Order、Thread(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
...
我们在上面看到该文件包含许多细节,如Buffers、SwapCached内存等。要只找到我们需要的行,我们可以使用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。每个类型名称都有一个分配的类型编号。