如何在Linux上扫描/检测新LUN
当我们运行带有DM-Multipath和软件iSCSI启动器的RedHat Enterprise Linux 5、6和7系列系统时,可以通过重新扫描主机上的iSCSI服务来发现新的LUN。
重新扫描服务将显示已映射到主机的所有新创建的LUN。
在本教程中,我将显示用于扫描和检测(输出以检查)连接到Centos/RHEL服务器的新lun的命令。
要在Linux中扫描新的FC LUN和SCSI磁盘,可以使用echo script命令进行手动扫描,而无需重新引导系统。
但是,从Redhat Linux 5.4开始,Redhat引入了“ /usr/bin/rescan-scsi-bus.sh”脚本来扫描所有LUN并更新SCSI层以反映新设备。
检查连接的磁盘数
我们可以使用以下命令来识别现有LUN以及如何将新映射的LUN添加到Linux。
# cat /proc/scsi/scsi | egrep -i 'Host:' | wc -l 7
我们可以使用以下命令来更好地输出所有磁盘
# fdisk -l 2>/dev/null | egrep '^Disk' | egrep -v 'dm-|type|identifier' Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors Disk /dev/sdb: 16.1 GB, 16106127360 bytes, 31457280 sectors Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors Disk /dev/mapper/centos-root: 18.8 GB, 18756927488 bytes, 36634624 sectors Disk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors Disk /dev/sdd: 10.7 GB, 10737418240 bytes, 20971520 sectors Disk /dev/sde: 10.7 GB, 10737418240 bytes, 20971520 sectors Disk /dev/sdf: 7516 MB, 7516192768 bytes, 14680064 sectors
或者
# fdisk -l | grep sd Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors /dev/sda1 * 2048 1026047 512000 83 Linux /dev/sda2 1026048 41943039 20458496 8e Linux LVM Disk /dev/sdb: 16.1 GB, 16106127360 bytes, 31457280 sectors Disk /dev/sdc: 10.7 GB, 10737418240 bytes, 20971520 sectors Disk /dev/sdd: 14.0 GB, 13958643712 bytes, 27262976 sectors
1)使用/sys类文件
我们可以使用echo命令如下扫描每个scsi主机设备。
现在要重新扫描总线,请使用以下命令
# echo "- - -" > /sys/class/scsi_host/host0/scan
该命令的三个破折号(“-”)用作通配符,表示重新扫描所有内容。
请记住,三个值通常代表通道,SCSI目标ID和LUN。
# echo "c t l" > /sys/class/scsi_host/hosth/scan
其中
- “ h”是HBA编号
- “ c”是HBA上的频道
- “ t”是SCSI目标ID
- “ l”是LUN。
如果我们没有主机总线号,则必须使用以下命令列出系统上所有现有的主机总线号:
# ls /sys/class/scsi_host host0 host1 host2
然后,我们将扫描找到的每个iscsi磁盘,并在每次扫描后扫描是否检测到新磁盘。
它的意思是
# echo "- - -" > /sys/class/scsi_host/host0/scan # echo "- - -" > /sys/class/scsi_host/host1/scan # echo "- - -" > /sys/class/scsi_host/host2/scan
或者
# for host in `ls /sys/class/scsi_host/`;do echo "- - -" >/sys/class/scsi_host/${host}/scan; done
当我们执行此操作时,它看起来非常简单,但是当我们执行存储扫描命令时,系统在后台要做很多工作。
查找通道路线的方法
如果我们知道通道,目标ID和LUN地址,则可以使用它进行扫描。
其中我们有4张HBA emulex卡0、1、2和3.
server1:/proc/scsi/lpfc# ls 0 1 2 3
通过卡0和2
server1:/proc/scsi/lpfc# cat 0 lpfc0t00 DID d200ef WWPN 50:06:01:68:39:a0:43:65 WWNN 50:06:01:60:b9:a0:43:65 lpfc0t01 DID d201ef WWPN 50:06:01:61:39:a0:43:65 WWNN 50:06:01:60:b9:a0:43:65
server1:#/proc/scsi/lpfc# cat 1
server1:/proc/scsi/lpfc# cat 2 lpfc2t01 DID ed0cef WWPN 50:06:01:69:39:a0:43:65 WWNN 50:06:01:60:b9:a0:43:65 lpfc2t00 DID ed0def WWPN 50:06:01:60:39:a0:43:65 WWNN 50:06:01:60:b9:a0:43:65
server1:/proc/scsi/lpfc# cat 3
对于所有4个WWPN(全球端口名称),它都具有相同的WWNN(全球节点名称)。
server1:/proc/scsi/lpfc# cat /sys/class/fc_transport/*/node_name 0x50060160b9a04365 0x50060160b9a04365 0x50060160b9a04365 0x50060160b9a04365
我们可以通过过滤WWPN(全球端口名称)进行深入研究,以获取更多信息
server1:/proc/scsi/lpfc# grep 50060160b9a04365 /sys/class/fc_transport/*/node_name /sys/class/fc_transport/target0:0:0/node_name:0x50060160b9a04365 /sys/class/fc_transport/target0:0:1/node_name:0x50060160b9a04365 /sys/class/fc_transport/target2:0:0/node_name:0x50060160b9a04365 /sys/class/fc_transport/target2:0:1/node_name:0x50060160b9a04365
这表明有四个到该目标的光纤通道路由。
Line 1 : Thru host 0 channel 0 target 0 Line 2 : Thru host 0 channel 0 target 1 Line 3 : Thru host 2 channel 0 target 0 Line 4 : thru host 2 channel 0 targer 1
因此,现在,我们可以按以下方式扫描LUN,并且存储团队将地址分配为“ 8”。
echo "0 0 8" > /sys/class/scsi_host/host0/scan echo "0 1 8" > /sys/class/scsi_host/host0/scan echo "0 0 8" > /sys/class/scsi_host/host2/scan echo "0 1 8" > /sys/class/scsi_host/host2/scan
说明了SCSI文件的输出,以供我们参考:
Host: scsi0 Channel: 00 Id: 00 Lun: 08 Vendor: DGC Model: RAID 5 Rev: 0326 Type: Direct-Access ANSI SCSI revision: 04 Host: scsi0 Channel: 00 Id: 01 Lun: 08 Vendor: DGC Model: RAID 5 Rev: 0326 Type: Direct-Access ANSI SCSI revision: 04 Host: scsi2 Channel: 00 Id: 00 Lun: 08 Vendor: DGC Model: RAID 5 Rev: 0326 Type: Direct-Access ANSI SCSI revision: 04 Host: scsi2 Channel: 00 Id: 01 Lun: 08 Vendor: DGC Model: RAID 5 Rev: 0326 Type: Direct-Access ANSI SCSI revision: 04
另一种方法
如果我们没有主机总线号,则必须使用以下命令列出系统上所有现有的主机总线号:
# ls /sys/class/scsi_host host0 host1 host2
或者尝试
# grep mpt /sys/class/scsi_host/host?/proc_name /sys/class/scsi_host/host0/proc_name:mptspi
在输出中,host0是相关字段。
如前所述,我们需要拥有主机总线号才能确定要扫描的内容
然后,我们将扫描找到的每个iscsi磁盘,并在每次扫描后扫描是否检测到新磁盘。
它的意思是
# echo "- - -" > /sys/class/scsi_host/host0/scan # echo "- - -" > /sys/class/scsi_host/host1/scan # echo "- - -" > /sys/class/scsi_host/host2/scan
如果主机太多(例如,从host0到host20),则可以使用以下命令
# for host in `ls /sys/class/scsi_host/`;do echo "- - -" >/sys/class/scsi_host/${host}/scan; done
或者,我们也可以尝试一下(针对光纤通道的这个)
# for host in `ls /sys/class/fc_host/`; do echo "1" >/sys/class/fc_host/${host}/issue_lip; done
是否可以在Linux OS中重新扫描设备而无需重新加载Linux驱动程序?
有一个过程可以迫使驱动器重新扫描目标并允许添加新设备。
这将触发驱动程序启动LUN发现过程。
要从命令行强制重新扫描,请键入以下命令:
# echo "scsi-qlascan" > /proc/scsi//
其中:
= qla2100,qla2200,qla2300(2.4个内核驱动程序)或者qla2xxx(2.6个内核驱动程序)
= HBA的实例号
执行此命令后,通过键入以下命令,强制SCSI中间层进行自己的扫描并为新设备构建设备表条目:
# echo "scsi add-single-device 0 1 2 3" >/proc/scsi/scsi
其中:
“ 0 1 2 3” =“主机通道ID LUN”
扫描必须按照上述顺序进行;首先是驱动程序(qla2300/qla2200驱动程序等),然后是Linux SCSI中间层(即OS扫描)。
2)用多路径/powermt扫描lun
我们可以使用multipath或者powermt命令检查当前的多路径设置。
# multipath -l mpath2 (36006016015501c0018c07c18e0d8dc11) [size=68 GB][features="1 queue_if_no_path"][hwhandler="1 emc"] _ round-robin 0 [active] _ 0:0:0:2 sdc 8:32 [active] _ round-robin 0 [enabled] _ 1:0:0:2 sdi 8:128 [active] mpath1 (36006016015501c0084227c0ee0d8dc11) [size=68 GB][features="1 queue_if_no_path"][hwhandler="1 emc"] _ round-robin 0 [active] _ 1:0:0:1 sdh 8:112 [active] _ round-robin 0 [enabled] _ 0:0:0:1 sdb 8:16 [active] .................... .................... mpath3 (36006016015501c0019c07c18e0d8dc11) [size=68 GB][features="1 queue_if_no_path"][hwhandler="1 emc"] _ round-robin 0 [active] _ 1:0:0:3 sdj 8:144 [active] _ round-robin 0 [enabled] _ 0:0:0:3 sdd 8:48 [active]
如果安装了EMC Powerpath,请检查磁盘/多路径状态,如下所示:
# powermt display dev=all | more Pseudo name=emcpowerb CLARiiON ID=APM00080503154 [cl10083] Logical device ID=6006016023041F003AB6ED708885DD11 [LUN 3] state=alive; policy=CLAROpt; priority=0; queued-IOs=0 Owner: default=SP A, current=SP A Array failover mode: 1 ============================================================================== ---------------- Host --------------- - Stor - -- I/O Path - -- Stats -- ### HW Path I/O Paths Interf. Mode State Q-IOs Errors ============================================================================== 3 qla2xxx sde SP A2 active alive 0 1 3 qla2xxx sdh SP B3 active alive 0 0 6 qla2xxx sdk SP A3 active alive 0 1 6 qla2xxx sdn SP B2 active alive 0 0 .............................. .............................. ============================================================================== ---------------- Host --------------- - Stor - -- I/O Path - -- Stats -- ### HW Path I/O Paths Interf. Mode State Q-IOs Errors ============================================================================== 3 qla2xxx sdd SP A2 active alive 0 1 3 qla2xxx sdg SP B3 active alive 0 0 6 qla2xxx sdj SP A3 active alive 0 1 6 qla2xxx sdm SP B2 active alive 0 0
如果配置正确,多路径守护程序将自动添加连接的设备。
对于powermt,我们需要手动运行以下命令。
# powermt config
3)使用脚本
我们可以使用SCSI重新扫描脚本进行重新扫描,该脚本将检测到新的lun并将其自动添加到服务器中。
我们可以在sg3_utils包中找到此脚本。
# /us/bin/rescan-scsi-bus.sh -a Scanning SCSI subsystem for new devices Scanning host 0 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs .................. .................. 1 new or changed device(s) found. [0:0:5:0] 0 remapped or resized device(s) found. 0 device(s) removed.