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 <gree...@candelatech.com>

Thanks,
Ben

--
Ben Greear <gree...@candelatech.com>
Candela Technologies Inc  http://www.candelatech.com

--- /home/greearb/casper.orig	2012-05-08 09:09:43.012658969 -0700
+++ casper	2012-05-16 15:10:04.310483151 -0700
@@ -17,6 +17,7 @@
 USERFULLNAME="Live session user"
 HOST=live
 BUILD_SYSTEM=Custom
+FSCKARG=-p
 
 mkdir -p $mountpoint
 tried=/tmp/tried
@@ -61,6 +62,10 @@
                 export TORAM="Yes" ;;
             todisk=*)
                 export TODISK="${x#todisk=}" ;;
+            fscky)
+		FSCKARG=-y ;;
+            casper-notquiet)
+		quiet=n ;;
         esac
     done
     if [ "${UNIONFS}" = "" ]; then
@@ -441,6 +446,24 @@
         fi
     fi
 
+    if [ "_${cow_fstype}" = "_ext2" -o "_${cow_fstype}" = "_ext3" -o "_${cow_fstype}" = "_ext4" ]
+	then
+	[ "$quiet" != "y" ] && log_warning_msg "Running e2fsck on ${cowdevice}, fstype: ${cow_fstype}"
+	e2fsck ${FSCKARG} ${cowdevice}
+	EC2=$?
+	if [ $EC2 != "0" ]
+		then
+		if [ $EC2 = "1" ]
+			then
+			log_warning_msg "e2fsck automatically corrected errors on ${cowdevice}, fstype: ${cow_fstype}"
+		else
+			panic "ERROR: Possible file system corruption on ${cowdevice}: $EC2  Run: e2fsck ${cowdevice} or e2fsck -y ${cowdevice} and then exit"
+		fi
+	fi
+    else
+	[ "$quiet" != "y" ] && log_warning_msg "Not running fsck on ${cowdevice}, only ext2/2/4 fsck supported: ${cow_fstype}"
+    fi
+
     mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} /cow || panic "Can not mount $cowdevice on /cow"
 
     case ${UNIONFS} in
@@ -505,9 +528,17 @@
                     ;;
             esac
         done
-        # shows cow fs on /cow for use by casper-snapshot
-        mkdir -p "${rootmnt}/cow"
-        mount -o bind /cow "${rootmnt}/cow"
+    fi
+
+    # We always need to show cow so we can at least try to gracefully
+    # unmount it on shutdown (or re-mount ro or whatever)
+
+    # shows cow fs on /cow for use by casper-snapshot
+    mkdir -p "${rootmnt}/cow"
+    if [ "${UNIONFS}" = unionfs-fuse ]; then
+	mount -o bind /cow "${rootmnt}/cow"
+    else
+	mount -o move /cow "${rootmnt}/cow"
     fi
 
     # move the first mount; no head in busybox-initramfs
#! /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

:
-- 
Ubuntu-devel-discuss mailing list
Ubuntu-devel-discuss@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/ubuntu-devel-discuss

Reply via email to