2007-11-14 07:55:50 -01:00
|
|
|
#!/bin/sh
|
|
|
|
|
2010-09-02 11:12:37 +00:00
|
|
|
## live-build(7) - System Build Scripts
|
2020-03-11 09:07:21 -01:00
|
|
|
## Copyright (C) 2016-2020 The Debian Live team
|
2015-01-04 18:05:39 -01:00
|
|
|
## Copyright (C) 2006-2015 Daniel Baumann <mail@daniel-baumann.ch>
|
2010-09-02 11:12:37 +00:00
|
|
|
##
|
2012-07-29 23:59:00 +00:00
|
|
|
## This program comes with ABSOLUTELY NO WARRANTY; for details see COPYING.
|
2010-09-02 11:12:37 +00:00
|
|
|
## This is free software, and you are welcome to redistribute it
|
|
|
|
## under certain conditions; see COPYING for details.
|
|
|
|
|
2011-07-21 15:00:54 +00:00
|
|
|
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.
|
2020-02-22 13:33:01 -01:00
|
|
|
if [ $(which udevadm) ]
|
2011-08-27 18:50:19 +00:00
|
|
|
then
|
2013-02-18 09:29:04 -01:00
|
|
|
udevadm settle
|
2011-08-27 18:50:19 +00:00
|
|
|
fi
|
2011-07-21 15:00:54 +00:00
|
|
|
|
|
|
|
# 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
|
|
|
|
|
2013-02-18 09:29:04 -01:00
|
|
|
${LB_LOSETUP} -d "${DEVICE}" || Lodetach "${DEVICE}" "$(expr ${ATTEMPT} + 1)"
|
2011-07-21 15:00:54 +00:00
|
|
|
}
|
2007-11-14 07:55:50 -01:00
|
|
|
|
|
|
|
Losetup ()
|
|
|
|
{
|
|
|
|
DEVICE="${1}"
|
|
|
|
FILE="${2}"
|
2009-07-08 16:04:38 +00:00
|
|
|
PARTITION="${3:-1}"
|
2007-11-14 07:55:50 -01:00
|
|
|
|
Pass --partscan to losetup
Recent versions of Linux, parted or some other bit of software cause
partition devices, like /dev/loop0p1 to be created when running parted
mkpart. However, these devices are not cleaned up when running
losetup -d to remove /dev/loop0 later, so they linger around and confuse
mkfs (which refuses to make a filesystem, thinking there are partitions):
mkfs.fat 4.1 (2017-01-24)
mkfs.vfat: Partitions or virtual mappings on device '/dev/loop0', not making filesystem (use -I to override)
To prevent this behaviour, pass --partscan to losetup when adding a new
partition, to clean up any lingering partitions. It seems losetup does not
accept --partscan when deleting a loop device, to clean up at that point, but
since binary_hdd mounts the partition last, there should not be any lingering
partition devices after live-build is done.
The --partscan option is available since util-linux 2.21 (released in 2012), so
it should be fairly safe to pass it unconditionally.
2017-08-29 13:04:31 +00:00
|
|
|
${LB_LOSETUP} --read-only --partscan "${DEVICE}" "${FILE}"
|
2010-09-07 13:11:20 +00:00
|
|
|
FDISK_OUT="$(${LB_FDISK} -l -u ${DEVICE} 2>&1)"
|
2011-07-21 15:00:54 +00:00
|
|
|
Lodetach "${DEVICE}"
|
2007-11-14 07:55:50 -01:00
|
|
|
|
|
|
|
LOOPDEVICE="$(echo ${DEVICE}p${PARTITION})"
|
|
|
|
|
|
|
|
if [ "${PARTITION}" = "0" ]
|
|
|
|
then
|
2008-08-11 20:28:54 +00:00
|
|
|
Echo_message "Mounting %s with offset 0" "${DEVICE}"
|
2007-11-14 07:55:50 -01:00
|
|
|
|
Pass --partscan to losetup
Recent versions of Linux, parted or some other bit of software cause
partition devices, like /dev/loop0p1 to be created when running parted
mkpart. However, these devices are not cleaned up when running
losetup -d to remove /dev/loop0 later, so they linger around and confuse
mkfs (which refuses to make a filesystem, thinking there are partitions):
mkfs.fat 4.1 (2017-01-24)
mkfs.vfat: Partitions or virtual mappings on device '/dev/loop0', not making filesystem (use -I to override)
To prevent this behaviour, pass --partscan to losetup when adding a new
partition, to clean up any lingering partitions. It seems losetup does not
accept --partscan when deleting a loop device, to clean up at that point, but
since binary_hdd mounts the partition last, there should not be any lingering
partition devices after live-build is done.
The --partscan option is available since util-linux 2.21 (released in 2012), so
it should be fairly safe to pass it unconditionally.
2017-08-29 13:04:31 +00:00
|
|
|
${LB_LOSETUP} --partscan "${DEVICE}" "${FILE}"
|
2007-11-14 07:55:50 -01:00
|
|
|
else
|
2008-03-10 23:10:59 -01:00
|
|
|
SECTORS="$(echo "$FDISK_OUT" | sed -ne "s|^$LOOPDEVICE[ *]*\([0-9]*\).*|\1|p")"
|
|
|
|
OFFSET="$(expr ${SECTORS} '*' 512)"
|
2007-11-14 07:55:50 -01:00
|
|
|
|
2008-08-11 20:28:54 +00:00
|
|
|
Echo_message "Mounting %s with offset %s" "${DEVICE}" "${OFFSET}"
|
2007-11-14 07:55:50 -01:00
|
|
|
|
Pass --partscan to losetup
Recent versions of Linux, parted or some other bit of software cause
partition devices, like /dev/loop0p1 to be created when running parted
mkpart. However, these devices are not cleaned up when running
losetup -d to remove /dev/loop0 later, so they linger around and confuse
mkfs (which refuses to make a filesystem, thinking there are partitions):
mkfs.fat 4.1 (2017-01-24)
mkfs.vfat: Partitions or virtual mappings on device '/dev/loop0', not making filesystem (use -I to override)
To prevent this behaviour, pass --partscan to losetup when adding a new
partition, to clean up any lingering partitions. It seems losetup does not
accept --partscan when deleting a loop device, to clean up at that point, but
since binary_hdd mounts the partition last, there should not be any lingering
partition devices after live-build is done.
The --partscan option is available since util-linux 2.21 (released in 2012), so
it should be fairly safe to pass it unconditionally.
2017-08-29 13:04:31 +00:00
|
|
|
${LB_LOSETUP} --partscan -o "${OFFSET}" "${DEVICE}" "${FILE}"
|
2007-11-14 07:55:50 -01:00
|
|
|
fi
|
|
|
|
}
|
2008-09-07 14:39:29 +00:00
|
|
|
|
2016-04-16 20:18:22 +00:00
|
|
|
# adapted from lib/ext2fs/mkjournal.c, default block size is 4096 bytes (/etc/mke2fs.conf).
|
|
|
|
ext2fs_default_journal_size()
|
2008-09-07 14:39:29 +00:00
|
|
|
{
|
2016-04-16 20:18:22 +00:00
|
|
|
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
|
|
|
|
}
|
2008-09-07 14:39:29 +00:00
|
|
|
|
2016-04-16 20:18:22 +00:00
|
|
|
Calculate_partition_size_without_journal ()
|
|
|
|
{
|
|
|
|
WITHOUT_JOURNAL_ORIGINAL_SIZE="${1}"
|
|
|
|
WITHOUT_JOURNAL_FILESYSTEM="${2}"
|
|
|
|
|
|
|
|
case "${WITHOUT_JOURNAL_FILESYSTEM}" in
|
2011-11-04 11:45:37 -01:00
|
|
|
ext2|ext3|ext4)
|
2013-02-21 07:04:28 -01:00
|
|
|
PERCENT="6"
|
2008-09-07 14:39:29 +00:00
|
|
|
;;
|
|
|
|
*)
|
2009-11-12 04:43:35 -01:00
|
|
|
PERCENT="3"
|
2008-09-07 14:39:29 +00:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2016-04-16 20:18:22 +00:00
|
|
|
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
|
2008-09-07 14:39:29 +00:00
|
|
|
}
|