then
if [ -n "${PERSISTENT_READONLY}" ]
then
- root_backing="/${rootmnt}/live/persistent/$(basename ${cowdevice})-root"
+ mount -t tmpfs -o rw,noatime,mode=755 tmpfs "/cow"
+ root_backing="${rootmnt}/live/persistent/$(basename ${cowdevice})-root"
mkdir -p ${root_backing}
else
root_backing="/cow"
rofscount=$(echo ${rofslist} |wc -w)
+ # XXX: we now ensure that there can only be one read-only filesystem. Should this be inside the EXPOSED_ROOT if?
if [ ${rofscount} -ne 1 ]
then
panic "only one RO file system supported with exposedroot: ${rofslist}"
#panic "unionmount does not support subunions (${cow_dirs})."
fi
- unionmountopts=""
- unionmountpoint=""
-
for dir in ${cow_dirs}; do
- unionrw="/cow${dir}"
- unionro="${rofs}${dir}"
unionmountpoint="${rootmnt}${dir}"
- mkdir -p ${unionrw}
+ mkdir -p ${unionmountpoint}
if [ "${UNIONTYPE}" = "unionmount" ]
then
# FIXME: handle PERSISTENT_READONLY
unionmountopts="-t ${cow_fstype} -o noatime,union,${cow_mountopt} ${cowdevice}"
mount_full $unionmountopts "${unionmountpoint}"
else
- do_union ${root_backing} ${unionrw} ${unionro} ${unionmountpoint}
+ cow_dir="/cow${dir}"
+ rofs_dir="${rofs}${dir}"
+ mkdir -p ${cow_dir}
+ if [ -n "${PERSISTENT_READONLY}" ] && [ "${cowdevice}" != "tmpfs" ]
+ then
+ #mount -t tmpfs -o rw,noatime,mode=755 tmpfs "${cow_dir}"
+ do_union ${unionmountpoint} ${cow_dir} ${root_backing} ${rofs_dir}
+ else
+ do_union ${unionmountpoint} ${cow_dir} ${rofs_dir}
+ fi
fi || panic "mount ${UNIONTYPE} on ${unionmountpoint} failed with option ${unionmountopts}"
done
mkdir -p "${rootmnt}/live"
mount -t tmpfs tmpfs ${rootmnt}/live
+ live_rofs_list=""
+ # SHOWMOUNTS is necessary for custom mounts with the union option
+ if [ -n "${SHOWMOUNTS}" ] || ( [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ] )
+ then
+ # XXX: is the for loop really necessary? rofslist can only contain one item (see above XXX about EXPOSEDROOT) and this is also assumed elsewhere above (see use of $rofs above).
+ for d in ${rofslist}
+ do
+ live_rofs="${rootmnt}/live/${d##*/}"
+ live_rofs_list="${live_rofs_list} ${live_rofs}"
+ mkdir -p "${live_rofs}"
+ case d in
+ *.dir)
+ # do nothing # mount -o bind "${d}" "${live_rofs}"
+ ;;
+ *)
+ case "${UNIONTYPE}" in
+ unionfs-fuse)
+ mount -o bind "${d}" "${live_rofs}"
+ ;;
+ *)
+ mount -o move "${d}" "${live_rofs}"
+ ;;
+ esac
+ ;;
+ esac
+ done
+ fi
+
# Adding other custom mounts
if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ]
then
[ "${DEBUG}" = "Yes" ] && cp ${include_list} ${persistent_backing}/${persistence_list}.${device_name}
while read source dest options # < ${include_list}
do
- if echo ${source} | grep -qe "^[[:space:]]*#"
+ if echo ${source} | grep -qe "^[[:space:]]*\(#.*\)\?$"
then
- # skipping commented line
+ # skipping empty or commented lines
continue
fi
for opt in $(echo ${options} | tr ',' ' ');
do
case "${opt}" in
- "linkfiles")
+ linkfiles|union)
;;
*)
log_warning_msg "Skipping custom mount with unkown option: ${opt}"
while read source dest options # < ${custom_mounts}
do
local opt_linkfiles=""
+ local opt_union=""
for opt in $(echo ${options} | tr ',' ' ');
do
case "${opt}" in
- "linkfiles")
+ linkfiles)
opt_linkfiles="yes"
;;
+ union)
+ opt_union="yes"
+ ;;
esac
done
fi
fi
- # FIXME: could we instead only save the aufs-diff in the persistent media? implications? What about when there's changes in the live image?
-
# if ${source} doesn't exist on our persistent media we
# bootstrap it with $dest from the live filesystem.
# this both makes sense and is critical if we're
if [ -n "${PERSISTENT_READONLY}" ] || [ -n "${opt_linkfiles}" ]
then
continue
+ elif [ -n "${opt_union}" ]
+ then
+ # union's don't need to be bootstrapped
+ mkdir "${source}"
+ else
+ # ensure that $dest is not copied *into* $source
+ mkdir -p "$(dirname ${source})"
+ cp -a "${dest}" "${source}"
fi
- # ensure that $dest is not copied *into* $source
- mkdir -p "$(dirname ${source})"
- cp -a "${dest}" "${source}"
fi
+ rofs_dest_backing=""
+ for d in ${live_rofs_list}
+ do
+ rofs_dest_backing="${d}/$(echo ${dest} | sed -e "s|${rootmnt}||")"
+ if [ -d "${rofs_dest_backing}" ]
+ then
+ break
+ else
+ rofs_dest_backing=""
+ fi
+ done
+
if [ -z "${PERSISTENT_READONLY}" ]
then
if [ -n "${opt_linkfiles}" ]
then
links_source="${source}"
links_dest="${dest}"
+ elif [ -n "${opt_union}" ]
+ then
+ do_union ${dest} ${source} ${rofs_dest_backing}
else
mount --bind "${source}" "${dest}"
fi
dest="$(mktemp -d ${persistent_backing}/links_source-XXXXXX)"
links_source="${dest}"
fi
- unionrw="$(echo ${dest} | sed -e "s|${rootmnt}|/cow/|")"
- mkdir -p ${unionrw}
- unionmountopts="noatime,${noxino_opt}dirs=${unionrw}=rw:${source}=${roopt}"
- do_union ${root_backing} ${unionrw} ${source} ${dest}
+ cow_dir="$(echo ${dest} | sed -e "s|${rootmnt}|/cow/|")"
+ mkdir -p ${cow_dir}
+ do_union ${dest} ${cow_dir} ${source} ${rofs_dest_backing}
fi
if [ -n "${opt_linkfiles}" ]
PERSISTENCE_IS_ON="1"
export PERSISTENCE_IS_ON
done < ${custom_mounts}
- rm -f ${bindings}
+ rm -f ${custom_mounts}
# Look for other snapshots to copy in
try_snap "${root_snapdata}" "${rootmnt}" "ROOT"
try_snap "${home_snapdata}" "${rootmnt}" "HOME" "/home"
fi
- if [ -n "${SHOWMOUNTS}" ]
- then
- for d in ${rofslist}
- do
- mkdir -p "${rootmnt}/live/${d##*/}"
-
- case d in
- *.dir)
- # do nothing # mount -o bind "${d}" "${rootmnt}/live/${d##*/}"
- ;;
-
- *)
- case "${UNIONTYPE}" in
- unionfs-fuse)
- mount -o bind "${d}" "${rootmnt}/live/${d##*/}"
- ;;
-
- *)
- mount -o move "${d}" "${rootmnt}/live/${d##*/}"
- ;;
- esac
- ;;
- esac
- done
- fi
-
# shows cow fs on /cow for use by live-snapshot
mkdir -p "${rootmnt}/live/cow"
mount -o move /cow "${rootmnt}/live/cow" >/dev/null 2>&1 || mount -o bind /cow "${rootmnt}/live/cow" || log_warning_msg "Unable to move or bind /cow to ${rootmnt}/live/cow"