Questions and patches related to casper.

Ben Greear greearb at candelatech.com
Wed May 16 22:40:54 UTC 2012


I have been having issues trying to do a persistent-usb image for
Ubuntu 12.04.

*  /cow is not checked with fsck on startup.  (casper patch to fix this attached)

* /cow is not visible in / by default.  I think this is required if
   we are ever to be able to unmount /cow cleanly.
   (fixed by attached casper patch).

* /cow cannot be cleanly un-mounted on shutdown

   I've made some attempts, but have not gotten this working.
   The attached '/etc/init.d/umountroot' contains my attempts.


I'd love to get this working cleanly....so please let me know if you
have any suggestions.

I'm not sure if Ubuntu uses 'signed-off-by' for this type
of thing, but if so, consider it:

Signed-off-by:  Ben Greear <greearb at candelatech.com>

Thanks,
Ben

-- 
Ben Greear <greearb at candelatech.com>
Candela Technologies Inc  http://www.candelatech.com

-------------- next part --------------
A non-text attachment was scrubbed...
Name: casper-12.04.patch
Type: text/x-patch
Size: 2046 bytes
Desc: not available
URL: <https://lists.ubuntu.com/archives/ubuntu-devel-discuss/attachments/20120516/fb892d5e/attachment.bin>
-------------- next part --------------
#! /bin/sh
### BEGIN INIT INFO
# Provides:          umountroot
# Required-Start:
# Required-Stop:
# Should-Stop:       halt reboot kexec
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Mount the root filesystem read-only.
### END INIT INFO

PATH=/sbin:/bin
. /lib/init/vars.sh

. /lib/lsb/init-functions

do_stop () {
	[ "$VERBOSE" = no ] || log_action_begin_msg "Mounting root filesystem read-only"
	# Ask init to re-exec itself before we go down if it has been
	# upgraded this cycle.  It'll lose all its state, but at least
	# it won't hold open files on the root filesystem (lp:#672177).
	if [ -f /var/run/init.upgraded ]
	then
		old_map=$( cat /proc/1/maps )
		map=$old_map
		telinit u || :
		i=0
		timeout=5
		while [ "$map" = "$old_map" ]
		do
			sleep 1
			map=$( cat /proc/1/maps )
			/usr/bin/logger "waiting for init to respawn"
			i=$((i+1))
			if [ $i -eq $timeout ] ; then
				break
			fi
		done

		if [ "$map" = "$old_map" ] ; then
			/usr/bin/logger "FAIL: init failed to respawn in $timeout seconds - unmounting anyway"
		else
			/usr/bin/logger "SUCCESS: init respawned after $i seconds (within $timeout seconds timeout)"
		fi
	fi

	# These directories must exist on the root filesystem as they are
	# targets for system mountpoints.  We've just unmounted all other
	# filesystems, so either they are mounted now (in which case the
	# mount point exists) or we can make the mountpoint.
	for dir in /proc /sys; do
	    mkdir -p $dir || true
	done
	# These must be turned into symlinks for the /run transition.  We
	# can't do this at boot time because / is remounted read-write too
	# late, so do it on shutdown instead.
	if [ -d /var/run ]; then
		umount -l /var/run || true
		rm -rf /var/run
		ln -nsf /run /var/run
	fi
	if [ -d /var/lock ]; then
		umount -l /var/lock || true
		rm -rf /var/lock
		ln -nsf /run/lock /var/lock
	fi
	if [ -d /dev/shm ]; then
		umount -l /dev/shm || true
		rm -rf /dev/shm
		ln -nsf /run/shm /dev/shm
	fi
	if [ ! -L /lib/init/rw ] && umount -l /lib/init/rw && \
	   rm -rf /lib/init/rw; then
	    ln -nsf /run /lib/init/rw
	elif [ -L /lib/init/rw ] && [ $(readlink /lib/init/rw) != /run ]; then
	    rm -f /lib/init/rw
	    ln -nsf /run /lib/init/rw
	fi

	MOUNT_FORCE_OPT=
	[ "$(uname -s)" = "GNU/kFreeBSD" ] && MOUNT_FORCE_OPT=-f
	# This:
	#     mount -n -o remount,ro /
	# will act on a bind mount of / if there is one.
	# See #339023 and the comment in checkroot.sh
	sync
	set -x
	auplink / flush
	mount    $MOUNT_FORCE_OPT -n -o remount,ro -t dummytype dummydev / 2>/dev/null \
	|| mount $MOUNT_FORCE_OPT -n -o remount,ro              dummydev / 2>/dev/null \
	|| mount $MOUNT_FORCE_OPT -n -o remount,ro                       /
	ES=$?
	sync
	[ "$VERBOSE" = no ] || log_action_end_msg $ES

	if [ -d /cow ]
	then
		# Remove from aufs
		# This doesn't actually seem to work.
		MOUNT_FORCE_OPT=-f
		mount $MOUNT_FORCE_OPT -n -o remount,mod:/cow=ro /
		mount $MOUNT_FORCE_OPT -n -o remount,del:/cow /
		mount $MOUNT_FORCE_OPT -n -o remount,ro /cow
 		umount $MOUNT_FORCE_OPT -n /cow
	fi
	cat /proc/mounts

	# Give usb persistent storage a chance to calm down??
	sleep 10
}

case "$1" in
  start)
	# No-op
	;;
  restart|reload|force-reload)
	echo "Error: argument '$1' not supported" >&2
	exit 3
	;;
  stop)
	do_stop
	;;
  *)
	echo "Usage: $0 start|stop" >&2
	exit 3
	;;
esac

:


More information about the Ubuntu-devel-discuss mailing list