[TOC]

前言介绍

描述:通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准是在计算机系统中用来标识信息的一个 128 位(比特)的数字,最初被用在阿波罗网络计算机系统(NCS)中,亦为自由软件基金会组织会(OSF)在分散式计算环境领域境(DCE)的一部份。

UUID的目的是让分散式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来每个人都可以创建不与其它人冲突的UUID。在这样的情况下就不需考虑数据库创建时的名称重复问题

目前最广泛应用的UUID:

  • 微软公司的全局唯一标识符(GUID)
  • 其他重要的应用则有Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE、Mac OS X等等

Linux UUID的作用及意义

  • 原因1:它是真正的唯一标志符
    UUID为系统中的存储设备提供唯一的标识字符串,不管这个设备是什么类型的。如果你在系统中添加了新的存储设备如硬盘,很可能会造成一些麻烦,比如说启动的时候因为找不到设备而失败,而使用UUID则不会有这样的问题。
  • 原因2:设备名并非总是不变的
    自动分配的设备名称并非总是一致的,它们依赖于启动时内核加载模块的顺序。如果你在插入了USB盘时启动了系统,而下次启动时又把它拔掉了,就有可能导致设备名分配不一致。
    使用UUID对于挂载移动设备也非常有好处──例如我有一个24合一的读卡器,它支持各种各样的卡,而使用UUID总可以使同一块卡挂载在同一个地方。
  • 原因3:Ubuntu中的许多关键功能现在开始依赖于UUID

UUID版本
UUID1:从主机ID、序列号和当前时间生成UUID。它基于硬件地址和一个随机的14位序列号。
UUID3:根据名称空间标识符(即UUID)和名称(即字符串,此站点使用UUID1作为字符串)的MD5哈希值生成UUID。
UUID4:生成一个随机UUID。
UUID5:根据名称空间标识符(即UUID)和名称(即字符串,本站点使用UUID1作为字符串)的SHA-1散列生成UUID。

UUID格式
UUID 以 32 个十六进制的数字表示,被连字符分割为 5 组显示,总共的 36 个字符的格式为 8-4-4-4-12(32 个字母或数字和 4 个连字符)。

1
例如:d92fa769-e00f-4fd7-b6ed-ecf7224af7fa


获取与生成uuid

获取UUID

Linux 中获取硬盘分区或文件系统的 UUID 的七种方法
描述:Linux 系统管理员你应该知道如何去查看分区的 UUID 或文件系统的 UUID,因为现在大多数的 Linux 系统都使用 UUID 挂载分区,你可以在 /etc/fstab 文件中可以验证。

1
2
cat /etc/fstab
UUID=b379c221-7e3d-42ff-b5ae-bf1d2dfe9ffb /boot xfs defaults 0 0

UUID它可以帮助 Linux 系统识别一个磁盘分区而不是块设备文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#使用下面的 7 个命令来查看
#blkid 命令:定位或打印块设备的属性。
$blkid
/dev/sda1: UUID="b379c221-7e3d-42ff-b5ae-bf1d2dfe9ffb" TYPE="xfs"
/dev/sda2: UUID="WYci3Y-yQO9-eU0R-Dzmu-ccUH-Lhns-rLhVnJ" TYPE="LVM2_member"


#lsblk 命令:列出所有可用的或指定的块设备的信息。
$lsblk -o name,mountpoint,size,uuid
NAME MOUNTPOINT SIZE UUID
sda 40G
|-sda1 /boot 1G b379c221-7e3d-42ff-b5ae-bf1d2dfe9ffb
`-sda2 39G WYci3Y-yQO9-eU0R-Dzmu-ccUH-Lhns-rLhVnJ
|-centos-root / 37G bf08ef5c-d394-4893-86ad-a3c8025daa85
`-centos-swap [SWAP] 2G b27b7ddb-1f8b-43cb-aaed-0365d1e2e450


#hwinfo 命令:硬件信息工具,是另外一个很好的实用工具,用于查询系统中已存在硬件。
hwinfo --block | grep by-uuid | awk -F "," '{print $1,"-",$3}'
Device Files: /dev/sda1 - /dev/disk/by-uuid/b379c221-7e3d-42ff-b5ae-bf1d2dfe9ffb

#udevadm 命令:udev 管理工具
udevadm info -q all -n /dev/sda1 | grep -i by-uuid | head -1
S: disk/by-uuid/b379c221-7e3d-42ff-b5ae-bf1d2dfe9ffb


#tune2fs 命令:调整 ext2/ext3/ext4 文件系统上的可调文件系统参数。
tune2fs -l /dev/sdc1 | grep UUID
Filesystem UUID: d17e3c31-e2c9-4f11-809c-94a549bc43b7


#dumpe2fs 命令:查询 ext2/ext3/ext4 文件系统的信息。 
tune2fs -l /dev/sdc1 | grep UUID
Filesystem UUID: d17e3c31-e2c9-4f11-809c-94a549bc43b7

