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컴퓨터의 모델명이 아니라 단순히아치리눅스암그리고아키텍처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에서 찾을 수 있는 특정 경로를 확인합니다.

다양한 배포판과 하드웨어에서 이 파일을 테스트했습니다.

PC 및 노트북

내 모든 시스템에는 /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.

참고하시기 바랍니다,제품 버전단지 개행 문자일 수도 있으므로 파일을 읽고 문자열을 연결한 후 후행 개행 문자를 제거(Ruby에서는 제거, 제거!)하는 것이 좋습니다.

따라서 모든 조건을 넣고 기존 파일을 확인한 후 파일을 읽어 모델 정보를 얻는 것이 합리적일 수 있습니다.

답변2

Linux에서는 하드웨어 모델 이름을 검색하는 이식 가능하고 안정적이며 보편적인 방법이 없습니다. 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/basecatn고양이파일을 만들고 개행을 추가하세요):

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 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가 없습니다. 즉, 장치 트리가 전혀 제공되지 않거나 일부 적절한 Linux 커널 구성 옵션이 비활성화되고 장치 트리가 사용자 공간에 노출되지 않습니다. 그러나 대신 /tmp/sysinfo가 있으므로 전자가 더 가능성이 높습니다.

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

이 값은 다음과 같이 제공됩니다.ar71xx.sh 스크립트 꽤 길지만 name1313행에 할당된 것을 볼 수 있습니다.

*"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플래시 파티션에서 읽습니다.

~ $ 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"
    ;;

물론 네오페치와 같은 범용 프로그램이 각 펌웨어, 플래시 메모리 레이아웃 등에 대해 그렇게 많이 알고 있을 것이라고는 상상하기 어렵습니다. 그러나 장치 트리를 지원하지 않거나 /tmp/sysinfo 및 다른 곳에서 유용한 하드웨어 모델 정보를 제공하지 않는 MIPS 기반 구현을 상상할 수 있습니다. 이 경우 /proc/cpuinfo는 최후의 수단으로 얻을 수 있습니다.어느하드웨어에 대한 정보입니다.

관련 정보