我正在写一个应用效果就像新取当一个-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 年起强制执行。设备树结构暴露给用户空间,可用于通过cat
ing 检索模型名称/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/fdt
dtc 手动转储扁平化设备树 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 获取,而是从firmware
flash 分区读取:
~ $ 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 可以作为获取的最后手段任何有关硬件的信息。