diff options
| author | Tails developers <amnesia@boum.org> | 2012-02-09 12:18:56 +0100 |
|---|---|---|
| committer | Daniel Baumann <daniel@debian.org> | 2012-04-01 22:08:53 +0200 |
| commit | e3ad4752eb66317c2a9c21a76ff0a1b0ac53b32f (patch) | |
| tree | 0ce9ea30345554a79ed0a646971f2dd3e4eb892a /scripts | |
| parent | aeba5c8e27d90f09701f6705de137d6129227567 (diff) | |
| download | live-boot-e3ad4752eb66317c2a9c21a76ff0a1b0ac53b32f.tar.gz live-boot-e3ad4752eb66317c2a9c21a76ff0a1b0ac53b32f.zip | |
Optionally mount custom mounts as unions.
This can potentially save a lot of space, and this type of persistence
doesn't hide changes to the read-only filesystem which can be both
good and bad.
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/live | 93 |
1 files changed, 58 insertions, 35 deletions
diff --git a/scripts/live b/scripts/live index abdc87c..fad7107 100755 --- a/scripts/live +++ b/scripts/live @@ -1564,6 +1564,34 @@ setup_unionfs () 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 @@ -1628,7 +1656,7 @@ setup_unionfs () for opt in $(echo ${options} | tr ',' ' '); do case "${opt}" in - "linkfiles") + linkfiles|union) ;; *) log_warning_msg "Skipping custom mount with unkown option: ${opt}" @@ -1677,12 +1705,16 @@ setup_unionfs () 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 @@ -1716,8 +1748,6 @@ setup_unionfs () 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 @@ -1727,18 +1757,38 @@ setup_unionfs () 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 @@ -1751,8 +1801,7 @@ setup_unionfs () fi 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} + do_union ${dest} ${cow_dir} ${source} ${rofs_dest_backing} fi if [ -n "${opt_linkfiles}" ] @@ -1771,32 +1820,6 @@ setup_unionfs () 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" |
