使用udev解决RedHat AS4.2下裸磁盘设备名称重启后发生改变的问题
一、 组网:
服务器上安装RedHat AS 4.2操作系统,后端存储为H3C IX5000或IX1000
二、 问题描述:
在RedHat AS 4.2上通过iSCSI协议连接IX5000提供的存储空间,IX5000分了3个卷给服务器,三个卷分别为:volume1, volume12, volume13,在服务器上执行fdisk -l,发现:
v1对应设备名sdb
v2对应设备名sdc
v3对应设备名sdd
执行service iscsi restart后,发现
v2对应设备名sdb
v1对应设备名sdc
v3对应设备名sdd
v1和v2的设备名发生了互换变化,这种情况重启系统后也回发生,即磁盘对应的设备名称无法固定。如果有数据库等应用需要使用磁盘裸设备,势必会出现因为设备名称发生改变而造成应用程序无法正常读取数据的现象。
三、 过程分析:
无
四、 解决方法:
解决磁盘设备名称不能固定的问题,有两种方法,一种方法是使用Linux系统自带的LVM(逻辑卷管理器)功能,另一种方法是使用Linux下的udev,这里我们使用udev的方法。
在Linux下udev类似与硬件即插即用管理器,它能让硬件即插即用。udev可以通过读取事先编辑好的规则对设备进行命名,那么我们就可以根据每个磁盘的特征编辑规则,使得磁盘每次被系统识别后的名称都保持不变。
接下来,我们通过具体的实例来说明如何使用udev解决设备名称无法固定的问题。
先在IX5000上分配两个卷test1(100GB)和test3(130GB),之后在Red Hat AS4.2上通过软件iSCSI initiator连接并识别到磁盘,卷test3(130GB)被识别为sdb,卷test1(100GB)被识别为sdc。对sdb和sdc进行分区,每个磁盘都全部被分为一个主分区,分别是sdb1和sdc1。
我们通过通过udevinfo查看sdb1及sdc1的一些属性(注意蓝色字体部分),通过分析,目前来看只有SYSFS{size}这个值可以用来唯一标识磁盘(前提是IX5000上分配给服务器的各个卷的大小都不同):
[root@as42-113 rules.d]# udevinfo -a -p /sys/block/sdb/sdb1
udevinfo starts with the device the node belongs to and then walks up the
device chain, to print for every device found, all possibly useful attributes in the udev key format.
Only attributes within one device section may be used together in one rule,
to match the device for which the node will be created.
looking at class device '/sys/block/sdb/sdb1':
SYSFS{dev}="8:17"
SYSFS{size}="272622987"
SYSFS{start}="63"
SYSFS{stat}=" 0 0 0 0"
follow the class device's "device"
looking at the device chain at '/sys/devices/platform/host4/target4:0:0/4:0:0:0':
BUS="scsi"
SYSFS{detach_state}="0"
SYSFS{device_blocked}="0"
SYSFS{model}="IP SAN "
SYSFS{queue_depth}="32"
SYSFS{rev}="1 "
SYSFS{scsi_level}="5"
SYSFS{state}="running"
SYSFS{timeout}="30"
SYSFS{type}="0"
SYSFS{vendor}="H3C "
looking at the device chain at '/sys/devices/platform/host4/target4:0:0':
BUS=""
SYSFS{detach_state}="0"
looking at the device chain at '/sys/devices/platform/host4':
BUS=""
SYSFS{detach_state}="0"
looking at the device chain at '/sys/devices/platform':
BUS=""
SYSFS{detach_state}="0"
记录下磁盘的唯一属性后,我们在/etc/udev/rules.d/目录下新建一个规则文件:15-udev.rules
[root@as42-113]# vi /etc/udev/rules.d/15-udev.rules
在文件中添加以下两行:
KERNEL="sd*", SYSFS{size}="272622987", NAME="test3"
KERNEL="sd*", SYSFS{size}="209712447", NAME="test1"
在本例中,test3将代表IX5000上分配过来的130GB的test3卷,test1将代表IX5000上分配过来的130GB的test1卷,SYSFS{size}="272622987"是通过udevinfo -a -p /sys/block/sdb/sdb1查看得到的值,SYSFS{size}="209712447"是通过udevinfo -a -p /sys/block/sdb/sdc1查看得到的值。
编辑完规则文件后,通过/sbin/start_udev命令使udev重新读取规则文件
[root@as42-113 ~]# /sbin/start_udev
Starting udev: [ OK ]
之后通过ls /dev/test*可以查看在/dev目录下有了两个新的设备。
[root@as42-113 ~]# ls -l /dev/test*
brw------- 1 root root 8, 17 Mar 27 20:16 /dev/test1
brw------- 1 root root 8, 65 Mar 27 20:16 /dev/test3
用fdisk –l /dev/test3 可以验证/dev/test3表示的就是卷test3(130GB)在服务器上对应的磁盘分区。
[root@as42-113 ~]# fdisk -l /dev/test3
Disk /dev/test3: 139.5 GB, 139582969344 bytes
255 heads, 63 sectors/track, 16969 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/test3 doesn't contain a valid partition table
以后应用程序在使用裸磁盘时,使用设备/dev/test1及/dev/test3即可。
至此我们完成了udev的配置,解决了磁盘名称不固定的问题。
注意使用udev这种方法的前提是RedHat AS 4.2上识别到的各个磁盘的大小是不一样的。
该案例暂时没有网友评论
✖
案例意见反馈
亲~登录后才可以操作哦!
确定你的邮箱还未认证,请认证邮箱或绑定手机后进行当前操作