alt_mountpoint="/media"
LIVE_MEDIA_PATH="live"
-root_persistence="live-rw"
+root_overlay_label="full-ov"
+custom_overlay_label="custom-ov"
root_snapshot_label="live-sn"
home_snapshot_label="home-sn"
persistence_list="live.persist"
;;
persistent-subtext=*)
- root_persistence="${root_persistence}-${ARGUMENT#persistent-subtext=}"
- home_persistence="${home_persistence}-${ARGUMENT#persistent-subtext=}"
+ root_overlay_label="${root_overlay_label}-${ARGUMENT#persistent-subtext=}"
+ custom_overlay_label="${custom_overlay_label}-${ARGUMENT#persistent-subtext=}"
root_snapshot_label="${root_snapshot_label}-${ARGUMENT#persistent-subtext=}"
home_snapshot_label="${home_snapshot_label}-${ARGUMENT#persistent-subtext=}"
;;
# Let's just mount the read-only file systems first
rofslist=""
- if [ "${UNIONTYPE}" = "aufs" ]
- then
- roopt="rr+wh"
- noxino_opt="noxino,"
- elif [ "${UNIONTYPE}" = "unionfs-fuse" ]
- then
- roopt="RO"
- else
- roopt="ro"
- fi
-
if [ -z "${PLAIN_ROOT}" ]
then
# Read image names from ${MODULE}.module if it exists
mkdir -p /cow
- # Looking for "${root_persistence}" device or file
+ # Looking for persistent devices or files
if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ]
then
if echo ${PERSISTENT_METHOD} | grep -qe "\<overlay\>"
then
- overlays="${root_persistence}"
+ overlays="${root_overlay_label} ${custom_overlay_label}"
fi
if echo ${PERSISTENT_METHOD} | grep -qe "\<snapshot\>"
# ext2|ext3|ext4|jffs2 snapshot types.
home_snapdata="${media#*=}"
;;
- *)
+ ${root_overlay_label}=*)
+ device="${media#*=}"
+ root_overlay_device="${device}"
+ ;;
+ ${custom_overlay_label}=*)
device="${media#*=}"
overlay_devices="${overlay_devices} ${device}"
;;
esac
done
- if [ -b "${cowprobe}" ] || [ -b "${homecow}" ]
+ if [ -b "${root_overlay_device}" ]
then
PERSISTENCE_IS_ON="1"
export PERSISTENCE_IS_ON
- fi
- if [ -b "${cowprobe}" ]
- then
- cowdevice=${cowprobe}
- cow_fstype=$(get_fstype "${cowprobe}")
+ cowdevice=${root_overlay_device}
+ cow_fstype=$(get_fstype "${root_overlay_device}")
if [ -z "${PERSISTENT_READONLY}" ]
then
cow_mountopt="rw,noatime"
then
if [ -n "${PERSISTENT_READONLY}" ]
then
- persistent_root="/$(basename ${cowdevice})-backing"
- mkdir -p ${persistent_root}
+ mount -t tmpfs -o rw,noatime,mode=755 tmpfs "/cow"
+ root_backing="${rootmnt}/live/persistent/$(basename ${cowdevice})-root"
+ mkdir -p ${root_backing}
else
- persistent_root="/cow"
+ root_backing="/cow"
fi
if [ "${cow_fstype}" = "nfs" ]
then
log_begin_msg \
- "Trying nfsmount ${nfs_cow_opts} ${cowdevice} ${persistent_root}"
- nfsmount ${nfs_cow_opts} ${cowdevice} ${persistent_root} || \
- panic "Can not mount ${cowdevice} (n: ${cow_fstype}) on ${persistent_root}"
+ "Trying nfsmount ${nfs_cow_opts} ${cowdevice} ${root_backing}"
+ nfsmount ${nfs_cow_opts} ${cowdevice} ${root_backing} || \
+ panic "Can not mount ${cowdevice} (n: ${cow_fstype}) on ${root_backing}"
else
- mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} ${persistent_root} || \
- panic "Can not mount ${cowdevice} (o: ${cow_fstype}) on ${persistent_root}"
+ mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} ${root_backing} || \
+ panic "Can not mount ${cowdevice} (o: ${cow_fstype}) on ${root_backing}"
fi
fi
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
- mkdir -p /cow${dir}
-
unionmountpoint="${rootmnt}${dir}"
- unionrw="/cow${dir}"
- unionro="${rofs}${dir}"
- # We don't handle spaces and other junk gracefully here, hopefully not needed.
- case "${UNIONTYPE}" in
- unionfs-fuse)
- unionmountopts="-o cow -o noinitgroups -o default_permissions -o allow_other -o use_ino -o suid"
- unionmountopts="${unionmountopts} ${unionrw}=RW:${unionro}=RO"
- ( sysctl -w fs.file-max=391524 ; ulimit -HSn 16384
- unionfs-fuse ${unionmountopts} "${unionmountpoint}" ) && \
- ( mkdir -p /run/sendsigs.omit.d
- pidof unionfs-fuse >> /run/sendsigs.omit.d/unionfs-fuse || true )
- ;;
-
- unionmount)
- unionmountopts="-t ${cow_fstype} -o noatime,union,${cow_mountopt} ${cowdevice}"
- mount_full $unionmountopts "${unionmountpoint}"
- ;;
-
- overlayfs)
- unionmountopts="-o noatime,${noxino_opt},lowerdir=${unionro},upperdir=${unionrw}"
- mount -t ${UNIONTYPE} ${unionmountopts} ${UNIONTYPE} "${unionmountpoint}"
- ;;
-
- *)
- if [ -n "${PERSISTENT_READONLY}" ]
- then
- mount -t tmpfs -o rw,noatime,mode=755 tmpfs "${unionrw}"
- unionmountopts="-o noatime,${noxino_opt}dirs=${unionrw}=rw:${persistent_root}=${roopt}:${unionro}=${roopt}"
- else
- unionmountopts="-o noatime,${noxino_opt}dirs=${unionrw}=rw:${unionro}=${roopt}"
- fi
- mount -t ${UNIONTYPE} ${unionmountopts} ${UNIONTYPE} "${unionmountpoint}"
- ;;
- esac || \
- panic "mount ${UNIONTYPE} on ${unionmountpoint} failed with option ${unionmountopts}"
+ 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
+ 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
# Correct the permissions of /:
[ "${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
;;
*)
log_warning_msg "Skipping custom mount with unkown option: ${opt}"
- continue
+ continue 2
;;
esac
done
# that we won't hide a previous mount. We also ignore
# duplicate destinations in a more or less arbitrary way.
[ -e "${bindings}" ] && sort -k2 -sbu ${bindings} >> ${custom_mounts}
+ rm -f ${bindings}
# After all mounts are considered we add symlinks so they
# won't be hidden by some mount.
[ -e "${links}" ] && sort -k2 -sbu ${links} >> ${custom_mounts}
+ rm -f ${links}
[ "${DEBUG}" = "Yes" ] && cp ${custom_mounts} ${persistent_backing}
# Now we do the actual mounting (and symlinking)
while read source dest options # < ${custom_mounts}
do
+ local opt_linkfiles=""
+ for opt in $(echo ${options} | tr ',' ' ');
+ do
+ case "${opt}" in
+ "linkfiles")
+ opt_linkfiles="yes"
+ ;;
+ esac
+ done
+
if mountpoint -q "${dest}";
then
log_warning_msg "Skipping custom mount ${source} on ${dest}: destination is already a mount point"
# dealing with /etc or other system dir.
if [ ! -d "${source}" ]
then
- if [ -n "${PERSISTENT_READONLY}" ] || echo ${options} | grep -qe "\<linkfiles\>"
+ if [ -n "${PERSISTENT_READONLY}" ] || [ -n "${opt_linkfiles}" ]
then
continue
fi
if [ -z "${PERSISTENT_READONLY}" ]
then
- if echo ${options} | grep -qe "\<linkfiles\>";
+ if [ -n "${opt_linkfiles}" ]
then
links_source="${source}"
links_dest="${dest}"
mount --bind "${source}" "${dest}"
fi
else
- if echo ${options} | grep -qe "\<linkfiles\>";
+ if [ -n "${opt_linkfiles}" ]
then
links_dest="${dest}"
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}"
- mount -t "${UNIONTYPE}" -o "${unionmountopts}" "${UNIONTYPE}" "${dest}"
+ cow_dir="$(echo ${dest} | sed -e "s|${rootmnt}|/cow/|")"
+ mkdir -p ${cow_dir}
+ # XXX: broken! will be fixed in the next few commits...
+ do_union ${dest} ${cow_dir} ${source}
fi
- if echo $options | grep -qe "\<linkfiles\>";
+ if [ -n "${opt_linkfiles}" ]
then
link_files "${links_source}" "${links_dest}" "${rootmnt}"
fi
+
+ PERSISTENCE_IS_ON="1"
+ export PERSISTENCE_IS_ON
done < ${custom_mounts}
rm -f ${bindings}