开始新对话

未解决

此帖子已超过 5 年

4622

2013年12月8日 16:00

Linux系统SCSI磁盘管理全攻略(一)

​ ​
​ ​

​Linux​​系统​​SCSI​​磁盘管理全攻略(一)​

​ ​
​ ​

​ ​

​转载请在文首保留原文出处:​​EMC​​中文支持论坛​​https://community.emc.com/go/chinese​

​ ​


​ ​


​ ​
​ ​

​介绍​

​ ​
​ ​

​ ​

​Linux系统SCSI磁盘管理全攻略(二)​

​ ​

​Linux系统SCSI磁盘管理全攻略(三)​

​ ​

​本系列文章系统、全面地介绍了​​Linux ​​的​​SCSI​​设备管理机制和整套操作命令。包括以下六大主题:​

​ ​
    ​ ​
  • ​Linux SCSI​​子系统概述​
  • ​ ​
  • ​Linux​​主机​​LUN​​识别​
  • ​ ​
  • ​动态​​SAN​​网络重配​
  • ​ ​
  • ​LUN​​发现步骤​
  • ​ ​
  • ​Linux​​设备命名​
  • ​ ​
  • ​SCSI​​磁盘限制​
  • ​ ​
​ ​

​ ​

​本文作为系列第一篇,解答了用户的常见问题,如:怎样确认驱模块是否被加载?怎样查看​​SCSI​​子系统已发现并识别的设备?如何验证内核已正确识别出​​LUN​​的编号,用户在从​​fabric​​中添加或删除磁盘时,有哪些方法让主机重新识别?​

​ ​


​ ​
​ ​

​更多信息​

​ ​
​ ​

​ ​

​Linux SCSI​​子系统概述​​:​

​ ​

​ ​

​Linux SCSI​​子系统包括三层:​

​ ​

​上层由特定的设备类型驱动所组成,如磁盘驱动、磁带驱动和​​CD-ROM​​驱动,最靠近用户空间。​

​ ​

​下层包括诸如​​QLogic​​和​​Emulex HBA​​这类驱动,最靠近硬件。​

​ ​

​中间层是​​SCSI​​核心代码,连接上层和下层。​

​ ​

​ ​

​按照内核版本的区别,驱动可编译进内核或以模块的形式加载到内核。​​sd​​是​​SCSI​​磁盘驱动,或块驱动,作为模块时命名为​​scsi_mod​​。​

​ ​

​ ​

​通常,在大多数版本中这些驱动都编译为模块,并在启动时作为初始化内存磁盘镜像文件(​​initrid image​​)的一部分被加载。如果当前没有在启动时加载,而启动过程中要求加载时,那么就需要重新编译一个包含该驱动的初始化内存磁盘镜像文件。在​​2.4​​版本内核中,需要修改​​/etc/modules.conf​​文件来完成;​​2.6​​版本内核中,不仅需要修改​​/etc/modules.conf​​文件,还要执行​​mkinitrd​​命令来对改动进行更新。​

​ ​

​ ​

​要确认驱动是否编译为模块及当前是否被加载,只需查看​​lsmod​​命令输出中的​​sd_mod ​​和​​ scsi_mod​​。以下为示例输出:​

​ ​

​# lsmod | grep sd​

​ ​

​sd_mod 13440 296​

​ ​

​scsi_mod 104068 6 [qla2300 st sr_mod sg ncr53c8xx sd_mod]​

​ ​

​注意:如果​​SCSI​​中间层驱动编译为模块,则​​scsi_mod​​必须先于上层和下层驱动加载。​

​ ​

​ ​

​Linux​​主机​​LUN​​识别:​

​ ​

​ ​

​Linux 2.4​​内核版本中,系统在加载主机适配层驱动时通过扫描​​SCSI​​总线时识别。​​SCSI​​子系统已发现并识别的设备在​​/proc/scsi/scsi​​文件中列出。比较好的方法是使用​​cat​​命令列出​​/proc/scsi/scsi​​的输出,来验证内核已正确识别出​​LUN ID​​。命令输出示例如下:​

​ ​

​# cat proc/scsi/scsi​

