linux硬盘挂载名称的几种方式和特点:by-uuid,by-path,by-id,/dev/sda

结论:在 /etc/fstab 配置文件中,使用什么形式的名称来标识和挂载磁盘:

1、如果不会发生磁盘硬件增删、交换接口位置的情况下,通常采用 /dev/sdx 的形式。

2、如果有可能发生磁盘硬件增删、交换接口位置,但不会发生磁盘LVM扩容或重新格式化的情况,可选 /dev/disk/by-uuid 。安装系统时,系统盘默认采用此方式,也是较为易用的方式。

3、如果有可能发生磁盘硬件增删、交换接口位置,也可能发生扩容或重新格式化的情况,但不会使用多路径设备的情况下,dev/disk/by-id 是较为稳定的选择,只受硬件序列号影响,不受格式化和扩容的影响。也是 Rad Hat 自动维护采用方式。

因此,通常情况下,较为稳定是使用 by-uuidby-id,而采用uuid的实际案例较多(无 lvm 的情况下首选),具体采用哪种,需要结合你的硬件软件环境来决定,请参考以下表格各形式特点。

----------以下是详细介绍----------

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

在 Linux 中,有以下方式可以对一个磁盘定位。

方式名称来源形式介绍磁盘名称发生改变,会引起挂载错误的情况
/dev/sd硬件位置顺序/dev/sda (也是最终显示名称形式)

磁盘通常是/dev/sda,/dev/sdb,/dev/vda 这样的名称,在开机时,会根据硬件顺序来依次命名 abcdefg,在通常不发生硬件改变的情况下,可以通过这些磁盘名称对磁盘进行各种操作,例如挂载,分区和格式化等等。

通过其它方式挂载后,df -hT 查看到的名称依然会显示为此名称。

如果你的机器上有不止一个SATA,SCSI或IDE磁盘控制器,那么它们所对应的设备节点将会依随机次序添加。这样就可能导致每次引导时设备的名字如/dev/sda与/dev/sdb互换了

1、增加或减少硬件会导致序号重排

2、硬盘拔插导致磁盘乱序等等,最终导致系统不可引导、kernel panic、或者设备不可见。

by-label创建分区时,自己取的名称/dev/disk/by-label/labelnamelabel表示标签的意思,即创建分区时,自己取的名称。几乎每一个文件系统都有一个标签。所有有标签的分区都在/dev/disk/by-label目录中列出。这个目录随着分区标签的变动而被动态地创建和销毁。标签必须是唯一的,标签是文件系统的一个属性,所以无法持久地表示单一磁盘阵列设备。
by-uuid (荐)分区格式化时通过文件系统工具生成/dev/disk/by-uuid/12d3b4c5-6e78-9010-a2c3-4f5c6b01fb2aUUID 是在分区格式化时通过文件系统工具生成,比如mkfs,这个唯一标识可以起到解决冲突的作用。即使设备发生物理位置变化,或插入到另一个系统(可能有一个标签相同的设备),它仍然是唯一的。

1、每当一个分区被调整时,如 lvm 分区调整。

2、分区重新格式化时,都会生成一个新的UUID。

by-path硬件物理端口路径/dev/disk/by-path/pci-0000:03:00.0-scsi-0:1:0:0-part1该符号名称通过用于访问设备的硬件路径引用存储设备,首先引用PCI hierachy中的存储控制器,并包括SCSI host、channel、target和LUN号,以及可选的分区号。

1、如果一个主机适配器切换到到一个不同的PCI插槽的话这个路径也会随之改变

2、如果HBA无法探测,或者如果驱动程序以不同的顺序加载,或者系统上安装了新的HBA,那么SCSI主机号都有可能会发生变化。

by-id (荐)硬件物理全局ID(WWID)或设备序列号/dev/disk/by-id/scsi-3600508e000000000ce506dc50ab0ad05
/dev/disk/by-id/wwn-0x600508e000000000ce506dc50ab0ad05
标识符是设备的属性,但不存储在设备的内容(即数据)中。该id从设备的全局ID(WWID)或设备序列号中获取。/dev/disk/by-id条目也可能包含一个分区号。World Wide Identifier(WWID)可用于可靠的识别设备。SCSI标准要求所有SCSI设备提供一个持久的、系统无关的ID。WWID标识符保证对每个存储设备都是唯一的,并且独立于用于访问设备的路径。

Red Hat Enterprise Linux 5自动维护即是采用从基于wwid的设备名称到系统上当前/dev/sd名称的正确映射。

一个设备可能会有多个id,使用其中之一就可以了。

1、当设备被插入到硬件控制器的端口时,而这个端口又受另一个子系统控制(即多路径),by-id的值也会改变。多路径设备会在下面详细讲解。

2、重配RAID,磁盘device ID会发生变化

3、virtualbox中,不建议,新导出的OVA文件启动新的虚拟机,会导致id变化。

by-partlabel && by-partuuid

这两个和上面提到的by-label和by-uuid类似,只不过是在GPT磁盘上。

以上名称均可通过 ls 或 blkid 命令获取

ls -l /dev/disk/by-uuid
ls -l /dev/disk/by-id
blkid -s UUID

总结:

为了方便管理和使用设备,linux操作系统给我们提供了上面这么多持久化命名方式。它们各自有各自的优势和使用场景。

by-label和by-uuid都和文件系统相关;

by-label是通过读取设备中的内容获取;

by-uuid则是随着每次文件系统的创建而创建,所以by-uuid的持久化程度更高一些;

持久化程度最高的要属by-path和by-id了,因为它们都是根据物理设备的位置或者信息而和链接做对应的,by-path会因为路径的变化而变化;而by-id则不会因为路径或者系统的改变而改变,它只会在多路径的情况下发生改变。这两个在通过虚拟设备名称寻找物理设备的场景下都十分有用。




多路径设备

所谓多路径设备指的是从一个系统到一个设备存在多个路径,这种现象主要出现在光纤网络的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名称的正确映射。这些名称即使是在路径发生改变时也是持久的,并且当从不同的系统访问设备时它们仍然是一致的。


参考文章:https://segmentfault.com/a/1190000020851019