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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM