服務器下的硬盤主有機械硬盤、固態硬盤以及raid陣列,通常內核分配盤符的順序是/dev/sda、/dev/sdb… …。在系統啟動過程中,內核會按照掃描到硬盤的順序分配盤符(先分配直通的,再分配陣列)。在同一個硬盤槽位,熱插拔硬盤,系統會順着已存在的盤符分配下去,如之前分配的是/dev/sdb,系統最后一塊硬盤是/dev/sdf,那么/dev/sdb/熱拔插后,系統會重新分配這塊硬盤的盤符為/dev/sdg,出現盤符錯亂的情況。
假設機器上有14個硬盤槽位,槽位號分別為0~13,在Centos7.3環境下,R730XD服務器分配槽位如下:
0 | 3 | 6 |
1 | 4 | 7 |
2 | 5 | 8 |
/dev/sda | /dev/sdd | /dev/sdg |
/dev/sdb | /dev/sde | /dev/sdh |
/dev/sdc | /dev/sdf | /dev/sdi |
在此種情況下,我們應該可以用以下方法解決盤符錯位的問題:
[root@localhost ~]# udevadm info -q path -n /dev/sda
/devices/pci0000:00/0000:00:1f.2/ata5/host5/target5:0:0/5:0:0:0/block/sda
按此方法分別獲取sdb sdc sdd, 然后自定義規則:
[root@localhost rules.d]# pwd /usr/lib/udev/rules.d
[root@localhost rules.d]# vi 100-define.rules
# define by self ACTION=="remove", GOTO="drivers_end" ENV{MODALIAS}=="?*", RUN{builtin}+="kmod load $env{MODALIAS}" SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="SD", RUN{builtin}+="kmod load tifm_sd" SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="MS", RUN{builtin}+="kmod load tifm_ms" SUBSYSTEM=="memstick", RUN{builtin}+="kmod load ms_block mspro_block" SUBSYSTEM=="i2o", RUN{builtin}+="kmod load i2o_block" SUBSYSTEM=="module", KERNEL=="parport_pc", RUN{builtin}+="kmod load ppdev" KERNEL=="mtd*ro", ENV{MTD_FTL}=="smartmedia", RUN{builtin}+="kmod load sm_ftl" DEVPATH=="/devices/pci0000:00/0000:00:1f.2/ata5/host5/target5:0:0/5:0:0:0/block/sda", NAME="sda", MODE="0660" DEVPATH=="/devices/pci0000:00/0000:00:01.0/0000:01:00.0/host0/target0:2:0/0:2:0:0/block/sdb", NAME="sdb", MODE="0660" DEVPATH=="/devices/pci0000:00/0000:00:01.0/0000:01:00.0/host0/target0:2:1/0:2:1:0/block/sdc", NAME="sdc", MODE="0660" DEVPATH=="/devices/pci0000:00/0000:00:01.0/0000:01:00.0/host0/target0:2:2/0:2:2:0/block/sdd", NAME="sdd", MODE="0660" LABEL="drivers_end" [root@localhost rules.d]#
這樣對應的插槽的第二個就會一直對應盤符sdc 而不會出現跳盤符的問題了。
我們可以用個小腳本實現綁定所有的盤符和槽位
#!/bin/bash disk="a b c d e f g h i j k l i j k m n" for i in ${disk}; do a=`/usr/sbin/udevadm info -q path -n /dev/sd${i}`; if [ ! -n "$a" ]; then break 1 ; else echo DEVPATH=="\"${a}"\", NAME="\"sd${i}"\", MODE="\"0660"\">>/etc/udev/rules.d/80-mydisk.rules; fi done