[SCM] live-boot branch, debian-next, updated. debian/3.0_a25-1-27-g931f580
Daniel Baumann
daniel at debian.org
Sun Apr 1 20:13:45 UTC 2012
The following commit has been merged in the debian-next branch:
commit 931f580302ca3a121d3be602a49e732d5189b667
Author: Tails developers <amnesia at boum.org>
Date: Thu Feb 9 18:13:25 2012 +0100
Refactor persistent custom mounting from live into live-helpers.
This will be useful for making it possible to enable persistent during
user-space.
diff --git a/scripts/live b/scripts/live
index fad7107..6f0dc48 100755
--- a/scripts/live
+++ b/scripts/live
@@ -1566,12 +1566,13 @@ setup_unionfs ()
live_rofs_list=""
# SHOWMOUNTS is necessary for custom mounts with the union option
- if [ -n "${SHOWMOUNTS}" ] || ( [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ] )
+ # Since we may want to do custom mounts in user-space it's best to always enable SHOWMOUNTS
+ if true #[ -n "${SHOWMOUNTS}" ] || ( [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ] 1)
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="${rootmnt}/live/rofs/${d##*/}"
live_rofs_list="${live_rofs_list} ${live_rofs}"
mkdir -p "${live_rofs}"
case d in
@@ -1592,227 +1593,20 @@ setup_unionfs ()
done
fi
- # Adding other custom mounts
+ # Adding custom persistent
if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ]
then
- 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"
+ local custom_mounts="/custom_mounts.list"
+ rm -rf ${custom_mounts} 2> /dev/null
- # First we scan all media and gather all information about custom mounts
- for device in ${overlay_devices}
- do
- if [ ! -b "${device}" ]
- then
- continue
- fi
- device_name="$(basename ${device})"
- backing="${persistent_backing}/${device_name}"
- mkdir -p "${backing}"
- device_fstype="$(get_fstype ${device})"
- if [ -z "${PERSISTENT_READONLY}" ]
- then
- device_mount_opts="rw,noatime"
- else
- device_mount_opts="ro,noatime"
- fi
- device_used=""
- mount -t "${device_fstype}" -o "${device_mount_opts}" "${device}" "${backing}"
- include_list="${backing}/${persistence_list}"
- if [ ! -r "${include_list}" ]
- then
- umount "${backing}"
- rmdir "${backing}"
- continue
- fi
-
- [ "${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 empty or commented lines
- continue
- fi
+ # Gather information about custom mounts from devies detected as overlays
+ get_custom_mounts ${overlay_devices} ${custom_mounts} ${rootmnt}
- if echo ${dest} | grep -qe "^[^/]"
- then
- options="${dest}"
- dest="${source}"
- elif [ -z "${dest}" ]
- then
- dest="${source}"
- fi
-
- if echo ${dest} | grep -qe "^/\+$\|^/\+live\(/.*\)\?$"
- then
- # mounting on / or /live could cause trouble
- log_warning_msg "Skipping unsafe custom mount on ${dest}"
- continue
- fi
-
- for opt in $(echo ${options} | tr ',' ' ');
- do
- case "${opt}" in
- linkfiles|union)
- ;;
- *)
- log_warning_msg "Skipping custom mount with unkown option: ${opt}"
- continue 2
- ;;
- 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"
- 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}" ]
- then
- # this device was not used for / earlier, or custom mount point now, so it's useless
- umount "${backing}"
- rmdir "${backing}"
- 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.
- [ -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}
+ [ "${DEBUG}" = "Yes" ] && cp ${custom_mounts} "${rootmnt}/live/persistent"
# 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}
+ do_custom_mounts ${custom_mounts} ${rootmnt}
+ rm ${custom_mounts}
# Look for other snapshots to copy in
try_snap "${root_snapdata}" "${rootmnt}" "ROOT"
diff --git a/scripts/live-helpers b/scripts/live-helpers
index 37ae7d4..c1efeec 100644
--- a/scripts/live-helpers
+++ b/scripts/live-helpers
@@ -665,3 +665,256 @@ do_union () {
;;
esac
}
+
+get_custom_mounts () {
+ # Side-effect: leaves $devices with live.persist mounted in ${rootmnt}/live/persistent
+ # Side-effect: prints info to file $custom_mounts
+
+ local devices="${1}"
+ local custom_mounts="${2}" # print result to this file
+ local rootmnt="${3}" # should be set empty post-live-boot
+
+ local bindings="/bindings.list"
+ local links="/links.list"
+ rm -rf ${bindings} ${links} 2> /dev/null
+ local persistent_backing="${rootmnt}/live/persistent"
+
+ for device in ${devices}
+ do
+ if [ ! -b "${device}" ]
+ then
+ continue
+ fi
+ local device_name="$(basename ${device})"
+ local backing="${persistent_backing}/${device_name}"
+ mkdir -p "${backing}"
+ local device_fstype="$(get_fstype ${device})"
+ if [ -z "${PERSISTENT_READONLY}" ]
+ then
+ device_mount_opts="rw,noatime"
+ else
+ device_mount_opts="ro,noatime"
+ fi
+ local device_used=""
+ mount -t "${device_fstype}" -o "${device_mount_opts}" "${device}" "${backing}"
+ local include_list="${backing}/${persistence_list}"
+ if [ ! -r "${include_list}" ]
+ then
+ umount "${backing}"
+ rmdir "${backing}"
+ continue
+ fi
+
+ [ "${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 empty or commented lines
+ continue
+ fi
+
+ if echo ${dest} | grep -qe "^[^/]"
+ then
+ options="${dest}"
+ dest="${source}"
+ elif [ -z "${dest}" ]
+ then
+ dest="${source}"
+ fi
+
+ if echo ${dest} | grep -qe "^/\+$\|^/\+live\(/.*\)\?$"
+ then
+ # mounting on / or /live could cause trouble
+ log_warning_msg "Skipping unsafe custom mount on ${dest}"
+ continue
+ fi
+
+ for opt in $(echo ${options} | tr ',' ' ');
+ do
+ case "${opt}" in
+ linkfiles|union)
+ ;;
+ *)
+ log_warning_msg "Skipping custom mount with unkown option: ${opt}"
+ continue 2
+ ;;
+ 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
+ local full_source="$(echo ${backing}/${source}/ | sed -e 's|/\+|/|g')"
+ local full_dest="$(echo ${rootmnt}/${dest}/ | sed -e 's|/\+|/|g')"
+ device_used="yes"
+ 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}" ]
+ then
+ # this device was not used for / earlier, or
+ # custom mount point now, so it's useless
+ umount "${backing}"
+ rmdir "${backing}"
+ 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.
+ [ -e "${bindings}" ] && sort -k2 -sbu ${bindings} >> ${custom_mounts}
+ rm ${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 ${links}
+
+ rm -f ${bindings} ${links} 2> /dev/null
+ echo ${custom_mounts}
+}
+
+do_custom_mounts () {
+ local custom_mounts="${1}" # the ouput from get_custom_mounts()
+ local rootmnt="${2}" # should be set empty post-live-boot
+
+ 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 ${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
+
+ 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
+ if [ -n "${rootmnt}" ]
+ then
+ cow_dir="$(echo ${dest} | sed -e "s|${rootmnt}|/cow/|")"
+ else
+ cow_dir="/live/cow/${dest}"
+ fi
+ 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}
+}
--
live-boot
More information about the debian-live-changes
mailing list