如果没有其他可用选项,我可以将MAC与其他内容结合使用,例如ID可以是MAC地址和其他信息的组合的MD5哈希值。
我想听听您的建议。
如果有用的话,我的应用程序是用C/C++编写的。
所有这些的目的是防止用户多次运行我的应用程序。我只想运行一次。
关于根文件系统的UUID怎么获取呢?你可以从/etc/fstab
中获取根文件系统设备,可以手动解析该文件或使用getfsent (3)
或 getfsfile (3)
函数。一旦获得设备,你可以通过检查/dev/disk/by-uuid
中的链接或使用blkid
命令来获取UUID。
通常最好的方法是看看其他人如何解决同样的问题。
FLEXlm 也使用主机标识符来进行其节点锁定许可证。 最常见的主机标识符是您其中一个网络接口的以太网MAC地址,没有任何分隔符。
它还可以使用(在Windows上)C:驱动器的卷序列号(再次没有分隔符);在Solaris上,使用 hostid
命令的输出(如果我没记错,在Sun计算机上,此数字实际上是唯一的,并位于系统板上的小可拆卸EEPROM上)。
虽然MAC地址极易伪造,但它现在几乎成为了一种普遍的标识符(几乎所有新计算机都至少有一个以太网端口,而且很常见它们被集成在主板上),并且实际上旨在全球唯一(事实上,以太网协议依赖于这种唯一性)。您可能会遇到的主要问题:
Solaris 和 Linux 都提供了 hostid
(1) 实用程序。
hostid
命令(但是它们都使用同一个发行版),所有电脑返回的值都相同。 - picrap没有一种通用且可靠的方法可以获得你想要的。
/
的UUID,这是相当可靠的,但它不能区分运行在同一磁盘上的chroots和可能的虚拟机。如果你主要处理专门用于运行特定操作系统的内部或静态硬盘,则应该能够使用根文件系统的UUID来检测系统。alias sys_guid='sudo /sbin/blkid | grep "$(df -h / | sed -n 2p | cut -d" " -f1):" | grep -o "UUID=\"[^\"]*\" " | sed "s/UUID=\"//;s/\"//"'
如果你需要进一步区分相同操作系统的内核版本或在同一磁盘上运行的不同操作系统,则可以使用uname
的数据和/或将它们与根fs UUID结合使用。我认为这是不可能的。最接近的方法是创建一个非常长的随机字符串(就像微软使用GUID一样),并将其存储在系统中。
需要考虑到很多设置可能已经创建了文件系统镜像并克隆到许多机器上,而不是单独设置它们。在其他情况下,一台机器可能会被重新设置多次。换句话说,操作系统提供的任何内容都不能信任。
然而,CPU确实保留了唯一的序列号,但是在不同的系统上访问它应该是不同的。
如其他人所说,dmidecode
命令是一种选择。
[root@sri-0000-0003 WebGui]# dmidecode -s system-uuid
03001234-1234-1234-1234-000700012345
我编辑了输出,以隐藏我测试系统的UUID。
你可以从dmidecode获取其他信息。 dmidecode -t
将告诉你类别。
[root@sri-0000-0003 WebGui]# dmidecode -t
dmidecode: option requires an argument -- 't'
Type number or keyword expected
Valid type keywords are:
bios
system
baseboard
chassis
processor
memory
cache
connect
dmidecode -t processor
是一个不错的选择。[root@sri-0000-0003 WebGui]# dmidecode -t processor
# dmidecode 3.1
Getting SMBIOS data from sysfs.
SMBIOS 3.0.0 present.
Handle 0x0041, DMI type 4, 48 bytes
Processor Information
Socket Designation: U3E1
Type: Central Processor
Family: Core i3
Manufacturer: Intel(R) Corporation
ID: E3 00 00 00 11 22 33 44
鉴于处理器制造商数量很少,这似乎是一个很好的替代方法dmidecode -s system-uuid
。然而,在虚拟框中,dmidecode -t processor
将不提供有用的信息。我不知道其他虚拟平台的情况。
我愿意打赌dmidecode -s system-uuid
在docker容器内也可以工作,但我无法验证。
您没有提及唯一标识符需要多稳定 - 您是否希望每次运行代码时始终使用相同的主机生成相同的ID?
如果不是,那么fuzzymonk的uuidgen建议就是您想要的。
如果是,那么您需要决定在主机方面什么构成了“相同”。一种方法是如您所建议的,第一个以太网接口的MAC地址和“某些内容”的MD5校验和。对于“某些内容”,在这种情况下我会考虑FQDN,除非您对“相同主机”的概念包括FQDN更改......