​ ​

​# cat /proc/scsi/scsi | less​

​ ​

​Attached devices:​

​ ​

​Host: scsi1 Channel: 00 Id: 00 Lun: 00​

​ ​

​ Vendor: IBM-PSG Model: DDYS-T36950M M Rev: S96E​

​ ​

​ Type: Direct-Access ANSI SCSI revision: 03​

​ ​

​Host: scsi1 Channel: 00 Id: 08 Lun: 00​

​ ​

​ Vendor: IBM Model: YGLv3 S2 Rev: 0​

​ ​

​ Type: Processor ANSI SCSI revision: 02​

​ ​

​Host: scsi4 Channel: 00 Id: 00 Lun: 00​

​ ​

​ Vendor: IBM Model: 1750500 Rev: 5.17​

​ ​

​ Type: Direct-Access ANSI SCSI revision: 05​

​ ​

​Host: scsi4 Channel: 00 Id: 00 Lun: 01​

​ ​

​ Vendor: IBM Model: 1750500 Rev: 5.17​

​ ​

​ Type: Direct-Access ANSI SCSI revision: 05​

​ ​

​Host: scsi4 Channel: 00 Id: 00 Lun: 02​

​ ​

​ Vendor: IBM Model: 1750500 Rev: 5.17​

​ ​

​ Type: Direct-Access ANSI SCSI revision: 05​

​ ​

​Host: scsi4 Channel: 00 Id: 00 Lun: 03​

​ ​

​ Vendor: IBM Model: 1750500 Rev: 5.17​

​ ​

​ Type: Direct-Access ANSI SCSI revision: 05​

​ ​

​Host: scsi4 Channel: 00 Id: 00 Lun: 04​

​ ​

​ Vendor: IBM Model: 1750500 Rev: 5.17​

​ ​

​ Type: Direct-Access ANSI SCSI revision: 05 ​

​ ​

​Host: scsi4 Channel: 00 Id: 00 Lun: 05​

​ ​

​ Vendor: IBM Model: 1750500 Rev: 5.17​

​ ​

​ Type: Direct-Access ANSI SCSI revision: 05​

​ ​

​Host: scsi4 Channel: 00 Id: 00 Lun: 06​

​ ​

​ Vendor: IBM Model: 1750500 Rev: 5.17​

​ ​

​ Type: Direct-Access ANSI SCSI revision: 05​

​ ​

​Host: scsi4 Channel: 00 Id: 00 Lun: 07​

​ ​

​ Vendor: IBM Model: 1750500 Rev: 5.17​

​ ​

​ Type: Direct-Access ANSI SCSI revision​​: 05​

​ ​

​ ​

​注意,​​ /proc/scsi/scsi ​​列出的磁盘设备不是动态的,因此不受网络状态变更的影响。​

​ ​

​ ​

​从​​Linux2.6​​内核版本开始,​​/proc​​文件系统迁移至改进后的​​/sys​​文件系统。​​/sys​​文件系统中加入对动态变更的支持,如添加和删除​​LUN​​,而无需重新加载主机适配器驱动或重启主机。通常,可通过​​/sys/class/scsi_host/hostN​​目录下的内容来查看哪些​​SCSI​​设备已被主机识别。​​N​​是主机适配器​​ID​​号。用户空间有一个​​lsscsi​​工具, 使用​​/sys​​中的信息来显示所有识别设备的汇总清单。(​​lsscsi​​命令仅在​​SLES​​中支持)​

​ ​

​ ​

​动态​​SAN​​网络重配:​

​ ​

​ ​

​用户在网络中添加或删除磁盘时,需要对其重新识别。可使用以下四种方法之一让​​Linux​​主机重新识别这些变更:​

​ ​
    ​ ​
  1. ​重启主机​
  2. ​ ​
  3. ​卸载并重新加载主机适配器驱动​
  4. ​ ​
  5. ​通过​​echo /sys​​文件系统(仅适用于​​2.6​​内核版本)重新扫描总线​
  6. ​ ​
  7. ​通过​​echo /proc​​或​​/sys​​文件系统手动添加和删除​​SCSI​​磁盘​
  8. ​ ​
