2016-05-02 19:15:13 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
for i in "$@"
|
|
|
|
do
|
|
|
|
case $i in
|
|
|
|
# Path to the working directory from which to build the image
|
|
|
|
-p=*|--path=*)
|
|
|
|
WORKSPACE_PATH="${i#*=}"
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
|
|
|
|
# Name for image
|
|
|
|
-n=*|--name=*)
|
|
|
|
IMAGE_NAME="${i#*=}"
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
|
|
|
|
# unknown option
|
|
|
|
*)
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
if [ ${EUID} -ne 0 ]; then
|
|
|
|
echo "this tool must be run as root"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -z "$IMAGE_NAME" ]
|
|
|
|
then
|
|
|
|
echo "No image name specified, defaulting to \"raspbian\""
|
|
|
|
IMAGE_NAME="raspbian"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -z "$WORKSPACE_PATH" ]
|
|
|
|
then
|
|
|
|
echo "You must specify a workspace path. Ex) --path=./work/2016-05-02-openrov/stage3"
|
|
|
|
exit 2
|
|
|
|
fi
|
|
|
|
|
|
|
|
work_path=$(readlink -f $WORKSPACE_PATH)
|
|
|
|
|
|
|
|
if [ ! -d "$work_path" ]
|
|
|
|
then
|
|
|
|
echo "Error resolving workspace path. Does not exist: work_path=\"${work_path}\""
|
|
|
|
exit 3
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "Creating image using rootfs in: ${work_path}"
|
|
|
|
|
|
|
|
bootsize="64M"
|
|
|
|
deb_release="jessie"
|
|
|
|
|
|
|
|
# define destination folder where created image file will be stored
|
|
|
|
buildenv="${PWD}/rpi"
|
|
|
|
|
|
|
|
# Set directory of rootfs and bootfs
|
|
|
|
rootfs="${buildenv}/rootfs"
|
|
|
|
bootfs="${buildenv}/boot"
|
|
|
|
|
|
|
|
today=`date +%Y%m%d`
|
|
|
|
|
|
|
|
mkdir -p ${buildenv}
|
2016-05-02 21:15:42 +00:00
|
|
|
mkdir -p ${buildenv}/images
|
2016-05-02 19:15:13 +00:00
|
|
|
|
|
|
|
# Construct image name
|
|
|
|
image="${buildenv}/images/${IMAGE_NAME}_${deb_release}_${today}.img"
|
|
|
|
|
|
|
|
# Create a blank image file
|
|
|
|
dd if=/dev/zero of=${image} bs=1MB count=3800
|
|
|
|
|
|
|
|
# Mount it on the loop back adapter
|
|
|
|
device=`losetup -f --show ${image}`
|
|
|
|
|
|
|
|
echo "image ${image} created and mounted as ${device}"
|
|
|
|
|
|
|
|
# Set up partition descriptor
|
|
|
|
fdisk ${device} << EOF
|
|
|
|
n
|
|
|
|
p
|
|
|
|
1
|
|
|
|
|
|
|
|
+${bootsize}
|
|
|
|
t
|
|
|
|
c
|
|
|
|
n
|
|
|
|
p
|
|
|
|
2
|
|
|
|
|
|
|
|
|
|
|
|
w
|
|
|
|
EOF
|
|
|
|
|
|
|
|
|
|
|
|
if [ "${image}" != "" ]; then
|
|
|
|
# Delete the loopback device
|
|
|
|
losetup -d ${device}
|
|
|
|
|
|
|
|
# Mount the disk image
|
|
|
|
device=`kpartx -va ${image} | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1`
|
|
|
|
echo device
|
|
|
|
device="/dev/mapper/${device}"
|
|
|
|
echo device
|
|
|
|
|
|
|
|
# Get paths to boot and root partitions
|
|
|
|
bootp=${device}p1
|
|
|
|
rootp=${device}p2
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Create the filesystems
|
|
|
|
mkfs.vfat ${bootp}
|
|
|
|
mkfs.ext4 ${rootp}
|
|
|
|
|
|
|
|
# Set the path to the rootfs
|
|
|
|
mkdir -p ${rootfs}
|
|
|
|
|
|
|
|
# Mount the rootfs to the root partition
|
|
|
|
mount ${rootp} ${rootfs}
|
|
|
|
|
|
|
|
# copy
|
|
|
|
rootfs_work="${work_path}/rootfs"
|
|
|
|
rsync -a ${rootfs_work}/ ${rootfs}
|
|
|
|
|
|
|
|
# Remove the contents of the boot folder, but not the boot folder itself
|
|
|
|
rm -rf ${rootfs}/boot/*
|
|
|
|
|
|
|
|
#unmount
|
|
|
|
umount ${rootp}
|
|
|
|
|
|
|
|
sync
|
|
|
|
|
|
|
|
bootfs_work="${rootfs_work}/boot"
|
|
|
|
mkdir -p ${bootfs}
|
|
|
|
|
|
|
|
mount ${bootp} ${bootfs}
|
|
|
|
|
|
|
|
cp -R ${bootfs_work}/* ${bootfs}
|
|
|
|
|
|
|
|
umount ${bootfs}
|
|
|
|
|
|
|
|
sync
|
|
|
|
|
|
|
|
rm -rf ${rootfs}
|
|
|
|
rm -rf ${bootfs}
|
|
|
|
|
|
|
|
# Remove device mapper bindings. Avoids running out of loop devices if run repeatedly.
|
|
|
|
dmsetup remove_all
|
|
|
|
|
|
|
|
echo "finishing ${image}"
|
|
|
|
|
|
|
|
if [ "${image}" != "" ]; then
|
|
|
|
kpartx -d ${image}
|
|
|
|
echo "created image ${image}"
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "done."
|