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アームそしてアーキテクチャ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ルーターという2つのシナリオを説明します。

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 は最後の手段として取得できます。どのハードウェアに関する情報です。

関連情報