​ ​

​ ​

​这一部分的更多命令示例可参见:​​Linux​​系统​​SCSI​​磁盘扫描机制解析及命令实例​​。​

​ ​

​ ​

​重启主机或卸载并加载主机适配器驱动​

​ ​

​由于设备是通过扫描​​SCSI​​总线被发现的,通常重新扫描​​SCSI​​总线来发现​​SAN​​网络变更是最简便的方法。由重新加载主机适配器驱动或重启系统来触发总线扫描。​

​ ​

​ ​

​卸载主机适配器驱动或重启系统之前,用户必须:​

​ ​
    ​ ​
  1. ​停止​​I/O​
  2. ​ ​
  3. ​卸载所有文件系统​
  4. ​ ​
  5. ​如果使用了​​SDD​​,在重新加载主机适配器驱动前,用​​sdd stop​​命令卸载​​SDD​​驱动。在主机适配器驱动重新加载之后,用​​sdd start​​命令重新加载​​SDD​​。​
  6. ​ ​
​ ​

​ ​

​当主机适配器驱动作为模块植入时,可通过重新加载主机适配器驱动来解决。而无论主机适配器驱动编入内核还是作为模块,都可以重启系统来解决该问题。​

​ ​

​ ​

​通过​​echo /sys​​文件系统重新扫描总线(仅适用于​​Linux2.6​​内核版本)​

​ ​

​对于​​Linux2.6​​内核版本,可通过​​/sys​​接口重新扫描总线,而无需重新加载主机适配器驱动或重启系统。以下命令可扫描所有通道、​​target​​、​​LUN​​和主机。​

​ ​

​echo “- - -” > /sys/class/scsi_host/hostH/scan​

​ ​

​ ​

​手动添加和删除​​SCSI​​磁盘​

​ ​

​用户可通过以下命令手动添加和删除​​SCSI​​磁盘。​

​ ​

​注意:以下命令示例中,​​H, B, T, L​​代表设备的主机,总线,​​target​​,和​​LUN ID​​。​

​ ​

​可通过以下命令删除或对​​SCSI​​磁盘取消配置:​

​ ​

​echo "scsi remove-single-device H B T L" > /proc/scsi/scsi​

​ ​

​如果驱动无法被卸载并重新加载,并且用户知道新设备的主机,总线,​​target​​和​​LUN ID​​,那么可以使用以下命令通过​​/proc/scsi/scsi​​ ​​文件添加来实现:​

​ ​

​echo "scsi add-single-device H B T L" > /proc/scsi/scsi​

​ ​

​ ​

​对于​​2.6​​内核版本,设备同样可通过​​/sys​​文件系统来添加和删除。使用以下命令删除磁盘并使系统重认此更新:​

​ ​

​echo “1” > /sys/class/scsi_host/hostH/device/H:B:T:L/delete​

​ ​

​或使用如下命令:​

​ ​

​echo “1” > /sys/class/scsi_host/hostH/device/targetH:B:T/H:B:T:L/delete​

​ ​

​使用以下命令在内核中重新注册磁盘:​

​ ​

​echo “B T L” > /sys/class/scsi_host/hostH/scan​

​ ​

​ ​

​注意:​​Linux​​内核不在​​/dev​​目录中为网络设备指定固定名称。设备文件名在扫描总线时按照发现顺序指定,例如,一个​​LUN​​名为​​/dev/sda​​,在驱动重新加载后,这个​​LUN​​名称可能更改为​​/dev/sdce​​。网络重认可能导致主机,总线,​​target​​和​​LUN ID​​值的偏移,因此通过​​/proc/scsi/scsi​​文件添加特定磁盘是不可靠的。​

​ ​

​ ​

​ ​
​ ​

​参考​

​ ​
​ ​

​ ​

​Linux​​系统​​SCSI​​磁盘扫描机制解析及命令实例​

​ ​


​ ​
​ ​

​应用于​

​ ​
​ ​

​ ​

​Linux​​操作系统​

​ ​

​ ​

​ ​

​ ​

​ ​

​ ​

​ ​

​ ​
没有回复!
找不到事件!

Top