diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2019-02-02 10:00:00 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2019-02-02 10:00:00 +0000 |
commit | 32322960234c8ec91e0d42835a3ec5ee63305070 (patch) | |
tree | 71d79574de0193778ad6cc6c96dfd4f74fa6bbbb /system-build/functions/losetup.sh | |
parent | Initial commit. (diff) | |
download | open-infrastructure-system-tools-32322960234c8ec91e0d42835a3ec5ee63305070.tar.xz open-infrastructure-system-tools-32322960234c8ec91e0d42835a3ec5ee63305070.zip |
Adding upstream version 20190202.upstream/20190202
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'system-build/functions/losetup.sh')
-rwxr-xr-x | system-build/functions/losetup.sh | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/system-build/functions/losetup.sh b/system-build/functions/losetup.sh new file mode 100755 index 0000000..0346ff6 --- /dev/null +++ b/system-build/functions/losetup.sh @@ -0,0 +1,119 @@ +#!/bin/sh + +## live-build(7) - System Build Scripts +## Copyright (C) 2006-2015 Daniel Baumann <mail@daniel-baumann.ch> +## +## This program comes with ABSOLUTELY NO WARRANTY; for details see COPYING. +## This is free software, and you are welcome to redistribute it +## under certain conditions; see COPYING for details. + +Lodetach () +{ + DEVICE="${1}" + ATTEMPT="${2:-1}" + + if [ "${ATTEMPT}" -gt 3 ] + then + Echo_error "Failed to detach loop device '${DEVICE}'." + exit 1 + fi + + # Changes to block devices result in uevents which trigger rules which in + # turn access the loop device (ex. udisks-part-id, blkid) which can cause + # a race condition. We call 'udevadm settle' to help avoid this. + if [ -x "$(which udevadm 2>/dev/null)" ] + then + udevadm settle + fi + + # Loop back devices aren't the most reliable when it comes to writes. + # We sleep and sync for good measure - better than build failure. + sync + sleep 1 + + ${LB_LOSETUP} -d "${DEVICE}" || Lodetach "${DEVICE}" "$(expr ${ATTEMPT} + 1)" +} + +Losetup () +{ + DEVICE="${1}" + FILE="${2}" + PARTITION="${3:-1}" + + ${LB_LOSETUP} --read-only "${DEVICE}" "${FILE}" + FDISK_OUT="$(${LB_FDISK} -l -u ${DEVICE} 2>&1)" + Lodetach "${DEVICE}" + + LOOPDEVICE="$(echo ${DEVICE}p${PARTITION})" + + if [ "${PARTITION}" = "0" ] + then + Echo_message "Mounting %s with offset 0" "${DEVICE}" + + ${LB_LOSETUP} "${DEVICE}" "${FILE}" + else + SECTORS="$(echo "$FDISK_OUT" | sed -ne "s|^$LOOPDEVICE[ *]*\([0-9]*\).*|\1|p")" + OFFSET="$(expr ${SECTORS} '*' 512)" + + Echo_message "Mounting %s with offset %s" "${DEVICE}" "${OFFSET}" + + ${LB_LOSETUP} -o "${OFFSET}" "${DEVICE}" "${FILE}" + fi +} + +# adapted from lib/ext2fs/mkjournal.c, default block size is 4096 bytes (/etc/mke2fs.conf). +ext2fs_default_journal_size() +{ + SIZE="$1" + if [ "${SIZE}" -lt "8" ]; then # 2048*4096 + echo 0 + elif [ "${SIZE}" -lt "128" ]; then # 32768*4096 + echo 4 + elif [ "${SIZE}" -lt "1024" ]; then # 256*1024*4096 + echo 16 + elif [ "${SIZE}" -lt "2048" ]; then # 512*1024*4096 + echo 32 + elif [ "${SIZE}" -lt "4096" ]; then # 1024*1024*4096 + echo 64 + else + echo 128 + fi +} + +Calculate_partition_size_without_journal () +{ + WITHOUT_JOURNAL_ORIGINAL_SIZE="${1}" + WITHOUT_JOURNAL_FILESYSTEM="${2}" + + case "${WITHOUT_JOURNAL_FILESYSTEM}" in + ext2|ext3|ext4) + PERCENT="6" + ;; + *) + PERCENT="3" + ;; + esac + + echo $(expr ${WITHOUT_JOURNAL_ORIGINAL_SIZE} + ${WITHOUT_JOURNAL_ORIGINAL_SIZE} \* ${PERCENT} / 100 + 1) +} + +Calculate_partition_size () +{ + ORIGINAL_SIZE="${1}" + FILESYSTEM="${2}" + + case "${FILESYSTEM}" in + ext3|ext4) + NON_JOURNAL_SIZE=$(Calculate_partition_size_without_journal ${ORIGINAL_SIZE} ${FILESYSTEM}) + PROJECTED_JOURNAL_SIZE=$(ext2fs_default_journal_size ${NON_JOURNAL_SIZE}) + PROJECTED_PARTITION_SIZE=$(expr ${ORIGINAL_SIZE} + ${PROJECTED_JOURNAL_SIZE}) + PRE_FINAL_PARTITION_SIZE=$(Calculate_partition_size_without_journal ${PROJECTED_PARTITION_SIZE} ${FILESYSTEM}) + JOURNAL_SIZE=$(ext2fs_default_journal_size ${PRE_FINAL_PARTITION_SIZE}) + + expr $(Calculate_partition_size_without_journal ${ORIGINAL_SIZE} ${FILESYSTEM}) + ${JOURNAL_SIZE} + ;; + *) + Calculate_partition_size_without_journal ${ORIGINAL_SIZE} ${FILESYSTEM} + ;; + esac +} |