解析Linux下磁盤亂序的問題
大家在使用linux過程當中肯定遇到過磁盤亂序的問題。一般情況下引起磁盤亂序有幾種可能,比如磁盤是通過raid卡連接到服務器的,raid卡電池沒電來,這時候如果服務器掉電的情況下可能會引起磁盤亂序。再就是比如新的服務器,但raid驅動是比較老的版本,一旦重啟也經常會有亂序的可能。再就是服務器磁盤較多,sata/ssd存在混用的情況下也會有亂序的可能。
針對這種亂序的情況應該如何解決呢?這里我總結了一種比較好的結局方法。下面這個腳本的目的是通過udevinfo(centos5)或者udevadm(centos6)來獲得磁盤的設備號,這個設備號是不會隨著服務器的重啟而改變的。獲得這個設備號后在/dev/下生成以slot0開通的相應的設備,比如有5塊磁盤則生成slot0-4這樣5個設備。這時候再掛載的時候用這些槽號來掛載就ok來。腳本如下:
#!/bin/bash #set -x function get_release() { while read i do release=`echo "$i" |grep"release" |awk '{print $3;}'` main_version=${release:0:1} 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 |