Linux系统SCSI磁盘扫描机制解析及命令实例(转)
转载请在⽂⾸保留原⽂出处:
介绍
Linux系统扫描SCSI磁盘有⼏种⽅式?Linux新增LUN之后,能否不重启主机就认出设备?如果安装了PowerPath,动态添加/删除LUN的命令是什么?本⽂总结了Linux主机对磁盘设备进⾏重新配置的⽅式,并附加命令实例。
linux磁盘管理更多信息
Linux系统提供多重机制以重新扫描SCSI总线并重认系统中加⼊的SCSI设备。在2.4内核⽅案中,由于动态LUN扫描机制不具备⼀致性,往往需要中断I/O。
2.6内核⾥,LUN扫描有了显著改进并添加了动态LUN扫描机制。Linux⽬前缺乏像drvconfig或ioscan那样允许动态SCSI通道重配的命令。Linux主机对磁盘设备进⾏重新配置的⽅式包括:
#  重启系统
#  卸载并重新加载HBA驱动模块
#  Echo /proc下的SCSI设备列表
#  通过/sys下的属性设置运⾏SCSI扫描
#  通过HBA⼚商脚本运⾏SCSI扫描
系统重启
重启主机是检测新添加磁盘设备的可靠⽅式。在所有I/O停⽌之后⽅可重启主机,同时静态或以模块⽅式连接磁盘驱动。系统初始化时会扫描PCI总线,因此挂载其上的SCSI host adapter会被扫描到,并⽣成⼀个PCI device。之后扫描软件会为该PCI device加载相应的驱动程序。加载SCSI host驱动时,其探测函数会初始化SCSI host,注册中断处理函数,最后调⽤scsi_scan_host函数扫描scsi host adapter所管理的所有scsi总线。
重新加载HBA驱动
通常情况下,HBA驱动在系统中以模块形式加载。从⽽允许模块被卸载并重新加载,在该过程中SCSI扫描函数得以调⽤。通常,在卸载HBA驱动之前,SCSI设备的所有I/O都应该停⽌,卸载⽂件系统,多路径服务应⽤也需停⽌。如果有代理或HBA应⽤帮助模块,也应当中⽌。
命令⽰例:
例如,rac节点上某台服务器执⾏fdisk –l命令看不到共享磁盘,可尝试执⾏如下命令:
# modprobe -r lpfc(卸载驱动)
# modprobe lpfc(加载驱动)
/proc下SCSI扫描
2.4内核中,/proc⽂件系统提供了可⽤SCSI设备的列表。如果系统中SCSI设备重新配置,那么所有这些改变通过echo /proc接⼝反映到SCSI设备中。添加⼀个设备,主机,channel,target ID,以及磁盘设备的LUN编号会被添加到/proc/scsi/,需指定scsi编号。
命令⽰例:
# echo "scsi add-single-device 0 1 2 3" > /proc/scsi/scsi
0:主机ID
1:channel ID
2:target ID
3:LUN编号
该命令会将新磁盘设备添加到/proc/scsi/scsi⽂件中。如果没有到相应⽂件,需为/dev路径下新增磁盘设备创建设备⽂件名。
如果要删除⼀个磁盘设备,使⽤适当的主机,channel,target ID及LUN编号运⾏如下格式命令:
# echo "scsi remove-single-device 0 1 2 3" > /proc/scsi/scsi
0:主机ID
1:channel ID
2:target ID
3:LUN编号
/sys下SCSI扫描
2.6内核中,HBA驱动将SCAN功能导出⾄/sys⽬录下,可⽤来重新扫描该接⼝下的SCSI磁盘设备。命令如下:
# cd /sys/class/scsi_host/host4/
# ls -al scan
# echo '- - -' > scan
'- - -' 代表channel,target和LUN编号。以上命令会导致hba4下所有channel,target以及可见LUN被扫描。
RHEL5 或SUSE10:
echo '- - -'  > /sys/class/scsi_host/host0/scan
/sys/class/scsi_host/ 下⾯有⼏个host 就扫描⼏次
RHEL4 或SUSE9:
echo 1 >> /sys/class/scsi_host/host0/issue_lip
同样是/sys/class/scsi_host/ 下⾯有⼏个host 就执⾏⼏次
echo '- - -' >> /sys/class/scsi_host/host0/scan
在现有PowerPath环境中增加LUN:
1.确保存储端已配置好LUN并输出给Linux 主机
2.通过powermt命令获得HBA 卡列表,并扫描列表中所有的HBA
echo '- - -' > /sys/class/scsi_host/host#/scan
例如, 如果powermt 显⽰列出HBA 4 和5, 使⽤如下命令开始扫描:
echo '- - -' > /sys/class/scsi_host/host4/scan
echo '- - -' > /sys/class/scsi_host/host5/scan
3.运⾏powermt config 配置新认到的磁盘,⽣成虚拟设备
4.⽤powermt display 检查新认到的LUN 及设备路径
在现有PowerPath环境中动态删除 LUN
注意,必须严格遵守操作次序,如果次序有误可能会造成主机OS panic。
1.在将要删除的设备上停⽌所有的I/O。
2.通过以下命令确定虚拟设备对应的原始SCSI设备:
powermt display dev=emcpower<id>
3.删除虚拟设备
powermt remove dev=emcpower<id>
4.回收虚拟设备号以备后⽤
powermt release
如果此命令失败,已删除的虚拟设备仍会存在于/dev 和/sys/block 下,并且在以后动态添加新LUN时可能会引发问题。
5.对每个原始SCSI 设备执⾏以下命令:
echo 1 > /sys/block/sd<id>/device/delete
此命令使PowerPath 停⽌这些原始sd 设备上的I/O 并且将其从/dev 和/sys/block下移除。如此命令执⾏不成功,在以后动态添加新LUN时可能会引发问题。
6.在存储阵列中删除对应的LUN,执⾏powermt display 验证设备已被删除。
通过HBA⼚商脚本进⾏SCSI扫描
QLogic
利⽤QLogic FC HBA LUN Scan Utility 脚本即可⽆需重启动系统⽽识别新添加的LUN。也⽆需对QLogic FC driver 的重新加载。
命令⽰例:
通过以下命令重新扫描所有HBA:
# ./ql-dynamic-tgt-lun-disc.sh
# ./ql-dynamic-tgt-lun-disc.sh -s
# ./ql-dynamic-tgt-lun-disc.sh –scan
重新扫描并删除丢失的LUN,使⽤以下两个命令其中任何⼀个:
# ./ql-dynamic-tgt-lun-disc.sh -s -r
# ./ql-dynamic-tgt-lun-disc.sh --scan –refresh
Emulex
使⽤ Emulex LUN Scan Utility 脚本可以动态扫描新添加的LUN。
命令⽰例:
# gunzip lun_
# chmod a+x lun_scan
扫描所有lpfc HBA:
# lun_scan all
扫描scsi主机编号2的lpfc HBA:
# lun_scan 2
之后确认OS 识别到新设备:
# fdisk -l
如果系统中有PowerPath ,还需要运⾏:
# powermt config
参考
EMC Host Connectivity Guide for Linux 应⽤于
Linux主机Kernel 2.4、2.6版本RHEL, SUSE

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。