私は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
ユーザーとしてDMI情報を読むことができます
/sys/class/dmi/id/
。シリアル番号は含まれていません(読み取りにはroot権限が必要です)。私はこれがプライバシーを重視するカーネル開発者の期待される動作だと思います。
About
dmesg
:dmesg
カーネルリングバッファにアクセスするコマンドです。リングバッファとは、バッファが「オーバーフロー」したときに古い情報を新しい情報で上書きすることを意味します。また、これは解析できないカーネルモジュールのデバッグ出力を読み込んでいます。以下を実行して
systemd
カーネル出力にアクセスするには:journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
~についてデビッド・ホマーそしてナイルA:このファイルは
/dev/mem
単にメモリ情報を提供するのではなく、物理メモリ全体をユーザー空間にマップします。これにより、DMIメモリアドレスにアクセスすることができます(そしてより不快な作業をすることができます)。情報と
chgrp
chmod g+s
dmidecode
ナイル回答:GIDを保存すると新しい権限が使用されchmod g+s
ないため、期待どおりに機能しないようです。アクセスする前に、有効なグループIDを設定するために呼び出しを行う必要があります。ソースコードで判断した場合、これは行われません。dmidecode
dmidecode
setegid
/dev/mem
dmidecode
答え3
私はCentOS 5システムを確認しました。以来:
chgrp kmem /usr/sbin/dmidecode
chmod g+s /usr/sbin/dmidecode
それでもdmidecodeを動作させることはできません。 kmemグループには、/ dev / memへの読み取りアクセス権しかありません。 BIOS情報の書き込みに関連しているようです。
したがって、いくつかの異なるオプションがあります。
- sudoを使う
- 他の情報源(例:/proc/meminfo)を使用する
- 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