Linux盘符漂移

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

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

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

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

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


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

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



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

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



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


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

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

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

Linux内核盘符绑定实现

在应用层,用户可以编写脚本,来避免盘符漂移带来的不便,但这种方式增加了上层软件的复杂性,同时可能会导致可靠性问题。

我们实现了通过修改内核和驱动来实现盘符绑定。对用户完全透明,且对内核其他模块、上层程序无任何影响。

如同样是有6个硬盘槽位的系统,1、2、5槽位有硬盘,则系统系统后,硬盘盘符对应关系为1 –> /dev/sdb,2 -> /dev/sdc,5-> /dev/sdf。

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



即实现槽位号与盘符完全绑定。

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

当我们在空的槽位上,插入硬盘时,不管插入空槽位插入硬盘顺序如何,得到的盘符始终是和槽位号绑定。

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

在我们的实现方案中,已实现以下功能:

  • 完全实现盘符与槽位绑定。

    根据硬盘所在槽位ID号来分配盘符。

  • 系统启动时,盘符与槽位绑定。

若相应的槽位上没有硬盘,则保留相应的盘符。

  • 热插拔硬盘后,盘符不变;对应的磁盘上有I/O操作时,盘符不变。

    系统运行过程中,插入硬盘后,根据槽位号分配盘符。

  • 保留n盘符/dev/sda …给硬盘。插拔U盘、USB光驱,不影响。
  • 服务器认证

    内核自动识别机器是否为特定品牌服务器。若为该品牌服务器,则提供盘符绑定功能。否则,按内核默认策略为磁盘分配盘符。

  • 支持多种磁盘控制器

    包括LSISAS1064、LSISAS1064E、LSISAS1068、LSISAS1068E。

  • 支持所有版本内核

    包括RHEL4/5/6系列、SLES9/10/11系列。

  •  

  •  

  •  

  •