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