如何在Linux下获取CPU序列号而不需要root权限

14

如何在Linux(Ubuntu)下获取CPU序列号而无需root权限?

我尝试了cpuid命令,它可以在没有root权限的情况下工作,但似乎返回全部为零(我认为是因为需要在BIOS中更改某些设置)。

请问是否有其他方法从程序中获取CPU序列号,而无需root权限且不必修改BIOS设置?

7个回答

11

需要 root 权限。答案是 dmidecode。
如果需要 CPU ID:

dmidecode | grep -w ID | sed "s/^.ID\: //g"

这将获取CPU ID,并从输出中删除“ID:”
如果您需要接收计算机ID:

dmidecode | grep -w UUID | sed "s/^.UUID\: //g"

如果您希望在无需root权限的情况下获取内核uuid,请执行以下操作:

dmesg | grep UUID | grep "Kernel" | sed "s/.*UUID=//g" | sed "s/\ ro\ quiet.*//g"

最近的评论引起了这一点。很久以前发生的事情,所以现在无法解释为什么这些ID被视为机器标识符。从处理器信息部分获取了实际的处理器ID。在Debian操作系统上提取。

pr=0; dmidecode | while read line; do [ "$line" == "Processor Information" ] && pr=1; [ $pr -eq 0 ] && continue; [ -n "$(echo $line | grep '^ID')" ] && echo $line | awk -F"ID: " '{print $2}' && break; done

1
所有这些都是不正确的。 "dmidecode" 返回有关系统中大多数设备的信息,因此会有很多噪音--例如,我的PC具有ID为“1”的PCI Express卡。但我可以猜测第一个命令旨在返回“CPUID”--相同类型的所有处理器的相同值。第二个命令将返回主板UUID--虽然一些主板确实在那里放置唯一的值,但许多主板将其留为空或重复使用相同的UUID。最后,最后一部分不是“内核UUID”(无论它是什么),而是您系统磁盘的UUID,并且每次格式化它时都会更改。 - theamk

9
处理器序列号基本上只出现在Pentium III处理器中。由于隐私问题,Intel从后续型号中删除了它。因此,除非您使用的是PIII 并且 您的BIOS设置允许您读取序列号,否则您将得到全为0。

我忘记了那些... Xeon 处理器并不是你在普通的 WorstBuy 商店里碰巧能够找到的东西。 - Marc B
是的,但其他操作系统如何获取它们?例如Windows上的WMI?Linux肯定也有一些解决方法。 - Alexey
@Alexey 我不想让这个古老的帖子复活,但它出现在谷歌上,我只想补充一下,你可以在Windows上获取这些信息而不需要管理员权限,是因为Windows使用内核驱动程序在用户空间中公开这些信息。在Linux上,您可以通过多种方式实现相同的功能,例如在Sudo配置中添加dmidecode可以在特定帐户下无需根权限执行,或者编写一个系统服务,在用户空间中通过API公开此信息。当您通过WMI请求此信息时,Windows还会访问'privileged' ring 0信息。 - Alex
@Alex:CPU序列号引用英特尔的说法,该功能根本没有实现:根本不存在可检索的序列号。不仅需要内核访问权限,除非有一些后来的CPU功能以另一种形式重新引入它,比如MSR……显然dmidecode能够获取一些信息,但我不知道从哪里获取。我们能确定这不仅仅是来自主板吗? - Peter Cordes
1
@Alex:如果序列号是真实存在且实际存储在 CPU 中,那么可能会通过在某些存储空间中烧写“保险丝”来进行编程(例如PROM:只能外部编程一次)。同样的地方,在芯片测试其频率/电压极限以使其成为 i7-6700k 或 i5-6600 等,并包括编程模型字符串 Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz 后会进行编程。 (Intel 还可以关闭 SIMD 单元的高半部分,使其成为 Celeron 或 Pentium,即使存在短路缺陷也可使用。) - Peter Cordes
显示剩余3条评论

2
将许可证绑定到安装其可执行文件时在用户文件系统中获得的inode编号。 如果它们被移动到其他地方,它们将会改变。
缺点是如果程序需要从备份中恢复,可能无法保留这些编号。
我以前做过这样的事情。 您必须非常慷慨地允许真正的用户在更改硬件时激活许可证。

1

cpuid 返回相同的序列号,无论我是否使用 sudo

 % cpuid | grep serial
Processor serial: 0002-0652-0000-0000-0000-0000
 % sudo cpuid | grep serial
Processor serial: 0002-0652-0000-0000-0000-0000

除非你指的是其他序列号...?


是的,我指的就是这个 - “0000-0000-0000-0000”。第一个字节是一些步进 ID,但真正的序列号应该在这些零后面。 - Alexey

1

如此问题之前所建议的那样,如果您正在尝试将其用于许可证(因为您使用了许可标签),则可以尝试MAC地址: CPU序列号


是的,我也在使用MAC地址,但我想要更多的功能 :) - Alexey

0

CPU 没有序列号;也许您想要 DMI 基本信息而不需要 root 权限(这只会向您显示主板制造商和型号的持久 ID,但没有序列号):

dmesg | grep -i dmi: | cut -d ":" -f 2-

否则,您可以“告诉”dmidecode从非特权用户运行:
sudo chmod +s /usr/sbin/dmidecode

然后你可以运行例如:

dmidecode -s system-serial-number

在大多数情况下,“system-serial-number” 与“chassis-serial-number”或“baseboard-serial-number”类似。请记住,并非所有发行版都安装了此程序,例如,基于Debian的系统有一个以其命名的软件包。
否则,您可以通过系统磁盘找到一个唯一且持久的系统ID;为此,您可以运行以下命令:
mount | grep "on / type" | awk '{print $1}'

前者将提供您的系统挂载的设备路径(对于我的操作系统,它返回了/dev/sda7),然后您可以使用以下命令找到其ID:

find /dev/disk/by-id/ -lname "*sda" ! -name "wwn*"

所以从系统硬盘查找唯一标识的完整命令可能是:

find /dev/disk/by-id/ -lname "*`mount | grep " / " | awk '{print $1}' | cut -b 6-8`" ! -name "wwn*" -printf "%f\n"

希望这可以满足您或其他人的需求。命令cut -b 6-8可能不可移植,因为我假设块设备名称为三个字符长;此外,/dev/disk/by-id/路径仅由UDEV管理的系统填充,并非所有Linux发行版都使用它,但我保证前者在Ubuntu中可以工作。

-2

你检查过dmesg了吗?它在/bin目录下。


我以前从未使用过它 - 它只是给了我一堆这样的消息 - 你能建议我应该如何调用它以获取处理器序列号:[38988.366706] VFS:更改媒体上的繁忙inode。 [38990.355161] VFS:更改媒体上的繁忙inode。 [38990.360004] VFS:更改媒体上的繁忙inode。 [38992.355334] VFS:更改媒体上的繁忙inode。 [38992.357489] VFS:更改媒体上的繁忙inode。 - Alexey
dmesg是内核消息的环形缓冲区。启动后,它将拥有所有启动内核消息,但最终会被其他系统事件推出。在/var/log某处应该有一个包含引导消息的文件。 - Marc B
@Marc,你需要以root身份才能查看/var/log/messages*文件,但非root用户可以访问dmesg。 - Foo Bah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接