match_files_in_dir ()
{
# Does any files match pattern ${1} ?
- local pattern="${1}"
+ local pattern
+ pattern="${1}"
if [ "$(echo ${pattern})" != "${pattern}" ]
then
is_in_list_separator_helper ()
{
- local sep=${1}
+ local sep element list
+ sep=${1}
shift
- local element=${1}
+ element=${1}
shift
- local list=${*}
+ list=${*}
echo ${list} | grep -qe "^\(.*${sep}\)\?${element}\(${sep}.*\)\?$"
}
is_in_space_sep_list ()
{
- local element=${1}
+ local element
+ element=${1}
shift
is_in_list_separator_helper "[[:space:]]" "${element}" "${*}"
}
is_in_comma_sep_list ()
{
- local element=${1}
+ local element
+ element=${1}
shift
is_in_list_separator_helper "," "${element}" "${*}"
}
what_is_mounted_on ()
{
- local dir="$(trim_path ${1})"
+ local dir
+ dir="$(trim_path ${1})"
grep -m1 "^[^ ]\+ ${dir} " /proc/mounts | cut -d' ' -f1
}
chown_ref ()
{
- local reference="${1}"
+ local reference targets owner
+ reference="${1}"
shift
- local targets=${@}
- local owner=$(stat -c %u:%g "${reference}")
+ targets=${@}
+ owner=$(stat -c %u:%g "${reference}")
chown -h ${owner} ${targets}
}
chmod_ref ()
{
- local reference="${1}"
+ local reference targets rights
+ reference="${1}"
shift
- local targets=${@}
- local rights=$(stat -c %a "${reference}")
+ targets=${@}
+ rights=$(stat -c %a "${reference}")
chmod ${rights} ${targets}
}
setup_loop ()
{
- local fspath=${1}
- local module=${2}
- local pattern=${3}
- local offset=${4}
- local encryption=${5}
- local readonly=${6}
+ local fspath module pattern offset encryption readonly
+ fspath=${1}
+ module=${2}
+ pattern=${3}
+ offset=${4}
+ encryption=${5}
+ readonly=${6}
# the output of setup_loop is evaluated in other functions,
# modprobe leaks kernel options like "libata.dma=0"
fi
}
+# Try to mount $device to the place expected by live-boot. If $device
+# is already mounted somewhere, move it to the expected place. If
+# we're only probing $device (to check if it has custom persistence)
+# $probe should be set, which suppresses warnings upon failure. On
+# success, print the mount point for $device.
mount_persistence_media ()
{
- local device=${1}
- local probe=${2}
+ local device probe backing old_backing fstype mount_opts
+ device=${1}
+ probe=${2}
- local backing="/live/persistence/$(basename ${device})"
+ backing="${rootmnt}/lib/live/mount/persistence/$(basename ${device})"
mkdir -p "${backing}"
- local old_backing="$(where_is_mounted ${device})"
+ old_backing="$(where_is_mounted ${device})"
if [ -z "${old_backing}" ]
then
- local fstype="$(get_fstype ${device})"
- local mount_opts="rw,noatime"
+ fstype="$(get_fstype ${device})"
+ mount_opts="rw,noatime"
if [ -n "${PERSISTENCE_READONLY}" ]
then
mount_opts="ro,noatime"
rmdir "${backing}"
return 1
fi
+ else
+ # This means that $device has already been mounted on
+ # the place expected by live-boot, so we're done.
+ echo ${backing}
+ return 0
fi
- return 0
}
close_persistence_media ()
{
- local device=${1}
- local backing="$(where_is_mounted ${device})"
+ local device backing
+ device=${1}
+ backing="$(where_is_mounted ${device})"
if [ -d "${backing}" ]
then
get_gpt_name ()
{
- local dev="${1}"
+ local dev
+ dev="${1}"
/sbin/blkid -s PART_ENTRY_NAME -p -o value ${dev} 2>/dev/null
}
is_gpt_device ()
{
- local dev="${1}"
+ local dev
+ dev="${1}"
[ "$(/sbin/blkid -s PART_ENTRY_SCHEME -p -o value ${dev} 2>/dev/null)" = "gpt" ]
}
probe_for_gpt_name ()
{
- local overlays="${1}"
- local dev="${2}"
+ local overlays dev gpt_dev gpt_name
+ overlays="${1}"
+ dev="${2}"
- local gpt_dev="${dev}"
+ gpt_dev="${dev}"
if is_active_luks_mapping ${dev}
then
# if $dev is an opened luks device, we need to check
return
fi
- local gpt_name=$(get_gpt_name ${gpt_dev})
+ gpt_name=$(get_gpt_name ${gpt_dev})
for label in ${overlays}
do
if [ "${gpt_name}" = "${label}" ]
probe_for_fs_label ()
{
- local overlays="${1}"
- local dev="${2}"
+ local overlays dev
+ overlays="${1}"
+ dev="${2}"
for label in ${overlays}
do
probe_for_file_name ()
{
- local overlays="${1}"
- local dev="${2}"
+ local overlays dev ret backing
+ overlays="${1}"
+ dev="${2}"
- local ret=""
- local backing="$(mount_persistence_media ${dev} probe)"
+ ret=""
+ backing="$(mount_persistence_media ${dev} probe)"
if [ -z "${backing}" ]
then
return
path=${backing}/${PERSISTENCE_PATH}${label}
if [ -f "${path}" ]
then
- local loopdev=$(setup_loop "${path}" "loop" "/sys/block/loop*")
+ local loopdev
+ loopdev=$(setup_loop "${path}" "loop" "/sys/block/loop*")
ret="${ret} ${label}=${loopdev}"
fi
done
# ${white_list_devices} is non-empty, only devices in it will be
# scanned.
- local overlays="${1}"
- local white_listed_devices="${2}"
- local ret=""
+ local overlays white_listed_devices ret black_listed_devices
+ overlays="${1}"
+ white_listed_devices="${2}"
+ ret=""
- local black_listed_devices="$(what_is_mounted_on /live/medium)"
+ black_listed_devices="$(what_is_mounted_on ${rootmnt}/lib/live/medium)"
for dev in $(storage_devices "${black_listed_devices}" "${white_listed_devices}")
do
- local result=""
+ local result luks_device
+ result=""
- local luks_device=""
+ luks_device=""
# Check if it's a luks device; we'll have to open the device
# in order to probe any filesystem it contains, like we do
# below. activate_custom_mounts() also depends on that any luks
# is non-empty, remove mask from all source paths when
# creating links (will be necessary if we change root, which
# live-boot normally does (into $rootmnt)).
+ local src_dir dest_dir src_mask
# remove multiple /:s and ensure ending on /
- local src_dir="$(trim_path ${1})/"
- local dest_dir="$(trim_path ${2})/"
- local src_mask="${3}"
+ src_dir="$(trim_path ${1})/"
+ dest_dir="$(trim_path ${2})/"
+ src_mask="${3}"
# This check can only trigger on the inital, non-recursive call since
# we create the destination before recursive calls
find "${src_dir}" -mindepth 1 -maxdepth 1 | \
while read src
do
- local dest="${dest_dir}$(basename "${src}")"
+ local dest final_src
+ dest="${dest_dir}$(basename "${src}")"
if [ -d "${src}" ]
then
if [ -z "$(ls -A "${src}")" ]
fi
link_files "${src}" "${dest}" "${src_mask}"
else
- local final_src=${src}
+ final_src=${src}
if [ -n "${src_mask}" ]
then
final_src="$(echo ${final_src} | sed "s|^${src_mask}||")"
do_union ()
{
- local unionmountpoint="${1}" # directory where the union is mounted
- local unionrw="${2}" # branch where the union changes are stored
- local unionro1="${3}" # first underlying read-only branch (optional)
- local unionro2="${4}" # second underlying read-only branch (optional)
+ local unionmountpoint unionrw unionro1 unionro2
+ unionmountpoint="${1}" # directory where the union is mounted
+ unionrw="${2}" # branch where the union changes are stored
+ unionro1="${3}" # first underlying read-only branch (optional)
+ unionro2="${4}" # second underlying read-only branch (optional)
case "${UNIONTYPE}" in
aufs)
get_custom_mounts ()
{
- # Side-effect: leaves $devices with persistence.conf mounted in /live/persistence
+ # Side-effect: leaves $devices with persistence.conf mounted in ${rootmnt}/lib/live/mount/persistence
# Side-effect: prints info to file $custom_mounts
- local custom_mounts=${1}
+ local custom_mounts devices bindings links
+ custom_mounts=${1}
shift
- local devices=${@}
+ devices=${@}
- local bindings="/tmp/bindings.list"
- local links="/tmp/links.list"
+ bindings="/tmp/bindings.list"
+ links="/tmp/links.list"
rm -rf ${bindings} ${links} 2> /dev/null
for device in ${devices}
continue
fi
- local device_name="$(basename ${device})"
- local backing=$(mount_persistence_media ${device})
+ local device_name backing include_list
+ device_name="$(basename ${device})"
+ backing=$(mount_persistence_media ${device})
if [ -z "${backing}" ]
then
continue
fi
- local include_list
if [ -r "${backing}/${persistence_list}" ]
then
include_list="${backing}/${persistence_list}"
if [ -n "${DEBUG}" ] && [ -e "${include_list}" ]
then
- cp ${include_list} /live/persistence/${persistence_list}.${device_name}
+ cp ${include_list} ${rootmnt}/lib/live/mount/persistence/${persistence_list}.${device_name}
fi
while read dir options # < ${include_list}
continue
fi
- if trim_path ${dir} | grep -q -e "^[^/]" -e "^/live\(/.*\)\?$" -e "^/\(.*/\)\?\.\.\?\(/.*\)\?$"
+ if trim_path ${dir} | grep -q -e "^[^/]" -e "^/lib" -e "^/lib/live\(/.*\)\?$" -e "^/\(.*/\)\?\.\.\?\(/.*\)\?$"
then
- log_warning_msg "Skipping unsafe custom mount ${dir}: must be an absolute path containing neither the \".\" nor \"..\" special dirs, and cannot be \"/live\" or any sub-directory therein."
+ log_warning_msg "Skipping unsafe custom mount ${dir}: must be an absolute path containing neither the \".\" nor \"..\" special dirs, and cannot be \"/lib\", or \"/lib/live\" or any of its sub-directories."
continue
fi
- local opt_source=""
- local opt_link=""
+ local opt_source opt_link source full_source full_dest
+ opt_source=""
+ opt_link=""
for opt in $(echo ${options} | tr ',' ' ');
do
case "${opt}" in
esac
done
- local source="${dir}"
+ source="${dir}"
if [ -n "${opt_source}" ]
then
if echo ${opt_source} | grep -q -e "^/" -e "^\(.*/\)\?\.\.\?\(/.*\)\?$" && [ "${opt_source}" != "." ]
fi
fi
- local full_source="$(trim_path ${backing}/${source})"
- local full_dest="$(trim_path ${rootmnt}/${dir})"
+ full_source="$(trim_path ${backing}/${source})"
+ full_dest="$(trim_path ${rootmnt}/${dir})"
if [ -n "${opt_link}" ]
then
echo "${device} ${full_source} ${full_dest} ${options}" >> ${links}
# We need to make sure that no two custom mounts have the same sources
# or are nested; if that is the case, too much weird stuff can happen.
- local prev_source="impossible source" # first iteration must not match
- local prev_dest=""
+ local prev_source prev_dest
+ prev_source="impossible source" # first iteration must not match
+ prev_dest=""
# This sort will ensure that a source /a comes right before a source
# /a/b so we only need to look at the previous source
sort -k2 -b ${custom_mounts} |
activate_custom_mounts ()
{
- local custom_mounts="${1}" # the ouput from get_custom_mounts()
- local used_devices=""
+ local custom_mounts used_devices
+ custom_mounts="${1}" # the ouput from get_custom_mounts()
+ used_devices=""
while read device source dest options # < ${custom_mounts}
do
- local opt_bind="true"
- local opt_link=""
- local opt_union=""
+ local opt_bind opt_link opt_union
+ opt_bind="true"
+ opt_link=""
+ opt_union=""
for opt in $(echo ${options} | tr ',' ' ');
do
case "${opt}" in
# XXX: If CONFIG_AUFS_ROBR is added to the Debian kernel we can
# ignore the loop below and set rootfs_dest_backing=$dest
- local rootfs_dest_backing=""
+ local rootfs_dest_backing
+ rootfs_dest_backing=""
if [ -n "${opt_link}"]
then
- for d in /live/rootfs/*
+ for d in ${rootmnt}/lib/live/mount/rootfs/*
do
if [ -n "${rootmnt}" ]
then
done
fi
+ local cow_dir links_source
if [ -n "${opt_link}" ] && [ -z "${PERSISTENCE_READONLY}" ]
then
link_files ${source} ${dest} ${rootmnt}
elif [ -n "${opt_link}" ] && [ -n "${PERSISTENCE_READONLY}" ]
then
- mkdir -p /live/persistence
- local links_source=$(mktemp -d /live/persistence/links-source-XXXXXX)
+ mkdir -p ${rootmnt}/lib/live/mount/persistence
+ links_source=$(mktemp -d ${rootmnt}/lib/live/mount/persistence/links-source-XXXXXX)
chown_ref ${source} ${links_source}
chmod_ref ${source} ${links_source}
# We put the cow dir in the below strange place to
# has its own directory and isn't nested with some
# other custom mount (if so that mount's files would
# be linked, causing breakage.
- local cow_dir="/live/overlay/live/persistence/$(basename ${links_source})"
+ cow_dir="${rootmnt}/lib/live/mount/overlay/lib/live/mount/persistence/$(basename ${links_source})"
mkdir -p ${cow_dir}
chown_ref "${source}" "${cow_dir}"
chmod_ref "${source}" "${cow_dir}"
# bind-mount and union mount are handled the same
# in read-only mode, but note that rootfs_dest_backing
# is non-empty (and necessary) only for unions
- if [ -n "${rootmnt}" ]
- then
- local cow_dir="$(echo ${dest} | sed -e "s|^${rootmnt}|/live/overlay/|")"
- else
- # This is happens if persistence is activated
- # post boot
- local cow_dir="/live/overlay/${dest}"
- fi
+ cow_dir="${rootmnt}/lib/live/mount/overlay/${dest}"
if [ -e "${cow_dir}" ] && [ -z "${opt_link}" ]
then
# If an earlier custom mount has files here
fix_backwards_compatibility ()
{
- local device=${1}
- local dir=${2}
- local opt=${3}
+ local device dir opt backing include_list
+ device=${1}
+ dir=${2}
+ opt=${3}
if [ -n "${PERSISTENCE_READONLY}" ]
then
return
fi
- local backing="$(mount_persistence_media ${device})"
+ backing="$(mount_persistence_media ${device})"
if [ -z "${backing}" ]
then
return
fi
- local include_list="${backing}/${persistence_list}"
+ include_list="${backing}/${persistence_list}"
if [ ! -r "${include_list}" ]
then
echo "# persistence backwards compatibility:
done
fi
- case "${PERSISTENCE_MEDIA}" in
- removable)
- whitelistdev="$(removable_dev)"
- ;;
-
- removable-usb)
- whitelistdev="$(removable_usb_dev)"
- ;;
+ local whitelistdev
+ whitelistdev=""
+ if [ -n "${PERSISTENCE_MEDIA}" ]
+ then
+ case "${PERSISTENCE_MEDIA}" in
+ removable)
+ whitelistdev="$(removable_dev)"
+ ;;
- *)
- whitelistdev=""
- ;;
- esac
+ removable-usb)
+ whitelistdev="$(removable_usb_dev)"
+ ;;
+ esac
+ if [ -z "${whitelistdev}" ]
+ then
+ whitelistdev="ignore_all_devices"
+ fi
+ fi
if is_in_comma_sep_list overlay ${PERSISTENCE_METHOD}
then
overlays="${old_root_overlay_label} ${old_home_overlay_label} ${custom_overlay_label}"
fi
- local overlay_devices=""
- for media in $(find_persistence_media "${overlays}" "${whitelistdev}")
- do
- media="$(echo ${media} | tr ":" " ")"
+ local overlay_devices
+ overlay_devices=""
+ if [ "${whitelistdev}" != "ignore_all_devices" ]
+ then
+ for media in $(find_persistence_media "${overlays}" "${whitelistdev}")
+ do
+ media="$(echo ${media} | tr ":" " ")"
- case ${media} in
- ${old_root_overlay_label}=*)
- device="${media#*=}"
- fix_backwards_compatibility ${device} / union
- overlay_devices="${overlay_devices} ${device}"
- ;;
+ case ${media} in
+ ${old_root_overlay_label}=*)
+ device="${media#*=}"
+ fix_backwards_compatibility ${device} / union
+ overlay_devices="${overlay_devices} ${device}"
+ ;;
- ${old_home_overlay_label}=*)
- device="${media#*=}"
- fix_backwards_compatibility ${device} /home bind
- overlay_devices="${overlay_devices} ${device}"
- ;;
+ ${old_home_overlay_label}=*)
+ device="${media#*=}"
+ fix_backwards_compatibility ${device} /home bind
+ overlay_devices="${overlay_devices} ${device}"
+ ;;
- ${custom_overlay_label}=*)
- device="${media#*=}"
- overlay_devices="${overlay_devices} ${device}"
- ;;
- esac
- done
+ ${custom_overlay_label}=*)
+ device="${media#*=}"
+ overlay_devices="${overlay_devices} ${device}"
+ ;;
+ esac
+ done
+ fi
elif [ -n "${NFS_COW}" ] && [ -z "${NOPERSISTENCE}" ]
then
# check if there are any nfs options
esac
done
+ # move all /live mountpoints that the custom persistence
+ # system depends on into /lib/live on the root filesystem
+ for _DIRECTORY in rootfs
+ do
+ if [ -d "/live/${_DIRECTORY}" ]
+ then
+ mkdir -p "${rootmnt}/lib/live/mount/${_DIRECTORY}"
+
+ for _MOUNT in $(ls /live/${_DIRECTORY})
+ do
+ mkdir -p "${rootmnt}/lib/live/mount/${_DIRECTORY}/${_MOUNT}"
+ mount -o move "/live/${_DIRECTORY}/${_MOUNT}" "${rootmnt}/lib/live/mount/${_DIRECTORY}/${_MOUNT}" > /dev/null 2>&1 || \
+ mount -o bind "/live/${_DIRECTORY}/${_MOUNT}" "${rootmnt}/lib/live/mount/${_DIRECTORY}/${_MOUNT}" || \
+ log_warning_msg "W: failed to mount /live/${_DIRECTORY}/${_MOUNT} to ${rootmnt}/lib/live/mount/${_DIRECTORY}/${_MOUNT}"
+ done
+ fi
+ done
+
+ mkdir -p "${rootmnt}/lib/live/mount/overlay"
+ mount -o move /live/overlay "${rootmnt}/lib/live/mount/overlay" > /dev/null 2>&1 || \
+ mount -o bind /live/overlay "${rootmnt}/lib/live/mount/overlay" || \
+ log_warning_msg "W: failed to mount /live/overlay to ${rootmnt}/lib/live/mount/overlay"
+
# Adding custom persistence
if [ -n "${PERSISTENCE}" ] && [ -z "${NOPERSISTENCE}" ]
then
- local custom_mounts="/tmp/custom_mounts.list"
+ local custom_mounts
+ custom_mounts="/tmp/custom_mounts.list"
rm -rf ${custom_mounts} 2> /dev/null
# Gather information about custom mounts from devies detected as overlays
get_custom_mounts ${custom_mounts} ${overlay_devices}
- [ -n "${DEBUG}" ] && cp ${custom_mounts} "/live/persistence"
+ [ -n "${DEBUG}" ] && cp ${custom_mounts} "/lib/live/mount/persistence"
# Now we do the actual mounting (and symlinking)
- local used_overlays=""
+ local used_overlays
+ used_overlays=""
used_overlays=$(activate_custom_mounts ${custom_mounts})
rm ${custom_mounts}
done
fi
- # move all mountpoints to root filesystem
- for _DIRECTORY in rootfs persistence
- do
- if [ -d "/live/${_DIRECTORY}" ]
- then
- mkdir -p "${rootmnt}/lib/live/mount/${_DIRECTORY}"
-
- for _MOUNT in $(ls /live/${_DIRECTORY})
- do
- mkdir -p "${rootmnt}/lib/live/mount/${_DIRECTORY}/${_MOUNT}"
- mount -o move "/live/${_DIRECTORY}/${_MOUNT}" "${rootmnt}/lib/live/mount/${_DIRECTORY}/${_MOUNT}" > /dev/null 2>&1 || \
- mount -o bind "/live/${_DIRECTORY}/${_MOUNT}" "${rootmnt}/lib/live/mount/${_DIRECTORY}/${_MOUNT}" || \
- log_warning_msg "W: failed to mount /live/${_DIRECTORY}/${_MOUNT} to ${rootmnt}/lib/live/mount/${_DIRECTORY}/${_MOUNT}"
- done
- fi
- done
-
- mkdir -p "${rootmnt}/lib/live/mount/overlay"
- mount -o move /live/overlay "${rootmnt}/lib/live/mount/overlay" > /dev/null 2>&1 || \
- mount -o bind /live/overlay "${rootmnt}/lib/live/mount/overlay" || \
- log_warning_msg "W: failed to mount /live/overlay to ${rootmnt}/lib/live/mount/overlay"
-
# ensure that a potentially stray tmpfs gets removed
# otherways, initramfs-tools is unable to remove /live
# and fails to boot