今天在进行iscsi实验时,发现同一个iscsi设备在初始化后会出现设备名称不一样的情况,该情况发生在

1.两个机器挂在同意iscsi设备,但是在每个机器上的设备名称不一致(使用相同脚本的将不可使用)

2.单个机器上如果增加了磁盘,并且如果增加时iscsi未挂在(启动顺序可能导致),就会出现设备名称改变

为了解决设备名称固定,可以使用udev工具,下面是转载相关资料

相同名称的设备文件在不同的系统中可能对应的是不同的磁盘。以下展示了一个实例,挂载到本地服务器的设备名称都是/dev/sdd,但对应的却不是同一个iSCSI磁盘。 
节点1通过执行fdisk -l查看到的/dev/sdd设备文件大小情况如下: 
Disk /dev/sdd: 5502 MB, 5502926848 bytes 
170 heads, 62 sectors/track, 1019 cylinders 
Units = cylinders of 10540 * 512 = 5396480 bytes 
节点1/dev/sdd设备文件对应的LUN大小为5502MB。 
节点2通过执行fdisk -l查看到的/dev/sdd设备文件大小情况如下: 
Disk /dev/sdd: 1073 MB, 1073741824 bytes 
34 heads, 61 sectors/track, 1011 cylinders 
Units = cylinders of 2074 * 512 = 1061888 bytes 
节点2/dev/sdd设备文件对应的LUN大小为1073MB。显然,两个节点/dev/sdd对应的并不是同一个设备。 
如果在环境中使用/dev/sd*的设备文件来管理和使用存储,而相同名称的设备文件对应的iSCSI磁盘却是不同的,这样就会导致操作的失败。例如,在第一个节点将分区/dev/sdd1格式化成OCFS2挂载到某个节点,在第二个节点执行同样的挂载命令就会失败,因为第二个节点的/dev/sdd1分区和第一个节点并不是同一个分区,即使挂载成功也不是相同的共享存储。 
Linux平台为了解决这个问题,使两个节点的设备文件都能相互对应,需要使用udev动态设备文件管理工具。它是一个默认安装并在系统启动时最先加载的工具,使用它能配置相应的设备加载规则,udev通过定义的规则来生成相应的设备文件。在指定规则下能够使用磁盘唯一标识的属性作为生成设备文件名称的一部分,就能在不同的节点保证相同名称的设备文件指向相同的iSCSI磁盘。 
下面举例说明udev的配置方法。 
udev的配置主目录是/etc/udev,包含以下文件和目录: 
q udev.conf文件。这是udev输出日志的配置文件,默认的配置是:udev_log=“err”,udev_log还可以被配置为info或debug。一般默认即可,如果修改为info或debug将有大量的日志信息被输出。 
q rules.d目录。此目录是最重要的配置目录,里面包含的都是配置的udev加载规则,udev会根据配置的规则来生成相应的设备文件。所有的规则文件都必须以“.rules”作为扩展名。 
q scripts目录。此目录保存着加载规则需要执行的脚本。 
在/etc/udev/rules.d目录下创建55-openiscsi.rules规则文件,将以下内容保存到文件中: 
#/etc/udev/rules.d/55-openiscsi.rules 
KERNEL=="sd*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev. 
sh %b",SYMLINK+="iscsi/%c/part%n" 
以上规则的含义是:为设备名以“sd”开头、设备的总线类型为scsi的设备创建链接文件。PROGRAM参数包含的是一条命令,SYMLINK中的%c代表的是PROGRAM命令的输出结果,SYMLINK参数表示链接文件存储的位置以及文件名,链接文件存放在/dev/iscsi/ 目录,文件名是part<设备内核号>,由于所有的设备文件都存放在/dev/目录下,所以在这个设置前面没有指定/dev目录。 
下面是PROGRAM中指定的iscsidev.sh脚本。 
在/etc/udev/scripts目录中创建iscsidev.sh脚本,保存以下内容,并添加此脚本的执行权限: 
#!/bin/sh 
# FILE: /etc/udev/scripts/iscsidev.sh 
BUS=${1} 
HOST=${BUS%%:*} 
[ -e /sys/class/iscsi_host ] || exit 1 
file="/sys/class/iscsi_host/host${HOST}/device/session*/iscsi_session*/targetname" 
target_name=$(cat ${file}) 
# This is not an open-scsi drive 
if [ -z "${target_name}" ]; then 
   exit 1 
fi 
echo "${target_name##*.}" 
以上脚本的含义是将表2-6中的iSCSI Target IQN的最后一个小数点之后的名称提取出来,作为udev创建链接文件的目录。由于iSCSI Target的名称是唯一的,通过这种方式就能使所有节点通过udev新创建的链接文件指向相同的iSCSI磁盘。 
相应的配置工作结束之后,需要重启服务器链接文件才能生成。其实,配置udev和在生产环境中安装多路径软件的效果是相同的,都是生成相应设备的链接文件,通过对链接文件的访问实现对设备的访问。重启服务器之后生成如下的文件结构。 
节点1执行结果: 
[root@rhel1 iscsi]# pwd 
/dev/iscsi 
[root@rhel1 iscsi]# tree 

|-- dbfile1 
|   `-- part -> ../../sda 
|-- dbfile2 
|   `-- part -> ../../sdd 
|-- fra1 
|   `-- part -> ../../sdb 
|-- ocrvdisk1 
|   `-- part -> ../../sdf 
|-- ocrvdisk2 
|   `-- part -> ../../sdc 
`-- ocrvdisk3 
    `-- part -> ../../sde 
 
6 directories, 6 files 
节点2执行结果: 
[root@rhel2 iscsi]# pwd 
/dev/iscsi 
[root@rhel2 iscsi]# tree 

|-- dbfile1 
|   `-- part -> ../../sdf 
|-- dbfile2 
|   `-- part -> ../../sdc 
|-- fra1 
|   `-- part -> ../../sda 
|-- ocrvdisk1 
|   `-- part -> ../../sde 
|-- ocrvdisk2 
|   `-- part -> ../../sdb 
`-- ocrvdisk3 
    `-- part -> ../../sdd 
 
6 directories, 6 files 
上面的执行结果dbfile1、dbfile2、fra1、ocrvdisk1、ocrvdisk2、ocrvdisk3表示的是目录,目录下面的part才是链接文件,链接文件对应的sd*就是链接对象。两个节点相同路径的链接文件对应的设备文件名不是完全相同的,但它们对应的共享磁盘确是完全一致的,不同节点对相同链接文件的访问能够确保访问的是相同的共享存储。 
链接文件是新生成的,并没有改动原有的以“sd”开头的设备文件,所以不同节点的/dev目录下以“sd”开头的设备文件依然不能正确地对应iSCSI磁盘