mirror of
https://github.com/ceph/ceph
synced 2025-01-04 02:02:36 +00:00
e58413abf4
When called with a "map" parameter, the rbdmap script iterates the list of images present in RBDMAPFILE (/etc/ceph/rbdmap), and maps each entry. When called with "unmap", rbdmap currently iterates *all* mapped RBD images and unmaps each one, regardless of whether it's listed in the RBDMAPFILE or not. This commit adds functionality such that only RBD images listed in the configuration file are unmapped. This behaviour is the new default for "rbdmap unmap". A new "unmap-all" parameter is added to offer the old unmap-all-rbd-images behaviour, which is used by the systemd service. Fixes: http://tracker.ceph.com/issues/18884 Signed-off-by: David Disseldorp <ddiss@suse.de>
168 lines
3.6 KiB
Bash
Executable File
168 lines
3.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
do_map() {
|
|
# Read /etc/rbdtab to create non-existant mapping
|
|
RET=0
|
|
while read DEV PARAMS; do
|
|
case "$DEV" in
|
|
""|\#*)
|
|
continue
|
|
;;
|
|
*/*)
|
|
;;
|
|
*)
|
|
DEV=rbd/$DEV
|
|
;;
|
|
esac
|
|
logger -p "daemon.debug" -t rbdmap "Mapping '${DEV}'"
|
|
newrbd=""
|
|
MAP_RV=""
|
|
OIFS=$IFS
|
|
IFS=','
|
|
CMDPARAMS=""
|
|
for PARAM in ${PARAMS[@]}; do
|
|
CMDPARAMS="$CMDPARAMS --$(echo $PARAM | tr '=' ' ')"
|
|
done
|
|
IFS=$OIFS
|
|
if [ -b /dev/rbd/$DEV ]; then
|
|
MAP_RV="$(readlink -f /dev/rbd/$DEV)"
|
|
else
|
|
MAP_RV="$(rbd map $DEV $CMDPARAMS 2>&1)"
|
|
if [ $? -eq 0 ]; then
|
|
newrbd="yes"
|
|
else
|
|
RET=$((${RET}+$?))
|
|
logger -p "daemon.warning" -t rbdmap "Failed to map '${DEV}"
|
|
continue
|
|
fi
|
|
fi
|
|
logger -p "daemon.debug" -t rbdmap "Mapped '${DEV}' to '${MAP_RV}'"
|
|
|
|
if [ "$newrbd" ]; then
|
|
## Mount new rbd
|
|
MNT_RV=""
|
|
mount --fake /dev/rbd/$DEV >>/dev/null 2>&1 \
|
|
&& MNT_RV=$(mount -vn /dev/rbd/$DEV 2>&1)
|
|
[ -n "${MNT_RV}" ] && logger -p "daemon.debug" -t rbdmap "Mounted '${MAP_RV}' to '${MNT_RV}'"
|
|
|
|
## post-mapping
|
|
if [ -x "/etc/ceph/rbd.d/${DEV}" ]; then
|
|
logger -p "daemon.debug" -t rbdmap "Running post-map hook '/etc/ceph/rbd.d/${DEV}'"
|
|
/etc/ceph/rbd.d/${DEV} map "/dev/rbd/${DEV}"
|
|
fi
|
|
fi
|
|
done < $RBDMAPFILE
|
|
exit ${RET}
|
|
|
|
}
|
|
|
|
unmount_unmap() {
|
|
local rbd_dev=$1
|
|
local mnt=$(findmnt --mtab --source ${rbd_dev} --noheadings \
|
|
| awk '{print $1'})
|
|
|
|
logger -p "daemon.debug" -t rbdmap "Unmapping '${rbd_dev}'"
|
|
if [ -n "${mnt}" ]; then
|
|
logger -p "daemon.debug" -t rbdmap "Unmounting '${mnt}'"
|
|
umount "${mnt}" >>/dev/null 2>&1
|
|
fi
|
|
if mountpoint -q "${mnt}"; then
|
|
## Un-mounting failed.
|
|
logger -p "daemon.warning" -t rbdmap "Failed to unmount '${mnt}'"
|
|
return 1
|
|
fi
|
|
## Un-mapping.
|
|
rbd unmap $rbd_dev >>/dev/null 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
logger -p "daemon.warning" -t rbdmap "Failed to unmap '${mnt}'"
|
|
return 1
|
|
fi
|
|
logger -p "daemon.debug" -t rbdmap "Unmapped '${rbd_dev}'"
|
|
|
|
return 0
|
|
}
|
|
|
|
do_unmap_all() {
|
|
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
|
|
logger -p "daemon.debug" -t rbdmap "Running pre-unmap hook for '${DEV}': '/etc/ceph/rbd.d/${LL}'"
|
|
/etc/ceph/rbd.d/${LL} unmap "$L"
|
|
break
|
|
fi
|
|
done
|
|
|
|
unmount_unmap "$DEV" || RET=$((${RET}+$?))
|
|
|
|
done
|
|
fi
|
|
exit ${RET}
|
|
}
|
|
|
|
do_unmap() {
|
|
RET=0
|
|
## skip if nothing is mapped
|
|
ls /dev/rbd[0-9]* >/dev/null 2>&1 || exit ${RET}
|
|
|
|
# Read /etc/rbdtab to create non-existant mapping
|
|
while read DEV PARAMS; do
|
|
case "$DEV" in
|
|
""|\#*)
|
|
continue
|
|
;;
|
|
*/*)
|
|
;;
|
|
*)
|
|
DEV=rbd/$DEV
|
|
;;
|
|
esac
|
|
|
|
MAP_RV="$(readlink -f /dev/rbd/$DEV)"
|
|
if [ ! -b $MAP_RV ]; then
|
|
logger -p "daemon.debug" -t rbdmap "$DEV not mapped, skipping unmap"
|
|
continue
|
|
fi
|
|
|
|
## pre-unmapping
|
|
if [ -x "/etc/ceph/rbd.d/${DEV}" ]; then
|
|
logger -p "daemon.debug" -t rbdmap "Running pre-unmap hook '/etc/ceph/rbd.d/${DEV}'"
|
|
/etc/ceph/rbd.d/${DEV} unmap "/dev/rbd/${DEV}"
|
|
fi
|
|
|
|
unmount_unmap "$MAP_RV" || RET=$((${RET}+$?))
|
|
|
|
done < $RBDMAPFILE
|
|
exit ${RET}
|
|
}
|
|
|
|
# default to reasonable value if RBDMAPFILE not set in environment
|
|
RBDMAPFILE="${RBDMAPFILE:-/etc/ceph/rbdmap}"
|
|
|
|
if [ ! -f "$RBDMAPFILE" ]; then
|
|
logger -p "daemon.warning" -t rbdmap "No $RBDMAPFILE found."
|
|
exit 0
|
|
fi
|
|
|
|
case "$1" in
|
|
map)
|
|
do_map
|
|
;;
|
|
|
|
unmap)
|
|
do_unmap
|
|
;;
|
|
|
|
unmap-all)
|
|
do_unmap_all
|
|
;;
|
|
|
|
*)
|
|
echo "Usage: rbdmap map | unmap | unmap-all"
|
|
esac
|