X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=scripts%2Fboot%2F9990-misc-helpers.sh;h=82099a43c88dc7b5bfc3fbd649fdaaf6ec54d970;hb=1b6cb3d57b8cbd3f0a34fadd235d9a85bde1e7bf;hp=807d7870b22769a556811b486ce6b5f6112d117e;hpb=19ee123659d0df348287019a15cef64bac2af295;p=live-boot-grml.git diff --git a/scripts/boot/9990-misc-helpers.sh b/scripts/boot/9990-misc-helpers.sh index 807d787..82099a4 100755 --- a/scripts/boot/9990-misc-helpers.sh +++ b/scripts/boot/9990-misc-helpers.sh @@ -2,21 +2,21 @@ #set -e -is_live_path () +file_pattern_matches() { - DIRECTORY="${1}" - - if [ -d "${DIRECTORY}"/"${LIVE_MEDIA_PATH}" ] - then - for FILESYSTEM in squashfs ext2 ext3 ext4 xfs dir jffs2 - do - if [ "$(echo ${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM})" != "${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}" ] - then - return 0 - fi - done - fi + [ -e "$1" ] +} +is_live_path() +{ + DIRECTORY="${1}/${LIVE_MEDIA_PATH}" + for FILESYSTEM in squashfs ext2 ext3 ext4 xfs dir jffs + do + if file_pattern_matches "${DIRECTORY}/"*.${FILESYSTEM} + then + return 0 + fi + done return 1 } @@ -62,32 +62,13 @@ get_backing_device () esac } -match_files_in_dir () -{ - # Does any files match pattern ${1} ? - local pattern - pattern="${1}" - - if [ "$(echo ${pattern})" != "${pattern}" ] - then - return 0 - fi - - return 1 -} - mount_images_in_directory () { directory="${1}" rootmnt="${2}" mac="${3}" - if match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.squashfs" || - match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.ext2" || - match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.ext3" || - match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.ext4" || - match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.jffs2" || - match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.dir" + if is_live_path "${directory}" then [ -n "${mac}" ] && adddirectory="${directory}/${LIVE_MEDIA_PATH}/${mac}" setup_unionfs "${directory}/${LIVE_MEDIA_PATH}" "${rootmnt}" "${adddirectory}" @@ -100,16 +81,7 @@ is_nice_device () { sysfs_path="${1#/sys}" - if [ -e /lib/udev/path_id ] - then - # squeeze - PATH_ID="/lib/udev/path_id" - else - # wheezy/sid (udev >= 174) - PATH_ID="/sbin/udevadm test-builtin path_id" - fi - - if ${PATH_ID} "${sysfs_path}" | egrep -q "ID_PATH=(usb|pci-[^-]*-(ide|sas|scsi|usb|virtio)|platform-sata_mv|platform-orion-ehci|platform-mmc|platform-mxsdhci)" + if /sbin/udevadm test-builtin path_id "${sysfs_path}" | egrep -q "ID_PATH=(usb|pci-[^-]*-(ide|sas|scsi|usb|virtio)|platform-sata_mv|platform-orion-ehci|platform-mmc|platform-mxsdhci)" then return 0 elif echo "${sysfs_path}" | grep -q '^/block/vd[a-z]$' @@ -617,7 +589,7 @@ load_keymap () # Load custom keymap if [ -x /bin/loadkeys -a -r /etc/boottime.kmap.gz ] then - loadkeys /etc/boottime.kmap.gz + loadkeys --quiet /etc/boottime.kmap.gz fi } @@ -742,7 +714,7 @@ mount_persistence_media () device=${1} probe=${2} - backing="${rootmnt}/lib/live/mount/persistence/$(basename ${device})" + backing="/live/persistence/$(basename ${device})" mkdir -p "${backing}" old_backing="$(where_is_mounted ${device})" @@ -966,7 +938,7 @@ find_persistence_media () white_listed_devices="${2}" ret="" - black_listed_devices="$(what_is_mounted_on ${rootmnt}/lib/live/medium)" + black_listed_devices="$(what_is_mounted_on /live/medium) $(what_is_mounted_on /live/findiso) $(what_is_mounted_on /live/fromiso)" for dev in $(storage_devices "${black_listed_devices}" "${white_listed_devices}") do @@ -1017,6 +989,21 @@ find_persistence_media () result=$(probe_for_file_name "${overlays}" ${dev}) if [ -n "${result}" ] then + local loopdevice + loopdevice=${result##*=} + if is_in_comma_sep_list luks ${PERSISTENCE_ENCRYPTION} && is_luks_partition ${loopdevice} + then + local luksfile + luksfile="" + if luksfile=$(open_luks_device "${loopdevice}") + then + result=${result%%=*} + result="${result}=${luksfile}" + else + losetup -d $loopdevice + result="" + fi + fi ret="${ret} ${result}" continue fi @@ -1149,12 +1136,12 @@ link_files () # 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 + local src_dir dest_dir src_transform # remove multiple /:s and ensure ending on / src_dir="$(trim_path ${1})/" dest_dir="$(trim_path ${2})/" - src_mask="${3}" + src_transform="${3}" # This check can only trigger on the inital, non-recursive call since # we create the destination before recursive calls @@ -1181,12 +1168,12 @@ link_files () chown_ref "${src}" "${dest}" chmod_ref "${src}" "${dest}" fi - link_files "${src}" "${dest}" "${src_mask}" + link_files "${src}" "${dest}" "${src_transform}" else final_src=${src} - if [ -n "${src_mask}" ] + if [ -n "${src_transform}" ] then - final_src="$(echo ${final_src} | sed "s|^${src_mask}||")" + final_src="$(echo ${final_src} | sed "${src_transform}")" fi rm -rf "${dest}" 2> /dev/null ln -s "${final_src}" "${dest}" @@ -1197,11 +1184,12 @@ link_files () do_union () { - local unionmountpoint unionrw unionro1 unionro2 + local unionmountpoint unionrw unionro 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) + shift + unionrw="${1}" # branch where the union changes are stored + shift + unionro="${*}" # space separated list of read-only branches (optional) case "${UNIONTYPE}" in aufs) @@ -1225,13 +1213,12 @@ do_union () unionfs-fuse) unionmountopts="-o cow -o noinitgroups -o default_permissions -o allow_other -o use_ino -o suid" unionmountopts="${unionmountopts} ${unionrw}=${rw_opt}" - if [ -n "${unionro1}" ] - then - unionmountopts="${unionmountopts}:${unionro1}=${ro_opt}" - fi - if [ -n "${unionro2}" ] + if [ -n "${unionro}" ] then - unionmountopts="${unionmountopts}:${unionro2}=${ro_opt}" + for rofs in ${unionro} + do + unionmountopts="${unionmountopts}:${rofs}=${ro_opt}" + done fi ( sysctl -w fs.file-max=391524 ; ulimit -HSn 16384 unionfs-fuse ${unionmountopts} "${unionmountpoint}" ) && \ @@ -1240,21 +1227,27 @@ do_union () ;; overlayfs) - # XXX: can unionro2 be used? (overlayfs only handles two dirs, but perhaps they can be chained?) - # XXX: and can unionro1 be optional? i.e. can overlayfs skip lowerdir? - unionmountopts="-o noatime,lowerdir=${unionro1},upperdir=${unionrw}" + # XXX: can multiple unionro be used? (overlayfs only handles two dirs, but perhaps they can be chained?) + # XXX: and can unionro be optional? i.e. can overlayfs skip lowerdir? + if echo ${unionro} | grep -q " " + then + panic "Multiple lower filesystems are currently not supported with overlayfs (unionro = ${unionro})." + elif [ -z "${unionro}" ] + then + panic "Overlayfs needs at least one lower filesystem (read-only branch)." + fi + unionmountopts="-o noatime,lowerdir=${unionro},upperdir=${unionrw}" mount -t ${UNIONTYPE} ${unionmountopts} ${UNIONTYPE} "${unionmountpoint}" ;; *) unionmountopts="-o noatime,${noxino_opt},dirs=${unionrw}=${rw_opt}" - if [ -n "${unionro1}" ] - then - unionmountopts="${unionmountopts}:${unionro1}=${ro_opt}" - fi - if [ -n "${unionro2}" ] + if [ -n "${unionro}" ] then - unionmountopts="${unionmountopts}:${unionro2}=${ro_opt}" + for rofs in ${unionro} + do + unionmountopts="${unionmountopts}:${rofs}=${ro_opt}" + done fi mount -t ${UNIONTYPE} ${unionmountopts} ${UNIONTYPE} "${unionmountpoint}" ;; @@ -1263,7 +1256,7 @@ do_union () get_custom_mounts () { - # Side-effect: leaves $devices with persistence.conf mounted in ${rootmnt}/lib/live/mount/persistence + # Side-effect: leaves $devices with persistence.conf mounted in /live/persistence # Side-effect: prints info to file $custom_mounts local custom_mounts devices bindings links @@ -1300,9 +1293,9 @@ get_custom_mounts () continue fi - if [ -n "${DEBUG}" ] && [ -e "${include_list}" ] + if [ -n "${LIVE_BOOT_DEBUG}" ] && [ -e "${include_list}" ] then - cp ${include_list} ${rootmnt}/lib/live/mount/persistence/${persistence_list}.${device_name} + cp ${include_list} /live/persistence/${persistence_list}.${device_name} fi while read dir options # < ${include_list} @@ -1485,21 +1478,19 @@ activate_custom_mounts () # ignore the loop below and set rootfs_dest_backing=$dest local rootfs_dest_backing rootfs_dest_backing="" - if [ -n "${opt_link}"] + if [ -n "${opt_link}" ] || [ -n "${opt_union}" ] then - for d in ${rootmnt}/lib/live/mount/rootfs/* + for d in /live/rootfs/* do if [ -n "${rootmnt}" ] then - rootfs_dest_backing="${d}/$(echo ${dest} | sed -e "s|${rootmnt}||")" + fs="${d}/$(echo ${dest} | sed -e "s|${rootmnt}||")" else - rootfs_dest_backing="${d}/${dest}" + fs="${d}/${dest}" fi - if [ -d "${rootfs_dest_backing}" ] + if [ -d "${fs}" ] then - break - else - rootfs_dest_backing="" + rootfs_dest_backing="${rootfs_dest_backing} ${fs}" fi done fi @@ -1507,7 +1498,7 @@ activate_custom_mounts () local cow_dir links_source if [ -n "${opt_link}" ] && [ -z "${PERSISTENCE_READONLY}" ] then - link_files ${source} ${dest} ${rootmnt} + link_files ${source} ${dest} "s|^/live/|/lib/live/mount/|" elif [ -n "${opt_link}" ] && [ -n "${PERSISTENCE_READONLY}" ] then mkdir -p ${rootmnt}/lib/live/mount/persistence @@ -1519,12 +1510,12 @@ activate_custom_mounts () # has its own directory and isn't nested with some # other custom mount (if so that mount's files would # be linked, causing breakage. - cow_dir="${rootmnt}/lib/live/mount/overlay/lib/live/mount/persistence/$(basename ${links_source})" + cow_dir="/live/overlay/lib/live/mount/persistence/$(basename ${links_source})" mkdir -p ${cow_dir} chown_ref "${source}" "${cow_dir}" chmod_ref "${source}" "${cow_dir}" do_union ${links_source} ${cow_dir} ${source} ${rootfs_dest_backing} - link_files ${links_source} ${dest} ${rootmnt} + link_files ${links_source} ${dest} "s|^${rootmnt}||" elif [ -n "${opt_union}" ] && [ -z "${PERSISTENCE_READONLY}" ] then do_union ${dest} ${source} ${rootfs_dest_backing} @@ -1536,7 +1527,7 @@ activate_custom_mounts () # 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 - cow_dir="${rootmnt}/lib/live/mount/overlay/${dest}" + cow_dir="/live/overlay/${dest}" if [ -e "${cow_dir}" ] && [ -z "${opt_link}" ] then # If an earlier custom mount has files here @@ -1562,32 +1553,6 @@ activate_custom_mounts () echo ${used_devices} } -fix_backwards_compatibility () -{ - local device dir opt backing include_list - device=${1} - dir=${2} - opt=${3} - - if [ -n "${PERSISTENCE_READONLY}" ] - then - return - fi - - backing="$(mount_persistence_media ${device})" - if [ -z "${backing}" ] - then - return - fi - - include_list="${backing}/${persistence_list}" - if [ ! -r "${include_list}" ] && [ ! -r "${backing}/${old_persistence_list}" ] - then - echo "# persistence backwards compatibility: -${dir} ${opt},source=." > "${include_list}" - fi -} - is_mountpoint () { directory="$1"