非 root 用户使用 Linux 硬盘序列号

非 root 用户使用 Linux 硬盘序列号

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

问题:

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

如有任何建议,我们将不胜感激。

亲切的问候,

穆斯塔法

答案1

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

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

(查找ID_SERIAL, ;基于这些值,ID_SERIAL_SHORT还有ATA 驱动器的符号链接)。/dev/disk/by-id/ata-*

udisks为这些数据和更多数据提供了更高级别的接口(它还可以访问 SMART 属性而不需要 root 权限,而这对于smartctl直接调用是必需的)。

答案2

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

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。

答案3

就像 womble 所说的那样,如果没有 root 访问权限或向某些进程授予类似 root 的权限,您就无法实现这一点。不过,既然你说你是新手,让我告诉你一个方便的命令,叫做lshw

答案4

/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(空格被“_”替换)。

相关内容