#by-uuid 路径:该目录下包含有 UUID 和实际的块设备文件,UUID 与实际的块设备文件链接在一起。
ls -lh /dev/disk/by-uuid/
ls -lh /dev/disk/by-id/ #能看见扩展分区磁盘的UUID
lrwxrwxrwx 1 root root 10 Aug 2 17:09 b379c221-7e3d-42ff-b5ae-bf1d2dfe9ffb -> ../../sda1
lrwxrwxrwx 1 root root 10 Aug 2 17:09 b27b7ddb-1f8b-43cb-aaed-0365d1e2e450 -> ../../dm-1
lrwxrwxrwx 1 root root 10 Aug 2 17:09 bf08ef5c-d394-4893-86ad-a3c8025daa85 -> ../../dm-0


Linux 中获取网卡的UUID方法

1
2
3
4
5
6
7
8
#示例1.Linux中网卡的UUID,可利用此uuid修改网卡的配置文件;
uuidgen eth0
e784d3f5-54ef-48f4-a5e0-4ee2d670e8b

#示例2.查看网卡的UUID与网卡名称对应的设备名称
[[email protected] ~]$ nmcli con
NAME UUID TYPE DEVICE
br-9bc175e03197 e784d3f5-54ef-48f4-a5e0-4ee2d670e8b bridge br-9bc175e03197


生成UUID

描述:UUID 由该库生成可以合理地认为在一个系统中 UUID 是唯一的,生成的UUID并且在所有系统中也是唯一的。

  • libuuid : 自内核2.15.1起就是 util-linux-ng 包中的一部分;
  • e2fsprogs : 包中的UUID库找到实现;

方式1:采用Python使用了UUID模块生成uuid1/3/4/5等版本的UUID字符串,位于Lib/uuid.py之中;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import uuid
class uuid.UUID(hex=None, bytes=None, bytes_le=None, fields=None, int=None, version=None, *, is_safe=SafeUUID.unknown)
UUID('{12345678-1234-5678-1234-567812345678}')
UUID('12345678123456781234567812345678')
UUID('urn:uuid:12345678-1234-5678-1234-567812345678')
UUID(bytes=b'\x12\x34\x56\x78'*4)
UUID(bytes_le=b'\x78\x56\x34\x12\x34\x12\x78\x56' +b'\x12\x34\x56\x78\x12\x34\x56\x78')
UUID(fields=(0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x567812345678))
UUID(int=0x12345678123456781234567812345678)

#SPACESNAME常量 (可作为uuid3/5 的 namespace 值)
uuid.getnode() #通用管理的MAC地址优于本地管理的MAC地址
uuid.NAMESPACE_OID
UUID('6ba7b812-9dad-11d1-80b4-00c04fd430c8')
>>> uuid.NAMESPACE_DNS
UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8')
>>> uuid.NAMESPACE_URL
UUID('6ba7b811-9dad-11d1-80b4-00c04fd430c8')
>>> uuid.NAMESPACE_X500
UUID('6ba7b814-9dad-11d1-80b4-00c04fd430c8')

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python
# python有一个模块叫做uuid,导入它就可以使用它的四个方法了
import uuid

print uuid.uuid1()
#bf1dfacf-67d8-11e8-9a23-408d5c985711
print uuid.uuid3(uuid.NAMESPACE_DNS, 'yuanlin') #UUID using an MD5 hash of a namespace UUID and a name
#ddb366f5-d4bc-3a20-ac68-e13c0560058f
print uuid.uuid4()
#144d622b-e83a-40ea-8ca1-66af8a86261c
print uuid.uuid5(uuid.NAMESPACE_DNS, 'yuanlin') #UUID using a SHA-1 hash of a namespace UUID and a name
#4a47c18d-037a-5df6-9e12-20b643c334d3


方式2:Linux中shell采用uuidgen进行生成

1
2
uuidgen
fcfe9f3e-1edc-43fe-8b29-c2a92958ce41



方式3:采用JS生成uuid

1
2
3
4
5
6
7
8
9
function uuid() {
return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[0148]/g, c =>(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
)
}

/** 调用生成 **/
print(uuid())
b3255b0d-ae61-16c6-833f-96c827fd17d8
725ad3d6-6eb1-12a2-855f-5a8a8bb6859d



方式4:采用java的util包里面的UUID类实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.UUID;
public class createUUID {
public static void main(String[] args) {
System.out.println(createID());
}
public static String createID(){
UUID uuid = UUID.randomUUID();
String id=uuid.toString();
return id.replace("-", "");
}
}

//调用执行效果
56e41c4d8aa64e3cbf4d1d119004af61
f1d443fcb9564ae7b3fc1993de1680d5
91fe1a1ef54843c08c42ba8c68f98d4b
2f763662d0b24b0f8e18c6f0da4dd643
4bf13006b8324ed8bfe4c194d6cb057e
1947e4ef40cb49c28ecfd2d725815ef8


附录

  • 匹配生成UUID