web-dev-qa-db-ja.com

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

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

質問:

私はLinuxを使い始めたばかりで、あまり詳しくはありませんが、root以外で実行されているハードドライブのシリアル番号を取得することは可能ですか。 Sudoを使用して実行されているこの情報を取得するために使用できるコマンドがあることを知っています。ただし、Sudoとして実行せずにこの情報を取得する方法が必要です。

任意の提案をいただければ幸いです。

敬具、

ムスタファ

15
mustafa

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

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

ID_SERIALID_SERIAL_SHORTを探します。これらの値に基づいて、ATAドライブの/dev/disk/by-id/ata-*シンボリックリンクもあります)。

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

19
Sergey Vlasov

通常動作する別の方法は次のとおりです。

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です。

6
Chriswall

ウォンブルが言ったように、ルートアクセスがないか、またはいくつかのプロセスにルートのようなアクセス許可を与えないと、これを達成することはできません。ただし、あなたは初心者だと言っているので、lshwという便利なコマンドについて説明します。

2

一部のプロセスにrootのような権限を付与しないと、これを実現することはできません。 rootであっても、一部のハードウェア構成では実行できません。

1
womble

/ 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(スペースは「_」で置き換えられます)。

0
TrueY