解析linux下磁碟亂序的問題

2021-09-22 05:21:26 字數 2169 閱讀 8693

大家在使用linux過程當中肯定遇到過磁碟亂序的問題。一般情況下引起磁碟亂序有幾種可能,比如磁碟是通過raid卡連線到伺服器的,raid卡電池沒電來,這時候如果伺服器掉電的情況下可能會引起磁碟亂序。再就是比如新的伺服器,但raid驅動是比較老的版本,一旦重啟也經常會有亂序的可能。再就是伺服器磁碟較多,sata/ssd存在混用的情況下也會有亂序的可能。

針對這種亂序的情況應該如何解決呢?這裡我總結了一種比較好的結局方法。下面這個指令碼的目的是通過udevinfo(centos5)或者udevadm(centos6)來獲得磁碟的裝置號,這個裝置號是不會隨著伺服器的重啟而改變的。獲得這個裝置號後在/dev/下生成以slot0開通的相應的裝置,比如有5塊磁碟則生成slot0-4這樣5個裝置。這時候再掛載的時候用這些槽號來掛載就ok來。指令碼如下:

#!/bin/bash

#set -x

function get_release()

'`main_version=$

if [ ! -z $main_version ]

then

echo $main_version

return 0

fidone < "/etc/redhat-release"

return 1

}function get_id_serial()

')if [ -z $id_serial ]

then

return 1

fiecho -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]

dodevice=`basename $i`

id_serial=`get_id_serial $i`

if [ $? -ne 0 ]

then

echo "fatal: get id_serial error" 1>&2

exit 1

fislot=`printf "slot%02d"  $index`

echo"kernel==\"sd*[a-z]\",action==\"add\",env==\"$id_serial\",symlink+=\"$slot\"">> $diskctl_config

echo"kernel==\"sd*[0-9]\",action==\"add\",env==\"$id_serial\",symlink+=\"$slot-part%n\"">> $diskctl_config

echo"kernel==\"sd*[a-z]\",action==\"remove\",env==\"$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 ''`

if [ -z "$id_sn" ]

then

id_sn="error"

fiecho "$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

ORACLE RAC環境下讀取序列亂序問題

在資料庫部署了rac環境之後,偶爾會出現從oracle sequence所取出來的數是混亂的,比如第二次比第一次所取的數要小。這樣當程式的邏輯依賴於id的大小來排序時,就會產生系統混亂。其實問題是出在資料庫是個rac環境,序列是被共享的,序列預設是有快取的。假設rac上的兩個節點上序列快取設為20,...

深入解析Linux下 r n的問題

from 一 例子 原始檔 main.c 例一 include int main void 結果 空 例二 printf dddddd r printf 12345 結果 空 例三 printf dddddd n printf 12345 結果 dddddd 例四 printf dddddd r p...

Linux下的磁碟快取

前段時間在開發乙個使用ssd做快取的系統,在高速寫入資料時會出現大量的磁碟快取。太多的磁碟快取如果沒有及時的寫入磁碟中,在機器出現問題時是非常危險的,這樣會導致很多的資料丟失,但是如果實時的將資料刷入磁碟中,這樣寫入效率有太低了。為了弄明白linux系統的這種磁碟寫入特性,最近深入的學習了一下。vf...