#!/bin/bash -e
# Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
# For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
usage() {
cat << ==usage
Usage: $(basename $0) image_path image_partitions sysroot
image_path - Destination image path name e.g., PurePhone.img
image_partitions - Path to image_partitions.map product-specific file
sysroot - product's system root e.g., build-rt1051-RelWithDebInfo/sysroot
==usage
}
if [[ ( $# -ne 3 ) ]]; then
echo "Error! Invalid argument count $# args: $*"
usage
exit 1
fi
IMAGE_NAME=$(realpath $1)
IMAGE_PARTITIONS=$(realpath $2)
SYSROOT=$(realpath $3)
if [ ! -d "$SYSROOT" ]; then
echo "Error! ${SYSROOT} is not a directory"
usage
exit 1
fi
_REQ_CMDS="sfdisk truncate mke2fs"
for cmd in $_REQ_CMDS; do
if [ ! $(command -v $cmd) ]; then
echo "Error! $cmd is not installed, please use 'sudo apt install' for install required tool"
exit 1
fi
done
source ${IMAGE_PARTITIONS}
DEVICE_BLK_SIZE=512
# Partition sizes in sector 512 units
PART1_START=1
PART2_START=$(($PART1_START + $PART1_SIZE))
PART2_SIZE=$PART1_SIZE
PART3_START=$(($PART2_START + $PART2_SIZE))
PART3_SIZE=$(($DEVICE_BLK_COUNT - $PART1_SIZE - $PART2_SIZE - $PART1_START))
# Remove previous file
echo "Removing previous image file..."
rm -f $IMAGE_NAME
# Create image file and set its length to block device size
truncate -s $(($DEVICE_BLK_COUNT * $DEVICE_BLK_SIZE)) $IMAGE_NAME
# Create image
echo "Creating empty disk image..."
sfdisk $IMAGE_NAME << ==sfdisk
label: dos
label-id: 0x09650eb4
unit: sectors
/dev/sdx1 : start= $PART1_START, size= $PART1_SIZE, type=83
/dev/sdx2 : start= $PART2_START, size= $PART2_SIZE, type=83
/dev/sdx3 : start= $PART3_START, size= $PART3_SIZE, type=83
==sfdisk
# Validate image source folder
if [ ! -d "${SYSROOT}/system_a" ]; then
echo "Fatal! Image folder 'system_a' missing in build. Check build system."
exit 1
fi
if [ ! -d "${SYSROOT}/user" ]; then
echo "Fatal! Image folder 'user' missing in build. Check build system."
exit 1
fi
cd "${SYSROOT}"
# Format partitions
# Disabling of the below options is required:
# ^64bit - 64-bit inodes are not supported by lwext4
# ^metadata_csum - metadata checksums have buggy implementation in lwext4
# Format ext4 system_a partition
echo "Formatting system_a partition as ext4..."
mke2fs \
-F \
-L 'system_a' \
-N 0 \
-E offset=$(($PART1_START*$DEVICE_BLK_SIZE)) \
-O ^64bit \
-O ^flex_bg \
-O ^metadata_csum \
-m 0 \
-r 1 \
-d 'system_a' \
-t ext4 \
"$IMAGE_NAME" \
$((($PART1_SIZE*$DEVICE_BLK_SIZE)/1024)) > /dev/null
# Format ext4 system_b partition
echo "Formatting system_b partition as ext4..."
mke2fs \
-F \
-L 'system_b' \
-N 0 \
-E offset=$(($PART2_START*$DEVICE_BLK_SIZE)) \
-O ^64bit \
-O ^flex_bg \
-O ^metadata_csum \
-m 0 \
-r 1 \
-t ext4 \
"$IMAGE_NAME" \
$((($PART2_SIZE*$DEVICE_BLK_SIZE)/1024)) > /dev/null
# Format ext4 user partition
echo "Formatting user partition as ext4..."
mke2fs \
-F \
-L 'user' \
-N 0 \
-E offset=$(($PART3_START*$DEVICE_BLK_SIZE)) \
-O ^64bit \
-O ^flex_bg \
-O ^metadata_csum \
-m 0 \
-r 1 \
-d 'user' \
-t ext4 \
"$IMAGE_NAME" \
$((($PART3_SIZE*$DEVICE_BLK_SIZE)/1024)) > /dev/null
echo "Image created!"
# Back to previous dir
cd - > /dev/null
sync