+
+ # 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}
+
+ [ "${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=""
+ local opt_union=""
+ for opt in $(echo ${options} | tr ',' ' ');
+ do
+ case "${opt}" in
+ linkfiles)
+ opt_linkfiles="yes"
+ ;;
+ union)
+ opt_union="yes"
+ ;;
+ esac
+ done
+
+ if mountpoint -q "${dest}";
+ then
+ log_warning_msg "Skipping custom mount ${source} on ${dest}: destination is already a mount point"
+ continue
+ fi
+
+ # FIXME: we don't handle already existing non-directory files in the paths of both $source and $dest.
+
+ if [ ! -d "${dest}" ]
+ then
+ # if ${dest} is in /home/$user, try fixing proper ownership
+ # FIXME: this should really be handled by live-config since we don't know for sure which uid a certain user has until then
+ if echo ${dest} | grep -qe "^${rootmnt}/*home/\+[^/]\+"
+ then
+ path="/"
+ for dir in $(echo ${dest} | sed -e 's|/\+| |g')
+ do
+ path=${path}/${dir}
+ if [ ! -e ${path} ]
+ then
+ mkdir -p ${path}
+ # assume that the intended user is the first, which is usually the case
+ chown 1000:1000 ${path}
+ fi
+ done
+ else
+ mkdir -p ${dest}
+ fi
+ fi
+
+ # 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
+ # dealing with /etc or other system dir.
+ if [ ! -d "${source}" ]
+ then
+ 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
+ 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
+ else
+ if [ -n "${opt_linkfiles}" ]
+ then
+ links_dest="${dest}"
+ dest="$(mktemp -d ${persistent_backing}/links_source-XXXXXX)"
+ links_source="${dest}"
+ fi
+ 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}" ]
+ then
+ link_files "${links_source}" "${links_dest}" "${rootmnt}"
+ fi
+
+ PERSISTENCE_IS_ON="1"
+ export PERSISTENCE_IS_ON
+ done < ${custom_mounts}
+ rm -f ${custom_mounts}
+
+ # Look for other snapshots to copy in
+ try_snap "${root_snapdata}" "${rootmnt}" "ROOT"
+ # This second type should be removed when snapshot grow smarter
+ try_snap "${home_snapdata}" "${rootmnt}" "HOME" "/home"