千家信息网

ceph中rbdmap遇到问题的案例分析

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章将为大家详细讲解有关ceph中rbdmap遇到问题的案例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。运行于centos6.5的rbdmap:[root
千家信息网最后更新 2026年11月03日ceph中rbdmap遇到问题的案例分析

这篇文章将为大家详细讲解有关ceph中rbdmap遇到问题的案例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

运行于centos6.5的rbdmap:

[root@mon0 ceph]# cat /etc/init.d/rbdmap #!/bin/bash## rbdmap Ceph RBD Mapping## chkconfig: 2345 70 70# description: Ceph RBD Mapping### BEGIN INIT INFO# Provides:          rbdmap# Required-Start:    $network $remote_fs# Required-Stop:     $network $remote_fs# Should-Start:      ceph# Should-Stop:       ceph# X-Start-Before:    $x-display-manager# Default-Start:     2 3 4 5# Default-Stop:      0 1 6# Short-Description: Ceph RBD Mapping# Description:       Ceph RBD Mapping### END INIT INFODESC="RBD Mapping:"RBDMAPFILE="/etc/ceph/rbdmap". /lib/lsb/init-functionsdo_map() {        if [ ! -f "$RBDMAPFILE" ]; then                #log_warning_msg "$DESC : No $RBDMAPFILE found."                exit 0        fi        # Read /etc/rbdtab to create non-existant mapping        RET=0        while read DEV PARAMS; do                case "$DEV" in                  ""|\#*)                        continue                        ;;                  */*)                        ;;                  *)                        DEV=rbd/$DEV                        ;;                esac                #log_action_begin_msg "${DESC} '${DEV}'"                newrbd=""                MAP_RV=""                RET_OP=0                OIFS=$IFS                IFS=','                for PARAM in ${PARAMS[@]}; do                        CMDPARAMS="$CMDPARAMS --$(echo $PARAM | tr '=' ' ')"                done                IFS=$OIFS                if [ ! -b /dev/rbd/$DEV ]; then                        MAP_RV=$(rbd map $DEV $CMDPARAMS 2>&1)                        if [ $? -eq 0 ]; then                            newrbd="yes"                        else                            RET=$((${RET}+$?))                            RET_OP=1                        fi                fi                #log_action_end_msg ${RET_OP} "${MAP_RV}"                if [ "$newrbd" ]; then                        ## Mount new rbd                        MNT_RV=""                        mount --fake /dev/rbd/$DEV >>/dev/null 2>&1 \                        && MNT_RV=$(mount -v /dev/rbd/$DEV 2>&1)                        [ -n "${MNT_RV}" ] && log_action_msg "mount: ${MNT_RV}"                        ## post-mapping                        if [ -x "/etc/ceph/rbd.d/${DEV}" ]; then                            #log_action_msg "RBD Running post-map hook '/etc/ceph/rbd.d/${DEV}'"                            /etc/ceph/rbd.d/${DEV} map "/dev/rbd/${DEV}"                        fi                fi        done < $RBDMAPFILE        exit ${RET}}do_unmap() {        RET=0        ## Unmount and unmap all rbd devices        if ls /dev/rbd[0-9]* >/dev/null 2>&1; then                for DEV in /dev/rbd[0-9]*; do                        ## pre-unmapping                        for L in $(find /dev/rbd -type l); do                            LL="${L##/dev/rbd/}"                            if [ "$(readlink -f $L)" = "${DEV}" ] \                            && [ -x "/etc/ceph/rbd.d/${LL}" ]; then                                log_action_msg "RBD pre-unmap:  '${DEV}' hook '/etc/ceph/rbd.d/${LL}'"                                /etc/ceph/rbd.d/${LL} unmap "$L"                                break                            fi                        done                        #log_action_begin_msg "RBD un-mapping: '${DEV}'"                        UMNT_RV=""                        UMAP_RV=""                        RET_OP=0                        MNT=$(findmnt --mtab --source ${DEV} --noheadings | awk '{print $1'})                        if [ -n "${MNT}" ]; then                        #    log_action_cont_msg "un-mounting '${MNT}'"                            UMNT_RV=$(umount "${MNT}" 2>&1)                        fi                        if mountpoint -q "${MNT}"; then                            ## Un-mounting failed.                            RET_OP=1                            RET=$((${RET}+1))                        else                            ## Un-mapping.                            UMAP_RV=$(rbd unmap $DEV 2>&1)                            if [ $? -ne 0 ]; then                                RET=$((${RET}+$?))                                RET_OP=1                            fi                        fi                        #log_action_end_msg ${RET_OP} "${UMAP_RV}"                        [ -n "${UMNT_RV}" ] && log_action_msg "${UMNT_RV}"                done        fi        exit ${RET}}case "$1" in  start)        do_map        ;;  stop)        do_unmap        ;;  restart|force-reload)        $0 stop        $0 start        ;;  reload)        do_map        ;;  status)        rbd showmapped        ;;  *)        log_success_msg "Usage: rbdmap {start|stop|restart|force-reload|reload|status}"        exit 1        ;;esac

修改一些在centos上没有的log后,这个脚本使用起来还是有问题,具体描述如下:

1. 在只rbd map一个块得到/dev/rbd0后,使用rbdmap脚本可以正常map/unmap /dev/rbd0。

2. 当将/dev/rbd0格式化后挂载到一个目录上,再使用rbdmap,关机的时候系统就会hang在unmounting filesystem上了,只能强制断电;再开机启动后执行了rbdmap的do_map()函数,一切正常。

排查后发现,当将/dev/rbd0挂载到目录后,rbdmap就不会执行do_unmap()函数,即使函数中加入显式umount操作也不会执行。

想了一个折中的办法,在rbdmap停止优先级高的服务中的stop函数中显式加入umount操作,重启时一切正常了。

先来看一下ceph、rbdmap的启停顺序:

head rbdmap#!/bin/bash## rbdmap Ceph RBD Mapping## chkconfig: 2345 70 70# description: Ceph RBD Mappinghead ceph#!/bin/sh# Start/stop ceph daemons# chkconfig: - 60 80### BEGIN INIT INFO# Provides:          ceph# Default-Start:# Default-Stop:# Required-Start:    $remote_fs $named $network $time# Required-Stop:     $remote_fs $named $network $time

可以看出ceph先于rbdmap启动,rbdmap先于ceph停止。如果采用nfs,使用rbdmap映射出的块设备,先看看nfs的启停顺序:

head /etc/init.d/nfs#!/bin/sh## nfs           This shell script takes care of starting and stopping#               the NFS services.## chkconfig: - 30 60# description: NFS is a popular protocol for file sharing across networks.#              This service provides NFS server functionality, which is \#              configured via the /etc/exports file.# probe: true

nfs是这三者中最先启动的,也是最先停止的。所以在nfs的stop函数中加入umount命令:

umount /mnt/nfsumount /mnt/nfs2

在rbdmap中加入挂载命令:

mount /dev/rbd0 -o rw,noexec,nodev,noatime,nobarrier,discard /mnt/nfsmount /dev/rbd1 -o rw,noexec,nodev,noatime,nobarrier,discard /mnt/nfs2

/etc/ceph/rbdmap的设置如下:

backup1/backup.imgbackup2/backup.img

记得在ceph-0.80时测试是没有问题的,到了0.87.1出现了上述问题。

关于"ceph中rbdmap遇到问题的案例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

问题 函数 篇文章 中加 案例 案例分析 分析 命令 更多 最先 目录 脚本 顺序 不错 实用 优先级 内容 办法 文章 时候 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么是科技互联网 深圳市人人互联网科技有限公司 广东万易互联网科技有限公司惠州分公司 哈尔滨大商圈互联网科技有限公司 河南云网互联网络科技有限公司 疫情对互联网科技公司影响 深圳科技互联网 互联网 科技创新 互联网 卓越科技 浩特互联网科技 须眉科技是互联网公司吗 昭通云南众福互联网科技有限公司 世界互联网领先科技成果获奖 工业互联网展湾科技股份有限公司 怎样加入科技互联网 广州富喜互联网络科技 21世纪互联网科技成就 版纳互联网科技选哪家 科技互联网公司两年变化 武汉亿视互联网科技有限公司 互联网科技公司排名 互联网科技活动banner 科技互联网政务服务 江苏南京365互联网科技 青岛中康互联网医疗科技有限公司 创业天下互联网科技有限公司 崇明区互联网教育科技售后服务 宜昌元轩互联网科技有限公司 云鲸互联网络科技有限公司 现代互联网科技公司
0