Skip to content

Commit

Permalink
Optionally mount custom mounts as unions.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Tails developers authored and daniel-baumann committed Apr 1, 2012
1 parent aeba5c8 commit e3ad475
Showing 1 changed file with 58 additions and 35 deletions.
93 changes: 58 additions & 35 deletions scripts/live
Expand Up @@ -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
Expand Down Expand Up @@ -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}"
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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}" ]
Expand All @@ -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"
Expand Down

0 comments on commit e3ad475

Please sign in to comment.