# Copyright 1999-2008 Gentoo Foundation; 2008 Chris Gianelloni, Andrew Gaffney
# Distributed under the GPL v2
+ 12 Nov 2008; Andrew Gaffney <agaffney@gentoo.org> defaults/initrd.scripts,
+ defaults/linuxrc:
+ Add back (modified) unionfs code in linuxrc
+
12 Nov 2008; Andrew Gaffney <agaffney@gentoo.org> gen_initramfs.sh:
Add append_fuse() and append_unionfs_fuse() functions
getdvhoff() {
echo $(( $(hexdump -n 4 -s $((316 + 12 * $2)) -e '"%i"' $1) * 512))
}
+
+setup_unionfs() {
+ local rw_dir=$1
+ local ro_dir=$2
+ if [ "${USE_UNIONFS_NORMAL}" = '1' ]
+ then
+ # Directory used for rw changes in union mount filesystem
+ UNION=/union
+ MEMORY=/memory
+ if [ -z "$UID" ]
+ then
+ CHANGES=$MEMORY/unionfs_changes/default
+ else
+ CHANGES=$MEMORY/unionfs_changes/$UID
+ fi
+
+ mkdir -p ${MEMORY}
+ mkdir -p ${UNION}
+ good_msg "Loading fuse module"
+ modprobe fuse > /dev/null 2>&1
+# if [ -n "${UNIONFS}" ]
+# then
+# CHANGESDEV=${UNIONFS}
+# good_msg "mounting $CHANGESDEV to $MEMORY for unionfs support"
+# mount -t auto $CHANGESDEV $MEMORY
+# # mount tmpfs only in the case when changes= boot parameter was
+# # empty or we were not able to mount the storage device
+# ret=$?
+# if [ "${ret}" -ne 0 ]
+# then
+# bad_msg "mount of $CHANGESDEV failed falling back to ramdisk based unionfs"
+# mount -t tmpfs tmpfs $MEMORY
+# fi
+# if [ "${CDROOT}" -eq '1' -a ! -f ${MEMORY}/livecd.unionfs ]
+# then
+# umount $MEMORY
+# bad_msg "failed to find livecd.unionfs file on $CHANGESDEV"
+# bad_msg "create a livecd.unionfs file on this device if you wish to use it for unionfs"
+# bad_msg "falling back to ramdisk based unionfs for safety"
+# mount -t tmpfs tmpfs $MEMORY
+# fi
+# else
+ good_msg "Mounting ramdisk to $MEMORY for unionfs support..."
+ mount -t tmpfs tmpfs $MEMORY
+# fi
+
+ mkdir -p $CHANGES
+# mount -t unionfs -o dirs=$CHANGES=rw unionfs ${UNION}
+ unionfs -o allow_others,allow_root,cow,noinitgroups ${rw_dir}=RW:${ro_dir} ${UNION}
+ ret=$?
+ if [ "${ret}" -ne 0 ]
+ then
+ bad_msg "Can't setup union ${UNION} in directory!"
+ USE_UNIONFS_NORMAL=0
+ fi
+ else
+ USE_UNIONFS_NORMAL=0
+ fi
+}
keymap\=*)
keymap=`parse_opt "${x}"`
;;
+ unionfs)
+ if [ ! -x /sbin/unionfs ]
+ then
+ USE_UNIONFS_NORMAL=0
+ bad_msg 'Unionctl not found: aborting use of unionfs!'
+ else
+ USE_UNIONFS_NORMAL=1
+ fi
+ ;;
+# unionfs\=*)
+# if [ ! -x /sbin/unionctl ]
+# then
+# USE_UNIONFS_NORMAL=0
+# bad_msg 'Unionctl not found: aborting use of unionfs!'
+# else
+# USE_UNIONFS_NORMAL=1
+# CMD_UNIONFS=`parse_opt "${x}"`
+# echo ${CMD_UNIONFS}|grep , >/dev/null 2>&1
+# if [ "$?" -eq '0' ]
+# then
+# UID=`echo ${CMD_UNIONFS#*,}`
+# UNIONFS=`echo ${CMD_UNIONFS%,*}`
+# else
+# UNIONFS=${CMD_UNIONFS}
+# fi
+# fi
+# ;;
esac
done
cache_cd_contents
# If encrypted, find key and mount, otherwise mount as usual
- if [ -n "${CRYPT_ROOT}" ]
+ if [ -n "${CRYPT_ROOT}" ]
then
CRYPT_ROOT_KEY="$(head -n 1 ${NEW_ROOT}/mnt/cdrom/livecd)"
CRYPT_ROOT='/dev/loop0'
fi
fi
+
+
# Unpacking additional packages from NFS mount
# This is useful for adding kernel modules to /lib
# We do this now, so that additional packages can add whereever they want.
if [ "${REAL_ROOT}" = '/dev/nfs' ]
then
- if [ -e "${CHROOT}/mnt/cdrom/add" ]
+ if [ -e "${NEW_ROOT}/mnt/cdrom/add" ]
then
- for targz in `ls ${CHROOT}/mnt/cdrom/add/*.tar.gz`
+ for targz in `ls ${NEW_ROOT}/mnt/cdrom/add/*.tar.gz`
do
tarname=`basename ${targz}`
good_msg "Adding additional package ${tarname}"
- (cd ${CHROOT} ; /bin/tar -xzf ${targz})
+ (cd ${NEW_ROOT} ; /bin/tar -xzf ${targz})
done
fi
fi
+
+ if [ "${USE_UNIONFS_NORMAL}" = '1' ]
+ then
+ setup_unionfs ${NEW_ROOT} ${NEW_ROOT}/${FS_LOCATION}
+ CHROOT=/union
+ else
good_msg "Copying read-write image contents to tmpfs"
# Copy over stuff that should be writable
mkdir initramfs proc tmp sys 2>/dev/null
chmod 1777 tmp
+ fi
+
#UML=`cat /proc/cpuinfo|grep UML|sed -e 's|model name.*: ||'`
#if [ "${UML}" = 'UML' ]
#then
then
sleep 10
fi
+else
+ if [ "${USE_UNIONFS_NORMAL}" = '1' ]
+ then
+ mkdir /union_changes
+ mount -t tmpfs tmpfs /union_changes
+ setup_unionfs /union_changes ${NEW_ROOT}
+ mkdir -p ${UNION}/tmp/.initrd
+ fi
fi
# Execute script on the cdrom just before boot to update things if necessary