获取linux中的硬件型号名称

获取linux中的硬件型号名称

我正在写一个应用效果就像新取当一个-w选项被传递时。它显示了一些系统信息,如内存、交换、CPU、电池使用情况、主机名、本地 IP、内核版本等。

我想知道如何像 Neofetch 中那样获得“主机”。例如:

                   -`                    sourav@archlinux-arm 
                  .o+`                   -------------------- 
                 `ooo/                   OS: Arch Linux armv7l 
                `+oooo:                  Host: Raspberry Pi 3 Model B Rev 1.2 
               `+oooooo:                 Kernel: 4.19.108-1-ARCH 
               -+oooooo+:                Uptime: 10 mins 
             `/:-:++oooo+:               Packages: 804 (pacman) 
            `/++++/+++++++:              Shell: bash 5.0.16 
           `/++++++++++++++:             Resolution: 1366x768 
          `/+++ooooooooooooo/`           DE: Xfce 
         ./ooosssso++osssssso+`          WM: Xfwm4 
        .oossssso-````/ossssss+`         WM Theme: XFCE_Colour_Lite_Pink 
       -osssssso.      :ssssssso.        Theme: XFCE_Colour_Lite_Pink [GTK2], X 
      :osssssss/        osssso+++.       Icons: Papirus [GTK2], Tela-orange [GT 
     /ossssssss/        +ssssooo/-       Terminal: tilix 
   `/ossssso+/:-        -:/+osssso+-     CPU: BCM2835 (4) @ 1.350GHz 
  `+sso+:-`                 `.-/+oso:    Memory: 333MiB / 901MiB 
 `++:.                           `-/+/
 .`                                 `/                           

我得到这样的信息。在我的笔记本电脑上:

                   -`                    sourav@archlinux 
                  .o+`                   ---------------- 
                 `ooo/                   OS: Arch Linux x86_64 
                `+oooo:                  Host: Inspiron 5567 
               `+oooooo:                 Kernel: 5.5.10-arch1-1 
               -+oooooo+:                Uptime: 3 hours 
             `/:-:++oooo+:               Packages: 1163 (pacman) 
            `/++++/+++++++:              Shell: bash 5.0.16 
           `/++++++++++++++:             Resolution: 1920x1080 
          `/+++ooooooooooooo/`           DE: Xfce 
         ./ooosssso++osssssso+`          WM: Xfwm4 
        .oossssso-````/ossssss+`         WM Theme: XFCE_Colour_Lite_Ruby 
       -osssssso.      :ssssssso.        Theme: XFCE_Colour_Lite_Purple [GTK2 
      :osssssss/        osssso+++.       Icons: Papirus [GTK2/3] 
     /ossssssss/        +ssssooo/-       Terminal: tilix 
   `/ossssso+/:-        -:/+osssso+-     CPU: Intel i3-6006U (4) @ 2.000GHz 
  `+sso+:-`                 `.-/+oso:    GPU: Intel Skylake GT2 [HD Graphics  
 `++:.                           `-/+/   Memory: 2814MiB / 3755MiB 
 .`                                 `/

我的问题与这个问题,但它没有回答我的问题,因为我的树莓派无法运行dmidecode,(/sys/devices/virtual/dmi/也没有),没有lshw安装。另外,它们/etc/hostname不是计算机的型号名称,而是只是archlinux-arm架构Linux。或没有uname -a'cat /proc/version树莓派' 树莓派上的字符串。

有没有一种方法可以在不使用任何依赖项的情况下获取像 neofetch 这样的硬件名称,并且该依赖项也应该在大多数硬件上运行?

答案1

阅读源码新取澄清了混乱。 Neofetch 版本 7.0.0 的第 1174 行有一个条件检查:

if [[ -d /system/app/ && -d /system/priv-app ]]; then
    model="$(getprop ro.product.brand) $(getprop ro.product.model)"

elif [[ -f /sys/devices/virtual/dmi/id/product_name ||
    -f /sys/devices/virtual/dmi/id/product_version ]]; then
    model=$(< /sys/devices/virtual/dmi/id/product_name)
    model+=" $(< /sys/devices/virtual/dmi/id/product_version)"

elif [[ -f /sys/firmware/devicetree/base/model ]]; then
    model=$(< /sys/firmware/devicetree/base/model)

elif [[ -f /tmp/sysinfo/model ]]; then
    model=$(< /tmp/sysinfo/model)
fi

它实际上检查各种路径,而不是单个路径来获取详细信息。因此,这并不是一个适用于每个 GNU/Linux 发行版的硬核检查。例如,第一个 if 条件检查可在 Android 上找到的特定路径。

我已经在各种发行版和硬件上测试了这些文件:

个人电脑和笔记本电脑

对于我的所有系统,/sys/devices/virtual/dmi/id/product_name都有型号信息。

Raspberry Pi 3 B 型和 Android(7.0 测试)

在我的 Raspberry Pi 3 Model B 和 Android 智能手机中,该文件/sys/firmware/devicetree/base/model包含型号信息。

虚拟盒子

Debian 在 Virtualbox 中运行,Neofetch 显示Virtualbox 1.2为主机,可以通过cat /sys/devices/virtual/dmi/id/product_name /sys/devices/virtual/dmi/id/product_version.

请注意,产品版本可以只是一个换行符,因此最好在读取文件并连接字符串后去掉(strip,strip!在 Ruby 中)尾随的换行符。

因此,放置所有条件并检查现有文件,然后读取文件以获取模型信息可能是有意义的。

答案2

没有一种可移植、可靠、通用的方法来检索 Linux 中的硬件型号名称。让我描述 2 种不同的情况:安装了 Raspbian 的基于 ARM 的 Raspberry Pi 和安装了 OpenWRT 的基于 MIPS 的 TP-LINK 路由器。

Raspberry Pi具有ARM CPU和常用的ARM设备 设备树描述硬件和 维基百科文章甚至提到它是自 2012 年起强制执行。设备树结构暴露给用户空间,可用于通过cating 检索模型名称/proc/device-tree/model,其中/proc/device-tree本身是一个符号链接/sys/firmware/devicetree/base(请注意,设备树文件末尾没有换行符,因此我们创建一个名为的辅助函数catn文件并添加换行符):

pi@raspberrypi:~$ catn () { cat $1 && echo; }
pi@raspberrypi:~$ catn /proc/device-tree/model
Raspberry Pi 3 Model B Rev 1.2
pi@raspberrypi:~$ catn /sys/firmware/devicetree/base/model
Raspberry Pi 3 Model B Rev 1.2

或者通过使用/sys/firmware/fdtdtc 手动转储扁平化设备树 blob:

pi@raspberrypi:~$ sudo dtc /sys/firmware/fdt 2>/dev/null | grep model
    compatible = "raspberrypi,3-model-b\0brcm,bcm2837";
    model = "Raspberry Pi 3 Model B Rev 1.2";

如果正在使用官方 Raspberry Pi Linux 分支,则模型也是如此 写入/proc/cpuinfo

pi@raspberrypi:~$ grep "^Model" /proc/cpuinfo
Model           : Raspberry Pi 3 Model B Rev 1.2

另请注意,主板的全名 -Raspberry Pi 3 Model B Rev 1.2由低级固件构建,您不会在 Linux 内核代码中的任何地方找到这样的完整字符串:

pi@raspberrypi:~$ strings /boot/start.elf  | grep 'Raspberry Pi '
Raspberry Pi %s Rev %s
Raspberry Pi Bootcode

model是标准设备树属性中描述的 DTSpec

其他架构(例如 RISC-V)也使用设备树来描述硬件,但我没有任何 RISC-V 板可以检查。

我的 TP-LINK 路由器上没有 /proc/device-tree、没有 /sys/firmware/devicetree/base 和 /sys/firmware/fdt - 这意味着它要么根本不带有 device-tree,要么一些适当的 Linux 内核配置选项已被禁用,并且设备树未暴露给用户空间。然而,前者更有可能,因为有 /tmp/sysinfo 代替:

~ $ cat /tmp/sysinfo/board_name
tl-wdr4300
~ $ cat /tmp/sysinfo/model
TP-Link TL-WDR3600 v1

这些值由ar71xx.sh脚本 这是相当长的,但你可以看到它name是在第 1313 行分配的:

*"TL-WDR3600/4300/4310")
        name="tl-wdr4300"
    ;;

基于TL-WDR4900 v2此依次machine从 /proc/cpuinfo 的字段中获取:

machine=$(awk 'BEGIN{FS="[ \t]+:[ \t]"} /machine/ {print $2}' /proc/cpuinfo)

然后在脚本末尾分配AR71XX_BOARD_NAME并写入 。/tmp/sysinfo/board_name

该路由器上 /proc/cpuinfo 中字段的完整值为machine

~ $ grep "^machine" /proc/cpuinfo
machine                 : TP-LINK TL-WDR3600/4300/4310

但 Neofetch 并不是在寻找 /tmp/sysinfo/board_name,而是在寻找 /tmp/sysinfo/model。它不是从 /proc/cpuinfo 获取,而是从firmwareflash 分区读取:

~ $ cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00020000 00010000 "u-boot"
mtd1: 0010c5a4 00010000 "kernel"
mtd2: 006c3a5c 00010000 "rootfs"
mtd3: 00490000 00010000 "rootfs_data"
mtd4: 00010000 00010000 "art"
mtd5: 007d0000 00010000 "firmware"
~ $ dd if=/dev/mtdblock5 bs=4 count=1 skip=16 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'  && echo
36000001

模型在第 321 行指定:

"360000"*)
    model="TP-Link TL-WDR3600"
    ;;

当然,很难想象像 Neofetch 这样的通用程序会对每个固件、其闪存布局等有如此多的了解。但是,我可以想象一个基于 MIPS 的实现,它不支持设备树,也不会提供任何/tmp/sysinfo 和其他任何地方都有有用的硬件型号信息,在这种情况下 /proc/cpuinfo 可以作为获取的最后手段任何有关硬件的信息。

相关内容