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=}"
;;
#modprobe ib_iser
modprobe iscsi_tcp
local debugopt=""
- [ "${DEBUG}" == "Yes" ] && debugopt="-d 8"
+ [ "${DEBUG}" = "Yes" ] && debugopt="-d 8"
#FIXME this name is supposed to be unique - some date + ifconfig hash?
ISCSI_INITIATORNAME="iqn.1993-08.org.debian.live:01:$(echo "${HWADDR}" | sed -e s/://g)"
export ISCSI_INITIATORNAME
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"
# Adding other custom mounts
if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ]
then
- bindings="/${persistence_list}"
- touch ${bindings}
+ bindings="/bindings.list"
+ links="/links.list"
+ custom_mounts="/custom_mounts.list"
+ rm -f ${bindings} ${links} ${custom_mounts} >/dev/null 2>&1
+ persistent_backing="${rootmnt}/live/persistent"
+
+ # First we scan all media and gather all information about custom mounts
for device in ${overlay_devices}
do
if [ ! -b "${device}" ]
then
continue
fi
- backing="/$(basename ${device})-backing"
+ device_name="$(basename ${device})"
+ backing="${persistent_backing}/${device_name}"
mkdir -p "${backing}"
device_fstype="$(get_fstype ${device})"
if [ -z "${PERSISTENT_READONLY}" ]
continue
fi
- # FIXME: debug stuff, remove me?
- [ "${DEBUG}" == "Yes" ] && cat ${include_list} >> ${rootmnt}/${bindings}-origs
- while read source dest
+ [ "${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:]]*#"
then
# skipping commented line
continue
fi
- if [ -z "${dest}" ]
+
+ if echo ${dest} | grep -qe "^[^/]"
+ then
+ options="${dest}"
+ dest="${source}"
+ elif [ -z "${dest}" ]
then
dest="${source}"
fi
- if echo ${dest} | grep -qe "^/\+$"
+
+ if echo ${dest} | grep -qe "^/\+$\|^/\+live\(/.*\)\?$"
then
- log_warning_msg "Skipping custom mount on /"
+ # mounting on / or /live could cause trouble
+ log_warning_msg "Skipping unsafe custom mount on ${dest}"
continue
fi
- # FIXME: handle case: we already have /a/b in $bindings, but now we find /a -- /a should replace /a/b in $bindings.
- # FIXME: handle case: we have /a in $bindings, now we find /a/b, so we skip /a/b
+ for opt in $(echo ${options} | tr ',' ' ');
+ do
+ case "${opt}" in
+ "linkfiles")
+ ;;
+ *)
+ log_warning_msg "Skipping custom mount with unkown option: ${opt}"
+ continue
+ ;;
+ esac
+ done
+
+ # FIXME: handle case: we already have /a/b in $bindings added from current $device, but now we find /a -- /a should replace /a/b in $bindings.
+ # FIXME: handle case: we have /a in $bindings from current $device, now we find /a/b, so we skip /a/b
# ensure that no multiple-/ occur in paths
full_source="$(echo ${backing}/${source}/ | sed -e 's|/\+|/|g')"
full_dest="$(echo ${rootmnt}/${dest}/ | sed -e 's|/\+|/|g')"
device_used="yes"
- echo "${full_source} ${full_dest}" >> ${bindings}
+ if echo ${options} | grep -qe "\<linkfiles\>";
+ then
+ echo "${full_source} ${full_dest} ${options}" >> ${links}
+ else
+ echo "${full_source} ${full_dest} ${options}" >> ${bindings}
+ fi
done < ${include_list}
if [ -z "${device_used}" ]
fi
done
- # we sort the list according to destination so we're sure that we won't hide a previous mount. we also ignore duplicate destinations in a more or less arbitrary way
- sort -k2 -sbu ${bindings} -o ${bindings}
+ # We sort the list according to destination so we're sure
+ # 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}
- # FIXME: debug stuff, remove me?
- [ "${DEBUG}" == "Yes" ] && cp ${bindings} ${rootmnt}/${bindings}-results
+ [ "${DEBUG}" = "Yes" ] && cp ${custom_mounts} ${persistent_backing}
- while read source dest
+ # Now we do the actual mounting (and symlinking)
+ while read source dest options # < ${custom_mounts}
do
if mountpoint -q "${dest}";
then
# dealing with /etc or other system dir.
if [ ! -d "${source}" ]
then
- if [ -n "${PERSISTENT_READONLY}" ]
+ if [ -n "${PERSISTENT_READONLY}" ] || echo ${options} | grep -qe "\<linkfiles\>"
then
continue
fi
if [ -z "${PERSISTENT_READONLY}" ]
then
- mount --bind "${source}" "${dest}"
+ if echo ${options} | grep -qe "\<linkfiles\>";
+ then
+ links_source="${source}"
+ links_dest="${dest}"
+ else
+ mount --bind "${source}" "${dest}"
+ fi
else
+ if echo ${options} | grep -qe "\<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}"
fi
- done < ${bindings}
- rm ${bindings}
+
+ if echo $options | grep -qe "\<linkfiles\>";
+ then
+ link_files "${links_source}" "${links_dest}" "${rootmnt}"
+ fi
+
+ PERSISTENCE_IS_ON="1"
+ export PERSISTENCE_IS_ON
+ done < ${custom_mounts}
+ rm -f ${bindings}
# Look for other snapshots to copy in
try_snap "${root_snapdata}" "${rootmnt}" "ROOT"