当传递一个应用程序选项时,我正在编写一个类似于新取的-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
.` `/我的问题与这个问题有关,但它没有回答我的问题,因为我的raspberry pi不能运行dmidecode,(也没有/sys/devices/virtual/dmi/ ),也没有安装lshw。而且,/etc/hostname不是计算机的模型名,而是archlinux-arm和archlinux。uname -a或cat /proc/version在覆盆子皮上没有'Rapsberry Pi‘字符串。
是否有一种方法可以获得类似于新取的硬件名称,而无需使用也应该在大多数硬件上运行的任何依赖项?
发布于 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的助手函数,该函数对文件进行猫化并添加换行符):
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:
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:
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 Bootcodemodel是DTSpec中描述的标准设备树属性.
其他架构,如RISC,也使用设备树来描述硬件,但我没有任何RISC-V板来检查。
在我的TP链路路由器上没有/proc/devicetree、no /sys/固件/devicetree/base和no /sys/固件/fdt--这意味着它要么根本不附带设备树,要么是一些适当的Linux内核配置选项已被禁用,并且设备树没有公开到用户空间。但是,前者更有可能是/tmp/sysinfo,而不是:
~ $ cat /tmp/sysinfo/board_name
tl-wdr4300
~ $ cat /tmp/sysinfo/model
TP-Link TL-WDR3600 v1这些值是由ar71xx.sh脚本生成的,它很长,但是您可以看到在第1313行中分配了name:
*"TL-WDR3600/4300/4310")
name="tl-wdr4300"
;;基于TL-WDR4900 v2 (从/proc/cpuinfo获取的machine字段):
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,而是从firmware闪存分区读取的:
~ $ 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可以作为获取有关硬件的任何信息的最后手段。
发布于 2020-03-25 20:50:46
阅读新取的源代码清楚地说明了这一点。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和安卓智能手机,文件/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找到。
请注意,product_version可以只是一个换行符,所以它更好地剥离(剥离,剥离!(在Ruby中)读取文件并连接字符串后的尾换行符。
因此,将所有条件放在一起并检查现有文件,并读取文件以获得模型信息可能是有意义的。
https://unix.stackexchange.com/questions/574808
复制相似问题