RSS

Linux存储在线管理(一)FC磁盘设备管理

转自 EMC 中文支持论坛 – https://community.emc.com/go/chinese
介绍

本文主要介绍 Linux 环境下 FC 磁盘管理相关只是,主要内容包括 FC 驱动介绍、Linux SCSI 磁盘永久命名、FC 磁盘添加与删除、FC 磁盘路径添加与删除以及 FC 存储链路在线扫描。
更多信息

Fibre Channel 驱动

Linux 系统上 Fibre Channel 驱动用户空间接口位于/sys/class 文件夹下面。以下条目中,H 代表主机,B 代表 bus 号,T 代表 target,L 代表 lun id,R 代表对端端口号。
注意:
如果主机使用多路径软件,修改配置参数之前,建议咨询多路径软件厂商
/sys/class 目录下有三个主要文件夹跟 fibre channel 相关的文件夹 fc_transport、fc_remote_ports,fc_hosts。其中 fc_transport 代表已分配存储信息;fc_remote_ports 代表主机到存储端口链路信息(fc_remote_ports 文件夹包含未给主机分配存储的链路信息);fc_host 代表主机 HBA 卡信息。

Transport: /sys/class/fc_transport/targetH:B:T/
· port_id – 存储端口的 24 位交换机端口 ID
· node_name – 存储端口的 64 位 node name
· port_name – 存储端口的 64 位 port name

Remote Port:/sys/class/fc_remote_ports/rport-H:B-R/
· port_id – 存储端口的 24 位交换机端口 ID

· node_name – 存储端口的 64 位 node name

· port_name – 存储端口的 64 位 port name
· dev_loss_tmo – 链路故障等待时间。故障链路不再处理任何新的 IO。默认 dev_loss_tmo 值视具体 HBA 卡而定,Qlogic 默认是 35 秒,Emulex 默认是 30 秒。HBA 卡自带驱动可以覆盖这个 参数值。dev_loss_tmo 最大值 600 秒,如果 dev_loss_tmo 值小于 0 或者大于 600,HBA 自带超时值生效。

· fast_io_fail_tmo – IO 故障等待时间。链路波动情况,IO 尝试多长时间。

Host:/sys/class/fc_host/hostH
· port_id – HBA 端口的 24 位交换机端口 ID。

· issues_lip – 重置 HBA 端口,重新尝试发现存储端口。

Persistent 命名

操作系统通过路径发送 IO 到存储,Linux 系统 SCSI 磁盘路径有以下部分组成:
· HBA 卡的 PCI 标示符

· HBA 卡的管道号

· 存储端 SCSI target 地址

· LUN(Logical Unit Number) 号

SCSI 磁盘路径在 Linux 上有 3 中表现方式:一、/dev/sd 目录;二、通过 major:minor 号;三、/dev/disk/by-path,该目录是 /dev/sd 设备的软连接。Fibre Channel 磁盘路径示范如下:
image001
上面这三种 SCSI 磁盘路径都不是永久不变,当服务器新增或者删除新的 PCI 设备时候,路径就会发生变化,有时候即使是服务器重启也可能导致路径变成发生变化。
为了保证应用程序使用的磁盘路径能够永久不变,有以下几种方法:

  1. WWID

根据 SCSI 标准,每个 SCSI 磁盘都有一个 WWID。类似于网卡的 MAC 地址,要求是独一无二。通过 WWID 标示 SCSI 磁盘就可以保证磁盘路径永久不变,Linux 系统上/dev/disk/by-id 目录包含每个 SCSI 磁盘 WWID 访问路径。实例:
scsi-3600508b400105e210000900000490000 -> ../../sda

提示:Linux 自带的 device-mapper-multipath 工具就是通过 WWID 来探测 SCSI 磁盘路径,可以将同一设备多条路径合并,并在/dev/mapper/下面创建新的设备路径。通过 multipath –l 可以看到 WWID 与 磁盘路径、Host:Channel:Target:Lun 与/dev/sd 以及 major:minor 对应关系。
image002

  1. UUID

UUID 是有文件系统在创建时候生成的,用来标记文件系统,类似 WWID 一样也是独一无二的。因此使用 UUID 来标示 SCSI 磁盘,也能保证路径是永久不变的。Linux 上/dev/disk/by-uuid 可以看到每个已经创建文件系统的磁盘设备以及与/dev/sd 之间的映射关键。
注意:Linux 自带的 md 和 LVM 工具也会在 SCSI 磁盘上面写入 UUID 信息。

  1. UDEV

UDEV 是 Linux 提供的一种让用户对设备进行自定义命名的机制。可以通过 UDEV 将 WWID/UUID 信息跟磁盘路径映射起来,这样也可以保证设备路径永久不变。

磁盘删除

在删除磁盘之前,建议先备份好数据,将内存脏数据写入磁盘,然后再删除磁盘所有关联路径。对于使用多路径软件的磁盘,需要同时删除多路径设备和每个路径磁盘。删除磁盘建议在系统空闲时操作,内存脏数据写入磁盘会增加系统负载,可以通过 vmstat 1 100 观察系统负载。如果满足一下条件之一,则不建议进行删除操作:
· vmstat 100 次输出结果超过 10 次以上的 free 内存小于系统内存的 5%。

