转载请在文首保留原文出处:EMC中文支持论坛
介绍
本系列文章系统、全面地介绍了Linux 的SCSI设备管理机制和整套操作命令。包括以下六大主题:
Linux SCSI子系统概述
Linux主机LUN识别
动态SAN网络重配
LUN发现步骤
Linux设备命名
SCSI磁盘限制
附:SCSI磁盘问题识别与解决方法
作为系列之二,本文主要介绍LUN发现步骤和Linux设备命名两大主题,解答用户常见问题乳:Linux驱动除了LUN 0以外,没有自动配置其他LUN怎么办?Linux磁盘的命名规则是什么?
更多信息
LUN发现步骤:
如果用户的Linux驱动除了LUN 0以外,没有自动配置其他LUN,用户可以根据SCSI中间层驱动使用的参数和设置来手动配置。以下示例显示了Linux主机/proc/scsi/scsi文件中,各适配器端口仅配置了第一个LUN,即LUN 0的情况。
# cat proc/scsi/scsi
...
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: EMC Model: SYMMETRIX Rev: 5773
Type: Direct-Access ANSI SCSI revision: 04
Host: scsi0 Channel: 00 Id: 15 Lun: 00
Vendor: EMC Model: SYMMETRIX Rev: 5773
Type: Direct-Access ANSI SCSI revision: 04
Host: scsi2 Channel: 00 Id: 00 Lun: 00
Vendor: EMC Model: SYMMETRIX Rev: 5773
Type: Direct-Access ANSI SCSI revision: 04
Host: scsi3 Channel: 00 Id: 00 Lun: 00
Vendor: EMC Model: SYMMETRIX Rev: 5773
Type: Direct-Access ANSI SCSI revision: 04
Host: scsi3 Channel: 00 Id: 01 Lun: 00
Vendor: EMC Model: SYMMETRIX Rev: 5773
Type: Direct-Access ANSI SCSI revision: 04
解决这一问题有两种方式:
创建脚本在/proc/scsi/scsi文件中手动添加磁盘设备
通过修改initrd设置系统启动时自动发现LUN
创建脚本echo /proc文件系统
使用scsi add-single-device命令连续配置分配给主机的所有LUN。写一个脚本为各主机适配器重复scsi add-single-device命令,从而给每一个LUN配置ID。该脚本必须扫描所有主机适配器端口并识别分配给各端口的所有LUN。
脚本运行结束之后,用户可以在/proc/scsi/scsi文件中查看分配的所有LUN。
以下示例列出脚本配置所有LUN之后的/proc/scsi/scsi文件。
# cat proc/scsi/scsi
...
Host: scsi3 Channel: 00 Id: 01 Lun: 00
Vendor: EMC Model: SYMMETRIX Rev: 5773
Type: Direct-Access ANSI SCSI revision: 04
Host: scsi3 Channel: 00 Id: 00 Lun: 01
Vendor: EMC Model: SYMMETRIX Rev: 5773
Type: Direct-Access ANSI SCSI revision: 04
Host: scsi3 Channel: 00 Id: 00 Lun: 02
Vendor: EMC Model: SYMMETRIX Rev: 5773
Type: Direct-Access ANSI SCSI revision: 04
Host: scsi3 Channel: 00 Id: 00 Lun: 03
Vendor: EMC Model: SYMMETRIX Rev: 5773
Type: Direct-Access ANSI SCSI revision: 04
Host: scsi3 Channel: 00 Id: 00 Lun: 04
Vendor: EMC Model: SYMMETRIX Rev: 5773
Type: Direct-Access ANSI SCSI revision: 04
...
在系统启动时自动发现LUN
第二种方法是通过设置SCSI中间层驱动的参数来完成,此参数控制在SCSI总线扫描过程中扫描LUN的数量。以下步骤同时适用于2.4和2.6内核版本,但假定SCSI中间层驱动编译为scsi_mod模块,并在系统启动时自动加载。对于Linux 2.4内核版本,为了发现所有卷,通常在系统中设置为磁盘设备的最大数量,用户需要设置SCSI中间层驱动的max_scsi_luns参数。例如,如果max_scsi_luns设置为1则SCSI总线只扫描到LUN 0。此参数应当设置为内核能够支持的最大磁盘数量,例如,128或256。在Linux 2.6内核中,可使用同样的步骤,除了参数名从max_scsi_lun更改为max_lun。
编辑/etc/modules.conf文件
添加以下内容:
options scsi_mod max_scsi_luns=<n>(n表示探测的LUN总数)
保存文件
运行mkinitrd命令重新编译当前内核相应的ram-disk。以下命令示例中,<kernel>为当前运行内核版本,可参见”uname -r”命令的输出,例如:2.4.21-292-smp。
SUSE中命令如下:
cd /boot
mkinitrd –k vmlinuz-<kernel> -i initrd-<kernel>
Red Hat中命令如下:
cd /boot
mkinitrd –v initrd-<kernel>.img <kernel>
重启主机
验证/boot/grub/menu.lst文件中,已正确配置了新创建的initrd镜像。
Linux设备命名:
内核驱动可使用特定的设备文件来控制磁盘设备。映射到同一物理磁盘设备的设备文件可能不止一个。例如,在多路径环境下某一设备配置四条路径,则会有四个不同的设备文件映射到同一设备。
设备文件位于/dev目录下,通过major和minor编号访问。光纤通道连接的设备通过sd驱动作为SCSI磁盘设备管理。因此,每一个LUN在/dev目录下有一个对应的设备文件。
SCSI磁盘设备有一个以“sd”为前缀的特定设备文件,具有如下命名格式:
/dev/sd[a-z][1-15]
名称中不带数字表示整个磁盘,而名称中有数字则表示磁盘的一个分区。依据惯例,一个SCSI磁盘设备最多可以有16个minor编号。因此,对于一整块磁盘,每块磁盘最多有15个分区,使用一个minor编号来标示整块磁盘(例如/dev/sda),其他15个minor编号用来标示该磁盘的分区(例如/dev/sda1,/dev/sda2,等等)。以下示例显示整块磁盘/dev/sda的设备文件,该设备major编号为8,minor编号为0,有15个分区。
# ls -l /dev/sda*
brw-rw---- 1 root disk 8, 0 May 24 08:09 /dev/sda
brw-rw---- 1 root disk 8, 1 May 24 08:09 /dev/sda1
brw-rw---- 1 root disk 8, 10 May 24 08:09 /dev/sda10
brw-rw---- 1 root disk 8, 11 May 24 08:09 /dev/sda11
brw-rw---- 1 root disk 8, 12 May 24 08:09 /dev/sda12
brw-rw---- 1 root disk 8, 13 May 24 08:09 /dev/sda13
brw-rw---- 1 root disk 8, 14 May 24 08:09 /dev/sda14
brw-rw---- 1 root disk 8, 15 May 24 08:09 /dev/sda15
brw-rw---- 1 root disk 8, 2 May 24 08:09 /dev/sda2
brw-rw---- 1 root disk 8, 3 May 24 08:09 /dev/sda3
brw-rw---- 1 root disk 8, 4 May 24 08:09 /dev/sda4
brw-rw---- 1 root disk 8, 5 May 24 08:09 /dev/sda5
brw-rw---- 1 root disk 8, 6 May 24 08:09 /dev/sda6
brw-rw---- 1 root disk 8, 7 May 24 08:09 /dev/sda7
brw-rw---- 1 root disk 8, 8 May 24 08:09 /dev/sda8
brw-rw---- 1 root disk 8, 9 May 24 08:09 /dev/sda9
对于Red Hat版本,内核实际上为128个设备创建了设备文件。对于SUSE,只有前16块磁盘有设备文件。用户必须使用mknod命令为其他磁盘创建设备文件。在2.6内核版本中,只有在内核发现并识别出设备时才能创建设备文件。/proc/partitions文件列出所有SCSI磁盘驱动识别出的“sd”设备,包括sd名,major编号,minor编号,以及各磁盘设备的大小。
以下示例列出/proc/partitions文件的内容:
# cat /proc/partitions
major minor #blocks name
8 0 17774160 sda
8 1 1052226 sda1
8 2 208845 sda2
8 3 10490445 sda3
8 16 976576 sdb
8 32 976576 sdc
8 48 976576 sdd
8 64 976576 sde
8 80 976576 sdf
8 96 976576 sdg
8 112 976576 sdh
8 128 976576 sdi
8 144 976576 sdj
8 160 976576 sdk
8 176 976576 sdl
8 192 976576 sdm
8 208 976576 sdn
8 224 976576 sdo
8 240 976576 sdp
65 0 976576 sdq
65 16 1048576 sdr
65 32 1048576 sds
65 48 1048576 sdt
65 64 1048576 sdu
65 80 1048576 sdv
65 96 1048576 sdw
65 112 1048576 sdx
65 128 1048576 sdy
65 144 1048576 sdz
65 160 1048576 sdaa
65 176 1048576 sdab
65 192 1048576 sdac
65 208 1048576 sdad
65 224 1048576 sdae
65 240 1048576 sdaf
66 0 1048576 sdag
66 16 1048576 sdah
66 32 1048576 sdai
66 48 1048576 sdaj
66 64 1048576 sdak
66 80 1048576 sdal
66 96 1048576 sdam
66 112 1048576 sdan
66 128 1048576 sdao
66 144 1048576 sdap
66 160 1048576 sdaq
66 176 1048576 sdar
66 192 1048576 sdas
66 208 1048576 sdat
66 224 1048576 sdau
66 240 1048576 sdav