qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          解析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

          posted on 2014-09-01 10:52 順其自然EVO 閱讀(349) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2014年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 台北市| 彭泽县| 介休市| 泊头市| 恩平市| 玉树县| 瑞金市| 定结县| 合水县| 晴隆县| 平泉县| 江阴市| 闽清县| 浏阳市| 于田县| 淮南市| 嘉兴市| 沁水县| 大庆市| 甘德县| 互助| 鄱阳县| 乌兰浩特市| 乌恰县| 蓬溪县| 商河县| 吴忠市| 泾阳县| 宁海县| 资中县| 屏南县| 丹棱县| 台南市| 崇礼县| 开江县| 西昌市| 留坝县| 台北县| 抚宁县| 吉林市| 农安县|