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 磁盘路径示范如下:
上面这三种 SCSI 磁盘路径都不是永久不变,当服务器新增或者删除新的 PCI 设备时候,路径就会发生变化,有时候即使是服务器重启也可能导致路径变成发生变化。
为了保证应用程序使用的磁盘路径能够永久不变,有以下几种方法:
- 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 对应关系。
- UUID
UUID 是有文件系统在创建时候生成的,用来标记文件系统,类似 WWID 一样也是独一无二的。因此使用 UUID 来标示 SCSI 磁盘,也能保证路径是永久不变的。Linux 上/dev/disk/by-uuid 可以看到每个已经创建文件系统的磁盘设备以及与/dev/sd 之间的映射关键。
注意:Linux 自带的 md 和 LVM 工具也会在 SCSI 磁盘上面写入 UUID 信息。
- UDEV
UDEV 是 Linux 提供的一种让用户对设备进行自定义命名的机制。可以通过 UDEV 将 WWID/UUID 信息跟磁盘路径映射起来,这样也可以保证设备路径永久不变。
磁盘删除
在删除磁盘之前,建议先备份好数据,将内存脏数据写入磁盘,然后再删除磁盘所有关联路径。对于使用多路径软件的磁盘,需要同时删除多路径设备和每个路径磁盘。删除磁盘建议在系统空闲时操作,内存脏数据写入磁盘会增加系统负载,可以通过 vmstat 1 100 观察系统负载。如果满足一下条件之一,则不建议进行删除操作:
· vmstat 100 次输出结果超过 10 次以上的 free 内存小于系统内存的 5%。
· vmstat 结果的 si 和 so 列不为空,代表系统正在进行 swaping,将内存数据写入磁盘。
磁盘删除操作步骤如下:
关闭使用磁盘的进程,备份磁盘数据。可以通过 fuser 命令查看正在访问某个磁盘的进程。
umount 卸载基于待删除磁盘的文件系统
md 和 LVM 中删除磁盘。LVM 可以使用 vgreduce 从卷组移除改磁盘,然后使用 pvremove 从磁盘删除 LVM 元数据。
如果磁盘使用多路径软件,通过 mulitpath –l 查看磁盘所有路径,然后通过 multipath –f 删除磁盘。(如果使用 powerpath 多路径软件,请参考 powerpath 操作手册)
blockdev –flushfs 将脏数据写入磁盘。这一步骤对于裸设备事情情况尤为重要,因为裸设备无法通过 umount 或者 vgreduce 将脏数据写入磁盘。
删除应用程序或者脚本中的磁盘路径引用。
使用命令 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-*方式查看。
直接删除磁盘文件。
磁盘路径删除
当系统使用多路径软件时候,可以在线删除一条路径而不影响业务使用。操作步骤如下:
在应用程序或脚本中删除磁盘路径应用。
使用命令 echo offline > /sys/block/sda/device/state 将磁盘路径 offline。多路径软件将会使用剩余路径处理 IO。
使用命令 echo 1 > /sys/block/device-name/delete 命令从 SCSI 子系统删除磁盘路径,device-name 通常以 sd 开头,比如 sda、sdb。
添加新磁盘或者磁盘路径
添加新磁盘或者磁盘路径,系统可能会自动分配老磁盘使用的名称给新磁盘,比如/dev/sd,major:minoe 和/dev/disk/by-path。因此在添加之前,请确认应用程序和脚本已经删除老磁盘的引用。
添加新磁盘或者磁盘路径步骤如下:
完成交换机和存储配置,记录号存储端口的 WWPN。
使用下面命令在系统上重新扫描磁盘设备。
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-*方法获取。
- 使用多路径软件 multipath(或者其他多路径软件)确认磁盘路径添加正常。
存储链路扫描
Linux 操作系统提供多种存储链路重置操作。存储链路重置通常用于多路径设备添加或者删除,这是一种破坏性操作,将导致 IO 操作超时。请谨慎使用这类型操作,另外操作时请注意以下事项:
操作前请确认链路没有新的 IO,脏数据已经写回存储。
在系统内存资源使用紧张情况下,不建议进行链路删除操作。系统内存使用情况可以通过 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