你們在使用linux過程中確定遇到過磁盤亂序的問題。通常狀況下引發磁盤亂序有幾種可能,好比磁盤是經過raid卡鏈接到服務器的,raid卡電池沒電來,這時候若是服務器掉電的狀況下可能會引發磁盤亂序。再就是好比新的服務器,但raid驅動是比較老的版本,一旦重啓也常常會有亂序的可能。再就是服務器磁盤較多,sata/ssd存在混用的狀況下也會有亂序的可能。linux
針對這種亂序的狀況應該如何解決呢?這裏我總結了一種比較好的結局方法。下面這個腳本的目的是經過udevinfo(centos5)或者udevadm(centos6)來得到磁盤的設備號,這個設備號是不會隨着服務器的重啓而改變的。得到這個設備號後在/dev/下生成以slot0開通的相應的設備,好比有5塊磁盤則生成slot0-4這樣5個設備。這時候再掛載的時候用這些槽號來掛載就ok來。腳本以下:centos
#!/bin/bashbash
#set -x服務器
function get_release()運維
{ide
while read ispa
dorem
release=`echo "$i" |grep"release" |awk '{print $3;}'`get
main_version=${release:0:1}cmd
if [ ! -z $main_version ]
then
echo $main_version
return 0
fi
done < "/etc/redhat-release"
return 1
}
function get_id_serial()
{
device=$1;
if [ -z "$device" ]
then
return -1
fi
device=`basename $device`
main_version=`get_release`
if [ $? -ne 0 ]
then
echo "get centos release versionerror" 1>&2
return $?
fi
case $main_version in
"5" ) cmd="/usr/bin/udevinfo-q all -n $device" ;;
"6" ) cmd="/sbin/udevadminfo --query=all --name=$device" ;;
esac
ID_SERIAL=$( $cmd |grep"ID_SERIAL=" |awk -F '=' '{print $2;}')
if [ -z $ID_SERIAL ]
then
return 1
fi
echo -n "$ID_SERIAL"
return 0
}
diskctl_config="/etc/udev/rules.d/99-hd.rules"
rm -rf $diskctl_config
diskctl_db="/usr/diskctl/diskctl.db"
rm -rf $diskctl_db
mkdir -p /usr/diskctl
touch $diskctl_db
index=0
for i in /dev/sd*[a-z]
do
device=`basename $i`
ID_SERIAL=`get_id_serial $i`
if [ $? -ne 0 ]
then
echo "FATAL: get ID_SERIAL error" 1>&2
exit 1
fi
slot=`printf "slot%02d" $index`
echo"KERNEL==\"sd*[a-z]\",ACTION==\"add\",ENV{ID_SERIAL}==\"$ID_SERIAL\",SYMLINK+=\"$slot\"">> $diskctl_config
echo"KERNEL==\"sd*[0-9]\",ACTION==\"add\",ENV{ID_SERIAL}==\"$ID_SERIAL\",SYMLINK+=\"$slot-part%n\"">> $diskctl_config
echo"KERNEL==\"sd*[a-z]\",ACTION==\"remove\",ENV{ID_SERIAL}==\"$ID_SERIAL\",RUN+=\"/bin/rm-f /dev/$slot /dev/$slot-part*\"" >> $diskctl_config
echo "#split$ID_SERIAL#############################" >> $diskctl_config
ID_SN=`smartctl -i $i 2>/dev/null |grep"Serial\s*number" -i |awk '{print $3;}'`
if [ -z "$ID_SN" ]
then
ID_SN="error"
fi
echo "$slot $ID_SERIAL $ID_SN" >> $diskctl_db
((index=index+1))
Done
/sbin/udevcontrolreload_rules
/sbin/start_udev
/etc/fstab裏面以相似下面的方式來掛載:
/dev/slot02 /data02 ext4 defaults 0 0
/dev/slot03 /data03 ext4 defaults 0 0
/dev/slot04 /data04 ext4 defaults 0 0
對了你們以爲若是對本身還有那麼一點點幫助的,但願你們多點贊,多評論,感謝!!!你們能夠加入運維交流羣:325525293 來一塊兒交流。