root権限なしでdmidecode情報を取得するには?

root権限なしでdmidecode情報を取得するには?

私はCentOSシステムでさまざまなシステム情報を表示するプログラムを書いています。たとえば、プロセッサの種類と速度(から/proc/cpuinfo)、最後の起動時間(計算から/proc/uptime)、IPアドレス(ifconfig出力から)、およびインストールされているプリンタのリスト(lpstat出力から)です。

現在のプログラムからいくつかのデータを取得しますdmidecode

  • プラットフォームタイプ( dmidecode -s system-product-name)
  • BIOSバージョン( dmidecode -s bios-version)
  • 物理メモリサイズ(dmidecode -t17 | grep Size

これは、私のプログラムがrootとして実行されている場合にのみ使用できます(そうしないと、子dmidecodeプロセスがエラーのために失敗するため/dev/mem: Permission denied)。一般ユーザーがアクセスできるこの情報を取得する代替方法はありますか?

答え1

提供されている情報の一部dmidecodeはで確認できます/sys/devices/virtual/dmi/id

追加情報は分析から入手できます/proc/cpuinfo/proc/meminfo/sys/system/node/node0/meminfo

答え2

  1. ユーザーとしてDMI情報を読むことができます/sys/class/dmi/id/。シリアル番号は含まれていません(読み取りにはroot権限が必要です)。

    私はこれがプライバシーを重視するカーネル開発者の期待される動作だと思います。

  2. About dmesg:dmesgカーネルリングバッファにアクセスするコマンドです。リングバッファとは、バッファが「オーバーフロー」したときに古い情報を新しい情報で上書きすることを意味します。また、これは解析できないカーネルモジュールのデバッグ出力を読み込んでいます。

  3. 以下を実行してsystemdカーネル出力にアクセスするには:

     journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
    
  4. ~についてデビッド・ホマーそしてナイルA:このファイルは/dev/mem単にメモリ情報を提供するのではなく、物理メモリ全体をユーザー空間にマップします。これにより、DMIメモリアドレスにアクセスすることができます(そしてより不快な作業をすることができます)。

  5. 情報とchgrpchmod g+sdmidecodeナイル回答:GIDを保存すると新しい権限が使用されchmod g+sないため、期待どおりに機能しないようです。アクセスする前に、有効なグループIDを設定するために呼び出しを行う必要があります。ソースコードで判断した場合、これは行われません。dmidecodedmidecodesetegid/dev/memdmidecode

答え3

私はCentOS 5システムを確認しました。以来:

chgrp kmem /usr/sbin/dmidecode
chmod g+s /usr/sbin/dmidecode

それでもdmidecodeを動作させることはできません。 kmemグループには、/ dev / memへの読み取りアクセス権しかありません。 BIOS情報の書き込みに関連しているようです。

したがって、いくつかの異なるオプションがあります。

  1. sudoを使う
  2. 他の情報源(例:/proc/meminfo)を使用する
  3. initスクリプトを使用して、dmidecodeの静的出力を誰でも読みやすいファイルに書き込みます。

答え4

@mtneagleがなぜ反対票を受け取ったのかわかりません。

OPが望む3つの項目は次のとおりです。

プラットフォームタイプ(dmidecode -s system-product-name
BIOSバージョン(dmidecode -s bios-version
物理メモリ容量(dmidecode -t17 | grep Size

私達はそれぞれ次のように得ることができます:

dmesg | grep "DMI:" | cut -c "6-" | cut -d "," -f "1"
dmesg | grep "DMI:" | cut -c "6-" | cut -d "," -f "2"
dmesg | grep "Memory:" | cut -d '/' -f '2-' | cut -d ' ' -f '1'

(または少なくとも私が持っている4つの異なるハードウェアサーバーで動作し、XenゲストはBIOSまたはサーバータイプをまったく返しません。)

私は明らかなものを見逃していますか?


修正する:私が見逃した明白な点を指摘してくれた@Ruslanに感謝します。

引用:

はい、あなたはそうでした。カーネルメッセージはリングバッファに保存されます。多すぎる行が印刷されると、最初の行が削除されます。

したがって、コンピュータが数週間稼働していて、少なくとも毎日一時停止/再開する場合、ここで収集した情報がバッファに含まれなくなる可能性が高くなります。

(ここでは稼働時間が18日のこのような状況があります。)確認することをお勧めします。/var/log/kern.log

それはまるでgrep DMI: /var/log/kern.log | tail -n1

関連情報