解決CentOS下磁碟亂序的相關問題

來源:互聯網
上載者:User

解決CentOS下磁碟亂序的相關問題

大家在使用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 /data02ext4 defaults 0 0

/dev/slot03 /data03ext4 defaults 0 0

/dev/slot04 /data04ext4 defaults 0 0

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.