#!/bin/sh #set -x ROOTMOUNTPT=/media/realroot REALMOUNT=/bin/mount.busybox UNIONMOUNT=$0 INCDIRS="^/media/\|^/mnt/" DEVICE="\/dev\/" newargs="" ONESHIFTARGS='aVhvfFilnsrw' TWOSHIFTARGS="pLUtOo" IGNOREARGS='--bind --move' 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 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 "-t " $3 " -o " $4 " " $1 " " $2}' /etc/fstab | while read line; do ${UNIONMOUNT} $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, mount and union-mount if ${REALMOUNT} $ARGS $DEV_PATH $MOUNT_POINT; then if mkdir -p $MOUNT_POINT$PACKAGE_DIR; then unionctl /. --add --after ${ROOTMOUNTPT} --mode rw `resolvelink $MOUNT_POINT`$PACKAGE_DIR fi fi