本文目录导读:

- ⚠️ 重要前提
- 方案一:批量发现并登录所有Target(最常见需求)
- 方案二:基于IP列表批量登录(多台主机或多个IP)
- 方案三:登录指定IQN列表(最安全、最推荐)
- 方案四:批量扫描并挂载文件系统(危险操作)
- 方案五:卸载与登出(脚本对应)
- 📌 实用技巧与注意事项
在Linux环境下,你可以通过编写脚本批量挂载(高,可能是指挂载或发现)iSCSI target,如果你说的“高”是指挂载(mount)或登录(login),以下是几种实用的脚本方案。
⚠️ 重要前提
批量操作iSCSI非常危险,容易误操作导致数据损坏或系统崩溃(尤其是生产环境),请确保:
- iSCSI initiator名称唯一:每个节点应有唯一的
/etc/iscsi/initiatorname.iscsi。 - Target名称准确:不要配错IQN(iSCSI Qualified Name)。
- 多路径(MPIO)配置:如果涉及多条路径,建议配合
multipath使用。
批量发现并登录所有Target(最常见需求)
这个脚本会连接到一个iSCSI Target IP,发现所有可用的target,并自动登录。
脚本:batch_iscsi_login.sh
#!/bin/bash
# iSCSI 目标服务器IP
TARGET_IP="192.168.1.100"
# 1. 发现所有Target
echo "正在发现 $TARGET_IP 上的Target..."
iscsiadm -m discovery -t sendtargets -p $TARGET_IP
if [ $? -ne 0 ]; then
echo "错误:无法发现Target,请检查网络或IP。"
exit 1
fi
# 2. 自动登录所有发现的Target
echo "正在登录所有Target..."
iscsiadm -m node -T ALL -p $TARGET_IP -l
if [ $? -eq 0 ]; then
echo "成功:所有Target已登录。"
echo "--- 当前iSCSI会话 ---"
iscsiadm -m session -P 3 | grep "Target:" | head -20
else
echo "警告:部分Target可能登录失败,请检查日志。"
fi
基于IP列表批量登录(多台主机或多个IP)
如果你的需求是多台机器或者多个iSCSI Portal IP,可以用循环。
脚本:batch_iscsi_by_ip.sh
#!/bin/bash
# IP列表(如果是单台多IP,直接写;如果是多台主机,每行一个IP)
IP_LIST="
192.168.1.100
192.168.1.101
192.168.2.100
"
for IP in $IP_LIST; do
echo "=============================="
echo "处理IP: $IP"
echo "=============================="
# 发现
iscsiadm -m discovery -t sendtargets -p $IP 2>/dev/null
if [ $? -ne 0 ]; then
echo "警告: $IP 发现失败,跳过。"
continue
fi
# 登录所有发现的Target
iscsiadm -m node -T ALL -p $IP -l 2>/dev/null
if [ $? -eq 0 ]; then
echo "成功: $IP 上的Target已登录。"
else
echo "警告: $IP 登录部分失败。"
fi
done
echo ""
echo "== 最终会话列表 =="
iscsiadm -m session -o show
登录指定IQN列表(最安全、最推荐)
如果你知道具体的Target IQN(iqn.2024-01.com.example:storage1),可以逐个登录,避免误登录其他无关Target。
脚本:batch_iscsi_specific_iqn.sh
#!/bin/bash
TARGET_IP="192.168.1.100"
# 你想要登录的特定IQN列表
IQN_LIST=(
"iqn.2024-01.com.example:storage1"
"iqn.2024-01.com.example:storage2"
"iqn.2024-01.com.example:backup"
)
for IQN in "${IQN_LIST[@]}"; do
echo "正在登录: $IQN"
# 先发现(确保该Target信息存在于本地节点记录中)
iscsiadm -m discovery -t sendtargets -p $TARGET_IP -o new 2>/dev/null | grep -q "$IQN"
if [ $? -ne 0 ]; then
echo "警告: $IQN 未在 $TARGET_IP 上发现,请检查名称。"
continue
fi
# 登录
iscsiadm -m node -T "$IQN" -p $TARGET_IP -l
if [ $? -eq 0 ]; then
echo "成功: $IQN 已登录。"
else
echo "失败: $IQN 登录失败。"
fi
echo "---"
done
批量扫描并挂载文件系统(危险操作)
此脚本极度危险,仅限已确认LUN结构、且无数据丢失风险时使用。
#!/bin/bash
# 1. 先确保所有iSCSI disk已登录(可合并前面的脚本)
# 2. 扫描SCSI总线让系统识别新磁盘
for host in /sys/class/scsi_host/host*; do
echo "- - -" > "${host}/scan" 2>/dev/null
done
# 3. 找出刚添加的iSCSI盘(假设设备名为 /dev/sdX)
# 警告:以下逻辑非常粗糙,生产环境绝不能用!
sleep 3
lsblk -o NAME,TYPE | grep disk | tail -n +3 | while read disk _; do
echo "发现新磁盘: /dev/$disk"
# 假设你想直接挂载到 /mnt/iscsi_$disk
mkdir -p "/mnt/iscsi_$disk"
mount "/dev/${disk}1" "/mnt/iscsi_$disk" 2>/dev/null || \
mount "/dev/$disk" "/mnt/iscsi_$disk" 2>/dev/null || \
echo "警告: 无法挂载 /dev/$disk,可能无文件系统。"
done
卸载与登出(脚本对应)
“生产环境”做完测试后,需要批量清理:
#!/bin/bash
# 批量登出所有iSCSI Target
echo "正在登出所有iSCSI会话..."
iscsiadm -m node -T ALL -u
if [ $? -eq 0 ]; then
echo "所有会话已登出。"
# 可选:清理节点记录(小心:会删除配置)
# iscsiadm -m node -T ALL -o delete
else
echo "存在无法正常登出的会话(可能设备忙)。"
# 强制登出(慎用)
echo "尝试强制登出..."
iscsiadm -m session -U 2>/dev/null
fi
📌 实用技巧与注意事项
-
确认initiator名称:
cat /etc/iscsi/initiatorname.iscsi
如果多台机器名称冲突,Target会踢掉旧连接。
-
查看当前会话:
iscsiadm -m session -o show -P 3 # 详细输出 iscsiadm -m session -o show # 简要输出
-
调试(debug)模式:如果脚本不生效,可以加
-d 2或-d 3参数:iscsiadm -m node -T <IQN> -p <IP> -l -d 3
-
配置持久化(重要): 执行
iscsiadm -m node -T <IQN> -p <IP> --op update -n node.startup -v automatic这样重启后iSCSI会自动登录。 -
不要在运行数据库或重要服务的机器上批量执行:脚本无法感知哪个盘正在被Oracle、MySQL、K8s使用。
| 需求 | 推荐脚本 | 风险 |
|---|---|---|
| 批量登录所有Target | 方案一 | 中等(可能登录上不需要的盘) |
| 多IP批量操作 | 方案二 | 中等 |
| 登录指定Target | 方案三 | 低(最安全) |
| 批量挂载文件系统 | 方案四 | 极高(不推荐生产使用) |
| 批量登出 | 方案五 | 低 |
建议:优先使用方案三(指定IQN),配合 automatic 启动参数实现持久配置,而不是在脚本里写死挂载逻辑。