不能仅用iscsiadm登录,因libvirt iSCSI存储池需自主管理login/logout生命周期、LUN发现与ACL校验;手动登录后libvirt无法感知连接状态,导致池启停不同步、volume创建失败或报“cannot find device by path”。

libvirt 添加 iSCSI 目标作为存储池,核心是用 virsh pool-define 配置一个 type='iscsi' 的持久化池,并确保 initiator 能成功登录 target —— 不是直接挂载路径,也不是靠手动 iscsiadm 登录后就完事。
为什么不能只用 iscsiadm 登录就当存储池用?
libvirt 的 iSCSI 存储池不是“看到设备就认”,它需要自己管理 login/logout 生命周期、LUN 发现和权限校验。如果仅手动运行 iscsiadm -m node -p IP -l,libvirt 启动时无法感知该连接,也无法在池启停时自动同步状态,后续创建 volume 或分配给 VM 会失败(常见报错:cannot find device by path 或 no valid paths to storage)。
- libvirt iSCSI 池依赖
iscsid服务持续运行,且要求/etc/iscsi/initiatorname.iscsi中的 IQN 已被 target 显式允许(ACL 配置) - 必须使用
virsh pool-define加载 XML 定义,而非靠 udev 自动发现设备节点 - 池启动后,libvirt 会调用
iscsiadm执行 discovery + login,这个过程可被日志跟踪:journalctl -u iscsid -f
virsh pool-define 所需的 XML 结构关键点
iSCSI 存储池 XML 必须包含 target portal、IQN、可选认证信息,且 <source> 下不能漏掉 <host> 和 <device>(即使只连一个 target,也得写):
<pool type='iscsi'>
<name>iscsi_pool</name>
<source>
<host name='192.168.10.100'/>
<device path='iqn.2026-09.com.example:storage.target01'/>
<auth type='chap' username='libvirt_user'>
<secret usage='libvirt_iscsi_secret'/>
</auth>
</source>
<target>
<path>/var/lib/libvirt/iscsi</path>
</target>
</pool>-
<host name='...'/>是 target 的 IP 或 DNS 名,不是 initiator 的;端口默认 3260,不可省略但不用显式写 -
<device path='...'>填的是 target 端配置的完整 IQN(不是 initiator 的),可通过iscsiadm -m discovery -t st -p 192.168.10.100验证是否能扫到 - 若 target 要求 CHAP 认证,必须提前用
virsh secret-define创建 secret,并在 XML 中引用usage,不能硬编码密码 -
<target><path>是 libvirt 本地用于存放元数据的目录,**不用于挂载设备** —— iSCSI 设备由内核通过 SCSI 总线暴露为/dev/sdX,libvirt 从 sysfs 解析 LUN 路径
启动池前必须确认的三件事
否则 virsh pool-start iscsi_pool 会静默失败或卡住:
- 运行
systemctl is-active iscsid,确保服务 active;若未启用,执行systemctl enable --now iscsid - 检查
/etc/iscsi/initiatorname.iscsi是否存在且内容合法(格式为InitiatorName=iqn.YYYY-MM.reverse.domain:optional_suffix),修改后需重启iscsid - 确认 target 端已将该 initiator IQN 加入 ACL 列表,并绑定了对应 LUN;可用
targetcli ls /iscsi在 target 上验证
启动后用 virsh pool-list --all 查看状态,再用 virsh vol-list iscsi_pool 看是否列出 LUN —— 正常应显示类似 lun0 的 volume 名,路径形如 /dev/disk/by-path/ip-192.168.10.100:3260-iscsi-iqn.2026-09.com.example:storage.target01-lun-0。
常见错误:LUN 列不出来 or volume 路径为空
最常发生在 target 配置与 initiator 权限不匹配时,而不是网络不通:
- 现象:
virsh vol-list iscsi_pool返回空,但iscsiadm -m session显示已登录 —— 说明 login 成功,但 target 未向该 initiator 暴露任何 LUN - 现象:
virsh vol-info iscsi_pool lun0报no volume with matching name—— 可能是 pool 未真正激活,或virsh pool-refresh iscsi_pool未执行(某些 target 需手动刷新才能同步 LUN 变更) - 现象:volume 路径是
/dev/sdb这类不稳定设备名 —— libvirt 默认用by-path或by-id,若看到裸/dev/sdX,说明 udev 规则或 multipath 未生效,建议在 target 端启用 ALUA 或在 initiator 配置node.session.scan = manual并指定 LUN ID
iSCSI 存储池的可靠性高度依赖 target 端的 ACL 精确性和 initiator 的 IQN 稳定性;一旦更换网卡或重装系统导致 /etc/iscsi/initiatorname.iscsi 变更,必须同步更新 target 的白名单,否则池无法启动 —— 这个细节容易被跳过,但会直接阻断所有虚拟机磁盘操作。

















