Linux硬盘驱动器序列号为非root


15

首先,我想为标题不包括硬件详细信息而道歉。这是因为我正在寻找在所有Linux发行版中都可以使用的命令。

题:

我对Linux还是很陌生,但是了解不多,是否可以检索以非root用户身份运行的硬盘驱动器序列号。我知道有一些命令可以检索使用sudo运行的此信息。但是,我需要一种无需使用sudo即可检索此信息的方法。

任何建议将不胜感激。

亲切的问候,

穆斯塔法

Answers:


19

在大多数当前发行版中,HDD序列号存储在udev数据库中,无需root权限即可查询:

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

(寻找ID_SERIALID_SERIAL_SHORT;还有/dev/disk/by-id/ata-*用于根据这些值ATA驱动器的符号链接)。

udisks提供了这些数据以及更多数据的更高级别的接口(它还提供了对SMART属性的访问,而无需root特权,例如,smartctl直接调用可能需要root特权)。


你说的没错,只是试图udisks --show-info.__ But__必须指出的是,在批处理模式或通常在脚本中使用时,udisks是远远慢udevadm
语法错误,2015年

6

通常有效的另一种方法是:

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

这是一个衬套,可让您快速枚举驱动器和型号/序列号:

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'"

然后,您可以进一步处理此输出。对于大多数驱动器类型,每行的第二个字符串为MODEL_SERIAL。


2

就像womble所说的那样,如果没有root用户访问权限或对某个进程授予类似root用户的权限,您将无法实现。但是,由于您说自己是新手,所以让我为您介绍一个名为的便捷命令lshw


非常感谢Womble和您自己,非常感谢。我将调查您提到的命令。

1

如果没有为某些进程授予类似root的权限,您将无法实现。即使是root用户,您也无法在某些硬件配置上做到这一点。


感谢您的快速回复Womble。我会去的。
mustafa

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从设备名称中找到此符号链接并非易事。但是至少有一种直接方法:

$ 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(用'_'代替的空格)中。


“ udevinfo”在Ubuntu上对我不起作用。但是,下面的单行代码完全满足了我的要求:udevadm info -q property -xn sda | awk -F\' '/ID_SERIAL_SHORT/{print $2}'当然,-q property可以将它们省略掉,但是我总是认为让udevadm输出根本不需要的其他行浪费资源。
语法错误
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.