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盘符对应关系。
3、热插拔硬盘盘符分配示例
下图是第1、5、9块硬盘不在位时,OS盘符对应关系,此时没有热插拔硬盘。
系统运行过程中,先热插拔一块到第1个物理槽位,此时得到的盘符为/dev/sdj,然后插入一块硬盘到第9个物理槽位,此时分配的盘符为/dev/sdk。
若插入2块硬盘后,机器重启,则盘符对应关系如下。从这里我们可以看出,硬盘盘符和物理槽位没有必然直接对应关系。
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) 编辑 收藏 举报