From d3e1b918deb15a4d31fc961c952f01d3b15cffd3 Mon Sep 17 00:00:00 2001 From: Braiden Vasco Date: Mon, 25 Sep 2017 16:08:16 +0000 Subject: [PATCH] Separate rootfs and image build steps --- .travis.yml | 4 +- README.md | 2 +- build.sh | 138 ++-------------------------------------------------- mkimg.sh | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++ run | 4 ++ 5 files changed, 149 insertions(+), 135 deletions(-) create mode 100644 mkimg.sh diff --git a/.travis.yml b/.travis.yml index ca692b0..97ff6e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,9 @@ before_install: - sudo apt-get update - sudo apt-get install -y bash quilt parted qemu-user-static debootstrap zerofree dosfstools libcap2-bin grep rsync -install: sudo ./run ./build.sh +install: + - sudo ./run ./build.sh + - sudo ./run ./mkimg.sh script: - ./run ./test/partition_alignment.sh diff --git a/README.md b/README.md index 721cb25..7aa50ae 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ file is `[:]`. Build ----- -Run `sudo ./run ./build.sh` to build the image. +Run `sudo ./run ./build.sh && sudo ./run ./mkimg.sh` to build the image. The following files will be created: * `rootfs/` - the root file system (`/` and `/boot/` partitions) diff --git a/build.sh b/build.sh index ca664dc..32fa49d 100644 --- a/build.sh +++ b/build.sh @@ -44,59 +44,17 @@ apply_file() { install -m "$MODE" "$SRC" "$DST" } -unmount() { - if [ -z "$1" ]; then - local DIR=$PWD - else - local DIR=$1 - fi - - while mount | grep -q "$DIR"; do - local LOCS=$(mount | grep "$DIR" | cut -f 3 -d ' ' | sort -r) - - for loc in $LOCS; do - umount "$loc" - done - done -} - -unmount_image() { - sync - sleep 1 - local LOOP_DEVICES=$(losetup -j "$1" | cut -f 1 -d ':') - - for LOOP_DEV in $LOOP_DEVICES; do - if [ -n "$LOOP_DEV" ]; then - local MOUNTED_DIR=$(mount | grep "$(basename "$LOOP_DEV")" | head -n 1 | cut -f 3 -d ' ') - - if [ -n "$MOUNTED_DIR" ] && [ "$MOUNTED_DIR" != "/" ]; then - unmount "$(dirname "$MOUNTED_DIR")" - fi - - sleep 1 - losetup -d "$LOOP_DEV" - fi - done -} - -## -# Prepare environment. -# if [ "$(id -u)" != '0' ]; then echo 'Please run as root' 1>&2 exit 1 fi -mkdir -p "$DEPLOY_DIR" -mkdir -p "$MOUNT_DIR" +if [ -d "$ROOTFS_DIR" ]; then + echo "$ROOTFS_DIR already exist" + exit 1 +fi -cd "$BASE_DIR" - -################################# -# START OF ROOT FS BUILD # -################################# -if [ ! -d "$ROOTFS_DIR" ]; then -################################# +mkdir "$ROOTFS_DIR" ## # Bootstrap a basic Debian system. @@ -300,89 +258,3 @@ rm -f "$ROOTFS_DIR/usr/sbin/policy-rc.d" # Clean Apt cache. # rm -rf "$ROOTFS_DIR/var/cache/apt/archives/*" - -######################## -fi -######################## -# END OF ROOT FS BUILD # -######################## - -## -# Prepare image file systems. -# -rm -f "$IMG_FILE" - -BOOT_SIZE=$(du --apparent-size -s "$ROOTFS_DIR/boot" --block-size=1 | cut -f 1) -TOTAL_SIZE=$(du --apparent-size -s "$ROOTFS_DIR" --block-size=1 | cut -f 1) - -IMG_SIZE=$((BOOT_SIZE + TOTAL_SIZE + (800 * 1024 * 1024))) - -truncate -s $IMG_SIZE "$IMG_FILE" - -fdisk -H 255 -S 63 "$IMG_FILE" < /dev/null -mkfs.ext4 -O ^huge_file $ROOT_DEV > /dev/null - -## -# Mount image file systems. -# -mkdir -p "$MOUNT_DIR" -mount -v $ROOT_DEV "$MOUNT_DIR" -t ext4 - -mkdir -p "$MOUNT_DIR/boot/" -mount -v $BOOT_DEV "$MOUNT_DIR/boot/" -t vfat - -## -# Copy root file system to image file systems. -# -rsync -aHAXx "$ROOTFS_DIR/" "$MOUNT_DIR/" - -## -# Store file system UUIDs to configuration files. -# -IMGID="$(fdisk -l "$IMG_FILE" | sed -n 's/Disk identifier: 0x\([^ ]*\)/\1/p')" - -BOOT_PARTUUID="$IMGID-01" -ROOT_PARTUUID="$IMGID-02" - -sed -i "s/PARTUUID=BOOTUUID/PARTUUID=$BOOT_PARTUUID/" "$MOUNT_DIR/etc/fstab" -sed -i "s/PARTUUID=ROOTUUID/PARTUUID=$ROOT_PARTUUID/" "$MOUNT_DIR/etc/fstab" -sed -i "s/PARTUUID=ROOTUUID/PARTUUID=$ROOT_PARTUUID/" "$MOUNT_DIR/boot/cmdline.txt" - -## -# Unmount all file systems and minimize image file for distribution. -# -ROOT_DEV=$(mount | grep "$MOUNT_DIR " | cut -f 1 -d ' ') -umount "$MOUNT_DIR/boot/" -umount "$MOUNT_DIR" -zerofree -v "$ROOT_DEV" -unmount_image "$IMG_FILE" diff --git a/mkimg.sh b/mkimg.sh new file mode 100644 index 0000000..f4c02e9 --- /dev/null +++ b/mkimg.sh @@ -0,0 +1,136 @@ +#!/bin/false + +unmount() { + if [ -z "$1" ]; then + local DIR=$PWD + else + local DIR=$1 + fi + + while mount | grep -q "$DIR"; do + local LOCS=$(mount | grep "$DIR" | cut -f 3 -d ' ' | sort -r) + + for loc in $LOCS; do + umount "$loc" + done + done +} + +unmount_image() { + sync + sleep 1 + local LOOP_DEVICES=$(losetup -j "$1" | cut -f 1 -d ':') + + for LOOP_DEV in $LOOP_DEVICES; do + if [ -n "$LOOP_DEV" ]; then + local MOUNTED_DIR=$(mount | grep "$(basename "$LOOP_DEV")" | head -n 1 | cut -f 3 -d ' ') + + if [ -n "$MOUNTED_DIR" ] && [ "$MOUNTED_DIR" != "/" ]; then + unmount "$(dirname "$MOUNTED_DIR")" + fi + + sleep 1 + losetup -d "$LOOP_DEV" + fi + done +} + +if [ "$(id -u)" != '0' ]; then + echo 'Please run as root' 1>&2 + exit 1 +fi + +if [ ! -d "$ROOTFS_DIR" ]; then + echo "$ROOTFS_DIR is not a directory" + exit 1 +fi + +if [ ! -d "$ROOTFS_DIR/boot" ]; then + echo "$ROOTFS_DIR/boot is not a directory" + exit 1 +fi + +if [ ! -d "$(dirname "$IMG_FILE")" ]; then + echo "$(dirname "$IMG_FILE") is not a directory" + exit 1 +fi + +## +# Prepare image file systems. +# +rm -f "$IMG_FILE" + +BOOT_SIZE=$(du --apparent-size -s "$ROOTFS_DIR/boot" --block-size=1 | cut -f 1) +TOTAL_SIZE=$(du --apparent-size -s "$ROOTFS_DIR" --block-size=1 | cut -f 1) + +IMG_SIZE=$((BOOT_SIZE + TOTAL_SIZE + (800 * 1024 * 1024))) + +truncate -s $IMG_SIZE "$IMG_FILE" + +fdisk -H 255 -S 63 "$IMG_FILE" < /dev/null +mkfs.ext4 -O ^huge_file $ROOT_DEV > /dev/null + +## +# Mount image file systems. +# +mkdir -p "$MOUNT_DIR" +mount -v $ROOT_DEV "$MOUNT_DIR" -t ext4 + +mkdir -p "$MOUNT_DIR/boot/" +mount -v $BOOT_DEV "$MOUNT_DIR/boot/" -t vfat + +## +# Copy root file system to image file systems. +# +rsync -aHAXx "$ROOTFS_DIR/" "$MOUNT_DIR/" + +## +# Store file system UUIDs to configuration files. +# +IMGID="$(fdisk -l "$IMG_FILE" | sed -n 's/Disk identifier: 0x\([^ ]*\)/\1/p')" + +BOOT_PARTUUID="$IMGID-01" +ROOT_PARTUUID="$IMGID-02" + +sed -i "s/PARTUUID=BOOTUUID/PARTUUID=$BOOT_PARTUUID/" "$MOUNT_DIR/etc/fstab" +sed -i "s/PARTUUID=ROOTUUID/PARTUUID=$ROOT_PARTUUID/" "$MOUNT_DIR/etc/fstab" +sed -i "s/PARTUUID=ROOTUUID/PARTUUID=$ROOT_PARTUUID/" "$MOUNT_DIR/boot/cmdline.txt" + +## +# Unmount all file systems and minimize image file for distribution. +# +ROOT_DEV=$(mount | grep "$MOUNT_DIR " | cut -f 1 -d ' ') +umount "$MOUNT_DIR/boot/" +umount "$MOUNT_DIR" +zerofree -v "$ROOT_DEV" +unmount_image "$IMG_FILE" diff --git a/run b/run index 92c9aae..95a5be6 100755 --- a/run +++ b/run @@ -55,4 +55,8 @@ dependencies_check() { dependencies_check "$BASE_DIR/depends" +cd "$BASE_DIR" + +mkdir -p "$DEPLOY_DIR" + exec bash -e $@