## Casper helper functions, used by casper on boot and by casper-snapshot
-if [ "${BUILD_SYSTEM}" == "Ubuntu" ]; then
+if [ "${BUILD_SYSTEM}" = "Ubuntu" ]; then
MP_QUIET="-Q"
-else
+elif [ "${BUILD_SYSTEM}" = "Debian" ]; then
MP_QUIET="-q"
+else
+ MP_QUIET=""
+fi
+
+if [ ! -x "/bin/fstype" ]; then
+ # klibc not in path -> not in initramfs
+ export PATH="${PATH}:/usr/lib/klibc/bin"
fi
sys2dev() {
echo ${r}
}
+get_fstype() {
+ local FSTYPE
+ local FSSIZE
+ eval $(fstype < $1)
+ if [ "$FSTYPE" != "unknown" ]; then
+ echo $FSTYPE
+ return 0
+ fi
+ /lib/udev/vol_id -t $1 2>/dev/null
+}
+
where_is_mounted() {
device=$1
if grep -q "^$device " /proc/mounts; then
done
}
-used_fs_size ()
+fs_size ()
{
- # Returns used fs kbytes + 5% more
+ # Returns used/free fs kbytes + 5% more
# You could pass a block device as $1 or the mount point as $2
dev="${1}"
mountp="${2}"
+ used="${3}"
if [ -z "${mountp}" ]; then
mountp=$(where_is_mounted "${dev}")
if [ "$?" -gt 0 ]; then
- mountp=/mnt/tmp_fs_size
+ mountp="/mnt/tmp_fs_size"
mkdir -p "${mountp}"
mount -t $(get_fstype "${dev}") -o ro "${dev}" "${mountp}"
doumount=1
fi
fi
- size=$(du -ks ${mountp} | cut -f1)
- size=$(expr ${size} + ${size}/20 ) # FIXME: 5% more to be sure
- needed_space=$(expr ${size} * 1024)
+ if [ "${used}" = "used" ]; then
+ size=$(du -ks ${mountp} | cut -f1)
+ size=$(expr ${size} + ${size} / 20 ) # FIXME: 5% more to be sure
+ else
+ # free space
+ size="$(df -k | grep -s ${mountp} | awk '{print $4}')"
+ fi
- if [ ! -z "${doumount}" ]; then
+ if [ -n "${doumount}" ]; then
umount "${mountp}"
rmdir "${mountp}"
fi
- echo "${needed_space}"
+ echo "${size}"
}
setup_loop() {
local fspath=$1
local module=$2
local pattern=$3
+ local offset=$4
- modprobe "${MP_QUIET}" -b "$module"
+ modprobe ${MP_QUIET} -b "$module"
udevsettle
for loopdev in $pattern; do
if [ "$(cat $loopdev/size)" -eq 0 ]; then
dev=$(sys2dev "${loopdev}")
- losetup "$dev" "$fspath"
+ if [ -n "$offset" ]; then
+ losetup -o "$offset" "$dev" "$fspath"
+ else
+ losetup "$dev" "$fspath"
+ fi
echo "$dev"
return 0
fi