linux磁盘盘符漂移

1、Linux硬盘盘符分配原则

在Linux系统中,若存在多块硬盘,内核分配盘符的顺序是/dev/sda、/dev/sdb、/dev/sdc … …。在系统启动过程中,内核会按照扫描到硬盘的顺序分配盘符

内核中分配盘符函数,见链接http://ilinuxkernel.com/?p=794

 

Linux内核通过IDR(integer ID)整数ID管理机制来分配盘符,即找到一个空闲的整数。内核针对SCSI盘符,从0开始分配整数。整数0对应的盘符为/dev/sda,关系如下:

若index=0,则分配给此块SCSI硬盘的盘符为sda;

若index=1,则分配给此块SCSI硬盘的盘符为sdb;

… …

若index=25,则分配给此块SCSI硬盘的盘符为sdz;

如在有12硬盘的服务器中,每个物理槽位均插一块硬盘,且没有做RAID,硬盘物理槽位关系如下:

  0   3   6   9
  1   4   7   10
  2   5   8   11

那么Linux内核启动后,IDR机制分配的盘符的整数为0、1、2、3、4、5、6、7、8、9、10、11,对应的硬盘盘符如下:

系统运行过程中,若拔掉第5块盘,如下图所示:

则此时系统中,/dev/sde盘符消失,内核针对SCSI盘符的IDR整数4就空闲出来。当再次将该硬盘插入时,得到的盘符仍然是/dev/sde。

 

2、非热插拔硬盘盘符分配示例

如下图,第5个硬盘物理槽位没有硬盘。系统重启后,盘符对应关系如下。系统中没有盘符/dev/sdl,缺少不是最后一块硬盘,而是第5块硬盘。

下图是第5块和第9块物理槽位硬盘不在位时,OS盘符对应关系。

 

从这我们可以看出:
1)非热插拔的磁盘它盘符是按照整数ID来分配
2)由于是非热插拔磁盘不能在通电的时候插入磁盘

 

3、热插拔硬盘盘符分配示例

下图是第1、5、9块硬盘不在位时,OS盘符对应关系,此时没有热插拔硬盘。

系统运行过程中,先热插拔一块到第1个物理槽位,此时得到的盘符为/dev/sdj,然后插入一块硬盘到第9个物理槽位,此时分配的盘符为/dev/sdk。

若插入2块硬盘后,机器重启,则盘符对应关系如下。从这里我们可以看出,硬盘盘符和物理槽位没有必然直接对应关系。

 

从这我们可以看出
1)由于磁盘是热插拔的可以在通电的时候插入磁盘
2)新插入的磁盘盘符是按照整数ID顺序来进行分配的
3)建议平时我们不要随意挪动硬盘,避免系统盘和数据盘调混了

 

4、硬盘盘符为什么会漂移

服务器只有12块物理硬盘,但在系统运行过程中或更换硬盘时,会出现/dev/sdm、/dev/sdn等类似盘符。

下面示例,系统运行过程中,我们把第5块硬盘拔出再插入,此时得到的硬盘盘符可能为/dev/sdm。

当我们拔出硬盘后,内核会调用sd_remove()函数卸载硬盘,正常情况下会清除该硬盘盘符占用的所有资源,包括SCSI盘符对应的IDR整数。但我们拔出硬盘时,若系统有进程正在访问该硬盘,则内核不会删除对应IDR的整数,该整数就会被占用,再次插入硬盘时,就分配新的IDR整数给盘符,导致盘符漂移。

如上面第5块硬盘,内核分配的IDR值为4,但硬盘拔出再插入后,应为IDR值为4没被释放,内核找到空闲的IDR就会12,此时盘符就变为/dev/sdm。盘符变为/dev/sdn等时,以此类推

 

参考链接:https://ilinuxkernel.com/?p=958

posted on 2021-03-02 20:46  gentleman_hai  阅读(3765)  评论(0编辑  收藏  举报

导航