原文地址: https://www.tony-yin.site/201...
众所周知,咱们看到的磁盘一般是/dev/sda
,/dev/sdb
这样的名称,咱们能够经过这些磁盘名称对磁盘进行各类操做,例如挂载,分区和格式化等等。可是,若是你的机器上有不止一个SATA
,SCSI
或IDE
磁盘控制器,那么它们所对应的设备节点将会依随机次序添加。这样就可能致使每次引导时设备的名字如/dev/sda
与/dev/sdb
互换了,再好比硬盘拔插致使磁盘乱序等等,最终致使系统不可引导、kernel panic
、或者设备不可见。持久化命名能够解决这些问题。php
持久化命名,顾名思义即一次性或者是短暂的命名,它是一种长久的而且稳定靠谱的命名方案。与之造成鲜明对比的就是/dev/sda
这种非持久化命名,这两种命名方案各有各的用处,本文着重对持久化命名进行介绍。持久化命名方案有四种:by-label
、by-uuid
、by-id
和by-path
。对于那些使用GUID
分区表(GPT
)的磁盘,还有额外的两种方案:by-partlabel
和by-partuuid
。你也可使用Udev
静态设备名方案,这个咱们就不做详细解释。下面我将对每种持久化命名方案进行详细的介绍和讲解,不难发现上面所提到的命名方式在/dev
目录下都存在一个与之名字对应的文件夹:html
label
表示标签的意思,几乎每个文件系统都有一个标签。全部有标签的分区都在/dev/disk/by-label
目录中列出。这个目录随着分区标签的变更而被动态地建立和销毁。linux
$ ls -l /dev/disk/by-label total 0 lrwxrwxrwx 1 root root 10 May 27 23:31 DATA -> ../../sda3 lrwxrwxrwx 1 root root 10 May 27 23:31 SYSTEM -> ../../sda2
标签必须是惟一的,标签是文件系统的一个属性,因此没法持久地表示单一磁盘阵列设备。api
注意:label
是经过从设备中的内容(即数据)获取,因此若是将该内容拷贝至另外一个设备中,咱们也能够经过blkid
来获取磁盘的label
。网络
UUID
是给每一个文件系统惟一标识的一种机制,这个标识是在分区格式化时经过文件系统工具生成,好比mkfs
,这个惟一标识能够起到解决冲突的做用。全部GNU/Linux
文件系统(包括swap
和原始加密设备的LUKS
头)都支持UUID
。FAT
和NTFS
文件系统并不支持UUID
,可是在/dev/disk/by-uuid
目录下仍是存在着一个更为简单的UID
(惟一标识)。app
$ ls -l /dev/disk/by-uuid/ total 0 lrwxrwxrwx 1 root root 10 May 27 23:31 0a3407de-014b-458b-b5c1-848e92a327a3 -> ../../sda2 lrwxrwxrwx 1 root root 10 May 27 23:31 b411dc99-f0a0-4c87-9e05-184977be8539 -> ../../sda3 lrwxrwxrwx 1 root root 10 May 27 23:31 CBB6-24F2 -> ../../sda1 lrwxrwxrwx 1 root root 10 May 27 23:31 f9fe0b69-a280-415d-a03a-a32752370dee -> ../../sda4
使用UUID
方法的优势是,名称冲突发生的可能性大大低于使用Label
的方式。更深层次地讲,它是在建立文件系统时自动生成的。例如,即便设备插入到另外一个系统(可能有一个标签相同的设备),它仍然是惟一的。ide
缺点是uuid
使得许多配置文件(例如fstab
或crypttab
)中的长代码行难以读取和破坏格式。此外,每当一个分区被调整大小或从新格式化时,都会生成一个新的UUID,而且必须(手动)调整配置。工具
该目录中的条目提供一个符号名称,该符号名称经过用于访问设备的硬件路径引用存储设备,首先引用PCI hierachy
中的存储控制器,并包括SCSI host
、channel
、target
和LUN
号,以及可选的分区号。虽然这些名字比使用major
和minor
号或sd
名字更容易,但必须使用谨慎以确保target
号不改变在光纤通道SAN
环境中(例如,经过使用持久绑定),若是一个主机适配器切换到到一个不一样的PCI
插槽的话这个路径也会随之改变。此外,若是HBA
没法探测,或者若是驱动程序以不一样的顺序加载,或者系统上安装了新的HBA
,那么SCSI
主机号都有可能会发生变化。附带路径清单的一个例子是:ui
/dev/disk/by-path/pci-0000:03:00.0-scsi-0:1:0:0
也许还会带着分区号:加密
/dev/disk/by-path/pci-0000:03:00.0-scsi-0:1:0:0-part1
注意: 上面说了不少种状况都会致使by-path
的值可能发生变化,可是在同一时间来讲,by-path
的值是和物理设备是惟一对应的,也就是说无论怎么说by-path
是对应物理机器上面的某个位置的,根据by-path
能够获取对应物理位置的设备。(此前megaraid
经过逻辑磁盘获取物理磁盘位置就是根据这个原理)
对于iSCSI
设备,路径/名称映射从目标名称和门户信息映射到sd
名称。
应用程序一般不适合使用这些基于路径的名称。这是由于这些路径引用可能会更改存储设备,从而可能致使将不正确的数据写入设备。基于路径的名称也不适用于多路径设备,由于基于路径的名称可能被误认为是单独的存储设备,致使不协调的访问和数据的意外修改。
此外,基于路径的名称是特定于系统的。当设备被多个系统访问时,例如在集群中,这会致使意外的数据更改。
此目录中的条目提供一个符号名称,该符号名称经过惟一标识符(与全部其余存储设备不一样)引用存储设备。标识符是设备的属性,但不存储在设备的内容(即数据)中。例如:
/dev/disk/by-id/scsi-3600508e000000000ce506dc50ab0ad05 /dev/disk/by-id/wwn-0x600508e000000000ce506dc50ab0ad05
该id
从设备的全局ID
(WWID
)或设备序列号中获取。/dev/disk/by-id
条目也可能包含一个分区号。例如:
/dev/disk/by-id/scsi-3600508e000000000ce506dc50ab0ad05-part1 /dev/disk/by-id/wwn-0x600508e000000000ce506dc50ab0ad05-part1
World Wide Identifier
(WWID
)可用于可靠的识别设备。SCSI
标准要求全部SCSI
设备提供一个持久的、系统无关的ID
。WWID
标识符保证对每一个存储设备都是惟一的,而且独立于用于访问设备的路径。
这个标识符能够经过发出SCSI
查询来获取设备标识重要厂商数据(第0x83
页)或单位序列号(第0x80
页)。从这些wwid
到当前/dev/sd
名称的映射能够在/dev/disk/by-id/
目录中维护的符号连接中看到。
例如,具备页0x83
标识符的设备将具备:
scsi-3600508b400105e210000900000490000 -> ../../sda
或者,具备页0x80
标识符的设备将具备:
scsi-SSEAGATE_ST373453LW_3HW1RHM6 -> ../../sda
Red Hat Enterprise Linux 5
自动维护从基于wwid
的设备名称到系统上当前/dev/sd
名称的正确映射。应用程序可使用/dev/ disk/by-id/
的连接引用磁盘上的数据,即便设备的路径改变,甚至当从不一样系统访问该设备时都是如此。
可是当设备被插入到硬件控制器的端口时,而这个端口又受另外一个子系统控制(即多路径),by-id
的值也会改变。多路径设备会在下面详细讲解。
这两个和上面提到的by-label
和by-uuid
相似,只不过是在GPT
磁盘上。
所谓多路径设备指的是从一个系统到一个设备存在多个路径,这种现象主要出如今光纤网络的SAN
下,主要是作数据链路冗余以达到高可用的效果,即对应底层一个物理设备,可能存在多个路径表示它,具体参考refer
下面有关文章。
若是从一个系统到一个设备有多个路径,那么 device-mapper-multipath
使用WWID
来检测它。而后在/dev/mapper/wwid
中显示一个“伪设备”,例如/dev/ mapper/3600508b400105df70000000ac0000
。
Device-mapper-multipath
显示映射到非持久标识符:Host:Channel:Target:LUN
, /dev/sd
名称,以及major:minor
号。
3600508b400105df70000e00000ac0000 dm-2 vendor,product [size=20G][features=1 queue_if_no_path][hwhandler=0][rw] \_ round-robin 0 [prio=0][active] \_ 5:0:1:1 sdc 8:32 [active][undef] \_ 6:0:1:1 sdg 8:96 [active][undef] \_ round-robin 0 [prio=0][enabled] \_ 5:0:0:1 sdb 8:16 [active][undef] \_ 6:0:0:1 sdf 8:80 [active][undef]
Device-mapper-multipath
在系统上自动维护每一个基于wwid
的设备名称和其对应的/dev/sd
名称的正确映射。这些名称即便是在路径发生改变时也是持久的,而且当从不一样的系统访问设备时它们仍然是一致的。
为了方便管理和使用设备,linux
操做系统给咱们提供了上面这么多持久化命名方式。它们各自有各自的优点和使用场景。by-label
和by-uuid
都和文件系统相关,by-label
是经过读取设备中的内容获取,by-uuid
则是随着每次文件系统的建立而建立,因此by-uuid
的持久化程度更高一些;持久化程度最高的要属by-path
和by-id
了,由于它们都是根据物理设备的位置或者信息而和连接作对应的,by-path
会由于路径的变化而变化;而by-id
则不会由于路径或者系统的改变而改变,它只会在多路径的状况下发生改变。这两个在经过虚拟设备名称寻找物理设备的场景下都十分有用。
多路径设备则帮助咱们在SAN
等场景下提升了数据传输的可用性,目前因为网络带宽的发展,它在iscsi
场景下也频繁亮相。