· vmstat 结果的 si 和 so 列不为空,代表系统正在进行 swaping,将内存数据写入磁盘。

磁盘删除操作步骤如下:

  1. 关闭使用磁盘的进程,备份磁盘数据。可以通过 fuser 命令查看正在访问某个磁盘的进程。

  2. umount 卸载基于待删除磁盘的文件系统

  3. md 和 LVM 中删除磁盘。LVM 可以使用 vgreduce 从卷组移除改磁盘,然后使用 pvremove 从磁盘删除 LVM 元数据。

  4. 如果磁盘使用多路径软件,通过 mulitpath –l 查看磁盘所有路径,然后通过 multipath –f 删除磁盘。(如果使用 powerpath 多路径软件,请参考 powerpath 操作手册)

  5. blockdev –flushfs 将脏数据写入磁盘。这一步骤对于裸设备事情情况尤为重要,因为裸设备无法通过 umount 或者 vgreduce 将脏数据写入磁盘。

  6. 删除应用程序或者脚本中的磁盘路径引用。

  7. 使用命令 echo 1 > /sys/block/device-name/device/delete 删除磁盘,device-name 以 sd 开头,比如 sda、sdb;或者使用命令 echo 1 > /sys/class/scsi_device/h:c:t:l/device/delete 删除磁盘,h 代表 HBA 卡号,c 代表 HBA 卡 channel,t 代表 SCSI target ID,i 代表 LUN ID。h:c:t:l 这些信息可以通过 lsscsi,scsi_id,multipath –l,ls –l /dev/disk/by-*方式查看。

  8. 直接删除磁盘文件。

磁盘路径删除

当系统使用多路径软件时候,可以在线删除一条路径而不影响业务使用。操作步骤如下:

  1. 在应用程序或脚本中删除磁盘路径应用。

  2. 使用命令 echo offline > /sys/block/sda/device/state 将磁盘路径 offline。多路径软件将会使用剩余路径处理 IO。

  3. 使用命令 echo 1 > /sys/block/device-name/delete 命令从 SCSI 子系统删除磁盘路径,device-name 通常以 sd 开头,比如 sda、sdb。

添加新磁盘或者磁盘路径

添加新磁盘或者磁盘路径,系统可能会自动分配老磁盘使用的名称给新磁盘,比如/dev/sd,major:minoe 和/dev/disk/by-path。因此在添加之前,请确认应用程序和脚本已经删除老磁盘的引用。

添加新磁盘或者磁盘路径步骤如下:

  1. 完成交换机和存储配置,记录号存储端口的 WWPN。

  2. 使用下面命令在系统上重新扫描磁盘设备。

echo “c t l” > /sys/class/scsi_host/hosth/scan
h 代表 HBA 号,c 代表 HBA 卡 channel,t 代表 SCSI target ID,l 代表 LUN ID。
也可以使用 命令 echo “scsi add-single-device 0 0 0 0” > /proc/scsi/scsi 完成扫描。
a. 某些 HBA 卡在存储分配完成后,需要通过 issue_lip 才能发现新增加设备,具体参考“存储链路扫描”。(如果需要 issue_lip,建议停止 IO 操作)

b. 新分配 LUN 在操作系统没有显示,可以通过 sg_luns 命令(来自 sg3_utils 包)重新获取阵列 LUN 列表。

c. c:t:l 信息可以使用命令 grep “存储 SP 端口 WWPN” /sys/class/fc_transport/*/[node_name|port_name]获取;也可以通过 lsscsi、scsi_id、multipath –l 或者 ls –l /dev/disk/by-*方法获取。

  1. 使用多路径软件 multipath(或者其他多路径软件)确认磁盘路径添加正常。

存储链路扫描

Linux 操作系统提供多种存储链路重置操作。存储链路重置通常用于多路径设备添加或者删除,这是一种破坏性操作,将导致 IO 操作超时。请谨慎使用这类型操作,另外操作时请注意以下事项:

  1. 操作前请确认链路没有新的 IO,脏数据已经写回存储。

  2. 在系统内存资源使用紧张情况下,不建议进行链路删除操作。系统内存使用情况可以通过 vmstat 1 100 命令评估。

以下命令可用于存储链路重新扫描:
· echo “1” > /sys/class/fc_host/host/issue_lip

issue_lip 重置 HBA 链路,重新扫描整个链路并配置 SCSI target。该操作是一种异步操作类型,具体完成时间需要参考/vag/log/message 日志。Linux 操作系统自带的 lpfc 和 qla2xxx 驱动支持 issue_lip 命令。
· echo “- – – ” > /sys/class/scsi_host/hostH/scan

· rmmod 驱动/ modprobe 驱动 删除/重新加载 HBA 卡驱动。

参考

· Redhat Linux – Storage Administration Guide