ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

iSCSI存储挂载实战:从Target配置到多客户端接入指南

iSCSI存储挂载实战:从Target配置到多客户端接入指南 前两天帮朋友把那台吃灰的旧服务器改造成全家共享的存储中枢他一听我打算用 iSCSI先愣了半天这不是远古技术吗我笑了笑在存储挂载这件事上iSCSI 确实算老黄牛级别的协议但直到今天它依然是很多虚拟化集群、数据库服务器和 Windows 工作站扩盘时绕不开的选项。这次配置里我需要在服务端把一块 1TB 机械盘和一块 512GB SSD 分别切成 LUN 映射出去再在几台不同系统的客户端上完成挂载整个过程踩了不少认证、路径、开机自动挂载的坑。这篇文章就把服务端和客户端配置从头到尾捋一遍希望能帮你少走我走过的弯路。适合看这篇的人管着几台 Linux 或 Windows 机器、想统一利用闲置磁盘的运维家里用成品 NAS包括极空间 Z2Pro 这类设备想把存储空间直接映射成本地硬盘的玩家以及刚接触块级存储、觉得 iSCSI 无从下手的新手。如果只做文件共享NFS/SMB 可能够用但你要是打算给虚拟机加数据盘、给数据库放数据文件那这份配置指南基本能直接用。1. 先搞清楚 iSCSI 到底解决了什么问题1.1 一句话理解 iSCSI把网线当成硬盘线iSCSI 全称是 Internet Small Computer System Interface核心思想就是把 SCSI 命令封装在 TCP/IP 包里传输。用人话讲就是让一台机器的磁盘通过网络出现在另一台机器上操作系统看到它时会认为这是一块真实存在的本地硬盘而不是一个共享文件夹。这个让远端存储变成本地块设备的能力是理解 iSCSI 的关键。服务端叫 Target负责把本地磁盘或文件对外发布客户端叫 Initiator负责发起连接并消费这些存储资源。两边都用 IQNiSCSI Qualified Name作为身份标识类似每个人的身份证号。IQN 的格式一般是iqn.2024-08.example:store1这种反转域名加上自定义名称全局唯一。操作系统把 iSCSI 盘识别为块设备之后你可以对它任意分区、格式化、建分区表甚至在上面装操作系统。虚拟机软件PVE、ESXi、Hyper-V之所以喜欢 iSCSI就是因为可以直接把远端 LUN 当虚拟磁盘使用不需要额外挂载目录。1.2 和 NFS/SMB 比为什么块级共享仍然不可替代有人会问文件共享协议里 NFS 和 SMB 那么成熟为什么还要搞 iSCSI区别在文件级和块级。NFS/SMB 解决的是把目录共享给别人客户端看到的是一个文件夹里面的文件读写由服务端来调度。而 iSCSI 共享的是整块硬盘客户端拿到的是完整的设备控制权。这意味着客户端可以自己格式化选择 ext4、XFS、NTFS 或者 Windows 动态磁盘可以跑需要裸设备支持的数据库实例多个节点可以通过集群文件系统如 GFS2、OCFS2并发访问同一块盘虚拟化平台可以直接在上面存储虚拟机镜像文件。生活化类比就是NFS/SMB 是你在餐厅点单厨房做好端上来iSCSI 是你直接承包了后厨的一块灶台自己动手炒菜想怎么折腾都行。代价是你得对自己的数据布局负责服务端只是老老实实把底层块传给你。1.3 什么时候该用 iSCSI什么时候应该绕开不是所有存储需求都适合 iSCSI。根据我长期折腾的经验下面这些场景是它的主场给虚拟化平台提供共享存储尤其是需要在多台宿主机之间做虚拟机迁移给数据库服务器挂载数据文件追求低延迟和块级控制Windows 集群的共享磁盘或需要把远端存储做成本地盘的桌面场景小型备份环境用 iSCSI 把备份机的大容量存储挂给主业务机。反过来以下场景建议别硬上 iSCSI多人同时编辑同一批文档需要文件锁和细粒度权限这应该交给 SMB跨平台文件共享Windows、macOS、Linux 都要访问文件协议更好用存储设备本身性能有限又希望即插即用那 SMB 的生态适配性更强。一个很典型的判断方法问自己客户端需要看到目录还是需要看到一块硬盘。前者选文件协议后者选块协议。搞清楚这个后面的配置就不会跑偏。2. 服务端配置把一台 Linux 变成 iSCSI Target2.1 环境准备装对软件、盘位规划服务端我这次用的是 Ubuntu 24.04内核版本 6.x完全支持 target 功能。如果你用的是 CentOS/Rocky 或者 Debian命令基本通用只是包管理器不同。第一步安装 targetcli-fbsudo apt install -y targetcli-fb # Debian/Ubuntu sudo yum install -y targetcli # CentOS/Rocky然后启动并开机自启sudo systemctl enable --now target安装完成后先不要急着创建 target先把磁盘规划想清楚。我的建议是单独准备一块物理盘或有独立路径的磁盘别把系统根分区所在盘直接拿来做 target记录下盘的设备名和容量比如/dev/sdb1TB、/dev/sdc512GB想清楚这些盘要给谁用之后创建 ACL 时要用到客户端的 IQN。这里有个容易犯的错有人随手把整块/dev/sda系统盘也划进 LUN后来 reboot 才发现系统都没了。所以规划阶段一定要确认lsblk的输出看清楚谁是谁。2.2 核心操作用 targetcli 创建 Target、LUN 和 ACLtargetcli 是现在 Linux 下配置 iSCSI Target 最主流的工具它的好处是可以交互式操作配置结果即时生效再执行一次saveconfig就能持久化。进入交互界面sudo targetcli典型的完整操作过程如下/ backstores/block create namestore1 dev/dev/sdb / backstores/block create namefaststore dev/dev/sdc / iscsi create iqn.2024-08.example:rgstore / iscsi/iqn.2024-08.example:rgstore/tpg1/luns create /backstores/block/store1 / iscsi/iqn.2024-08.example:rgstore/tpg1/luns create /backstores/block/faststore / iscsi/iqn.2024-08.example:rgstore/tpg1/acls create iqn.1993-08.org.debian:windows-pc / iscsi/iqn.2024-08.example:rgstore/tpg1/acls create iqn.1993-08.org.debian:linux-node逐条解释一下做了什么backstores/block create namestore1 dev/dev/sdb表示把物理块设备/dev/sdb注册为一个后备存储这是后面 LUN 的数据来源iscsi create iqn.2024-08.example:rgstore创建了一个 target名称为rgstore在tpg1Target Portal Group 1下创建 LUN把刚才的后备存储挂上去这样 target 对外暴露的两块盘分别对应 store1 和 faststore最关键的是 ACL只允许我指定 IQN 的客户端访问。没有 ACL 的话任何一个知道 IP 的发起程序都能连上来这对内网设备也很危险。如果你手头没有空闲物理盘也可以先用文件模拟块设备来测试很多教程会用这种方式避免误操作/ backstores/fileio create nameteststore file_or_dev/data/store.img size200G在实际部署时我更推荐用 block backend而不是 fileio因为文件模拟多了一层文件系统开销性能会有可见损耗。测试环境无所谓生产环境能上 block 就上 block。创建完成后执行ls看一下树形结构然后saveconfig把配置写入/etc/target/saveconfig.json。重启 target 服务后配置依然在。2.3 服务端必须做好的安全与持久化很多人图省事把 target 建好就开开心心去客户端挂载了结果后面被 CHAP 认证坑得满头包。我的习惯是建好 target 后第一时间把认证和安全相关的事情做掉。先开防火墙端口iSCSI 默认使用 3260/tcpsudo ufw allow 3260/tcp然后打开 CHAP 认证。在 targetcli 里进入 target 的 tpg1设置认证属性/ iscsi/iqn.2024-08.example:rgstore/tpg1 set attribute authentication1 / iscsi/iqn.2024-08.example:rgstore/tpg1 set attribute generate_node_acls0 / iscsi/iqn.2024-08.example:rgstore/tpg1 set attribute demo_mode_write_protect1这几个参数的含义authentication1启用 CHAP 认证客户端必须提供用户名密码才能登录generate_node_acls0关闭自动生成 ACL避免给未知客户端放行demo_mode_write_protect1即使被探测到也不允许写入相当于一个保护性兜底。然后给 ACL 里的每个客户端设置用户名密码。以windows-pc为例/ iscsi/iqn.2024-08.example:rgstore/tpg1/acls/iqn.1993-08.org.debian:windows-pc set useridstoreuser / iscsi/iqn.2024-08.example:rgstore/tpg1/acls/iqn.1993-08.org.debian:windows-pc set passwordStorePass2024保存配置/ saveconfig / exit之后再改任何参数一定记得保存。我见过有人配完没 saveconfig顺手 reboot然后一脸懵地来问为什么 target 消失了。target 服务本身是可用的但配置没持久化相当于白干。提示targetcli saveconfig只会保存当前配置到本地 JSON 文件。如果你用容器或云主机还需要把配置文件一并纳入备份策略否则机器故障恢复后要重建所有 LUN。3. 客户端配置Windows、Linux 和成品 NAS 的挂载姿势3.1 Windows 自带 iSCSI 发起程序根本不用装额外软件Windows 是 iSCSI 客户端里最傻瓜化的系统自带iSCSI 发起程序无需装驱动。在 Windows 10/11 或 Server 版上直接按 Win 键搜索 iSCSI 发起程序 打开首次运行会提示服务未运行点是。关键步骤如下在目标选项卡里填入服务端 IP比如192.168.10.10点击快速连接如果配了 CHAP点高级勾选启用 CHAP 登录填写用户名和密码连接成功后目标状态会变成已连接打开磁盘管理diskmgmt.msc会看到新出现的磁盘状态是未知或脱机右键联机、初始化推荐 GPT再新建简单卷。这里有个细节Windows 连接 iSCSI 后默认并不一定开机自动重连。你需要在快速连接时勾选添加到收藏目标列表或者连接后在收藏的目标标签里点击连接才能实现开机自动恢复。很多人在服务器上配好 iSCSI 后重启机器盘不在了多半就是漏了这一步。如果你配的是双向 CHAPWindows 的界面里会多一个目标 CHAP 机密和执行相互认证的选项需要和服务端 ACL 里的 mutual_password 保持一致否则连不上且日志里只有笼统的登录失败。3.2 Linux 下用 open-iscsi 挂载命令简洁但坑也不少Linux 客户端的标准实现是 open-iscsi。安装sudo apt install -y open-iscsi sudo systemctl enable --now iscsid然后是经典的发现-登录-挂载三步# 1. 发现 target sudo iscsiadm -m discovery -t st -p 192.168.10.10 # 2. 设置 CHAP 认证如果服务端开了认证 sudo iscsiadm -m node -T iqn.2024-08.example:rgstore -p 192.168.10.10 --opupdate --namenode.session.auth.authmethod -v CHAP sudo iscsiadm -m node -T iqn.2024-08.example:rgstore -p 192.168.10.10 --opupdate --namenode.session.auth.username -v storeuser sudo iscsiadm -m node -T iqn.2024-08.example:rgstore -p 192.168.10.10 --opupdate --namenode.session.auth.password -v StorePass2024 # 3. 登录 target sudo iscsiadm -m node -T iqn.2024-08.example:rgstore -p 192.168.10.10 --login登录后lsblk就能看到新的 sd 设备比如/dev/sdb、/dev/sdc。然后就是常规的分区格式化sudo fdisk /dev/sdb # 新建分区建议整个盘一个分区 sudo mkfs.ext4 /dev/sdb1 sudo mkdir -p /data开机自动挂载这里要注意不能像普通本地盘那样简单写/etc/fstab。iSCSI 盘依赖网络和 iscsid 服务启动顺序稍有偏差就会挂不上。我推荐的 fstab 写法是/dev/disk/by-path/ip-192.168.10.10:3260-iscsi-iqn.2024-08.example:rgstore-lun-0 /data ext4 defaults,_netdev,nofail 0 0这里用by-path路径而不是/dev/sdb1可以避免系统里有多块盘时设备名漂移。_netdev告诉系统这是网络设备应该等网络就绪后再挂载nofail是万一挂载失败不要卡住启动流程。同时要把 iSCSI 节点启动策略设为自动sudo iscsiadm -m node -T iqn.2024-08.example:rgstore -p 192.168.10.10 --opupdate --namenode.startup -v automatic这一步相当重要。不做的话重启后 iSCSI 不会自动登录fstab 里的盘自然也就找不到了。3.3 极空间 Z2Pro 这类成品 NASiSCSI 一般怎么配热词里看到不少人在搜极空间 Z2Pro 设置 iSCSI确实现在家用 NAS 路由系统基本都内置了 iSCSI Target 功能极空间、群晖、威联通都有对应入口。以极空间这类设备为例通常路径是存储管理或网络服务里找到 iSCSI 设置核心就三件事创建 Target起一个名字比如iqn.2024-08.z2pro:backup创建 LUN选择要映射给客户端的共享文件夹或存储空间注意建议给 iSCSI 单独划分一块空间而不是把整个存储池裸映射出去设置认证信息往往可以绑定客户端的 IQN 或直接设 CHAP 用户名密码。对普通用户来说在完成品 NAS 上做 iSCSI 有个很直观的好处电脑上会直接多出一块本地磁盘你往里面拷贝大文件时不用再走 SMB 那层文件协议开销。备份软件也能直接识别为本地盘兼容性比网络驱动器好很多。但我要提醒一点如果只是家人互相传照片、看视频用 SMB 网络共享体验更自然。iSCSI 适合你自己或少数几台固定设备需要把 NAS 盘当本机盘用的场景不要指望它能在多台设备之间做文件级权限精细管理。4. CHAP 认证和常见问题排查这关过了才算真正会配4.1 CHAP 单向和双向认证配置时最烦的一环CHAP 认证的作用是验证发起程序是否有权限访问 target。单向 CHAP 指 target 验证客户端的用户名密码双向 CHAPMutual CHAP则要求客户端也验证 target 的身份防止连到伪造的服务端。在 targetcli 里启用双向认证的完整做法是/ iscsi/iqn.2024-08.example:rgstore/tpg1 set attribute authentication1 / iscsi/iqn.2024-08.example:rgstore/tpg1 set attribute chap_mutual1 / iscsi/iqn.2024-08.example:rgstore/tpg1/acls/iqn.1993-08.org.debian:windows-pc set useridstoreuser / iscsi/iqn.2024-08.example:rgstore/tpg1/acls/iqn.1993-08.org.debian:windows-pc set passwordStorePass2024 / iscsi/iqn.2024-08.example:rgstore/tpg1/acls/iqn.1993-08.org.debian:windows-pc set mutual_useridtargetuser / iscsi/iqn.2024-08.example:rgstore/tpg1/acls/iqn.1993-08.org.debian:windows-pc set mutual_passwordTargetPass2024客户端上Linux 的 open-iscsi 除了设置node.session.auth.username和node.session.auth.password还需要额外设置sudo iscsiadm -m node -T iqn.2024-08.example:rgstore -p 192.168.10.10 --opupdate --namenode.session.auth.username_in -v targetuser sudo iscsiadm -m node -T iqn.2024-08.example:rgstore -p 192.168.10.10 --opupdate --namenode.session.auth.password_in -v TargetPass2024这里username_in就是客户端用来验证服务端身份的用户名容易写反。我见过好几次报错日志里写 Initiator CHAP authentication failed其实是服务端那边 password 设置少了或者写错客户端用户名结果怎么看方向都不对。排查时先在服务端tail -f /var/log/syslog再在客户端同时看系统日志哪边先报错基本能定位到哪边。另外targetcli 对密码长度有要求过短的密码会被拒绝或无法正常使用建议直接用不少于 12 位且包含大小写字母和符号的密码。这里不是教条而是 CHAP 交互对长度确实有最低要求。4.2 常见问题速查表照着检查80%的坑都能跳过去我把这几年遇到比较高频的问题整理成一张表配置出错时先对照自查现象最常见原因解决思路客户端能发现 target但登录失败CHAP 用户名或密码不一致检查服务端 ACL 和客户端 session.auth 配置是否匹配找不到 target防火墙未开 3260/tcp服务端放行端口客户端测试nc -vz IP 3260登录成功但 lsblk 看不到盘服务端 LUN 没挂好或系统缓存未刷新targetcli 里ls看看 LUN 是否存在客户端sudo systemctl restart iscsid重启后盘消失未设置 node.startupautomatic或 fstab 少了 _netdev按前文触发自动登录和 _netdev 配置Windows 能连上但磁盘管理里是脱机Windows 多路径情况下未联机右键磁盘选择联机和初始化性能很差网卡协商成了百兆或 MTU 不一致检查网口速率尝试统一 MTU多台机器同时挂同一 LUN 后文件系统损坏普通文件系统不支持多节点并发块访问要么单挂要么上集群文件系统这张表不需要背排障时按连接-认证-盘符-持久化-性能顺序挨个排查基本能覆盖绝大多数状况。4.3 一个真实排障案例Windows 显示已连接但磁盘管理里没有盘有个朋友碰到一个牛角尖问题Windows 发起程序显示已连接目标状态正常但磁盘管理里就是没有新磁盘。我远程排查先看磁盘管理确实没有再看设备管理器也没多出来。然后我让他运行iscsicli sessionlist看会话状态显示会话是ACTIVE。这就说明网络和认证层面都没问题问题出在 Windows 的磁盘枚举上。最后发现原因很无语他之前在同一台机器上做过 MPIO多路径 IO实验残留了多路径驱动配置磁盘被 Windows 认为需要从多路径路径枚举而服务端并没有配置 Multipass于是盘被卡在系统不可见状态。解决方法是右键此电脑进管理在磁盘管理里如果能看到灰色脱机盘就右键联机看不到就检查服务Microsoft iSCSI Initiator Service是否异常以及禁用多余的多路径软件。后来我帮他卸载了实验用的 MPIO 功能重新连接盘就出来了。这个案例提醒我遇到已连接但无盘时不要盯着服务端配置死磕客户端本地的各种存储栈驱动也会导致盘隐身。5. 性能调优让 iSCSI 盘快得不像走网络5.1 网络基础独立网段、MTU 9000一个都不能少iSCSI 再怎么说也是网络存储底子还是网卡和交换机。想让挂载盘用起来舒服先保证底层网络不拖后腿。最有效的措施是给存储单独划一个网段或 VLAN。如果业务网、无线网、打印设备全和存储挤在一个二层网络里广播流量会让 iSCSI 延迟明显波动。我一般建议存储走独立交换机或至少独立网卡这比后面调任何参数都管用。第二件事是 MTU。如果你的交换机、网卡、对端设备统统支持巨型帧Jumbo Frame可以把 MTU 从 1500 调到 9000。这样同样传输大量数据包数量大幅下降CPU 中断开销也随之减少。Linux 客户端设置sudo ip link set dev eth1 mtu 9000服务端同样设置sudo ip link set dev enp2s0 mtu 9000验证是否生效ping -M do -s 8972 192.168.10.10-M do表示不允许分片-s 8972加 IP 头 28 字节刚好等于 9000。如果全程能 ping 通说明链路支持巨型帧。如果中间某个设备不支持会出现 ping 不通或 MTU 黑洞此时建议老老实实改回 1500因为客户端抓包看到的现象会非常诡异。5.2 服务端和客户端各自还能调的参数服务端如果用的是多核 CPU可以确认 target 服务所在进程跑满多核。targetcli-fb基于内核模块target_core_mod通常不用额外做太多配置但要确保网卡中断绑定在业务 CPU 上不要和别的服务抢核。客户端方面open-iscsi 的默认队列深度queue depth一般可以在/sys/block/sdb/device/queue_depth看到。想提高并发能力可以适当调大echo 64 | sudo tee /sys/block/sdb/device/queue_depth不过这个值受 HBA 卡或网卡驱动限制乱调太高反而增加延迟。如果不是很清楚自己在做什么保持默认值就好。还有一个我经常强调的点不要为了性能盲目多会话叠加。iSCSI 允许同一个 target 建多个 session但如果没有配置 Multipath多路径多个 session 可能导致 I/O 乱序严重时反而让性能下降。想要链路冗余和提速请先安装 multipath-tools并把所有网卡路径加入 multipath 配置让内核统一管理路径而不是靠客户端反复 login 堆会话。5.3 存储介质选择别把机械盘和固态盘一起乱调度我这次给朋友配的两块盘SSD 用于虚拟机热数据机械盘用于备份。这两类介质混在一个 target 下当然没问题但客户端使用时要清楚它们的差异。SSD 走 iSCSI 时网络往往是瓶颈所以优先优化 MTU、队列深度机械盘走 iSCSI 时瓶颈通常在磁盘本身建议在客户端对这块盘使用顺序读写友好的文件系统如 XFS并且不要在上面跑数据库这类高随机 IO 负载。如果你用的是成品 NAS务必在 NAS 端确认磁盘休眠策略。因为 iSCSI 是块级协议NAS 一旦休眠磁盘客户端就会报告 IO 错误或卡死不是每个品牌都会友善地自动唤醒。把映射给 iSCSI 使用的目录设为不休眠否则半夜磁盘被休眠第二天起来盘就不响应了。6. 配置完成后我最后想提醒你的几件事6.1 备份配置比备份数据更让人安心整个 iSCSI 链路配好后最容易被忽视的是服务端配置文件。targetcli 的配置只存在/etc/target/saveconfig.json里如果操作系统崩溃或者磁盘损坏这个文件没了所有 Target 都要重新建。我会定期把这个文件复制到另一台机器上或者在部署脚本里保存一份。客户端这边也一样/etc/iscsi/nodes下记录了节点的启动参数和认证信息重建系统前记得tar一份带走否则重新做系统后还得逐台机器重新 discovery、重新配密码。我吃过这个亏所以现在每配一类机器就把生成配置的命令写成脚本存起来。6.2 测试一定要用真实负载光能用不算成功很多教程演示完挂载、格式化、看到盘符就收工了这可不够。建议你配完后至少做一轮读写验证sudo fio --nametest --filename/data/test.img --size2G --rwrandrw --bs4k --ioenginelibaio --iodepth32 --numjobs4 --runtime60 --group_reportingfio 这类的工具跑一轮很快就能看出网络、磁盘、认证交互有没有隐藏问题。有一次我配完 iSCSI 觉得一切正常一跑 fio 才发现吞吐只有 30MB/s最后定位到服务端网卡 ethtool 只协商到了百兆。这种问题如果只靠复制几个文件根本感觉不出来。Windows 那边可以用 CrystalDiskMark 或者微软的 diskspd 测一下测完心里有底后续使用就不慌。6.3 遇到诡异问题先看日志再猜哪里我这次配置过程中最诡异的问题是 Linux 客户端登录成功后挂载目录里文件读写出现间歇性卡死。从客户端日志看iscsi 会话没问题dmesg 里刷出blocked for more than 120 seconds的报警。乍一看像是存储卡住了查了半天才发现是服务端后台跑着 rsync 任务把机械盘 IO 占满了iSCSI 请求排队太久。这类问题靠猜是猜不出来的老老实实dmesg -T、journalctl -u iscsid -f、服务端iostat -x 1一起看才能快速确认成因。iSCSI 的架构本身就是服务器-网络-客户端三层任何一层的异常都会表现为盘不好用学会分层排查才是真正掌握存储挂载的开始。
返回列表