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