diff mbox

Add rc script for rbd map/unmap

Message ID 1371827829-1025-1-git-send-email-laurent@ksperis.com (mailing list archive)
State New, archived
Headers show

Commit Message

Laurent Barbe June 21, 2013, 3:17 p.m. UTC
Init script for mapping/unmapping rbd device on startup and shutdown.
On start, map rbd dev according to /etc/rbdmap, and force mount -a
On stop, umount file system depending on rbd and unmap all rbd
Since some distribution use symlink for /etc/mtab, the user-space attribute _netdev is not enough to umount file system before rbd dev.
(also concern: #1790)

Signed-off-by: Laurent Barbe <laurent@ksperis.com>
---
 src/init-rbdmap | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/rbdmap      |   3 ++
 2 files changed, 106 insertions(+)
 create mode 100755 src/init-rbdmap
 create mode 100644 src/rbdmap

Comments

Sage Weil June 25, 2013, 4:53 a.m. UTC | #1
Hi Laurent,

I opened a github pull request for this at

	https://github.com/ceph/ceph/pull/378

We might consider putting /etc/rbdmap in /etc/ceph/rbdmap to avoid 
polluting /etc... Dan, can you take a look?

Thanks!
sage


On Fri, 21 Jun 2013, Laurent Barbe wrote:

> Init script for mapping/unmapping rbd device on startup and shutdown.
> On start, map rbd dev according to /etc/rbdmap, and force mount -a
> On stop, umount file system depending on rbd and unmap all rbd
> Since some distribution use symlink for /etc/mtab, the user-space attribute _netdev is not enough to umount file system before rbd dev.
> (also concern: #1790)
> 
> Signed-off-by: Laurent Barbe <laurent@ksperis.com>
> ---
>  src/init-rbdmap | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/rbdmap      |   3 ++
>  2 files changed, 106 insertions(+)
>  create mode 100755 src/init-rbdmap
>  create mode 100644 src/rbdmap
> 
> diff --git a/src/init-rbdmap b/src/init-rbdmap
> new file mode 100755
> index 0000000..a2187ce
> --- /dev/null
> +++ b/src/init-rbdmap
> @@ -0,0 +1,103 @@
> +#!/bin/bash
> +
> +### BEGIN INIT INFO
> +# Provides:          rbdmap
> +# Required-Start:    $network
> +# Required-Stop:     $network
> +# Default-Start:     2 3 4 5
> +# Default-Stop:      0 1 6
> +# Short-Description: Ceph RBD Mapping
> +# Description:       Ceph RBD Mapping
> +### END INIT INFO
> +
> +DESC="RBD Mapping"
> +RBDMAPFILE="/etc/rbdmap"
> +
> +. /lib/lsb/init-functions
> +
> +do_map() {
> +	if [ ! -f "$RBDMAPFILE" ]; then
> +		log_warning_msg "$DESC : No $RBDMAPFILE found."	
> +		exit 0
> +	fi
> +
> +	log_daemon_msg "Starting $DESC"
> +	# Read /etc/rbdtab to create non-existant mapping
> +	newrbd=
> +	RET=0
> +	while read DEV PARAMS; do
> +		case "$DEV" in
> +		  ""|\#*)
> +			continue
> +			;;
> +		  */*)
> +			;;
> +		  *)
> +			DEV=rbd/$DEV
> +			;;
> +		esac
> +		OIFS=$IFS
> +		IFS=','
> +		for PARAM in ${PARAMS[@]}; do
> +			CMDPARAMS="$CMDPARAMS --$(echo $PARAM | tr '=' ' ')"
> +		done
> +		IFS=$OIFS
> +		if [ ! -b /dev/rbd/$DEV ]; then
> +			log_progress_msg $DEV
> +			rbd map $DEV $CMDPARAMS
> +			[ $? -ne "0" ] && RET=1
> +			newrbd="yes"
> +		fi
> +	done < $RBDMAPFILE
> +	log_end_msg $RET
> +
> +	# Mount new rbd
> +	if [ "$newrbd" ]; then
> +                log_action_begin_msg "Mounting all filesystems"
> +		mount -a
> +               	log_action_end_msg $?
> +	fi
> +}
> +
> +do_unmap() {
> +	log_daemon_msg "Stopping $DESC"
> +	RET=0
> +	# Unmap all rbd device
> +	for DEV in /dev/rbd[0-9]*; do
> +		log_progress_msg $DEV
> +		# Umount before unmap
> +		MNTDEP=$(findmnt --mtab --source $DEV --output TARGET | sed 1,1d | sort -r)
> +		for MNT in $MNTDEP; do
> +			umount $MNT || sleep 1 && umount -l $DEV
> +		done 
> +		rbd unmap $DEV
> +		[ $? -ne "0" ] && RET=1
> +	done
> +	log_end_msg $RET
> +}
> +
> +
> +case "$1" in
> +  start)
> +	do_map
> +	;;
> +
> +  stop)
> +	do_unmap
> +	;;
> +
> +  reload)
> +	do_map
> +	;;
> +
> +  status)
> +	rbd showmapped
> +	;;
> +
> +  *)
> +	log_success_msg "Usage: rbdmap {start|stop|reload|status}"
> +	exit 1
> +	;;
> +esac
> +
> +exit 0
> diff --git a/src/rbdmap b/src/rbdmap
> new file mode 100644
> index 0000000..9d34e9e
> --- /dev/null
> +++ b/src/rbdmap
> @@ -0,0 +1,3 @@
> +# RbdDevice		Parameters
> +#rbd/rbddevice		id=client,keyring=/etc/ceph/ceph.client.keyring
> +
> -- 
> 1.8.1.2
> 
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Sage Weil June 27, 2013, 5:16 a.m. UTC | #2
Hi Laurent,

I went ahead and merged this.

Thanks!
sage

On Mon, 24 Jun 2013, Sage Weil wrote:

> Hi Laurent,
> 
> I opened a github pull request for this at
> 
> 	https://github.com/ceph/ceph/pull/378
> 
> We might consider putting /etc/rbdmap in /etc/ceph/rbdmap to avoid 
> polluting /etc... Dan, can you take a look?
> 
> Thanks!
> sage
> 
> 
> On Fri, 21 Jun 2013, Laurent Barbe wrote:
> 
> > Init script for mapping/unmapping rbd device on startup and shutdown.
> > On start, map rbd dev according to /etc/rbdmap, and force mount -a
> > On stop, umount file system depending on rbd and unmap all rbd
> > Since some distribution use symlink for /etc/mtab, the user-space attribute _netdev is not enough to umount file system before rbd dev.
> > (also concern: #1790)
> > 
> > Signed-off-by: Laurent Barbe <laurent@ksperis.com>
> > ---
> >  src/init-rbdmap | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  src/rbdmap      |   3 ++
> >  2 files changed, 106 insertions(+)
> >  create mode 100755 src/init-rbdmap
> >  create mode 100644 src/rbdmap
> > 
> > diff --git a/src/init-rbdmap b/src/init-rbdmap
> > new file mode 100755
> > index 0000000..a2187ce
> > --- /dev/null
> > +++ b/src/init-rbdmap
> > @@ -0,0 +1,103 @@
> > +#!/bin/bash
> > +
> > +### BEGIN INIT INFO
> > +# Provides:          rbdmap
> > +# Required-Start:    $network
> > +# Required-Stop:     $network
> > +# Default-Start:     2 3 4 5
> > +# Default-Stop:      0 1 6
> > +# Short-Description: Ceph RBD Mapping
> > +# Description:       Ceph RBD Mapping
> > +### END INIT INFO
> > +
> > +DESC="RBD Mapping"
> > +RBDMAPFILE="/etc/rbdmap"
> > +
> > +. /lib/lsb/init-functions
> > +
> > +do_map() {
> > +	if [ ! -f "$RBDMAPFILE" ]; then
> > +		log_warning_msg "$DESC : No $RBDMAPFILE found."	
> > +		exit 0
> > +	fi
> > +
> > +	log_daemon_msg "Starting $DESC"
> > +	# Read /etc/rbdtab to create non-existant mapping
> > +	newrbd=
> > +	RET=0
> > +	while read DEV PARAMS; do
> > +		case "$DEV" in
> > +		  ""|\#*)
> > +			continue
> > +			;;
> > +		  */*)
> > +			;;
> > +		  *)
> > +			DEV=rbd/$DEV
> > +			;;
> > +		esac
> > +		OIFS=$IFS
> > +		IFS=','
> > +		for PARAM in ${PARAMS[@]}; do
> > +			CMDPARAMS="$CMDPARAMS --$(echo $PARAM | tr '=' ' ')"
> > +		done
> > +		IFS=$OIFS
> > +		if [ ! -b /dev/rbd/$DEV ]; then
> > +			log_progress_msg $DEV
> > +			rbd map $DEV $CMDPARAMS
> > +			[ $? -ne "0" ] && RET=1
> > +			newrbd="yes"
> > +		fi
> > +	done < $RBDMAPFILE
> > +	log_end_msg $RET
> > +
> > +	# Mount new rbd
> > +	if [ "$newrbd" ]; then
> > +                log_action_begin_msg "Mounting all filesystems"
> > +		mount -a
> > +               	log_action_end_msg $?
> > +	fi
> > +}
> > +
> > +do_unmap() {
> > +	log_daemon_msg "Stopping $DESC"
> > +	RET=0
> > +	# Unmap all rbd device
> > +	for DEV in /dev/rbd[0-9]*; do
> > +		log_progress_msg $DEV
> > +		# Umount before unmap
> > +		MNTDEP=$(findmnt --mtab --source $DEV --output TARGET | sed 1,1d | sort -r)
> > +		for MNT in $MNTDEP; do
> > +			umount $MNT || sleep 1 && umount -l $DEV
> > +		done 
> > +		rbd unmap $DEV
> > +		[ $? -ne "0" ] && RET=1
> > +	done
> > +	log_end_msg $RET
> > +}
> > +
> > +
> > +case "$1" in
> > +  start)
> > +	do_map
> > +	;;
> > +
> > +  stop)
> > +	do_unmap
> > +	;;
> > +
> > +  reload)
> > +	do_map
> > +	;;
> > +
> > +  status)
> > +	rbd showmapped
> > +	;;
> > +
> > +  *)
> > +	log_success_msg "Usage: rbdmap {start|stop|reload|status}"
> > +	exit 1
> > +	;;
> > +esac
> > +
> > +exit 0
> > diff --git a/src/rbdmap b/src/rbdmap
> > new file mode 100644
> > index 0000000..9d34e9e
> > --- /dev/null
> > +++ b/src/rbdmap
> > @@ -0,0 +1,3 @@
> > +# RbdDevice		Parameters
> > +#rbd/rbddevice		id=client,keyring=/etc/ceph/ceph.client.keyring
> > +
> > -- 
> > 1.8.1.2
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > 
> > 
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/src/init-rbdmap b/src/init-rbdmap
new file mode 100755
index 0000000..a2187ce
--- /dev/null
+++ b/src/init-rbdmap
@@ -0,0 +1,103 @@ 
+#!/bin/bash
+
+### BEGIN INIT INFO
+# Provides:          rbdmap
+# Required-Start:    $network
+# Required-Stop:     $network
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Ceph RBD Mapping
+# Description:       Ceph RBD Mapping
+### END INIT INFO
+
+DESC="RBD Mapping"
+RBDMAPFILE="/etc/rbdmap"
+
+. /lib/lsb/init-functions
+
+do_map() {
+	if [ ! -f "$RBDMAPFILE" ]; then
+		log_warning_msg "$DESC : No $RBDMAPFILE found."	
+		exit 0
+	fi
+
+	log_daemon_msg "Starting $DESC"
+	# Read /etc/rbdtab to create non-existant mapping
+	newrbd=
+	RET=0
+	while read DEV PARAMS; do
+		case "$DEV" in
+		  ""|\#*)
+			continue
+			;;
+		  */*)
+			;;
+		  *)
+			DEV=rbd/$DEV
+			;;
+		esac
+		OIFS=$IFS
+		IFS=','
+		for PARAM in ${PARAMS[@]}; do
+			CMDPARAMS="$CMDPARAMS --$(echo $PARAM | tr '=' ' ')"
+		done
+		IFS=$OIFS
+		if [ ! -b /dev/rbd/$DEV ]; then
+			log_progress_msg $DEV
+			rbd map $DEV $CMDPARAMS
+			[ $? -ne "0" ] && RET=1
+			newrbd="yes"
+		fi
+	done < $RBDMAPFILE
+	log_end_msg $RET
+
+	# Mount new rbd
+	if [ "$newrbd" ]; then
+                log_action_begin_msg "Mounting all filesystems"
+		mount -a
+               	log_action_end_msg $?
+	fi
+}
+
+do_unmap() {
+	log_daemon_msg "Stopping $DESC"
+	RET=0
+	# Unmap all rbd device
+	for DEV in /dev/rbd[0-9]*; do
+		log_progress_msg $DEV
+		# Umount before unmap
+		MNTDEP=$(findmnt --mtab --source $DEV --output TARGET | sed 1,1d | sort -r)
+		for MNT in $MNTDEP; do
+			umount $MNT || sleep 1 && umount -l $DEV
+		done 
+		rbd unmap $DEV
+		[ $? -ne "0" ] && RET=1
+	done
+	log_end_msg $RET
+}
+
+
+case "$1" in
+  start)
+	do_map
+	;;
+
+  stop)
+	do_unmap
+	;;
+
+  reload)
+	do_map
+	;;
+
+  status)
+	rbd showmapped
+	;;
+
+  *)
+	log_success_msg "Usage: rbdmap {start|stop|reload|status}"
+	exit 1
+	;;
+esac
+
+exit 0
diff --git a/src/rbdmap b/src/rbdmap
new file mode 100644
index 0000000..9d34e9e
--- /dev/null
+++ b/src/rbdmap
@@ -0,0 +1,3 @@ 
+# RbdDevice		Parameters
+#rbd/rbddevice		id=client,keyring=/etc/ceph/ceph.client.keyring
+