本文讲解CentOS如何挂载块存储。

申请卷

菜单:云平台 -> MStore 存储管理 -> 存储块管理 -> 卷 -> 点击创建

创建卷

设置卷大小:

参数说明:

  • 存储池:选择对应的存储池
  • 卷名称:具备业务属性,或某些标识,例如 image-db(数据库)
  • 大小:根据业务需求分配(如 10G)

创建网关

卷创建完成后,我们需要通过“网关”,将该向外提供。

菜单:云平台 -> MStore 存储管理 -> 存储块管理 -> iSCSI -> 点击创建

参数说明:

  • 目标限定名(IQN):格式要求:iqn.YYYY-MM.<reversed-domain>:<unique-name>
  • 入口网关:向外提供服务的节点
  • 存储:选择刚创建的卷

获取连接信息

  • IQN:iqn.2025-09.com.company:1758837954180833
  • 入口网关:192.168.0.16 192.168.0.17 192.168.0.18 192.168.0.19"
  • 挂载地址:/mnt/db(自动化脚本默认路径)

自动化脚本

将获取到的IQNPortals及要挂载的目录写到以下脚本。也可传递给脚本。

PS:当前默认将新创建的挂到/mnt/db

#!/bin/bash

echo "========== 自动挂载脚本 =========="

# ===== 默认配置 =====
TARGET_IQN="iqn.2001-07.com.store:1758791383502"
PORTALS="192.168.0.16 192.168.0.17 192.168.0.18 192.168.0.19"
MOUNT_DIR="/mnt/db"
# ====================

echo "目标 IQN: $TARGET_IQN"
echo "Portal 列表: $PORTALS"
echo "挂载目录: $MOUNT_DIR"
echo "======================================"

# 安装依赖
yum install -y iscsi-initiator-utils device-mapper-multipath xfsprogs

# multipath 配置
mpathconf --enable --with_multipathd y --with_module y

# 登录所有 portal
for portal in $PORTALS; do
    echo ">>> 登录 $portal"
    iscsiadm -m discovery -t sendtargets -p ${portal}:3260
    iscsiadm -m node -T $TARGET_IQN -p ${portal}:3260 --login
done

# 轮询等待 multipath 设备
echo "等待 multipath 设备创建..."
DEVICE=""
for i in {1..10}; do
    DEVICE=$(multipath -ll | grep -oE 'mpath[a-z]+' | head -n1)
    if [ -n "$DEVICE" ]; then
        break
    fi
    echo "第 $i 次检测: 还未发现 multipath 设备,等待3秒..."
    sleep 3
done

if [ -z "$DEVICE" ]; then
    echo "未找到 multipath 设备,请检查 iscsi 连接"
    exit 1
fi

DEV_PATH="/dev/mapper/$DEVICE"
echo "发现 multipath 设备: $DEV_PATH"

# 创建文件系统(如果未格式化)
if ! blkid $DEV_PATH >/dev/null 2>&1; then
    echo "格式化 $DEV_PATH 为 XFS"
    mkfs.xfs -f $DEV_PATH
fi

# 挂载目录
mkdir -p $MOUNT_DIR
mount $DEV_PATH $MOUNT_DIR
echo "$DEV_PATH 已挂载到 $MOUNT_DIR"

# 写入 fstab,重启自动挂载
UUID=$(blkid -s UUID -o value $DEV_PATH)
if ! grep -q "$UUID" /etc/fstab; then
    echo "UUID=$UUID $MOUNT_DIR xfs _netdev 0 0" >> /etc/fstab
fi

echo "完成!"

注意:

  • 脚本默认格式化为 XFS,可能不适合所有场景(例如需要 ext4 的用户自行更改)。

运行:

chmod +x mount-rbd.sh 
./mount-rbd.sh 

验证

lsblk

解绑脚本

同样,基于IQNPortals及要目录写入到以下脚本,进行解绑:

#!/bin/bash
echo "========== 自动卸载脚本 =========="
# ===== 默认配置 =====
TARGET_IQN="iqn.2001-07.com.store:1758791383502"
PORTALS="192.168.0.16 192.168.0.17 192.168.0.18 192.168.0.19"
MOUNT_DIR="/mnt/db"
# ====================
echo "目标 IQN: $TARGET_IQN"
echo "Portal 列表: $PORTALS"
echo "挂载目录: $MOUNT_DIR"
echo "======================================"
# 检查挂载点是否在使用
if mountpoint -q "$MOUNT_DIR"; then
    echo ">>> 卸载 $MOUNT_DIR"
    umount "$MOUNT_DIR"
    if [ $? -eq 0 ]; then
        echo "$MOUNT_DIR 卸载成功"
    else
        echo "卸载 $MOUNT_DIR 失败,请检查是否有进程占用"
        exit 1
    fi
else
    echo "$MOUNT_DIR 未挂载,跳过卸载"
fi
# 获取 multipath 设备
DEVICE=$(multipath -ll | grep -oE 'mpath[a-z]+' | head -n1)
if [ -n "$DEVICE" ]; then
    DEV_PATH="/dev/mapper/$DEVICE"
    echo "发现 multipath 设备: $DEV_PATH"
    # 刷新 multipath 设备
    echo ">>> 清理 multipath 设备"
    multipath -f "$DEVICE"
    if [ $? -eq 0 ]; then
        echo "multipath 设备 $DEVICE 已清理"
    else
        echo "清理 multipath 设备 $DEVICE 失败"
        exit 1
    fi
else
    echo "未找到 multipath 设备,跳过清理"
fi
# 登出所有 iSCSI portal
for portal in $PORTALS; do
    echo ">>> 登出 $portal"
    iscsiadm -m node -T "$TARGET_IQN" -p "${portal}:3260" --logout
    if [ $? -eq 0 ]; then
        echo "成功登出 $portal"
    else
        echo "登出 $portal 失败"
    fi
done
# 删除 iSCSI 节点记录
echo ">>> 删除 iSCSI 节点记录"
iscsiadm -m node -T "$TARGET_IQN" -o delete
if [ $? -eq 0 ]; then
    echo "iSCSI 节点记录已删除"
else
    echo "删除 iSCSI 节点记录失败"
fi
# 移除 fstab 条目
if grep -q "$MOUNT_DIR" /etc/fstab; then
    echo ">>> 移除 /etc/fstab 中的条目"
    sed -i "\|$MOUNT_DIR|d" /etc/fstab
    if [ $? -eq 0 ]; then
        echo "fstab 条目已移除"
    else
        echo "移除 fstab 条目失败"
        exit 1
    fi
else
    echo "fstab 中未找到 $MOUNT_DIR 的条目,跳过"
fi
# 可选:移除挂载目录
if [ -d "$MOUNT_DIR" ] && [ -z "$(ls -A $MOUNT_DIR)" ]; then
    echo ">>> 删除空挂载目录 $MOUNT_DIR"
    rmdir "$MOUNT_DIR"
    if [ $? -eq 0 ]; then
        echo "挂载目录 $MOUNT_DIR 已删除"
    else
        echo "删除挂载目录 $MOUNT_DIR 失败"
    fi
else
    echo "挂载目录 $MOUNT_DIR 不存在或非空,跳过删除"
fi
echo "完成!"