#!/bin/sh #set -x ROOTMOUNTPT=/media/realroot REALUMOUNT=/bin/umount.busybox UNIONUMOUNT=$0 INCDIRS="^/media/\|^/mnt/" DEVICE="\/dev\/" newargs="" ONESHIFTARGS='adflnrv' TWOSHIFTARGS="tO" resolvelink () { if test -h $1; then echo `readlink $1` else echo $1 fi } # Retrieves arguments/mount-point for var in $@; do if [ -z "$SKIP" ]; then if echo $var | grep -q "^-.*"; then if echo $var | grep -q "[$TWOSHIFTARGS]"; then SKIP="yes" fi if echo $var | grep -q "^-[^- ]*a"; then DO_FSTAB="yes" fi ARGS="$ARGS $var" else if [ -z "$MOUNT_POINT" ]; then MOUNT_POINT=$var else # This really shouldn't happen when unmounting DEV_PATH="$MOUNT_POINT" MOUNT_POINT="$var" fi fi else ARGS="$ARGS $var" unset SKIP fi done # Parse fstab if -a is used if ! [ -z "$DO_FSTAB" ]; then # FIXME: This doesn't handle -t or -O awk '/^[^ #]/ {print $1}' /etc/fstab | while read line; do ${UNIONUMOUNT} $line done exit 0 fi # Get mount-point for device name, if device name is given if echo "$MOUNT_POINT" | grep -q "^${DEVICE}"; then MOUNT_POINT_TEMP=`echo $MOUNT_POINT | sed -e "s/\//\\\\\\\\\//g"` NEW_MOUNT_POINT=`awk "/$MOUNT_POINT_TEMP/ {print "'$2'"}" /etc/fstab` if ! [ -z "$NEW_MOUNT_POINT" ]; then MOUNT_POINT=$NEW_MOUNT_POINT fi fi if ! (echo "$MOUNT_POINT" | grep -q "$INCDIRS"||[ "$MOUNT_POINT" = "/" ]); then exec ${REALMOUNT} $@ fi # Replace requests to mount '/' (from init scripts and such) # with mount ROOTMOUNTPT (the real-root mount point for the # unionfs'd system). packagedir="" if ([ "$MOUNT_POINT" = "/" ]||[ "$MOUNT_POINT" = "${ROOTMOUNTPT}" ]); then MOUNT_POINT=${ROOTMOUNTPT} else PACKAGE_DIR="/packages" fi # Finally, umount and union-umount unionctl /. --remove `resolvelink $MOUNT_POINT`$PACKAGE_DIR exec ${REALUMOUNT} $ARGS $MOUNT_POINT