1. 为什么大家都在折腾 iSCSI 服务器先说个我最近遇到的场景一个朋友的小公司有三台服务器跑着虚拟化之前每台机器各挂各的硬盘虚拟机想从一台迁移到另一台要么先关机拷文件要么折腾半天同步脚本折腾一次少说半小时。后来帮他搭了一台 iSCSI 服务器三台物理机统一挂同一个存储池虚拟机在线迁移变成面板上点两下的事他第一反应是“原来这么简单”。这就是 iSCSI 服务器最典型的价值——用普通网络和普通服务器把分散的存储集中成一块共享磁盘。iSCSI 的全称是 Internet Small Computer System Interface核心思路非常直接把传统 SCSI 存储指令封装进 TCP/IP 包里通过网络传输。服务器称为 Initiator发起端通过网络连接存储设备称为 Target目标端就像是本地插入了一块硬盘。对操作系统来说iSCSI 盘和本地盘几乎没区别能分区、格式化、建文件系统甚至在上面跑数据库或者装系统。谁最适合用这套方案我的判断是三类人正在折腾服务器虚拟化需要多台宿主机共享存储做 HA、在线迁移的人有 NAS 或者旧服务器闲置想物尽其用当集中存储的人刚接触存储想低成本学习 SAN 概念和配置流程的人。当然iSCSI 不是万能药它更适合中小规模、性能要求中等、预算有限的场景。如果你的业务对存储延迟极度敏感比如核心数据库每秒几万次随机读写那还是老老实实考虑本地 NVMe 或者真正的 FC SAN。把 iSCSI 用在合适的场景是这篇文章想帮你做的第一个判断。1.1 iSCSI 到底解决什么问题很多人分不清 iSCSI 和 NAS 的区别这里我用一个生活化的类比讲清楚。NAS 好比一个公共文件柜大家通过 SMB、NFS 往里面存取文件你看到的是“文件”格式、权限都由 NAS 自己管理。而 iSCSI 更像是把你家的一块硬盘用一根很长的 SATA 线接到了别人电脑上对方看到的是“裸磁盘”分不分区、用什么文件系统完全由使用方自己决定。这种“给裸盘”的方式解决了几个实际问题。虚拟化平台需要共享存储才能实现 vMotion、HA、FT 这些高级功能因为虚拟机磁盘文件必须放在所有宿主机都能访问的地方。数据库集群、文件服务器集群也常常需要一份所有节点都能并发读写的共享磁盘。还有做容灾备份时远程备份节点通过 iSCSI 直接挂载备份盘比层层文件复制高效得多。我见过不少人用 NFS 给虚拟化做共享存储小规模确实能跑但碰到要对磁盘做裸设备映射、Windows 集群验证磁盘、或者数据库要求 SCSI 锁语义的时候NFS 就不够用了。iSCSI 在这种场景下表现更接近“真正的存储”。1.2 对比 DAS、NAS、FC SANiSCSI 赢在哪存储方案选型本质上是在成本、性能、易用性之间做取舍。我把常见方案放在一起比较过结果如下方案成本性能易用性适合场景DAS 直连硬盘最低极高简单单机存储无法共享NASSMB/NFS中中简单文件共享虚拟化小规模可用iSCSI SAN中低中高中等中小虚拟化集群共享裸盘FC SAN极高极高复杂大规模生产环境核心数据库iSCSI 最大的优势是它跑在标准以太网上不需要专门的光纤交换机、HBA 卡。现有的交换机、网卡、网线都能用很多服务器自带万兆网口跑 iSCSI 性能相当可观。相比 FC SAN 一套动辄几十万的硬件iSCSI 几乎零硬件成本投入。不过它也有短板最大的问题是性能受网络影响很大。普通千兆网理论带宽只有 125MB/s跑多台虚拟机会吃紧另外 iSCSI 走 TCP/IP 协议栈CPU 开销比 FC 高好在中高端网卡都支持 TCP 卸载引擎TOE和 iSCSI 卸载能缓解不少。理解这些边界你就知道为什么后面要专门花篇幅讲网络调优。2. iSCSI 核心概念搞懂这几个词配置基本不会翻车iSCSI 配置之所以劝退很多人是因为术语太劝退。Initiator、Target、LUN、IQN、Portal、CHAP…第一次看到这些词确实像天书。其实这些概念每个都很简单我一个个拆开讲。2.1 Initiator、Target、LUN、IQN 都是什么**Initiator发起端**是请求存储的一方也就是使用 iSCSI 盘的服务器。Windows 自带 iSCSI 发起程序Linux 装 open-iscsi 软件包ESXi 内置软件 iSCSI 适配器。**Target目标端**是提供存储的一方就是我们的 iSCSI 服务器。一个 Target 相当于一个“磁盘柜”里面可以放多个 LUN。**LUNLogical Unit Number**是 Target 里的逻辑存储单元也就是客户端实际挂载到的“那块盘”。一个 Target 可以对外提供多个 LUN客户端连上 Target 后能看到并挂载这些 LUN。**IQNiSCSI Qualified Name**是 iSCSI 世界的身份证。格式通常是iqn.年份-月份.反向域名:自定义标识比如iqn.2024-04.example.com:storage01。Initiator 和 Target 都有各自的 IQN配置访问控制时就是认这个名字。用一个类比帮你记住Initiator 是“买家”Target 是“店铺”LUN 是店铺里的“商品”IQN 是“营业执照号”。买家拿营业执照号进店选商品拿走用。2.2 Portal、CHAP 认证和发现机制Portal是 Target 对外暴露的入口就是“IP 地址 端口”。默认端口是 3260。配置完 Target 之后客户端通过 Portal 地址去“发现”它就像你用手机号去添加联系人一样。CHAPChallenge Handshake Authentication Protocol是 iSCSI 的认证机制。简单说Initiator 和 Target 之间用一个用户名和密码互相确认身份。很多人配置 iSCSI 图省事不设 CHAP内网环境问题不大但只要存储服务器有被非信任设备访问的可能我强烈建议开 CHAP。原因后面在问题排查章节会详细讲。发现机制分静态发现和动态发现。动态发现就是客户端主动向 Portal 发送 Discover 请求列出该地址上所有允许它访问的 Target。静态发现则直接手动填写 Target 的 IP、端口和 IQN。生产环境我更推荐用静态发现少一次广播交互连接更稳定。把这些词串起来整个 iSCSI 工作流程就是Initiator 通过 Portal 发现 Target经过 CHAP 认证后建立会话Session然后挂载 Target 上的 LUN操作系统把它当作一块本地磁盘来用。就这么简单。2.3 网络规划为什么我建议单独划一个 VLANiSCSI 是存储流量和业务网络混在一起会互相干扰。我踩过一次很深的坑客户把 iSCSI 和办公网络放在同一个交换机上某天一个同事大带宽下载文件直接把存储网络打满虚拟化的数据库虚拟机全卡住。从那以后我配置 iSCSI 必做几件事单独划分一个 VLAN 专门跑存储流量或者至少用独立物理网口存储网段不和业务网段重叠用 10.0.0.0/24 这类独立地址段有条件就上双网卡做绑定后面在调优章节细讲尽量避免 iSCSI 流量跨三层路由同一二层网络内延迟最低。还有 MTU 的问题。标准以太网 MTU 是 1500如果交换机、网卡都支持可以开 Jumbo Frame巨帧MTU 设到 9000。大帧能让每次传输携带更多数据降低包数量对吞吐量有明显提升。但注意整个链路上所有设备必须都支持 9000有一个设备不支持就会出问题。我的习惯是先不开等基础功能全部调通确认链路没问题再逐步开。3. 从零搭建 iSCSI 服务器Linux targetcli 实战接下来写实操。我以 Linux 上最主流的 targetcli 工具为例。targetcli 是 LIOLinux IO Target的管理工具LIO 是内核自带的 iSCSI Target 实现稳定性和性能都经过生产验证。无论你是 CentOS、Rocky、Ubuntu 还是 Debian都可以用这套命令只是安装包名略有区别。3.1 环境准备硬件和软件要求先说硬件。iSCSI 服务器不需要多高的配置但磁盘和网络是硬指标。硬盘建议用独立盘阵或者至少机器上有额外的数据盘别把系统盘和存储盘混在一起。我习惯给存储划独立的磁盘或者 RAID 卷而不是直接把根分区的一个目录共享出去虽然 fileio 也支持文件模拟盘但性能和稳定性都不如块设备。网络方面服务器至少一个千兆口推荐双千兆或万兆。如果是虚拟化生产环境万兆是起步配置。软件方面需要安装 targetcli不同系统命令如下# CentOS / Rocky / AlmaLinux dnf install -y targetcli # Ubuntu / Debian apt update apt install -y targetcli-fbUbuntu 的包名是 targetcli-fb这是因为 Linux 基金会维护的版本。装完直接敲targetcli进入交互式管理界面。3.2 创建 Target 和 LUN一步一步来我先把完整命令贴出来然后逐行解释。假设我们有一块空闲数据盘/dev/sdb想创建一个 LUN 提供给客户端。# 进入 targetcli 交互界面 targetcli # 进入 backstores 目录 cd /backstores/block # 用 /dev/sdb 创建名为 disk01 的块设备存储对象 create disk01 /dev/sdb # 回到根目录 cd / # 创建一个新的 targetIQN 按规范命名 /iscsi create iqn.2024-04.example.com:storage01 # 在 target 下创建 LUN关联到刚才的块设备 /iscsi/iqn.2024-04.example.com:storage01/tpg1/luns create /backstores/block/disk01 # 为目标配置访问 ACL只允许指定的 initiator 连接 /iscsi/iqn.2024-04.example.com:storage01/tpg1/acls create iqn.2024-04.client1.example.com # 设置 CHAP 认证 /iscsi/iqn.2024-04.example.com:storage01/tpg1 set attribute authentication1 /iscsi/iqn.2024-04.example.com:storage01/tpg1/acls/iqn.2024-04.client1.example.com set auth useridiscsi_user /iscsi/iqn.2024-04.example.com:storage01/tpg1/acls/iqn.2024-04.client1.example.com set auth passwordYourStrongPassword # 查看整体配置 ls / # 保存配置使其开机自动加载 saveconfig整个过程最重要的是理解层级关系。targetcli 的目录结构是/iscsi/target_iqn/tpg1/下挂三块luns定义存储后端acls定义谁能访问portals定义入口地址。默认创建 target 时会自动生成一个 portal监听所有 IP 的 3260 端口。如果只想监听某个特定 IP先删掉默认 portal 再新建/iscsi/iqn.2024-04.example.com:storage01/tpg1/portals delete ip_address0.0.0.0 ip_port3260 /iscsi/iqn.2024-04.example.com:storage01/tpg1/portals create 192.168.100.10 3260这里我建议只监听存储专用 IP不要用 0.0.0.0 全监听减少暴露面。保存完配置后别忘了让服务开机自启systemctl enable target --now3.3 多 Target 规划与权限隔离一个 iSCSI 服务器通常不只服务一个客户端。我常用的规划方式是每个业务或每个客户端建一个独立 TargetIQN 里带上业务标识。比如iqn.2024-04.example.com:web-cluster、iqn.2024-04.example.com:db-backup。这样 ACL 管理非常清晰谁访问哪个存储一目了然。权限隔离要靠 ACL 和 CHAP 双保险。ACL 控制哪个 Initiator 能连CHAP 控制账号密码是否正确。生产环境我见过只做 ACL 不做 CHAP 的方案相当于只看了身份证没验证人是不是本人。如果机器被攻破或者网卡 MAC 被伪造整个磁盘直接暴露。所以我在所有环境都会开启 CHAP成本极低安全感拉满。还有一个细节LUN 的配置顺序会影响设备编号。多 LUN 的情况下客户端看到的盘符可能按添加顺序变化。为了稳定我建议在所有 LUN 创建好后设置 lun serial 号或者在客户端用 UUID 挂载最好别依赖/dev/sdb这种设备名。4. 客户端连接与挂载实操Windows、Linux、ESXi 全覆盖服务端配好了接下来看客户端怎么连。我会分别讲 Windows、Linux、ESXi 三种最常见的场景每一步都可以直接照着做。4.1 Windows 客户端连接 iSCSIWindows 从 7 开始自带 iSCSI 发起程序不需要装任何额外软件。操作路径是控制面板 → 管理工具 → iSCSI 发起程序。第一次打开会提示启动服务确认即可。在“目标”标签页填入 iSCSI 服务器的 IP 或域名点击“快速连接”。如果需要认证先在“配置”标签页点“CHAP”设置用户名和密码与服务器端配置一致。然后回到快速连接勾选“高级”里面可以指定本地网卡 IP、发起端 IQN以及启用 CHAP。连上之后打开“磁盘管理”会看到新出现的磁盘处于未初始化状态。右键初始化然后新建简单卷分区格式化分配盘符。整个过程和操作本地硬盘一模一样之后这块“网络硬盘”就能正常使用了。Windows 这边有几个小坑需要提醒关机或重启时iSCSI 盘可能出现未安全移除的警告正常现象不影响下次启动自动重连系统默认 60 秒没有 I/O 就可能会丢会话适合办公场景跑数据库建议调整超时参数如果要从 iSCSI 盘启动系统需要在服务器 BIOS 里配置 iSCSI 启动那就是另一个话题了门槛更高。4.2 Linux 客户端连接 iSCSILinux 客户端需要安装 open-iscsi 工具包# CentOS / Rocky dnf install -y iscsi-initiator-utils # Ubuntu / Debian apt install -y open-iscsi安装好后先配置本机的 Initiator IQN。文件在/etc/iscsi/initiatorname.iscsi内容格式如下InitiatorNameiqn.2024-04.client1.example.com这个 IQN 必须和服务器端 ACL 里设置的一致否则会被拒绝连接。然后配置 CHAP 账号vi /etc/iscsi/iscsid.conf找到node.session.auth.authmethod相关配置修改为node.session.auth.authmethod CHAP node.session.auth.username iscsi_user node.session.auth.password YourStrongPassword接下来是发现和连接# 发现服务器上的 target iscsiadm -m discovery -t st -p 192.168.100.10 # 登录所有发现的 target iscsiadm -m node -l登录之后lsblk或fdisk -l就能看到新设备通常是/dev/sdb或/dev/sdc。分区格式化fdisk /dev/sdb mkfs.xfs /dev/sdb1 mkdir /mnt/iscsi01 mount /dev/sdb1 /mnt/iscsi01如果希望开机自动挂载需要两步。第一步开启 iscsi 服务自动连接目标第二步在 fstab 里用 UUID 挂载别用设备名systemctl enable iscsid --now systemctl enable iscsi --now # 查看 UUID blkid /dev/sdb1 # 在 /etc/fstab 增加一行 UUIDxxxxxx /mnt/iscsi01 xfs defaults,_netdev 0 0_netdev这个挂载选项特别重要它告诉系统在网络就绪后再挂载避免开机时网络还没起就尝试挂载导致失败。4.3 ESXi 7 挂载 iSCSI 存储的完整流程服务器虚拟化场景下ESXi 挂 iSCSI 是核心操作。先说一个大原则ESXi 的 iSCSI 配置必须在 Web Client 和命令行两边配合而且很多隐藏参数只能命令行改。Web Client 操作步骤如下在“主机 → 存储 → 适配器”中添加“软件 iSCSI 适配器”ESXi 7 会创建一个名为vmhba64的虚拟适配器选择该适配器在“网络端口绑定”中添加用于 iSCSI 的 VMkernel 网卡。这里一定要单独建一个 VMkernel标记为“iSCSI 启用”并放在存储 VLAN 里在“动态发现”中填入 iSCSI 服务器的 IP如果设了 CHAP在“身份验证”里配置 CHAP保存配置后到“主机 → 存储 → 存储设备”里点击“重新扫描”就能看到新发现的存储设备新建数据存储类型选 VMFS选中 iSCSI LUN跟着向导走完即可。命令行方面用esxcli也能完成全部操作# 查看软件适配器 esxcli iscsi software list # 添加动态发现目标 esxcli iscsi adapter discovery add -A vmhba64 -i 192.168.100.10 # 设置 CHAP esxcli iscsi adapter auth chap set -A vmhba64 -u iscsi_user -p YourStrongPassword # 重新扫描 esxcli storage core adapter rescan -A vmhba64ESXi 下最容易踩的坑是存储网络不通。很多人在 ESXi 里把 VMkernel 建好了但网卡属性没选“iSCSI 启用”或者 VLAN ID 不对结果就是发现不到 Target。排查思路是先用vmkping -I vmk1 192.168.100.10测试存储网络的连通性通了再去查 iSCSI 的发现和认证配置。ESXi 挂 iSCSI 还有一个关键概念叫“端口绑定”Port Binding。如果你只有一块物理网卡软件适配器的默认行为就能工作。但如果你给 iSCSI 配了多块网卡ESXi 默认只用一个路径带宽可能浪费。我建议给每个 iSCSI 的 VMkernel 配置独立物理网卡并启用端口绑定配合 NMP 的多路径策略能实现带宽聚合和故障切换。这在后面调优章节会演示具体命令。5. 常见问题排查与性能调优实录这个章节是我想重点写的部分因为 iSCSI 的坑远比配置步骤多。我把自己遇到过的、以及身边朋友踩过的问题整理成一个速查表再拆几个典型的排查过程。5.1 问题速查表连接、认证、挂载三连坑现象可能原因排查命令 / 方法发现不到 Target防火墙拦截 3260 端口ss -lntp确认监听firewall-cmd --list-all检查放行连接超时网络 VLAN 不通 / MTU 不一致ping、ping -M do -s 8972测大包认证失败CHAP 用户名或密码不一致检查两端配置服务端targetcli ls看 auth 参数LUN 挂上但看不到磁盘客户端未重新扫描Windows 磁盘管理刷新Linuxiscsiadm -m session -r重扫上机重启后盘不见了fstab 缺_netdev检查 fstabiscsi 服务未启用ESXi 找不到存储VMkernel 未启用 iSCSIvmkping测通esxcli iscsi adapter discovery list性能跑不满网络未开巨帧 / 单路径检查 MTU配置多路径掉线频繁交换机泛洪 / 网线质量看dmesg换交换端口测试5.2 典型排查ESXi 发现不了 iSCSI 目标这个场景我排查过很多次思路已经固化了。第一步先区分是网络问题还是 iSCSI 配置问题。vmkping -I vmk1 192.168.100.10能通说明二层网络没问题。然后看 vmkping 的通-丢包情况如果丢包严重多半是交换机端口速率协商问题或者 VLAN 配置错了。网络确认通了之后在目标服务器上执行targetcli ls确认 Target 的 Portal 监听地址如果只监听在某个特定 IP 上而客户端访问的是另一个 IP自然发现不了。这就是为什么我建议 Portal 要么监听存储专用 IP要么干脆用 0.0.0.0但配合防火墙做白名单限制。再下一步查 ACL。esxcli 里查 initiator IQNesxcli iscsi adapter get -A vmhba64拿到 IQN 后到服务端 targetcli 里确认 ACL 列表里有没有这个 IQN。有一次我调了半天最后发现是之间手误把 IQN 里的字母大小写搞错了。IQN 大小写敏感这是最容易忽略的细节。5.3 性能调优从千兆到万兆的实战配置iSCSI 性能调优我的优先级排序是网卡绑定和路径冗余 巨帧 MTU IO 队列深度 文件系统挂载参数。先说多路径。这里有两种做法一种是 iSCSI 层多路径MPIOWindows 原生支持另一种是网卡绑定如 Linux bonding 的 balance-alb 或 802.3ad。我的经验是Linux 下做 bond 比做 MPIO 简单而且兼容性更好。bond mode 4802.3ad需要交换机侧配合配置 LACP。ESXi 下则建议走 NMP 多路径。给同一个 LUN 配置多个目标路径后在“存储设备 → 属性 → 管理路径”里选“轮转Round Robin”策略两个网卡就能轮流承载 IO。命令如下# 查看当前路径 esxcli storage nmp path list # 设置 Round Robin esxcli storage nmp satp set --satpVMW_SATP_ALUA --default-pspVMW_PSP_RR巨帧方面务必要两端同步开启。Linux 和 ESXi 分别在网卡和 VMkernel 上设置 MTU 9000。有一个验证方法是从一端用大包 ping 另一端如果通了就说明链路支持。比如在 Linux 上执行ping -M do -s 8972 192.168.100.118972 是 9000 减去 28 字节的 ICMP 头部能通说明 MTU 9000 链路正常。内核参数和文件系统挂载参数也是隐藏收益。Linux 下 iSCSI 会话建议提高命令超时和无超时连接时间在/etc/iscsi/iscsid.conf里调整node.session.timeo.replacement_timeout 120 node.conn[0].timeo.noop_out_interval 5 node.conn[0].timeo.noop_out_timeout 30挂载时XFS 建议加noatimeext4 加noatime,nobarrier。数据库场景建议 LUN 自己管理缓存策略不要交给文件系统层叠叠缓冲。这些都是老调重弹但真的能拉开性能差距。5.4 备份与安全iSCSI 服务器最容易忽略的三件事iSCSI 服务器一旦上线就是整个虚拟化环境的命脉所以备份和安全必须提前规划。第一件事是配置备份。targetcli 的配置保存在/etc/target/saveconfig.json我每次改完配置都会复制一份到/root/backup/下。恢复也很简单拷贝回原路径后重启 target 服务即可。但 LUN 里的数据不在配置文件里数据备份还得靠快照工具或 rsync。如果用的是文件模拟盘直接备份文件就行块设备 LUN 建议用 LVM 快照。第二件事是网络安全。我之前建议单独开 CHAP这其实是安全的第一道门。第二道门是防火墙只允许存储 VLAN 的网段访问 3260 端口。以 firewalld 为例firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.100.0/24 port port3260 protocoltcp accept firewall-cmd --reload第三件事是监控。iSCSI 服务器出问题通常是静默的——盘还在但 IO 卡住。我建议至少监控磁盘 IO 等待时间和网络丢包率最好接入现有的监控系统比如 Prometheus node_exporter配合告警规则。存储挂了如果没告警等于赤手空拳出事故。多提一嘴iSCSI 服务器主机本身的操作系统也要更新、加固千万别以为存储服务器不需要维护。它是提供服务的但用的还是普通操作系统同样有被攻破的风险。养成定期安全更新的习惯很重要。写在最后关于 iSCSI 服务器我的实操体会搭过这么多套 iSCSI 环境之后我最大的体会是iSCSI 的难点从来不在配置命令而在于网络设计和预期管理。很多人第一次搭完跑个dd测速发现还不如本地硬盘就下结论说 iSCSI 不行。其实主要原因是没做网络隔离、没开巨帧、没用多路径或者说千兆网卡本身就不适合高 IO 场景。先想清楚你的负载需要多少吞吐和延迟再倒推网络方案才是正确的思路。还有一个小技巧分享给你排查 iSCSI 问题时记得先看服务端targetcli ls的输出再看客户端iscsiadm -m session或 Windows 发起程序的状态最后才去看交换机。我之前遇到过好几次问题其实出在交换机的端口上了但一开始就被配置细节带偏绕了远路。如果你只是自己的实验室玩一玩一台旧 PC、一块闲置硬盘、一个千兆口就足够跑起 iSCSI 了。先跑通再优化再上生产。把这个流程走一遍你对存储网络、虚拟化、运维的理解都会上一个台阶。希望这篇内容对你有用。
阅读完成 · 觉得有帮助?