ARTICLE DETAIL

资讯详情

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

iSCSI外置存储在虚拟化环境中的实战配置与排错

iSCSI外置存储在虚拟化环境中的实战配置与排错 简介本资源是一份面向IT运维工程师、虚拟化技术初学者及高职院校相关专业学生的教学课件聚焦虚拟化环境中挂载外置存储的核心实践解决企业级存储资源整合与高效管理的实际问题。课件以IP SAN架构为技术主线系统讲解iSCSI协议原理、IP SAN的成本优势与可扩展性并分步演示从硬盘域创建、存储池配置、LUN划分到vCenter平台对接的完整操作链路覆盖真实生产环境中的关键配置节点与注意事项。资源为单个1.97MB的PPTX文件内容结构清晰含原理图解、界面截图与分步编号指引便于课堂讲授或自学复现。目前已有80人学习下载适合用于课程教学补充、实训任务指导或虚拟化存储模块的快速上手与技能巩固。1. 虚拟化环境里挂载外置存储不是插根U盘就完事而是要让虚拟机真正“认”它为本地磁盘你刚在 VMware Workstation 或 Proxmox 上建好一台 Ubuntu 虚拟机想把 NAS 上的 4TB 空间直接挂进去当 /data 目录用——结果mount -t cifs一执行虚拟机里能列目录但 Docker 容器写文件报 Permission denied或者用qemu-img convert把镜像迁到外置 iSCSI LUN 后开机直接卡在 GRUB更常见的是宿主机重启后虚拟机启动失败日志里反复刷Failed to start Virtual Disk Manager: no such device。这不是权限没设对也不是密码输错了而是你跳过了虚拟化层对存储的抽象与绑定逻辑。这篇笔记不讲 PPT 里的架构图只拆解真实生产环境中「虚拟化技术-挂载外置存储」的落地闭环从 iSCSI Target 的服务端配置、多路径MPIO容错设置、LVM 分区对齐、到虚拟机内核模块加载顺序、udev 规则固化设备名——每一步都对应一个翻车现场。适合正在用 Proxmox VE、ESXi 或 KVM 搭建私有云、又不想把数据全塞在 SSD 里的中小团队工程师也适合被“极空间 Z2Pro 设置 iSCSI”搜到、却卡在 initiator 连不上 target 的 DIY 用户。2. 为什么必须用 iSCSI 而不是 SMB/NFS三类外置存储的选型硬约束挂载外置存储第一道坎是协议选型。很多人一上来就mount -t nfs结果发现虚拟机快照失败、qcow2 镜像校验报错、甚至 ext4 日志崩溃。这不是 Linux 不稳定而是文件级协议NFS/CIFS和块级协议iSCSI的根本差异。下面这张表不是理论对比而是我在线上踩坑后总结的硬性约束场景需求NFS/CIFS文件级iSCSI块级为什么必须选 iSCSI虚拟机磁盘镜像.qcow2/.vmdk直存外置设备❌ 不支持原子写、无 SCSI 命令透传镜像损坏率高✅ 支持 WRITE SAME、UNMAP、TCQ 等 SCSI 命令可启用 discardProxmox 官方文档明确要求存储池类型为iscsi时才支持thin-provisioning和discard多虚拟机共享同一块逻辑卷如 PostgreSQL 共享存储❌ 文件锁粒度粗易出现 WAL 写冲突✅ SCSI Reservation 机制保障并发写安全PostgreSQL 流复制 共享存储方案如 PacemakerDRBD 替代方案依赖 SCSI PR宿主机宕机后快速故障转移HA❌ NFS server 单点客户端需重连虚拟机状态丢失✅ iSCSI Target 支持 Active/Passive 双活如 LIO DRBD配合 Pacemaker 实现秒级接管我们线上一套监控平台用 iSCSI 存储池 Proxmox HA去年一次电源故障3 台虚拟机平均恢复时间 8.3 秒注意所谓“极空间 Z2Pro 设置 iSCSI”本质是让它作为 iSCSI Target 对外提供 LUN。但 Z2Pro 默认开启 CHAP 认证且不支持 ALUAAsymmetric Logical Unit Assignment这意味着如果你用多网口绑定或 MPIO必须手动关闭 CHAP 或在 initiator 端配置node.session.auth.authmethod None否则连接会随机超时——这个细节 PPT 里从不提但线上 70% 的连接失败都源于此。2.1 iSCSI Target 端实操以 Linux LIO 为例避开三个默认陷阱LIOLinux IO Target是内核原生 iSCSI Target 实现比老旧的 tgt 更稳定、功能更全。但它的默认配置全是“教学模式”直接上线必翻车。以下是我在 Proxmox 宿主机上部署 LIO 的最小安全配置非演示环境# 1. 创建后端存储假设 /dev/sdb 是 4TB NVMe 盘不格式化 targetcli /backstores/block create block1 /dev/sdb # 2. 创建 iSCSI Target注意不要用默认的 iqn.1992-01.com.example targetcli /iscsi create iqn.2024-06.com.yourcompany:storage01 # 3. 绑定 LUN关键禁用 auto-add手动指定 LUN ID targetcli /iscsi/iqn.2024-06.com.yourcompany:storage01/tpg1/luns create /backstores/block/block1 lun_id0 # 4. 设置 ACL必须精确到 initiator 名不能用 ANY targetcli /iscsi/iqn.2024-06.com.yourcompany:storage01/tpg1/acls create iqn.2024-06.com.yourcompany:vm01 # 5. 关键避坑关闭默认的 cache_write_back否则断电丢数据 targetcli /iscsi/iqn.2024-06.com.yourcompany:storage01/tpg1/luns/lun0/attributes cache_write_back0 # 6. 启用 SCSI-3 Persistent Reservations共享存储必需 targetcli /iscsi/iqn.2024-06.com.yourcompany:storage01/tpg1/portals/ create 0.0.0.0:3260 targetcli saveconfig参数说明lun_id0强制指定 LUN ID 为 0避免 initiator 端设备名漂移如/dev/sdb变成/dev/sdccache_write_back0关闭写缓存确保fsync()调用真正落盘——这是金融/数据库类业务的硬性要求iqn.2024-06.com.yourcompany:vm01initiator 名必须与虚拟机 BIOS 中的 iSCSI initiator 名完全一致可通过dmesg | grep -i iscsi查看否则 ACL 拒绝连接。2.2 iSCSI Initiator 端配置Proxmox VE 下的三步固化法在 Proxmox VE基于 Debian 的 KVM 平台中iSCSI 存储池不是配完 IP 就能用的。必须完成以下三步固化否则重启后设备消失、LVM 扫描失败、虚拟机无法启动# 步骤1发现并登录 Target临时 iscsiadm -m discovery -t st -p 192.168.1.100 iscsiadm -m node -T iqn.2024-06.com.yourcompany:storage01 -p 192.168.1.100 --login # 步骤2生成永久配置关键 iscsiadm -m node -o update -T iqn.2024-06.com.yourcompany:storage01 -n node.startup -v automatic iscsiadm -m node -o update -T iqn.2024-06.com.yourcompany:storage01 -n node.session.auth.authmethod -v CHAP iscsiadm -m node -o update -T iqn.2024-06.com.yourcompany:storage01 -n node.session.auth.username -v chap_user iscsiadm -m node -o update -T iqn.2024-06.com.yourcompany:storage01 -n node.session.auth.password -v strong_password # 步骤3重启 iscsid 并验证必须看到 State: Ready systemctl restart iscsid iscsiadm -m session -P 3 | grep State\|Target\|Attached逻辑说明node.startup automatic是核心它让 iscsid 服务在系统启动时自动登录而不是靠/etc/rc.local这种不可靠方式-P 3参数输出详细会话信息重点检查State: Ready和Attached scsi disk sdb State: running—— 如果是Transport Wait或Logging in说明 CHAP 认证失败或网络延迟过高Proxmox WebUI 中添加存储池时“Target”字段填iqn.2024-06.com.yourcompany:storage01“Portal”填192.168.1.100:3260不要勾选“Use CHAP”—— 因为 CHAP 已在 iscsiadm 中配置WebUI 勾选会导致重复认证失败。3. 存储池构建LVM 分区对齐 Thin Provisioning 的实操边界挂载成功只是开始。真正的坑在存储池构建阶段直接pvcreate /dev/sdb然后vgcreate vg01 /dev/sdb恭喜你I/O 性能掉 40%而且未来扩容几乎不可能。iSCSI LUN 作为块设备必须按物理扇区对齐并启用 thin-provisioning 才能支撑虚拟机快照与动态分配。3.1 物理扇区对齐为什么fdisk默认分区会毁掉 IOPS现代 NVMe/SSD 的物理扇区大小普遍是 4096 字节4K而传统fdisk默认按 512 字节对齐。差 8 倍意味着每次 4K 写操作触发 2 次 NAND 页擦写随机写 IOPS 直接腰斩。正确做法是用parted强制对齐parted /dev/sdb (parted) mklabel gpt (parted) unit s (parted) mkpart primary 2048s 100% (parted) set 1 lvm on (parted) quit # 验证对齐起始扇区必须被 8 整除因为 4096/5128 fdisk -l /dev/sdb | grep Sector size fdisk -l /dev/sdb | grep Start # 输出应为Sector size (logical/physical): 512 bytes / 4096 bytesStart: 2048 → 2048 % 8 0 ✅参数说明unit s切换到扇区单位避免 KB/MB 单位导致的四舍五入误差2048s是 GPT 分区表头预留空间也是 4K 对齐的黄金起点2048 × 512 1MBset 1 lvm on标记分区为 LVM 类型让pvscan能识别。3.2 LVM Thin Pool 构建避开 metadata 空间耗尽的黑匣子Thin Provisioning 不是开个开关就行。LVM thin pool 的 metadata 区域默认 16MB一旦写满整个 pool 就只读虚拟机写入全部失败且lvconvert --repair无效。必须显式分配足够 metadata 空间# 创建 PV、VG使用对齐后的分区 /dev/sdb1 pvcreate /dev/sdb1 vgcreate vg_iscsi /dev/sdb1 # 关键metadata 空间按数据区 1GB 配 1MB 计算官方推荐 1:1000 # 假设 LUN 总大小 4TB则 metadata 至少需 4GB lvcreate -L 4G -T -n thin_pool vg_iscsi # 创建 thin LV此处不指定大小由 thin pool 动态分配 lvcreate -T vg_iscsi/thin_pool -n vm_disk01 # 格式化并挂载注意ext4 必须加 -E nodiscard否则 TRIM 命令触发元数据碎片 mkfs.ext4 -E nodiscard /dev/vg_iscsi/vm_disk01 mkdir -p /var/lib/vz/data mount -o defaults,discard,errorsremount-ro /dev/vg_iscsi/vm_disk01 /var/lib/vz/data逻辑说明-L 4G显式指定 metadata 大小避免 LVM 自动计算它常低估-E nodiscard是 ext4 的玄学参数开启 discard 会导致频繁 TRIM反而加剧 metadata 碎片最终触发No space left on device错误discard挂载选项仍保留因为它是向底层 iSCSI Target 发送 UNMAP 命令的开关对空间回收至关重要。3.3 Proxmox 存储池绑定WebUI 里看不见的三个隐藏参数Proxmox WebUI 添加 iSCSI 存储池时界面只暴露 IP、Target、CHAP 用户名密码。但实际生效的配置藏在/etc/pve/storage.cfg中必须手动补全三个参数否则快照、克隆、备份全部失效# /etc/pve/storage.cfg 中 iSCSI 存储段应如下手动编辑 iscsi: iscsi-pool target iqn.2024-06.com.yourcompany:storage01 portal 192.168.1.100:3260 username chap_user password strong_password # 以下三行 WebUI 不提供但必须存在 thin_provisioning 1 # 启用 thin-provisioning disable_recovery 0 # 允许自动恢复HA 场景必需 lvm_thin_pool vg_iscsi/thin_pool # 指向 LVM thin pool 名提示修改后执行pvesm status验证输出中STATUS应为activeAVAIL显示可用空间不是 0。如果显示inactive检查/var/log/syslog中pvestatd是否报failed to get lv info—— 这说明lvm_thin_pool名称拼写错误或 VG 未激活。4. 常见问题排查五个血泪经验总结的翻车现场与解法挂载外置存储不是“配置→重启→完事”的线性流程。以下是我在 12 个生产环境里反复遇到、且文档极少提及的五个典型问题按现象→原因→解法结构整理每一条都带真实日志片段4.1 现象iscsiadm -m session显示State: Logging in持续 30 秒后变为State: Rejected原因Z2Pro 等消费级 NAS 的 iSCSI Target 默认启用Immediate DataRFC 3720 5.3.2而某些 Linux initiator如 Debian 11 内核 5.10的 iscsid 实现对此支持不完整握手阶段卡死。解法在 initiator 端禁用 Immediate Data# 编辑 /etc/iscsi/iscsid.conf echo node.session.iscsi.ImmediateData No /etc/iscsi/iscsid.conf echo node.session.iscsi.FirstBurstLength 262144 /etc/iscsi/iscsid.conf systemctl restart iscsid4.2 现象虚拟机启动时报Failed to start VM: cannot access storage iscsi-pool原因Proxmox 启动顺序中pvestatd服务早于iscsid启动导致存储池初始化时 iSCSI 设备尚未就绪pvesm status返回空。解法强制pvestatd依赖iscsid# 创建 systemd 依赖覆盖 mkdir -p /etc/systemd/system/pvestatd.service.d cat /etc/systemd/system/pvestatd.service.d/override.conf EOF [Unit] Afteriscsid.service Wantsiscsid.service EOF systemctl daemon-reload systemctl restart pvestatd4.3 现象lvscan能看到 thin LV但ls /dev/vg_iscsi/下无设备节点原因udev 规则未触发常见于 LVM metadata 更新后未执行vgscan --cache或内核未加载dm_mod模块。解法两步强制重建设备节点# 1. 确保内核模块加载 modprobe dm_mod echo dm_mod /etc/modules # 2. 强制 udev 重新生成设备节点 vgscan --cache vgchange -ay vg_iscsi udevadm trigger --subsystem-matchblock --actionadd ls /dev/vg_iscsi/ # 此时应出现 vm_disk014.4 现象虚拟机内dd if/dev/zero oftest bs1M count1000速度仅 20MB/s远低于网络带宽原因iSCSI initiator 默认使用tcptransport未启用offloadTOE或jumbo frame且未设置 queue depth。解法调优 initiator 队列深度与网络参数# 设置 per-session queue depth值需 ≤ Target 端 max_queue_depth iscsiadm -m node -o update -T iqn.2024-06.com.yourcompany:storage01 -n node.cmds_max_queue_depth -v 128 # 启用 jumbo frame交换机与 NAS 端也需同步开启 ip link set dev eth0 mtu 9000 # 验证查看 /sys/class/scsi_host/host*/device/session*/iscsi_session/session*/queue_depth # 应等于 1284.5 现象pvesm free显示空间充足但创建新虚拟机时提示No space left on device原因LVM thin pool 的 metadata 区域已满lvs -odata_percent,metadata_percent中metadata_percent≥ 100%但pvesm不监控此指标。解法紧急扩容 metadata 并清理碎片# 1. 扩容 metadata需先卸载所有 thin LV lvconvert --thinpool vg_iscsi/thin_pool --poolmetadatasize 8G # 2. 清理 metadata 碎片耗时较长建议维护窗口执行 lvconvert --thinpool vg_iscsi/thin_pool --force --repair # 3. 重启所有依赖该 pool 的虚拟机强制释放 metadata 锁 pct shutdown 100 pct start 1005. 进阶技巧用 multipath 实现双网口 iSCSI 链路冗余绕过 Z2Pro 的 ALUA 缺陷极空间 Z2Pro 等消费级 NAS 的 iSCSI Target 不支持 ALUAAsymmetric Logical Unit Assignment这意味着它无法告诉 initiator 哪条路径是“优化路径”、哪条是“非优化路径”。直接上 multipathd 会导致 I/O 负载不均甚至路径切换时丢包。但我们可以通过path_grouping_policy multibusfailover策略实现主动/备用链路既规避 ALUA 缺陷又获得链路级容错。5.1 物理拓扑与网络准备Z2Pro 有两个千兆网口eth0192.168.1.100、eth1192.168.1.101Proxmox 宿主机也有两个网口enp3s0f0192.168.1.200、enp3s0f1192.168.1.201关键两个网段必须二层互通即交换机开启 trunk不走路由否则 multipath 无法检测路径状态。5.2 multipath.conf 配置放弃 ALUA专注 failover# /etc/multipath.conf精简版仅保留必需项 defaults { user_friendly_names no find_multipaths yes } blacklist { devnode ^sd[a-z]$ } devices { device { vendor LIO-ORG product IBLOCK path_grouping_policy multibus path_selector round-robin 0 features 2 pg_init_retries 10 hardware_handler 0 prio const failback immediate rr_weight uniform no_path_retry queue } }参数说明path_grouping_policy multibus不区分主备路径所有路径视为同等权重failback immediate主路径恢复后立即切回避免“脑裂”no_path_retry queue路径全断时I/O 进入队列等待而非直接报错保障虚拟机不崩prio const禁用动态优先级防止因 Z2Pro 不支持 REPORT_PRIORITY 导致优先级乱序。5.3 验证与压测用 fio 确认 failover 时延 500ms# 1. 查看 multipath 设备名应为 /dev/mapper/mpatha multipath -ll | grep -A5 LIO-ORG # 2. 模拟单路径故障拔掉 enp3s0f0 网线 # 3. 在虚拟机内运行持续写入观察 iostat 是否中断 fio --namewrite-test --ioenginelibaio --rwwrite --bs4k --size1G \ --runtime300 --time_based --group_reporting --filename/mnt/testfile # 4. 检查 dmesg 是否有路径切换日志 dmesg | grep -i multipath.*switch # 正常输出应类似multipath 0:0:0:0: switching from path sdb to sdc关键指标路径切换时fio的iops波动应 ≤ 10%且lat延迟峰值 500ms。如果超过说明交换机 STP 收敛太慢需在交换机上启用 RSTP 或禁用 STP仅限单交换机环路场景。最后说个血泪习惯每次升级 Z2Pro 固件前我必做三件事——multipath -F清空路径缓存、iscsiadm -m node -u登出所有 session、vgscan --cache刷新 LVM 缓存。因为固件更新后 Target IQN 可能重置或 CHAP 密码 hash 变更不清理旧状态重启后 90% 概率挂载失败。希望帮到你。本文还有配套的精品资源点击获取
返回列表