首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在linux中获取硬件模型名。

在linux中获取硬件模型名。
EN

Unix & Linux用户
提问于 2020-03-25 06:34:28
回答 2查看 4.2K关注 0票数 5

当传递一个应用程序选项时,我正在编写一个类似于新取-w。它显示了一些系统信息,如内存、交换、cpu、电池使用、主机名、本地ip、内核版本等。

我想知道如何得到“主机”,就像在Neofetch一样。例如:

代码语言:javascript
复制
                   -`                    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 
 `++:.                           `-/+/
 .`                                 `/                           

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

代码语言:javascript
复制
                   -`                    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 
 .`                                 `/

我的问题与这个问题有关,但它没有回答我的问题,因为我的raspberry pi不能运行dmidecode,(也没有/sys/devices/virtual/dmi/ ),也没有安装lshw。而且,/etc/hostname不是计算机的模型名,而是archlinux-arm和archlinux。uname -acat /proc/version在覆盆子皮上没有'Rapsberry Pi‘字符串。

是否有一种方法可以获得类似于新取的硬件名称,而无需使用也应该在大多数硬件上运行的任何依赖项?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-03-25 23:22:26

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

Raspberry有一个ARM处理器和ARM设备,通常使用设备树来描述硬件,而维基百科文章甚至提到这是2012年以来的必修课。设备-树结构公开给用户空间,可以通过cating /proc/device-tree/model检索模型名,其中/proc/device-tree本身是一个指向/sys/firmware/devicetree/base的符号链接(请注意,在设备树文件的末尾没有换行符,因此我们创建了一个名为catn的助手函数,该函数对文件进行猫化并添加换行符):

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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叉子正在使用,那么模型也是写信给/proc/cpuinfo

代码语言:javascript
复制
pi@raspberrypi:~$ grep "^Model" /proc/cpuinfo
Model           : Raspberry Pi 3 Model B Rev 1.2

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

代码语言:javascript
复制
pi@raspberrypi:~$ strings /boot/start.elf  | grep 'Raspberry Pi '
Raspberry Pi %s Rev %s
Raspberry Pi Bootcode

modelDTSpec中描述的标准设备树属性.

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

在我的TP链路路由器上没有/proc/devicetree、no /sys/固件/devicetree/base和no /sys/固件/fdt--这意味着它要么根本不附带设备树,要么是一些适当的Linux内核配置选项已被禁用,并且设备树没有公开到用户空间。但是,前者更有可能是/tmp/sysinfo,而不是:

代码语言:javascript
复制
~ $ cat /tmp/sysinfo/board_name
tl-wdr4300
~ $ cat /tmp/sysinfo/model
TP-Link TL-WDR3600 v1

这些值是由ar71xx.sh脚本生成的,它很长,但是您可以看到在第1313行中分配了name

代码语言:javascript
复制
*"TL-WDR3600/4300/4310")
        name="tl-wdr4300"
    ;;

基于TL-WDR4900 v2 (从/proc/cpuinfo获取的machine字段):

代码语言:javascript
复制
machine=$(awk 'BEGIN{FS="[ \t]+:[ \t]"} /machine/ {print $2}' /proc/cpuinfo)

然后分配给AR71XX_BOARD_NAME,并在脚本结束时写入/tmp/sysinfo/board_name

此路由器上/proc/cpuinfo中machine字段的全部值为:

代码语言:javascript
复制
~ $ grep "^machine" /proc/cpuinfo
machine                 : TP-LINK TL-WDR3600/4300/4310

但是Neofetch并不是在寻找/tmp/sysinfo/board_name,而是在寻找/tmp/sysinfo/model。它不是取自/proc/cpuinfo,而是从firmware闪存分区读取的:

代码语言:javascript
复制
~ $ 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行中指定:

代码语言:javascript
复制
"360000"*)
    model="TP-Link TL-WDR3600"
    ;;

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

票数 3
EN

Unix & Linux用户

发布于 2020-03-25 20:50:46

阅读新取的源代码清楚地说明了这一点。Neofetch版本7.0.0的第1174行有一个条件检查:

代码语言:javascript
复制
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和安卓(7.0测试)

在我的Raspberry Pi 3型号B和安卓智能手机,文件/sys/firmware/devicetree/base/model有模型的信息。

VirtualBox

Debian在Virtualbox中运行,Neofetch将Virtualbox 1.2显示为主机,这可以由cat /sys/devices/virtual/dmi/id/product_name /sys/devices/virtual/dmi/id/product_version找到。

请注意,product_version可以只是一个换行符,所以它更好地剥离(剥离,剥离!(在Ruby中)读取文件并连接字符串后的尾换行符。

因此,将所有条件放在一起并检查现有文件,并读取文件以获得模型信息可能是有意义的。

票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/574808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档