实用脚本能批量高iSCSI吗?

wen 实用脚本 62

本文目录导读:

实用脚本能批量高iSCSI吗?

  1. ⚠️ 重要前提
  2. 方案一:批量发现并登录所有Target(最常见需求)
  3. 方案二:基于IP列表批量登录(多台主机或多个IP)
  4. 方案三:登录指定IQN列表(最安全、最推荐)
  5. 方案四:批量扫描并挂载文件系统(危险操作)
  6. 方案五:卸载与登出(脚本对应)
  7. 📌 实用技巧与注意事项

在Linux环境下,你可以通过编写脚本批量挂载(高,可能是指挂载发现)iSCSI target,如果你说的“高”是指挂载(mount)或登录(login),以下是几种实用的脚本方案。

⚠️ 重要前提

批量操作iSCSI非常危险,容易误操作导致数据损坏系统崩溃(尤其是生产环境),请确保:

  1. iSCSI initiator名称唯一:每个节点应有唯一的 /etc/iscsi/initiatorname.iscsi
  2. Target名称准确:不要配错IQN(iSCSI Qualified Name)。
  3. 多路径(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

📌 实用技巧与注意事项

  1. 确认initiator名称

    cat /etc/iscsi/initiatorname.iscsi

    如果多台机器名称冲突,Target会踢掉旧连接。

  2. 查看当前会话

    iscsiadm -m session -o show -P 3   # 详细输出
    iscsiadm -m session -o show         # 简要输出
  3. 调试(debug)模式:如果脚本不生效,可以加 -d 2-d 3 参数:

    iscsiadm -m node -T <IQN> -p <IP> -l -d 3
  4. 配置持久化(重要): 执行 iscsiadm -m node -T <IQN> -p <IP> --op update -n node.startup -v automatic 这样重启后iSCSI会自动登录。

  5. 不要在运行数据库或重要服务的机器上批量执行:脚本无法感知哪个盘正在被Oracle、MySQL、K8s使用。


需求 推荐脚本 风险
批量登录所有Target 方案一 中等(可能登录上不需要的盘)
多IP批量操作 方案二 中等
登录指定Target 方案三 低(最安全)
批量挂载文件系统 方案四 极高(不推荐生产使用)
批量登出 方案五

建议:优先使用方案三(指定IQN),配合 automatic 启动参数实现持久配置,而不是在脚本里写死挂载逻辑。

抱歉,评论功能暂时关闭!