From: Tails developers Date: Mon, 26 Mar 2012 17:23:56 +0000 (+0200) Subject: Make cases for all different custom mounting situations more explicit. X-Git-Tag: debian/3.0_a26-1~3 X-Git-Url: http://git.grml.org/?a=commitdiff_plain;h=d15a4009895b692ff2645e1e7041a7975c49e518;hp=d4d4f98335c3bd91192501e123694a727da85956;p=live-boot-grml.git Make cases for all different custom mounting situations more explicit. The old code had grown wild over time and was hard to follow, and consequently contained bugs (all related to linkfiles custom mounts in read-only mode) that that became obvious and were fixed solely all thanks to this re-write. --- diff --git a/scripts/live-helpers b/scripts/live-helpers index 78de240..889d157 100644 --- a/scripts/live-helpers +++ b/scripts/live-helpers @@ -1466,49 +1466,73 @@ activate_custom_mounts () # XXX: If CONFIG_AUFS_ROBR is added to the Debian kernel we can # ignore the loop below and set rofs_dest_backing=$dest - rofs_dest_backing="" - for d in ${rootmnt}/live/rofs/* - do - if [ -n "${rootmnt}" ] - then - rofs_dest_backing="${d}/$(echo ${dest} | sed -e "s|${rootmnt}||")" - else - rofs_dest_backing="${d}/${dest}" - fi - if [ -d "${rofs_dest_backing}" ] - then - break - else - rofs_dest_backing="" - fi - done + local rofs_dest_backing="" + if [ -n "${opt_linkfiles}"] + then + for d in ${rootmnt}/live/rofs/* + do + if [ -n "${rootmnt}" ] + then + rofs_dest_backing="${d}/$(echo ${dest} | sed -e "s|${rootmnt}||")" + else + rofs_dest_backing="${d}/${dest}" + fi + if [ -d "${rofs_dest_backing}" ] + then + break + else + rofs_dest_backing="" + fi + done + fi - if [ -z "${PERSISTENT_READONLY}" ] + if [ -n "${opt_linkfiles}" ] && [ -z "${PERSISTENT_READONLY}" ] then - if [ -n "${opt_linkfiles}" ] - then - links_source="${source}" - links_dest="${dest}" - elif [ -n "${opt_union}" ] + link_files ${source} ${dest} ${rootmnt} + elif [ -n "${opt_linkfiles}" ] && [ -n "${PERSISTENT_READONLY}" ] + then + mkdir -p ${rootmnt}/live/persistent + local links_source=$(mktemp -d ${rootmnt}/live/persistent/links-source-XXXXXX) + chown_ref ${source} ${links_source} + chmod_ref ${source} ${links_source} + # We put the cow dir in the below strange place to + # make it absolutely certain that the link source + # has its own directory and isn't nested with some + # other custom mount (if so that mount's files would + # be linked, causing breakage. + if [ -n "${rootmnt}" ] then - do_union ${dest} ${source} ${rofs_dest_backing} + local cow_dir="/cow/live/persistent/$(basename ${links_source})" 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}" + # This is happens if persistence is activated + # post boot + local cow_dir="/live/cow/live/persistent/$(basename ${links_source})" fi + mkdir -p ${cow_dir} + chown_ref "${source}" "${cow_dir}" + chmod_ref "${source}" "${cow_dir}" + do_union ${links_source} ${cow_dir} ${source} ${rofs_dest_backing} + link_files ${links_source} ${dest} ${rootmnt} + elif [ -n "${opt_union}" ] && [ -z "${PERSISTENT_READONLY}" ] + then + do_union ${dest} ${source} ${rofs_dest_backing} + elif [ -n "${opt_bind}" ] && [ -z "${PERSISTENT_READONLY}" ] + then + mount --bind "${source}" "${dest}" + elif [ -n "${opt_bind}" -o -n "${opt_union}" ] && [ -n "${PERSISTENT_READONLY}" ] + then + # bind-mount and union mount are handled the same + # in read-only mode, but note that rofs_dest_backing + # is non-empty (and necessary) only for unions if [ -n "${rootmnt}" ] then - cow_dir="$(echo ${dest} | sed -e "s|${rootmnt}|/cow/|")" + local cow_dir="$(echo ${dest} | sed -e "s|^${rootmnt}|/cow/|")" else - cow_dir="/live/cow/${dest}" + # This is happens if persistence is activated + # post boot + local cow_dir="/live/cow/${dest}" fi - if [ -e "${cow_dir}" ] + if [ -e "${cow_dir}" ] && [ -z "${opt_linkfiles}" ] then # If an earlier custom mount has files here # it will "block" the current mount's files @@ -1521,11 +1545,6 @@ activate_custom_mounts () 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