块设备持久化命名和多路径

原文地址: https://www.tony-yin.site/201...

persistent name

众所周知,咱们看到的磁盘一般是/dev/sda/dev/sdb这样的名称,咱们能够经过这些磁盘名称对磁盘进行各类操做,例如挂载,分区和格式化等等。可是,若是你的机器上有不止一个SATASCSIIDE磁盘控制器,那么它们所对应的设备节点将会依随机次序添加。这样就可能致使每次引导时设备的名字如/dev/sda/dev/sdb互换了,再好比硬盘拔插致使磁盘乱序等等,最终致使系统不可引导、kernel panic、或者设备不可见。持久化命名能够解决这些问题。php

概述

持久化命名,顾名思义即一次性或者是短暂的命名,它是一种长久的而且稳定靠谱的命名方案。与之造成鲜明对比的就是/dev/sda这种非持久化命名,这两种命名方案各有各的用处,本文着重对持久化命名进行介绍。持久化命名方案有四种:by-labelby-uuidby-idby-path。对于那些使用GUID分区表(GPT)的磁盘,还有额外的两种方案:by-partlabelby-partuuid。你也可使用Udev静态设备名方案,这个咱们就不做详细解释。下面我将对每种持久化命名方案进行详细的介绍和讲解,不难发现上面所提到的命名方式在/dev目录下都存在一个与之名字对应的文件夹:html

by-label

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网络

by-uuid

UUID是给每一个文件系统惟一标识的一种机制,这个标识是在分区格式化时经过文件系统工具生成,好比mkfs,这个惟一标识能够起到解决冲突的做用。全部GNU/Linux文件系统(包括swap和原始加密设备的LUKS头)都支持UUIDFATNTFS文件系统并不支持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使得许多配置文件(例如fstabcrypttab)中的长代码行难以读取和破坏格式。此外,每当一个分区被调整大小或从新格式化时,都会生成一个新的UUID,而且必须(手动)调整配置。工具

by-path

该目录中的条目提供一个符号名称,该符号名称经过用于访问设备的硬件路径引用存储设备,首先引用PCI hierachy中的存储控制器,并包括SCSI hostchanneltargetLUN号,以及可选的分区号。虽然这些名字比使用majorminor号或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名称。
应用程序一般不适合使用这些基于路径的名称。这是由于这些路径引用可能会更改存储设备,从而可能致使将不正确的数据写入设备。基于路径的名称也不适用于多路径设备,由于基于路径的名称可能被误认为是单独的存储设备,致使不协调的访问和数据的意外修改。

此外,基于路径的名称是特定于系统的。当设备被多个系统访问时,例如在集群中,这会致使意外的数据更改。

by-id

此目录中的条目提供一个符号名称,该符号名称经过惟一标识符(与全部其余存储设备不一样)引用存储设备。标识符是设备的属性,但不存储在设备的内容(即数据)中。例如:

/dev/disk/by-id/scsi-3600508e000000000ce506dc50ab0ad05
/dev/disk/by-id/wwn-0x600508e000000000ce506dc50ab0ad05

id从设备的全局IDWWID)或设备序列号中获取。/dev/disk/by-id条目也可能包含一个分区号。例如:

/dev/disk/by-id/scsi-3600508e000000000ce506dc50ab0ad05-part1
/dev/disk/by-id/wwn-0x600508e000000000ce506dc50ab0ad05-part1

World Wide IdentifierWWID)可用于可靠的识别设备。SCSI标准要求全部SCSI设备提供一个持久的、系统无关的IDWWID标识符保证对每一个存储设备都是惟一的,而且独立于用于访问设备的路径。

这个标识符能够经过发出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-partlabel && by-partuuid

这两个和上面提到的by-labelby-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-labelby-uuid都和文件系统相关,by-label是经过读取设备中的内容获取,by-uuid则是随着每次文件系统的建立而建立,因此by-uuid的持久化程度更高一些;持久化程度最高的要属by-pathby-id了,由于它们都是根据物理设备的位置或者信息而和连接作对应的,by-path会由于路径的变化而变化;而by-id则不会由于路径或者系统的改变而改变,它只会在多路径的状况下发生改变。这两个在经过虚拟设备名称寻找物理设备的场景下都十分有用。

多路径设备则帮助咱们在SAN等场景下提升了数据传输的可用性,目前因为网络带宽的发展,它在iscsi场景下也频繁亮相。

Refer

相关文章
相关标签/搜索