问题现象
应用系统中存在着三个系统LUN,分别是SYS_LUN1、SYS_LUN2、SYS_LUN3,通常情况下,SYS_LUN3能正常挂载到sda盘符下,如下所示:
[root@hym ~]# cd /dev/disk/by-id/
[root@hym by-id]# ll
total 0
lrwxrwxrwx 1 root root 9 Apr 29 15:36 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN1 -> ../../sdb
lrwxrwxrwx 1 root root 9 Apr 29 15:36 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN2 -> ../../sdc
lrwxrwxrwx 1 root root 9 Apr 29 15::36 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN3 -> ../../sda
lrwxrwxrwx 1 root root 10 Apr 29 15:36 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN3 --part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Apr 29 15:36 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN3-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Apr 29 15:36 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN3-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 Apr 29 15:36 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN3-part4 -> ../../sda4
但在实际应用中,当系统中该节点发生重启后,SYS_LUN3会概率性挂载到sdc或者其他盘符下,也就是节点重启后linux挂载盘符发生了盘符漂移现象,如下所示:
[root@hym ~]# cd /dev/disk/by-id/
[root@hym by-id]# ll
total 0
lrwxrwxrwx 1 root root 9 Apr 29 14:09 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN1 -> ../../sda
lrwxrwxrwx 1 root root 9 Apr 29 14:09 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN2 -> ../../sdb
lrwxrwxrwx 1 root root 9 Apr 29 14:09 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN3 -> ../../sdc
lrwxrwxrwx 1 root root 10 Apr 29 14:09 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN3 --part1 -> ../../sdc1
lrwxrwxrwx 1 root root 10 Apr 29 14:09 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN3 --part2-> ../../sdc2
lrwxrwxrwx 1 root root 10 Apr 29 14:09 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN3 --part3 -> ../../sdc3
lrwxrwxrwx 1 root root 10 Apr 29 14:09 scsi-0QEMU_QEMU_HARDDISK_SYS_LUN3 --part4 -> ../../sdc4
由于系统中业务逻辑部分存在大量将SYS_LUN3与sda盘符进行绑定的操作,一旦发生盘符漂移现象,则导致SYS_LUN3挂载盘符与预期不一致,进而造成系统应用无法正常使用。
问题分析
有没有一种方法可以实现这种SYS_LUN3与sda盘符进行永久绑定,也就是指定盘符挂载方式,即使是系统节点发生重启也不受影响呢?
尝试利用Udev策略创建58-storage.rule规则来解决这个问题,但当系统重新启动时,却提示如下信息,即udev版本不支持重命名内核设备节点。
NAME=/sda%n ignored, kernel device nodes can not be renamed; please fix it in /etc/udev/rules.d/10-test.rules:2
其实,指定挂载盘符的方式并不合理。上述问题现象实际上是系统业务逻辑设计存在缺陷导致的,即逻辑设计中将SYS_LUN3与sda盘符进行绑定,未考虑到这种可能发生的盘符漂移问题。应用程序和用户不应该关心特定存储设备的系统LUN会挂载到那个分区上,因为系统重启后这些sdX盘符可能会发生更改,并且这种更改是符合预期的。
解决方案
1、动态适配SYS_LUN3挂载盘符。例如,当系统盘符挂载到sdc盘符时,业务逻辑需要跟着适配和绑定到sdc盘符,替代之前预期需要绑定到sda盘符的相关操作。
2、SYS_LUN3使用一些唯一或永久的属性进行绑定(例如LUN WWID或文件系统UUID),而不是sdX这种可能发生变化的盘符。
下面是在/etc/fstab中使用的一个样例:
[root@hym ~]# blkid | grep sda2
/dev/sda2: UUID="8418e5ee-4c32-4bd2-8e60-f8c16fcf1375" TYPE="ext3"
[root@hym ~]#
[root@hym ~]# grep "8418e5ee-4c32-4bd2-8e60-f8c16fcf1375" /etc/fstab
UUID=8418e5ee-4c32-4bd2-8e60-f8c16fcf1375 / ext3 rw,suid,dev,exec,auto,nouser,sync 1 1