
做虚拟化运维的基本都会遇到一个非常典型的任务给ESXi主机加共享存储。前阵子我们机房上了一台IBM Storwize v3700要把几台VMware ESXi主机接进去用FC光纤通道来跑生产业务。整个过程不算复杂但涉及存储、光纤交换机、虚拟化三层任何一个环节掉链子后面全白忙。这篇文章把我实际操作中踩过的坑、用过的命令、每一步背后的原理都记录下来给准备给ESXi添加v3700 FC存储的朋友做个参考。无论你是第一次接触FC SAN还是已经接过几台存储里面这些细节应该能帮你少走不少弯路。1. 动手前先把组网和硬件理清楚1.1 核心需求解析ESXi FC SAN的典型架构场景其实很常见。ESXi主机上的本地磁盘不够用了或者虚拟机需要vMotion、HA这些高级功能就必须得有共享存储。FC SAN是传统企业环境里最常见的选择走的是专用光纤通道稳定性和性能都比iSCSI好一个档次。v3700作为中端存储性价比不错配合FC交换机能轻松支撑几十台虚拟机的IO压力。我这次的环境是3台ESXi主机各自装了两块双端口QLogic FC HBA卡一共4个前端端口连接到两台光纤交换机上做冗余。每台交换机再接v3700的两个控制器存储端每个控制器也出了4个FC口。整体就是典型的双FC交换SAN拓扑任何一个链路断掉都有另外一条路径可以顶上。ESXi主机和v3700存储之间走的全部是FC协议不经过IP网络。提示使用FC存储之前一定要确认HBA卡和存储支持的速率匹配现在主流是16Gb FC。如果是老一点的8Gb HBA卡插到16Gb交换机上需要把交换机端口速率改成自适应否则容易协商失败。另外还要想清楚一件事这个存储阵列是给谁用的如果是给生产环境就要考虑控制器的缓存策略、卷的类型、多路径的冗余甚至要留出维护窗口。如果是给测试环境那可以稍微随意一点直接一个RAID5池一个卷打天下。我这次是混合环境既有生产虚拟机也有测试虚拟机所以我在后面会按不同需求多划几个卷而不是所有东西挤在一个卷里。1.2 硬件检查清单光纤卡、交换机、存储端配置动手前先检查这几样东西缺一不可ESXi主机上的HBA卡驱动和固件确认在VMware兼容列表里否则后面装驱动非常折腾。光纤模块和跳线我遇到过模块本身没问题但跳线被机房猫咬坏的排查起来非常痛苦。交换机上是否有空闲端口端口类型建议提前改成F_Port或自动协商。v3700的管理IP和SSH账号确保可以从管理网段访问。ESXi版本和v3700存储微码的兼容性还是建议先查一下官方互操作列表。这里我多说一句很多人忽略存储微码和HBA固件版本。有一次客户现场300多块盘只识别到100多块最后查出来是HBA固件太老导致上报给存储的WWN寄存器异常。建议在实施前确认所有固件都在厂家建议版本。ESXi 8.0如果搭配老款QLogic卡基本都需要更新到官方最新固件否则扫LUN的时候会出现“设备超时”的莫名其妙错误。1.3 存储规划RAID、存储池、卷大小v3700上面盘柜插满了硬盘之后不是直接就能用的。先要决定怎么组RAID组再把这些RAID组加入到存储池Storage Pool最后在池里划分卷Volume出去。这个流程和任何中端存储都差不多但v3700有自己的术语体系后面我会专门讲。我这次用的是24块1.2TB 10K SAS盘分了2个RAID5组每组11块盘加1块热备。这里不推荐用RAID6因为容量利用率太低除非你业务对盘故障容忍度要求特别高。每个RAID组对应创建一个MDisk然后两个MDisk并到一个Pool里这样池容量大约21TB左右。如果你们用的是大容量NL_SAS盘RAID6倒是可以考虑毕竟那种盘重建时间长多坏一两块盘的风险承受不起。卷大小看业务需求。一般虚拟机系统盘不需要太大200GB到500GB足够数据盘看情况给但建议做成精简置备v3700支持thin provisioning可以临时多分配一些。我这次划了3个卷第一个给生产VM3TB厚置备第二个给测试VM2TB精简置备第三个给备份转储用5TB厚置备。卷划分的原则是“能少则少”因为每个卷在ESXi里都是一个独立的LUNLUN太多会影响存储侧缓存命中率和多路径管理复杂度。2. 存储端配置v3700上创建存储池和卷2.1 登录管理界面和CLI基础v3700既可以通过图形界面管理也能用命令行。我个人习惯在存储划分这种批量操作时用命令行效率太高。开启SSH之后用putty连过去登录时用超级管理员账号。命令风格和IBM Storwize家族基本一样。登录后先别急着建池先看一下现有结构lsmdisk这个命令会列出所有MDisk以及它们的状态比如是否在线、是否已经被加入存储池。如果要看更详细的信息可以用lsmdisk -gui虽然图形界面也有但命令行在批量操作时更省事。比如我一次性要查询所有盘的容量和raid级别直接lsmdisk -filtervalue mdisk_typeraid输出结果一目了然。注意v3700的管理IP最好固定下来不要用DHCP。万一IP变了所有主机映射记录都会混乱。我习惯在存储和交换机上都配置好管理网段白名单避免SSH被乱连。2.2 创建存储池和管理卷v3700的术语要先分清MDisk对应一组RAID磁盘阵列可以理解为底层存储资源。Storage Pool由若干MDisk组成类似一个容量池。Volume从Pool里划分出来的逻辑单元映射给主机使用。创建存储池最简单的方式是在图形界面的存储池页面点击新建。但我通常会用命令因为命令可以顺手写进操作记录。先创建存储池mkarray -level raid5 -strip 256 -mdisk 1:2 -name V3700_Pool这里的-mdisk 1:2指的是把MDisk1和MDisk2加入这个池。如果你有多组MDisk要混在一个池里要小心不同RAID组的磁盘性能可能不一致。虽然存储池能混用但性能上强盘会被弱盘拖累我一般不推荐混合不同类型的MDisk。创建卷mkvolume -pool V3700_Pool -size 3TB -name VDI_DS01 -thin-thin代表精简置备。如果不需要精简可以不加这个参数。v3700的thin卷优点是可以超分配但必须监控水位。一旦池容量用满所有卷都会进入只读模式那是生产事故级别的问题。创建卷之后默认状态是available还没有映射给主机。下一步就要把卷和主机对上号。2.3 创建FC主机映射映射之前得先把ESXi主机的WWN告诉v3700。v3700的“主机”既可以是单台主机也可以是一个主机集群。我这里有3台ESXi按主机各自划分卷所以我给每台都建了单独的主机对象把该主机所有HBA口的WWPN都加进去。创建主机的时候可以用命令行mkhost -name esxi01 -fcwwpn 10000090fa123456:10000090fa654321 -type fcWWPN之间用冒号分隔注意是中英文冒号都不能混用。不过图形界面更直观。在“主机”页面添加主机命名然后扫描WWPN。v3700会自动发现通过Zone能看到的FC设备把这些设备里属于同一台主机的WWPN全加进去。注意一台ESXi主机有多个FC端口每个端口都会产生一个WWPN。要全部加进去漏掉一个后续多路径就会出问题。我一般按端口的位置命名比如esxi01_p1、esxi01_p2这样排障时一眼能看出来。2.4 把卷映射给ESXi主机主机对象建好之后把卷映射给主机。在卷列表里选中要映射的卷右键“映射”选择刚建好的主机。这时候系统会自动生成一个LUN IDESXi侧会按这个ID来识别存储设备。映射完以后可以在CLI里验证lsmapping输出里能看到哪个卷映射给了哪个主机LUN ID是多少。这一步千万别偷懒多检查几遍映射错误会导致ESXi识别到错乱的LUN。比如你把本该映射给ESXi02的卷不小心也映射给了ESXi01ESXi01会多出一个不认识的数据盘严重时甚至可能导致数据混乱。如果你有多台主机需要同时看同一个卷v3700支持多主机映射但默认可能会提示是否确认允许冲突。ESXi的VMFS里多个主机访问同一个LUN是正常的所以放心选允许。3. FC交换机Zone配置WWN对对碰3.1 查看ESXi主机和存储的WWPN/WWNNFC SAN里面的设备都有自己的WWNWorld Wide Name类似网卡的MAC地址。ESXi主机的HBA端口有WWPNv3700控制器的FC端口也有WWPN。要让主机和存储能通信必须先在FC交换机上把它们的WWN放到同一个Zone里。在ESXi上怎么看WWN可以进esxcli命令行esxcli fc port list这个命令会输出每个FC HBA端口的WWPN和WWNN我每次实施前都会把这些内容整理成一个表格方便后面在交换机和存储端同步操作。如果你有多台主机写个小脚本批量抓取也可以无非是echo几行命令的事。存储端的WWN在v3700管理界面的“系统”里能看到控制器的光纤卡各有WWPN。我这次是4个FC交换机端口接存储4个端口接ESXi每台交换机需要划多个Zone。注意有些老工程师习惯看端口号但在大型SAN网络里靠WWN才是靠谱的特别是当有人拔线重插之后端口号会变。3.2 在光纤交换机上配置ZoningZoning规则很简单每个Zone里包含需要互通的设备WWPN。我按“一主机一存储控制器”的原则划Zone。比如ESXi01的第一个端口和v3700控制器A的端口同zoneESXi01的第二个端口和控制器B的端口同zone这样主机看到两条路径也实现了控制器间的冗余。交换机是博科6505两个交换机各划Zone。常用的命令是zonecreate ESXI01_V3700_Zone1, ESXI01_P1_WWPN; V3700_CTRL1_WWPN cfgadd SAN_CFG, ESXI01_V3700_Zone1 cfgsave cfgenable SAN_CFG注意博科的zone名称不能用中文建议统一大写和下划线方便后期维护。如果使用思科MDS语法不同但原理一样。很多新手喜欢把所有主机和存储端口放在同一个大Zone里图省事。强烈不建议。这样一来一个问题主机的广播也会影响所有主机而且排障非常麻烦。Zoning划分得越细越利于隔离和管理。虽然多划几次Zone看起来麻烦但每划一次就是在给后面排障省时间。3.3 Zone配置后的验证配置完Zone用switchshow命令查看端口状态如果端口都显示OnlineWWN也出现在端口上基本就通了。再有问题先用portlogdump查一下有没有CRC错误。常见的一个奇葩情况是两个FC端口都显示online但ESXi怎么都看不到存储。这时重点查Zone是否真正启用了。博科有时候会忘记执行cfgenable配置存在但没生效。我习惯每次改完都再敲一遍cfgshow确认当前有效配置里包含了新加的Zone。注意启用配置时可能会造成短暂链路抖动尽量选业务低峰期操作。我最早有一次大白天在业务高峰期改配置结果一台正在跑数据库的虚拟机存储路径全部弹掉差点出事故。4. ESXi主机侧扫描与存储识别4.1 刷新HBA和存储适配器存储映射、Zone配置都完成之后在ESXi主机上要扫描新的存储设备。vCenter里进到主机存储适配器Storage Adapters页面右键对应的FC HBA选择重新扫描。也可以命令行esxcli storage core adapter rescan --all扫描的时候看下event日志有没有报错或新设备出现。这里有个小技巧如果ESXi主机很多可以在vCenter里批量选择几台主机同时扫描省时间。但注意不要主机数量太多否则存储控制器的承受能力有限有可能会出现短暂无响应。建议一批5台以内等稳定了再继续。扫描完成之后我习惯于用命令再验证一次而不是只看图形界面esxcli storage core device list这个命令会列出所有被ESXi识别的存储设备包括本地盘和FC盘。你可以在列表里找到厂商是IBM的盘。4.2 确认LUN是否正常显示扫描完成后到虚拟机的存储设备列表查看是否出现v3700映射出来的LUN。如果看不到优先排查Zone是否生效可以通过esxcli fc port list看端口state。卷是否正确映射到该主机回存储上确认。HBA驱动是否有问题。成功的情况你会看到类似“IBM STORWIZE V3700”的设备总线号、LUN号都显示出来。我通常会记下这个设备的naa编号比如naa.60050768018204c8xxxxxxxx后面配置多路径和数据存储的时候都要用到。如果是V3700 FCO8Gb FC这种型号还会在设备信息里看到控制器标识。多个LUN对应同一个控制器阵列是可以的但还是要确保每个LUN都能被主机正确识别不要出现LUN ID冲突。4.3 多路径策略配置FC存储识别到之后ESXi会用NMPNative Multipathing Plugin自动为每个LUN生成多个路径。查看路径esxcli storage nmp path list正常情况一个LUN应该显示4条路径两块卡×两个控制器。如果只显示2条一般就是Zone没划全或者HBA口没全部映射。多路径策略默认是“VMW_PSP_RR”轮循适用于大多数存储如果v3700建议用固定路径也可以改。改多路径策略的命令esxcli storage nmp psp set --device naa.xxxx --psp VMW_PSP_FIXED不过现在v3700大多能配合VMware做自适应RR就很稳。还有一个细节当ESXi挂载VMFS文件系统之后如果你再改多路径策略可能需要重新挂载一遍文件系统才能生效。所以建议在创建数据存储之前就先把多路径策略配好。5. 创建VMFS数据存储并投入使用5.1 在vCenter中新建VMFS数据存储识别到LUN后下一步就是建数据存储。vCenter里选中主机存储设备里找到新LUN创建新数据存储选择VMFS版本。ESXi 6.7以上一般都选VMFS6支持更高级特性比如自动精简回收。创建时注意选择分区大小和块大小。块大小默认1MB对于绝大多数虚拟机足够除非你单个VMDK超过2TB才需要改成4KB甚至8KB。注意一旦创建了VMFS块大小就不能再改了所以一开始要规划好。我给这台v3700的VDI卷创建的VMFS数据存储名称是“v3700_VDI_01”容量3TB。创建完之后在集群里的另一台ESXi主机上也要刷新存储把同样的LUN挂载到同一路径下才能实现共享。提示如果是vSAN或超融合环境可能不需要这样手动加存储但这里我们是普通FC SAN架构必须这样做。5.2 命名和数据存储配置细节最重要的一点给数据存储起一个清晰的名字不要用默认的datastore1。我一般按用途序号比如“v3700_VDI_01”。这样在多存储环境里排障一眼知道数据在哪。创建VMFS之后建议用esxcli storage vmfs extent list检查一下确认卷的UFS/UUID没问题。另外如果ESXi主机在集群里必须把每个主机都能看到该LUN并挂载上去才能在集群内vMotion。我还建议在vCenter里给共享存储打上标签比如“Role: Production”或“SLA: Gold”后面使用的时候可以直接按标签筛选尤其在多存储、多云环境下非常有用。存储数据存放的位置整理得越清楚后期扩容和迁移越轻松。5.3 挂载后验证性能和稳定性数据存储建立好先放几台测试虚拟机跑一下I/O用命令观察延迟和吞吐esxtop进入后按d看磁盘设备观察所有路径是否都active。如果某个路径是dead或者standby很可能是Zone配置或存储映射遗漏。 我的经验是先用fio或者vmkfstools做一个大文件复制看看会不会掉路径。有一次就是新建完没什么问题但大压力下一掉一条路径折腾半天发现是光纤模块的烧机问题。换了一个模块之后压力测试立刻正常。另外建议用esxcli storage nmp device list查看当前设备的路径策略和IO工作负载确保RR策略真的在负载均衡。如果只有一条路径在跑IO其他路径完全空闲那要检查一下是不是固定路径策略导致的。6. 常见问题与排查技巧实录6.1 主机看不到LUN怎么快速定位这是碰到最多的。主机扫不到LUN按顺序查存储映射lsmapping在存储上确认卷映射给了哪台主机WWPN有没有填错。Zoning交换机上确认Zone内WWPN正确且Zone已生效。用switchshow看端口。HBA驱动确认驱动没有异常升级驱动前先看VMware兼容矩阵。重启确实有一种情况下esxcli storage core adapter rescan不管用需要重启主机才能识别这是ESXi的老毛病实在没办法的时候可以试。还有一种容易被忽略的情况ESXi主机的FC HBA端口没有启用。有些服务器BIOS默认会禁用某个板载FC口你rescan多少次都没用。这种情况在服务器重启后会消失但下次重启可能又会禁用非常恶心。我一般在实施前先把所有FC端口状态都确认一遍。6.2 ESXi主机能看到多个相同LUN但路径不完整如果看到LUN但路径数比预期少一般是主机对象漏加WWPN或者Zone里ESXi的另一个HBA口没和存储控制器配对。这时候回到我们之前设置的命名规范一个个查。 还有一种情况是存储端卷映射到了多个“主机对象”导致每个对象把自己的WWPN当作单独启动器路径显示多但不完整。处理方式就是统一到一个主机对象下不要建多个相同名称的主机。我在实际工作中还遇到过一种情况ESXi主机认到两个完全一样的LUN设备ID相同但路径各半。其实这是因为存储端同一个卷被映射了两次一次给“esxi01”主机对象一次给“esxi01_hba2”主机对象。ESXi认为这是两个不同的设备所以会出现两个一模一样的数据存储。这样非常危险必须把多余的映射删掉。6.3 多路径显示active/standby但IO不均衡多路径状态里如果有一条active一条standby那不一定是错误固定路径策略下正常就是这样。如果你希望所有路径都参与IO把PSP改成RR轮循即可。需要注意旧版本驱动可能不支持RR要升级VMware的SAN驱动。提示别一看到standby就强迫症非要改成active。对于QLogic或者Emulex的卡固定路径反而能更好地配合存储控制器的缓存均衡。其实RR和固定路径的取舍要看存储端控制器的负载均衡算法。v3700作为双控制器存储如果主机有两条到不同控制器的路径RR能有效均衡两个控制器的压力。而固定路径只选一个控制器另一个控制器可能闲着。具体用哪个策略可以看v3700的官方最佳实践文档我这边实测是RR效果更好。6.4 性能不达预期或延迟波动加了FC存储后发现性能还不如以前本地盘先别急着怪存储。可以先看存储端卷的IOPS和带宽再用esxtop查看HBA队列深度。一般被忽略的原因是光纤交换机端口速率协商变成8Gb/4Gb或者光模块衰减导致重传增多需要检查交换机端口错误计数。另外v3700的卷若做了thin provisioning应该定期监控容量水位。当池容量接近满时性能会急剧下降。这个可以设定告警阈值避免影响业务。我上面提到过池满会导致卷变成只读这是非常严重的状态一定要提前设置监控。还有一个容易被忽略的点ESXi的VMFS数据存储需要预留一些空闲空间用于快照和vSphere HA。如果一个数据存储塞满了会导致很多自动化操作失败。我建议数据存储的剩余空间不要低于20%尤其在生产环境。7. 一些实施后的经验总结把整个流程走完最深的体会是给ESXi添加v3700 FC存储本身并不复杂真正的难点在于三层存储、FC交换机、虚拟化的细节对齐。尤其是WWN管理、Zoning划分、主机映射这三件事只要其中一处不一致后面排障几天都找不到头。所以我的建议是动手前画好一张拓扑图把所有设备的WWN、端口、Zone名称全部标注清楚然后在每个步骤完成后都做一次确认再进入下一步。不要迷信“图形界面点几下就好了”命令行验证一遍会稳得多。最后再分享一个技巧所有映射和Zone配置操作都保留一份文本记录存到运维文档里。下次需要加一台ESXi主机或者扩一台存储直接把记录翻出来照着做能省下很多时间。另外使用v3700的SSH命令创建存储池、映射卷这一点绝对值得花时间熟悉尤其在批量操作时比鼠标点来点去靠谱得多。我现在已经把所有ESXi主机的FC WWPN、存储池名称、卷映射表、Zone配置都整理成一张大表后续维护基本不会慌。