语境
我有一台新配置了 CentOS 7 的服务器,通过光纤通道连接连接到磁盘阵列。
我想将磁盘阵列的磁盘安装在我的服务器的文件系统中,然后在其上设置一个 NFS 服务器,以使该存储可供集群中的所有节点使用(服务器和磁盘阵列都是我管理的小集群的一部分)。
服务器 :公牛R423
磁盘阵列:DDN S2A6620(直接数据网络)
我仅使用磁盘阵列的两个控制器中的一个。
以下是命令输出的摘录lspci
:
# lspci
85:00.0 Fibre Channel: Emulex Corporation Saturn-X: LightPulse Fibre Channel Host Adapter (rev 03)
85:00.1 Fibre Channel: Emulex Corporation Saturn-X: LightPulse Fibre Channel Host Adapter (rev 03)
因此我认为我的服务器可以很好地检测到 FC HBA(光纤通道主机总线适配器),它似乎来自 Emulex 品牌。
该磁盘阵列与 Red Hat 5 和 6 服务器兼容,所以我不确定它是否真的可以与 CentOS 7 服务器一起使用,但我决定尝试一下。
我已遵循磁盘阵列的用户指南,能够从服务器远程连接到它,并且已完成所有必要的配置(创建 2 个磁盘的 Raid 1 存储池,从该池创建虚拟磁盘以将磁盘呈现给服务器,使用 LUN 编号将虚拟磁盘呈现给主机,...)。但是用户指南没有提到服务器端的任何内容。
磁盘阵列配置
关于我在磁盘阵列端如何执行配置的一些细节。
磁盘阵列操作系统是 SFA OS v1.3.0.8 。我找到的最接近的手册是这个(v1.4.0)。基本上,以下是我遵循的步骤(对应于文档的第 3.6.5 节及以下内容):
- 清洁磁盘阵列
$ application delete presentation * $ application delete host * $ delete virtual_disk * $ delete pool *
- 创建存储池
$ create pool raid_level=raid1 number=2
number
代表池的磁盘数量。创建的池的 ID 为 7。
- 根据该池创建虚拟磁盘
$ create virtual_disk capacity=max pool=7
虚拟磁盘基于我刚刚创建的池并使用其所有存储容量。
- 创建与我的服务器对应的主机对象:
$ application create host name=io1 ostype=linux
- 将发现的启动器导入到与主机的关系中:
$ app show discovered * | Initiator Identifier | | Index | Type | ID | node | port | Ctrl 0 | Ctrl 1 | 00003 FC 0x000001 0x20000000c99de40f 0x10000000c99de40f 1 Total FC Initiators: 1
仅发现一个启动器,其 ID 为 3。它对应于我的服务器的一台光纤通道主机:
$ cat /sys/class/fc_host/host10/port_name 0x10000000c99de40f
它与磁盘阵列的控制器 1 相关联,这实际上是我正在使用的唯一控制器。
$ application import discovered_initiator 3 host 3
- 向主机呈现虚拟磁盘
$ application create presentation virtual_disk 7 host 3
(我创建的虚拟磁盘的id是7)
虚拟磁盘和存储池似乎都处于就绪状态。
问题
现在我已经将磁盘提交给我的服务器了,我想将该存储空间作为文件系统挂载到我的服务器上。
我尝试检查/dev/
目录。sda
目前只安装了磁盘(我的服务器硬盘)。我查询了 中的每个文件/dev/
,发现一些可能与光纤通道或 Scsi 有关的文件:
/dev/bsg/
是专用于 Linux SCSI 通用驱动程序的目录,包含/dev/bsg/fc_host9
和/dev/bsg/fc_host10
;/dev/lpfcmgmt
专用于 Emulex 驱动程序;/dev/tgt
,由 SCSI 目标使用。
我安装了sg3_utils
,并在 fc_host10 上运行了扫描:
$ sg_scan /dev/bsg/fc_host10
/dev/bsg/fc_host10: scsi0 channel=0 id=0 lun=0 [em]
运行该扫描命令后,我仍然找不到其他内容/dev/sd*
。
此外,/sys/class/fc_host/host10/
是到的链接/sys/devices/pci0000:80/0000:80:07.0/0000:85:00.1/host10/fc_host/host10
,所以我想这给了我一种公交车的“ID”。
但这是目录中的文件列表/dev/disk/by-path
:
$ ll /dev/disk/by-path
total 0
lrwxrwxrwx. 1 root root 9 Aug 3 22:02 pci-0000:84:00.0-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx. 1 root root 10 Aug 3 22:02 pci-0000:84:00.0-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx. 1 root root 10 Aug 3 22:02 pci-0000:84:00.0-scsi-0:0:0:0-part2 -> ../../sda2
ID 不匹配,并且无论如何,这些都是指向 的符号链接/dev/sda*
,对应于我的服务器本地磁盘。
按照 billyw 的建议,我跑了
echo '- - -' > /sys/class/scsi_host/host10/scan
但它没有输出任何东西,而且仍然没有任何新的东西/dev/sd*
出现。
问题
我假设成功后磁盘应该显示为某些/dev/sd*/
。是这样的吗?如果不是,这些磁盘应该显示在哪里?
最后,如何才能使这些磁盘出现在我的服务器视角上?
编辑
根据 billyw 的建议,我跑了echo 1 > /sys/class/fc_host/hostX/issue_lip
。以下是日志。
显然这些FLOGI
错误与此无关,因为我处于环路拓扑中,而不是结构拓扑中。但是,没有磁盘出现在 中/dev
。
现在关注此主题,我重新启动了lpfc
驱动程序:
$ modprobe -r lpfc
$ modprobe lpfc
这导致了这些日志在/var/log/messages
。
这次,/dev/sdb
出现/dev/sdc
了。但我无法安装它们:
$ mount /dev/sdb /mnt/db
mount: /dev/sdb is write-protected, mounting read-only
mount: unknown filesystem type '(null)'
因此,我尝试调查重新启动时生成的日志lpfc
。首先,我注意到了该Link Up Event npiv not supported in loop topology
消息。我重新启动了lpfc
,npiv
这次禁用了它(我认为npiv
在我的情况下是没用的):
$ modprobe -r lpfc
$ modprobe lpfc lpfc_enable_npiv=0
日志完全相同,但是npiv
消息消失了。
我仍在调查日志,我的待办事项列表中的下一个错误是Warning! Received an indication that the LUN assignments on this target have changed. The Linux SCSI layer does not automatically remap LUN assignments.
。
答案1
要使磁盘出现在 下/dev/sd*
,解决方案是重新启动光纤通道 HBA 驱动程序,如这个答案就我而言,情况是lpfc
:
阻止lpfc
司机:
$ modprobe -r lpfc
启动lpfc
驱动程序:
$ modprobe lpfc
然后,我的设备出现在 下/dev/sdb
。之后,正如 GregL 所说,我需要对设备进行分区,然后使用给定的文件系统对其进行格式化。
下列的那条线:
parted
mklabel
我使用命令在磁盘上创建了一个 GPT 分区表。
$ parted /dev/sdb mklabel gpt
parted
mkpart
然后我使用命令创建了一个主分区,占据该设备上的所有空间(从 0% 到 100%)并进行最佳对齐:
$ parted --align optimal /dev/sdb mkpart primary 0% 100%
这给了我一个分区/dev/sb1
。
- 之后,我用文件系统格式化了该分区
xfs
(我已经在其他分区中使用该文件系统):
$ mkfs.xfs /dev/sdb1
- 最后,我挂载了分区:
mount /dev/sdb1 /mnt/disk_array/
现在一切正常:)
答案2
我的回答基于您的产品的文档,特别是第 3.12 节。我没有您的产品,因此请相信文档,而不是相信我。
您需要配置 DDN 存储阵列,以便服务器有权访问它。在您的案例中,术语发起者指服务器上的光纤通道 HBA,术语目标指DDN存储阵列上将呈现LUN的端口。
总结一下步骤:
- 显示存储阵列检测到的启动器,使用
APPLICATION SHOW DISCOVERED_INITIATOR *
- 创建一个主机(似乎只是一种标签形式),使用
APPLICATION CREATE HOST INDEX=<index> NAME=<host name> OSTYPE=<ostype>
- 将主机映射到启动器,使用
APPLICATION IMPORT DISCOVERED_INITIATOR=<initiator_id> HOST=<host-id>
- 检查映射是否正确,使用
APPLICATION SHOW INITIATOR *
- 将虚拟磁盘呈现给主机,使用
APPLICATION CREATE PRESENTATION INDEX=<index> HOST=<host> VIRTUAL_DISK=<vd-id> LUN=<lun-id>
- (还有一种替代的混杂模式,用于向所有主机端口呈现虚拟磁盘,但它带有警告)
- 检查演示是否正确,使用
APPLICATION SHOW PRESENTATION *
在服务器端,您应该能够使用以下命令重新扫描 LUN(将 X 替换为 HBA 编号):
echo '- - -' > /sys/class/scsi_host/hostX/scan
如果您计划将来更多地使用光纤通道,并且不想生活在狂野的西部,我还建议您学习分区。