解析linux下磁盘乱序的问题


你们在使用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 来一块儿交流。

相关文章
相关标签/搜索