X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=components%2F9990-misc-helpers.sh;h=2a3e6ad2b3f2a68458d098e163d8efc54cc63818;hb=1ba79ed1eb5e2a52bdf226b0bbeaa3917f048778;hp=d85a1d1bfd6ef87b7a43bb4e2d736ae989420e36;hpb=3da00deab98dc5999f4583d05d164e2549efa6b2;p=live-boot-grml.git diff --git a/components/9990-misc-helpers.sh b/components/9990-misc-helpers.sh index d85a1d1..2a3e6ad 100755 --- a/components/9990-misc-helpers.sh +++ b/components/9990-misc-helpers.sh @@ -684,8 +684,9 @@ try_mount () } # 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) +# is already mounted somewhere, move it to the expected place. If $device +# ends with a "/" this is a directory path. +# 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 () @@ -694,6 +695,20 @@ mount_persistence_media () device=${1} probe=${2} + # get_custom_mounts() might call this with a directory path instead + # of a block device path. This means we have found sub-directory path + # underneath /lib/live/mounts/persistence, so we're done + if [ -d "${device}" ] + then + echo "${device}" + return 0 + fi + + if [ ! -b "${device}" ] + then + return 1 + fi + backing="/live/persistence/$(basename ${device})" mkdir -p "${backing}" @@ -717,15 +732,24 @@ mount_persistence_media () fi elif [ "${backing}" != "${old_backing}" ] then - if mount --move ${old_backing} ${backing} >/dev/null + if ! mount --move ${old_backing} ${backing} >/dev/null then - echo ${backing} - return 0 - else [ -z "${probe}" ] && log_warning_msg "Failed to move persistence media ${device}" rmdir "${backing}" return 1 fi + mount_opts="rw,noatime" + if [ -n "${PERSISTENCE_READONLY}" ] + then + mount_opts="ro,noatime" + fi + if ! mount -o "remount,${mount_opts}" "${backing}" >/dev/null + then + log_warning_msg "Failed to remount persistence media ${device} writable" + # Don't unmount or rmdir the new mountpoint in this case + fi + echo ${backing} + return 0 else # This means that $device has already been mounted on # the place expected by live-boot, so we're done. @@ -875,7 +899,7 @@ probe_for_file_name () for label in ${overlays} do - path=${backing}/${PERSISTENCE_PATH}${label} + path=${backing}/${PERSISTENCE_PATH}/${label} if [ -f "${path}" ] then local loopdev @@ -894,6 +918,39 @@ probe_for_file_name () fi } +probe_for_directory_name () +{ + local overlays dev ret backing + overlays="${1}" + dev="${2}" + + ret="" + backing="$(mount_persistence_media ${dev} probe)" + if [ -z "${backing}" ] + then + return + fi + + for label in ${overlays} + do + path=${backing}/${PERSISTENCE_PATH}/${label} + if [ -d "${path}" ] + then + # in this case the "device" ends with a "/" + ret="${ret} ${label}=${backing}/${PERSISTENCE_PATH}/${label%%/}/" + fi + done + + if [ -n "${ret}" ] + then + echo ${ret} + else + # unmount and remove mountpoint + umount ${backing} > /dev/null 2>&1 || true + rmdir ${backing} > /dev/null 2>&1 || true + fi +} + find_persistence_media () { # Scans devices for overlays, and returns a whitespace @@ -918,7 +975,17 @@ find_persistence_media () white_listed_devices="${2}" ret="" - black_listed_devices="$(what_is_mounted_on /live/medium) $(what_is_mounted_on /live/findiso) $(what_is_mounted_on /live/fromiso)" + # + # The devices that are hosting the actual live rootfs should not be + # used for persistence storage since otherwise you might mount a + # parent directory on top of a sub-directory of the same filesystem + # in one union together. + # + black_listed_devices="" + for d in /live/rootfs/* /live/findiso /live/fromiso + do + black_listed_devices="${black_listed_devices} $(what_is_mounted_on d)" + done for dev in $(storage_devices "${black_listed_devices}" "${white_listed_devices}") do @@ -989,6 +1056,17 @@ find_persistence_media () fi fi + # Probe for directory with matching name on mounted partition + if is_in_comma_sep_list directory ${PERSISTENCE_STORAGE} + then + result=$(probe_for_directory_name "${overlays}" ${dev}) + if [ -n "${result}" ] + then + ret="${ret} ${result}" + continue + fi + fi + # Close luks device if it isn't used if [ -z "${result}" ] && [ -n "${luks_device}" ] && is_active_luks_mapping "${luks_device}" then @@ -1250,11 +1328,6 @@ get_custom_mounts () for device in ${devices} do - if [ ! -b "${device}" ] - then - continue - fi - local device_name backing include_list device_name="$(basename ${device})" backing=$(mount_persistence_media ${device})