解析linux下磁盘乱序的问题

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

大家在使用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

   



本文转自 gehailong 51CTO博客,原文链接:http://blog.51cto.com/gehailong/1546206,如需转载请自行联系原作者

相关文章
|
1月前
|
Ubuntu Linux Shell
Linux系统中如何查看磁盘情况
【9月更文挑战第3天】在Linux系统中,有多种方式查看磁盘情况。可通过命令行工具`df`查看文件系统磁盘使用情况,选项`-h`以人类可读格式显示,`-T`显示文件系统类型;`du`命令显示目录或文件磁盘使用情况,`-h`以人类可读格式显示,`-s`仅显示总计;`fdisk -l`列出磁盘和分区信息。此外,图形界面的磁盘管理工具和文件管理器也可用于查看磁盘使用情况。这些方法有助于更好地管理磁盘空间。
|
2月前
|
存储 监控 安全
在Linux中,⼀个EXT3的文件分区,当使用touch test.file命令创建⼀个新文件时报错,报错的信息是提示磁盘已满,但是采用df -h命令查看磁盘大小时,只使用了,60%的磁盘空间,为什么会出现这个情况?
在Linux中,⼀个EXT3的文件分区,当使用touch test.file命令创建⼀个新文件时报错,报错的信息是提示磁盘已满,但是采用df -h命令查看磁盘大小时,只使用了,60%的磁盘空间,为什么会出现这个情况?
|
2月前
|
网络协议 Linux Docker
在Linux中,如何指定dns服务器,来解析某个域名?
在Linux中,如何指定dns服务器,来解析某个域名?
|
8天前
|
存储 Linux 5G
Linux 基于 LVM 逻辑卷的磁盘管理【简明教程】
这篇文章介绍了LVM(逻辑卷管理)如何提供灵活的磁盘管理方式,允许动态调整逻辑卷的大小而不会丢失数据。
Linux 基于 LVM 逻辑卷的磁盘管理【简明教程】
|
2月前
|
图形学 开发者 存储
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
68 3
|
2月前
|
存储 监控 Linux
|
2月前
|
监控 Shell Linux
在Linux中,如何使用shell脚本检测磁盘使用率?
在Linux中,如何使用shell脚本检测磁盘使用率?
|
2月前
|
网络协议 Linux
在Linux中,如何改IP、主机名、DNS?
在Linux中,如何改IP、主机名、DNS?
|
2月前
|
域名解析 网络协议 Linux
在Linux中,我们都知道,dns采用了tcp协议,又采用了udp协议,什么时候采用tcp协议?什么 时候采用udp协议?为什么要这么设计?
在Linux中,我们都知道,dns采用了tcp协议,又采用了udp协议,什么时候采用tcp协议?什么 时候采用udp协议?为什么要这么设计?
|
2月前
|
缓存 网络协议 Linux
在Linux中,当用户在浏览器当中输入⼀个网站,计算机对dns解释经过那些流程?
在Linux中,当用户在浏览器当中输入⼀个网站,计算机对dns解释经过那些流程?
下一篇
无影云桌面