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

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2025-01-29 23:59:49

解析Linux下磁盘乱序的问题的相关文章

linux下磁盘容量和df命令原理

df命令是linux下查看磁盘容量的常用命令.可以列出block数量,总容量,使用率等.这次使用python编写一个类似功能的模块,顺便学习一下df的原理. 直接输入df命令可以看到 Filesystem 1k-blocks Used Available Use% Mounted on 磁盘设备 blocks个数 使用的容量 有效容量 空闲率 挂载点 接下来就是这些参数怎么来的问题. /etc/mtab文件 /etc/mtab可以读出的是已经挂载的盘的信息,包括磁盘设备,挂载点,文件系统类型等.

深入解析Linux下MySQL数据库的备份与还原_Mysql

深入解析Linux下MySQL数据库的备份与还原 1. 备份 [root@localhost ~]# cd /var/lib/mysql (进入到MySQL库目录,根据自己的MySQL的安装情况调整目录) [root@localhost mysql]# mysqldump -u root -p voice>voice.sql,输入密码即可. 2. 还原法一:[root@localhost ~]# mysql -u root -p 回车,输入密码,进入MySQL的控制台"mysql>&

linux下磁盘相关工具(待整理)

一.概述: fsck tune2fs mke2fs badblocks mkfs* fdisk mount umount mknod e2label blkid hdparm mkswap swapon smartctl  #yum install smartmontools 二. (1): fsck:检查文件系统并尝试修复错误.当文件系统发生错误时,可用fsck指令尝试加以修复.但是注意,在没有错误的系统上慎用,不然有可能引起系统文件错误.一般都是在单用户模式中或系统启动时使用. http:/

位图解析-linux下/dev/fb0怎样解析成windows下可以显示的图片

问题描述 linux下/dev/fb0怎样解析成windows下可以显示的图片 cat /dev/fb0 > /tmp/jietu 这样截取到的原始位图,复制到windows下之后改名为.png或者.bmp都不能打开: 据说要根据设备分辨率和颜色位深解析之后才可以,求具体解析算法,最好有代码~~ 解决方案 文件/dev/fb0就是控制屏幕上的每一点的颜色的文件. 然后通过 FrameBuffer 机制,把屏幕上的每个点映射成一段线性内存空间,最终可以获取到显示缓冲,即屏幕上显示的内容的图片. 解

深入解析Linux下的定时任务

在有了邮件的告警功能后,下一步要做的就是做一个定时任务,让这个任务按周期执行,这样就能周期性地收到告警信息了   在做定时任务之前,先检查一下当前的系统时间[date  "+%Y-%m-%d %T"]和硬件时钟时间[hwclock]: [root@localhost test]# date  "+%Y-%m-%d %T" 2013-07-01 07:57:52 [root@localhost test]# hwclock 2013年07月01日 星期一 07时57分

深入解析Linux下的定时任务_unix linux

在做定时任务之前,先检查一下当前的系统时间[date  "+%Y-%m-%d %T"]和硬件时钟时间[hwclock]: [root@localhost test]# date  "+%Y-%m-%d %T"2013-07-01 07:57:52 [root@localhost test]# hwclock2013年07月01日 星期一 07时57分48秒  -0.059059 seconds 上面的结果显示,我当前的时钟时间都不正确,先设置系统时间:[root@l

深入解析Linux下\r\n的问题_C 语言

常在Linux下操作,难免要遇到\r\n问题,特别在很多地方比如最近的邮件发送,怎么都\r\n了,以前只有\n的时代好像已经过去了,因为我是一个比较喜欢总结的人,一个喜欢理论先行的人,所以,认真的测试并且理解了一番,尽管我个人认为是比较可以了,但,如果哪位高手看出了不妥之处,不吝赐教!一.例子源文件:main.c例一:#include <stdio.h>int main(void){       printf("dddddd"); //6个d       printf(&q

深入解析Linux下的磁盘缓存机制与SSD的写入放大问题

前段时间在开发一个使用SSD做缓存的系统,在高速写入数据时会出现大量的磁盘缓存.太多的磁盘缓存如果没有及时的写入磁盘中,在机器出现问题时是非常危险的,这样会导致很多的数据丢失,但是如果实时的将数据刷入磁盘中,这样写入效率有太低了.为了弄明白Linux系统的这种磁盘写入特性,最近深入的学习了一下. VFS(Virtual File System)的存在使得Linux可以兼容不同的文件系统,例如ext3.ext4.xfs.ntfs等等,其不仅具有为所有的文件系统实现一个通用的外接口的作用,还具有另一

linux下磁盘管理之利器 lvm使用介绍

一.LVM 简介   LVM(Logical Volume Manager)是一个应用于Linux的内核的逻辑卷管理器,是Linux环境下对磁盘进行分区管理的一种机制.先介绍几个有关LVM的名词    1.PV(物理卷)可以是一个磁盘,一个分区.由PE(物理盘区)组成,多个PV可以组成一个VG(卷组).    2.VG(卷组)多个物理卷组成的一个组,但是卷组不可以直接使用,需要在上面创LV(逻辑卷)才可以使用.VG上可以创建多个LV.    3.PE(物理盘区)就像我们之前学习的磁盘的block