From 953a40e0036df685cfd34cc39e31dcda587c9185 Mon Sep 17 00:00:00 2001 From: Charles Cross Date: Mon, 2 May 2016 12:15:13 -0700 Subject: [PATCH] Created an initial script that builds an image from a generated stage rootfs --- create-image.sh | 157 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100755 create-image.sh diff --git a/create-image.sh b/create-image.sh new file mode 100755 index 0000000..300dd03 --- /dev/null +++ b/create-image.sh @@ -0,0 +1,157 @@ +#!/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" + +mkdir -p rpi + +# 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} + +# 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."