linux盘符漂移问题及解决方案

在Linux系统中,若存在多块硬盘,通常内核分配盘符的顺序是
/dev/sda、/dev/sdb、/dev/sdc ……
在系统启动过程中,内核会按照扫描到硬盘的顺序分配盘符。
在系统启动后,热插拔硬盘硬盘,系统会顺序分配盘符。在同一个硬盘槽位,每次插入硬盘后,在系统中的盘符都可能不一致。第一次插入时,盘符可能为/dev/sdb,将硬盘拔除后,再次插入硬盘,盘符可能变为/dev/sde,就会出现盘符漂移。

假设机器上有6个硬盘槽位,槽位号分别为0~5。其中1、2、5槽位有硬盘,则Linux系统后

x 0 √ 2 x 4
√ 1 x 3 √ 5

所得到的系统盘符对应关系为:1槽位的硬盘盘符为/dev/sdb,2槽位的硬盘盘符为/dev/sdb,3槽位的硬盘盘符为/dev/sdc。

x 0 sdb 2 x 4
sda 1 x 3 sdc 5

系统启动后,我们热插拔硬盘,将一块硬盘插入3槽位,则该硬盘的盘符为/dev/sdd。

x 0 sdb 2 x 4
sda 1 sdd 3 sdc 5

再分别在0和4槽位插入硬盘,则系统盘符为:

sde 0 sdb 2 sdf 4
sda 1 sdd 3 sdc 5

从上面,我们可以可以看出,Linux分配给硬盘的盘符与所在槽位没有关系,只与插入硬盘的顺序有关。

同时即使在同一槽位的硬盘,也会存在盘符漂移现象。如,当系统中有进程正在读写磁盘/dev/sdd,若此时我们将该硬盘拔除,稍后将硬盘插入,此时得到的盘符可能为/dev/sdg,而不是所希望的/dev/sdd。

sde 0 sdb 2 sdf 4
sda 1 sdg 3 sdc 5

盘符漂移现象,给用户带来很大不便,尤其是使用裸设备的用户。

解决方案有两种:

1. 用户态,业务自己写脚本来实现绑定;

方案一

如下所示的fstab,系统启动时,会自动执行每一行挂载动作,将/dev/sda挂载到/data/disk1,其它依此类推。如果磁盘发生热插拔,第一块磁盘的盘符由原来的/dev/sda变成了/dev/sdc,那么fstab就不能正确挂载第一块磁盘。

/dev/sda /data/disk1 ext4 defaults,noatime 0 0 
/dev/sdb /data/disk2 ext4 defaults,noatime 0 0

为了保证在发生盘符漂移时,磁盘仍能正常挂载,首先对fstab做如下改进,按磁盘标签来挂载;比如第一行的含义是,将标签为disk1的磁盘挂载到/data/disk1。

LABEL=disk1 /data/disk1 ext4 defaults,noatime 0 0 
LABEL=disk2 /data/disk2 ext4 defaults,noatime 0 0

接下来的问题就是如何给磁盘设置标签,针对ext系列的文件系统,可通过e*label来设置标签;也可在磁盘format时设置标签。

mke4fs /dev/sda -L disk1 

或者

mke4fs /dev/sda; e4label /dev/sda disk1

通过上述设置后,磁盘/dev/sda就拥有了标签disk1,在fstab里挂载拥有disk1标签的磁盘,即挂载/dev/sda,即使这块磁盘的盘符发生了变化,由于其标签没变,fstab也能正确的将其挂载;通过mke4fs或e4label设置的标签,标签实际上是跟文件系统绑定的,是文件系统超级块的一部分,可通过tune4fs查询到。

方案二

设置标签后,如果磁盘上的文件系统被重新格式化,则其原来设置的标签也就不复存在了,这也正是标签机制不足的地方;如果要解决这个问题,可通过在fstab里按UUID来挂载磁盘,UUID对于磁盘来说是不变的,不论其盘符、标签是否变化;但使用UUID的缺陷在于灵活性不足,不利于大批量部署。

UUID=356fdf58-6923-43d5-9a09-349159c7c8a6 /data/disk1 ext4 defaults,noatime 0 0 
UUID=3b93fbad-bea2-4cbb-9a76-b4885924d287 /data/disk1 ext4 defaults,noatime 0 0
2. 内核态

修改内核和驱动来实现盘符绑定,用户态不需要做任何操作;(这个涉及磁盘驱动的修改,就要推动硬件厂商也跟随,比较难)

原文链接:https://blog.csdn.net/chyq112366/article/details/90084152

你可能感兴趣的:(linux盘符漂移问题及解决方案)