使用iSCSI与systemd挂载多单元卷时的竞态条件问题咨询
我完全理解你遇到的这个头疼的问题——依赖iscsi.service看起来逻辑没问题,但实际启动时就是会出现部分iSCSI设备还没attach就触发挂载的竞态,导致挂载偶尔失败。其实这里的核心误区是:iscsi.service只是负责启动Open-iSCSI服务本身,它不保证所有配置的iSCSI目标都已经完成连接和设备挂载,这就是你踩坑的原因。
下面给你几个针对性的解决方案,按推荐优先级排序:
1. 依赖具体的iSCSI目标systemd单元
Open-iSCSI在你配置并登录iSCSI目标后,会自动为每个目标生成对应的systemd单元,命名格式是iscsi-target@<IQN>.service(比如iscsi-target@iqn.2023-01.example.com:storage.lun0.service)。
先找出你所有需要的目标单元:
systemctl list-units | grep iscsi-target或者查看
/etc/systemd/system/multi-user.target.wants/目录下的软链接,找到对应你目标的单元名。修改你的挂载单元的
[Unit]段,把原来依赖iscsi.service改成依赖这些具体的目标单元:[Unit] # 替换成你实际的目标单元,多个用空格分隔 Requires=iscsi-target@iqn.xxxxxx.service iscsi-target@iqn.yyyyyy.service After=iscsi-target@iqn.xxxxxx.service iscsi-target@iqn.yyyyyy.service这样systemd会严格等到每个指定的iSCSI目标都完成连接、设备attach完成后,才会执行挂载操作,从根源上避免竞态。
2. 直接依赖磁盘设备的systemd单元
因为你是按UUID挂载,也可以让挂载单元直接依赖对应磁盘设备的systemd单元,这样更直接——只要设备没就绪,挂载就不会触发。
先用
systemd-escape生成正确的设备单元名:systemd-escape --path /dev/disk/by-uuid/你的UUID字符串比如UUID是
12345678-1234-1234-1234-1234567890ab,生成的单元名会是dev-disk-by\x2duuid-12345678-1234-1234-1234-1234567890ab.device。修改挂载单元的
[Unit]段:[Unit] Requires=dev-disk-by\x2duuid-12345678-1234-1234-1234-1234567890ab.device After=dev-disk-by\x2duuid-12345678-1234-1234-1234-1234567890ab.device
额外检查项
别忘记确认你的iSCSI配置开启了自动登录:编辑/etc/iscsi/iscsid.conf,确保node.startup = automatic,这样系统启动时会自动连接所有已配置的iSCSI目标,避免出现目标未登录的情况。
备注:内容来源于stack exchange,提问作者brainchild

