非ルートとしてのLinuxハードドライブのシリアル番号


15

まず、タイトルにハードウェアの詳細を含めないことをおaび申し上げます。これは、すべてのLinuxディストリビューションで機能するコマンドを探しているためです。

質問:

私はLinuxを初めて使用しますが、あまり知らないのですが、非ルートとして実行されているハードドライブのシリアル番号を取得することは可能ですか。sudoを使用して実行しているこの情報を取得するためのコマンドがあることを知っています。ただし、sudoとして実行せずにこの情報を取得する方法が必要です。

ご提案をいただければ幸いです。

敬具、

ムスタファ

回答:


19

現在のほとんどのディストリビューションでは、HDDのシリアル番号はudevデータベースに保存されており、ルート権限なしで照会できます。

/sbin/udevadm info --query=property --name=sda

(外観のためID_SERIALID_SERIAL_SHORT;もある/dev/disk/by-id/ata-*これらの値に基づいて、ATAドライブのシンボリックリンク)。

udisksこれらのデータなどに高レベルのインターフェイスを提供します(また、たとえばsmartctl直接呼び出しに必要なルート権限を必要とせずにSMART属性にアクセスできます)。


あなたは試してみました、正しいudisks --show-info.__ But__をバッチモードまたは一般的にスクリプトで使用する場合、ことに注意しなければならないudisksWAYよりも遅いですudevadm
構文エラー

6

通常機能する別の方法は次のとおりです。

ls -l /dev/disk/by-id/

ドライブとモデル/シリアル番号をすばやく列挙できる1つのライナーを次に示します。

ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print $NF " " $(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'  

または、リモートマシンの場合:

ssh $host "ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print \$NF \" \" \$(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'"

その後、この出力をさらに処理できます。ほとんどのドライブタイプでは、1行あたりの2番目の文字列はMODEL_SERIALです。


2

wombleが言ったように、rootアクセスなしで、または何らかのプロセスにrootのような許可を与えなければ、これを達成することはできません。ただし、あなたは初心者だと言っているので、という便利なコマンドについて注意しましょうlshw


Wombleとあなたの両方に感謝します。あなたが言及したコマンドを調査します。

1

何らかのプロセスにルートのような権限を付与する以外は、これを達成できません。rootであっても、一部のハードウェア構成では実行できません。


Wombleに迅速に対応していただきありがとうございます。やってみます。
ムスタファ

0

/ dev / disk / by-idの下のリンクは、udevによって作成されます。/etc/udev/rules.d/50-udev.rulesには、次のような行があります。

KERNEL=="sd*[!0-9]|sr*", SYSFS{ieee1394_id}=="*", ENV{ID_SERIAL}="$sysfs{ieee1394_id}", ENV{ID_BUS}="ieee1394"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/usb_id -x"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/scsi_id -g -x -s %p -d $tempnode"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/scsi_id -g -x -a -s %p -d $tempnode"
KERNEL=="nst[0-9]*|st*|sd*[!0-9]|sr*|dasd*[!0-9]|cciss?c", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"

残念ながらby-id、デバイスの名前からこのシンボリックリンクを見つけることは簡単ではありません。しかし、少なくとも1つの直接的な方法があります。

$ udevinfo -q path -n /dev/sda
/block/sda
$ udevinfo -q symlink -p /block/sda
disk/by-id/scsi-SATA_KINGSTON_SVP100_31JY100MY5SK disk/by-path/pci-0000:00:11.0-scsi-0:0:0:0

スペースで区切られたリストが返されます。そのため、by-idパスを見つけることができます。

または、「複合」シリアル番号を直接取得できます。

$ udevinfo -q env -p /block/sda
ID_VENDOR=ATA
ID_MODEL=KINGSTON_SVP100S
ID_REVISION=CJR1
ID_SERIAL=SATA_KINGSTON_SVP100_31JY100MY5SK
ID_TYPE=disk
ID_BUS=scsi
ID_PATH=pci-0000:00:11.0-scsi-0:0:0:0

ID_SERIAL最後のアンダースコアの後では、シリアル番号を取得できます。

シリアル番号には英数字と「-」を含めることができます(このようなSCSI HDDがあります)。シリアル番号に関する制限を知っている人はいますか?「_」を含めることができる場合、このメソッドは防弾ではありません。

ID_MODEL(それは私には思える)とキーは、その最初の15の文字が追加され、より正確にはシリアル番号の先頭をローカライズするために使用することができID_SERIAL(「_」に置き換えスペース)。


ここではUbuntuで「udevinfo」が機能しませんでした。しかし、次のワンライナーは、私が望んでいたことを正確に実行しました。udevadm info -q property -xn sda | awk -F\' '/ID_SERIAL_SHORT/{print $2}'もちろん、-q property除外することもできますが、udevadm必要のない追加の行を出力できるようにすることは常にリソースの無駄だと思います。
構文エラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.