From 26cd138b9b530151ae57ec7d50cc3e82ccb8ce02 Mon Sep 17 00:00:00 2001 From: Drew Bonasera Date: Mon, 27 Apr 2020 06:17:07 -0400 Subject: [PATCH 01/18] More verbose and earlier errors on incompatible images --- pishrink.sh | 161 +++++++++++++++++++++++++++++----------------------- 1 file changed, 90 insertions(+), 71 deletions(-) diff --git a/pishrink.sh b/pishrink.sh index 7e308aa..5e63751 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -66,6 +66,88 @@ fi } +function set_autoexpand() { + #Make pi expand rootfs on next boot + mountdir=$(mktemp -d) + mount "$loopback" "$mountdir" + + if [ ! -d "$mountdir/etc" ]; then + info "/etc not found, autoexpand will not be enabled" + umount "$mountdir" + return + fi + + if [ "$(md5sum "$mountdir/etc/rc.local" 2>/dev/null | cut -d ' ' -f 1)" != "0542054e9ff2d2e0507ea1ffe7d4fc87" ]; then + echo "Creating new /etc/rc.local" + if [ -f "$mountdir/etc/rc.local" ]; then + mv "$mountdir/etc/rc.local" "$mountdir/etc/rc.local.bak" + fi + + #####Do not touch the following lines##### +cat <<\EOF1 > "$mountdir/etc/rc.local" +#!/bin/bash +do_expand_rootfs() { + ROOT_PART=$(mount | sed -n 's|^/dev/\(.*\) on / .*|\1|p') + + PART_NUM=${ROOT_PART#mmcblk0p} + if [ "$PART_NUM" = "$ROOT_PART" ]; then + echo "$ROOT_PART is not an SD card. Don't know how to expand" + return 0 + fi + + # Get the starting offset of the root partition + PART_START=$(parted /dev/mmcblk0 -ms unit s p | grep "^${PART_NUM}" | cut -f 2 -d: | sed 's/[^0-9]//g') + [ "$PART_START" ] || return 1 + # Return value will likely be error for fdisk as it fails to reload the + # partition table because the root fs is mounted + fdisk /dev/mmcblk0 < /etc/rc.local && +#!/bin/sh +echo "Expanding /dev/$ROOT_PART" +resize2fs /dev/$ROOT_PART +rm -f /etc/rc.local; cp -f /etc/rc.local.bak /etc/rc.local; /etc/rc.local + +EOF +reboot +exit +} +raspi_config_expand() { +/usr/bin/env raspi-config --expand-rootfs +if [[ $? != 0 ]]; then + return -1 +else + rm -f /etc/rc.local; cp -f /etc/rc.local.bak /etc/rc.local; /etc/rc.local + reboot + exit +fi +} +raspi_config_expand +echo "WARNING: Using backup expand..." +sleep 5 +do_expand_rootfs +echo "ERROR: Expanding failed..." +sleep 5 +rm -f /etc/rc.local; cp -f /etc/rc.local.bak /etc/rc.local; /etc/rc.local +exit 0 +EOF1 + #####End no touch zone##### + chmod +x "$mountdir/etc/rc.local" + fi + umount "$mountdir" +} + help() { local help read -r -d '' help << EOM @@ -189,6 +271,13 @@ partnum="$(echo "$parted_output" | tail -n 1 | cut -d ':' -f 1)" partstart="$(echo "$parted_output" | tail -n 1 | cut -d ':' -f 2 | tr -d 'B')" loopback="$(losetup -f --show -o "$partstart" "$img")" tune2fs_output="$(tune2fs -l "$loopback")" +rc=$? +if (( $rc )); then + echo "$tune2fs_output" + error $LINENO "tune2fs failed. Unable to shrink this type of image" + exit 7 +fi + currentsize="$(echo "$tune2fs_output" | grep '^Block count:' | tr -d ' ' | cut -d ':' -f 2)" blocksize="$(echo "$tune2fs_output" | grep '^Block size:' | tr -d ' ' | cut -d ':' -f 2)" @@ -196,77 +285,7 @@ logVariables $LINENO beforesize parted_output partnum partstart tune2fs_output c #Check if we should make pi expand rootfs on next boot if [ "$should_skip_autoexpand" = false ]; then - #Make pi expand rootfs on next boot - mountdir=$(mktemp -d) - mount "$loopback" "$mountdir" - - if [ "$(md5sum "$mountdir/etc/rc.local" | cut -d ' ' -f 1)" != "0542054e9ff2d2e0507ea1ffe7d4fc87" ]; then - echo "Creating new /etc/rc.local" - mv "$mountdir/etc/rc.local" "$mountdir/etc/rc.local.bak" - #####Do not touch the following lines##### - -cat <<\EOF1 > "$mountdir/etc/rc.local" -#!/bin/bash -do_expand_rootfs() { - ROOT_PART=$(mount | sed -n 's|^/dev/\(.*\) on / .*|\1|p') - - PART_NUM=${ROOT_PART#mmcblk0p} - if [ "$PART_NUM" = "$ROOT_PART" ]; then - echo "$ROOT_PART is not an SD card. Don't know how to expand" - return 0 - fi - - # Get the starting offset of the root partition - PART_START=$(parted /dev/mmcblk0 -ms unit s p | grep "^${PART_NUM}" | cut -f 2 -d: | sed 's/[^0-9]//g') - [ "$PART_START" ] || return 1 - # Return value will likely be error for fdisk as it fails to reload the - # partition table because the root fs is mounted - fdisk /dev/mmcblk0 < /etc/rc.local && -#!/bin/sh -echo "Expanding /dev/$ROOT_PART" -resize2fs /dev/$ROOT_PART -rm -f /etc/rc.local; cp -f /etc/rc.local.bak /etc/rc.local; /etc/rc.local - -EOF -reboot -exit -} -raspi_config_expand() { -/usr/bin/env raspi-config --expand-rootfs -if [[ $? != 0 ]]; then - return -1 -else - rm -f /etc/rc.local; cp -f /etc/rc.local.bak /etc/rc.local; /etc/rc.local - reboot - exit -fi -} -raspi_config_expand -echo "WARNING: Using backup expand..." -sleep 5 -do_expand_rootfs -echo "ERROR: Expanding failed..." -sleep 5 -rm -f /etc/rc.local; cp -f /etc/rc.local.bak /etc/rc.local; /etc/rc.local -exit 0 -EOF1 - #####End no touch zone##### - chmod +x "$mountdir/etc/rc.local" - fi - umount "$mountdir" + set_autoexpand else echo "Skipping autoexpanding process..." fi From c1c8a0b4a2bc61221d907d033c63e967e2e84d30 Mon Sep 17 00:00:00 2001 From: framp Date: Sat, 23 May 2020 11:11:49 +0200 Subject: [PATCH 02/18] Fixed required tools bug --- pishrink.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pishrink.sh b/pishrink.sh index 7e308aa..ce8754b 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -91,7 +91,6 @@ parallel=false verbose=false prep=false ziptool="" -required_tools="$REQUIRED_TOOLS" while getopts ":adhprsvzZ" opt; do case "${opt}" in @@ -142,7 +141,7 @@ if [[ -n $ziptool ]]; then error $LINENO "$ziptool is an unsupported ziptool." exit -17 else - if [[ $parallel == true && ziptool == "gzip" ]]; then + if [[ $parallel == true && $ziptool == "gzip" ]]; then REQUIRED_TOOLS="$REQUIRED_TOOLS pigz" else REQUIRED_TOOLS="$REQUIRED_TOOLS $ziptool" From 198e6c944f23cd911766d64b0409ddf2daa485f5 Mon Sep 17 00:00:00 2001 From: framp Date: Sat, 23 May 2020 11:40:53 +0200 Subject: [PATCH 03/18] Remove zip extension in target --- pishrink.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/pishrink.sh b/pishrink.sh index ce8754b..1e17bdd 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -160,15 +160,19 @@ done #Copy to new file if requested if [ -n "$2" ]; then - info "Copying $1 to $2..." - cp --reflink=auto --sparse=always "$1" "$2" + f="$2" + if [[ -n $ziptool && "${f##*.}" == ${ZIPEXTENSIONS[$ziptool]} ]]; then # remove zip extension if zip requested because zip tool will complain about extension + f="${f%.*}" + fi + info "Copying $1 to $f..." + cp --reflink=auto --sparse=always "$1" "$f" if (( $? != 0 )); then error $LINENO "Could not copy file..." exit -5 fi old_owner=$(stat -c %u:%g "$1") - chown "$old_owner" "$2" - img="$2" + chown "$old_owner" "$f" + img="$f" fi # cleanup at script exit From 0a45a5fdae643b28a99d85a0e7ee73f50fc09646 Mon Sep 17 00:00:00 2001 From: framp Date: Sun, 31 May 2020 21:09:51 +0200 Subject: [PATCH 04/18] Deleted ERR cleanup and added check for rc.local existance --- pishrink.sh | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/pishrink.sh b/pishrink.sh index 7e308aa..fcaf23d 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -173,7 +173,7 @@ if [ -n "$2" ]; then fi # cleanup at script exit -trap cleanup ERR EXIT +trap cleanup EXIT #Gather info info "Gathering data" @@ -200,10 +200,11 @@ if [ "$should_skip_autoexpand" = false ]; then mountdir=$(mktemp -d) mount "$loopback" "$mountdir" - if [ "$(md5sum "$mountdir/etc/rc.local" | cut -d ' ' -f 1)" != "0542054e9ff2d2e0507ea1ffe7d4fc87" ]; then + if [[ -f "$mountdir/etc/rc.local" ]] && [[ "$(md5sum "$mountdir/etc/rc.local" | cut -d ' ' -f 1)" != "0542054e9ff2d2e0507ea1ffe7d4fc87" ]]; then echo "Creating new /etc/rc.local" mv "$mountdir/etc/rc.local" "$mountdir/etc/rc.local.bak" - #####Do not touch the following lines##### + +#####Do not touch the following lines##### cat <<\EOF1 > "$mountdir/etc/rc.local" #!/bin/bash @@ -238,7 +239,10 @@ cat < /etc/rc.local && #!/bin/sh echo "Expanding /dev/$ROOT_PART" resize2fs /dev/$ROOT_PART -rm -f /etc/rc.local; cp -f /etc/rc.local.bak /etc/rc.local; /etc/rc.local +if [[ -f /etc/rc.local.bak ]]; then + cp -f /etc/rc.local.bak /etc/rc.local + /etc/rc.local +fi EOF reboot @@ -363,7 +367,7 @@ if [[ -n $ziptool ]]; then [[ $parallel == true ]] && options="${ZIP_PARALLEL_OPTIONS[$ziptool]}" [[ -v $envVarname ]] && options="${!envVarname}" # if environment variable defined use these options [[ $verbose == true ]] && options="$options -v" # add verbose flag if requested - + if [[ $parallel == true ]]; then parallel_tool="${ZIP_PARALLEL_TOOL[$ziptool]}" info "Using $parallel_tool on the shrunk image" @@ -372,7 +376,7 @@ if [[ -n $ziptool ]]; then error $LINENO "$parallel_tool failed with rc $rc" exit -18 fi - + else # sequential info "Using $ziptool on the shrunk image" if ! $ziptool ${options} $img; then From 370e88d58194c0c84f4b7cd962a8e2fdc79c602c Mon Sep 17 00:00:00 2001 From: Drew Bonasera Date: Sat, 13 Jun 2020 16:12:39 -0400 Subject: [PATCH 05/18] Fix quoting issues Closes #146 --- pishrink.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pishrink.sh b/pishrink.sh index aed71fb..d715f93 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -222,7 +222,7 @@ fi # check selected compression tool is supported and installed if [[ -n $ziptool ]]; then - if [[ ! " ${ZIPTOOLS[@]} " =~ " $ziptool " ]]; then + if [[ ! " ${ZIPTOOLS[@]} " =~ $ziptool ]]; then error $LINENO "$ziptool is an unsupported ziptool." exit -17 else @@ -246,7 +246,7 @@ done #Copy to new file if requested if [ -n "$2" ]; then f="$2" - if [[ -n $ziptool && "${f##*.}" == ${ZIPEXTENSIONS[$ziptool]} ]]; then # remove zip extension if zip requested because zip tool will complain about extension + if [[ -n $ziptool && "${f##*.}" == "${ZIPEXTENSIONS[$ziptool]}" ]]; then # remove zip extension if zip requested because zip tool will complain about extension f="${f%.*}" fi info "Copying $1 to $f..." @@ -392,7 +392,7 @@ if [[ -n $ziptool ]]; then if [[ $parallel == true ]]; then parallel_tool="${ZIP_PARALLEL_TOOL[$ziptool]}" info "Using $parallel_tool on the shrunk image" - if ! $parallel_tool ${options} "$img"; then + if ! $parallel_tool "${options}" "$img"; then rc=$? error $LINENO "$parallel_tool failed with rc $rc" exit -18 @@ -400,7 +400,7 @@ if [[ -n $ziptool ]]; then else # sequential info "Using $ziptool on the shrunk image" - if ! $ziptool ${options} $img; then + if ! $ziptool "${options}" "$img"; then rc=$? error $LINENO "$ziptool failed with rc $rc" exit -19 From 574fab3e529a3fdc27fd1e3723b78b306f4846e9 Mon Sep 17 00:00:00 2001 From: Drew Bonasera Date: Sat, 13 Jun 2020 16:19:04 -0400 Subject: [PATCH 06/18] Add partprobe as it might help some users Relates to #138 --- pishrink.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/pishrink.sh b/pishrink.sh index d715f93..2489b67 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -69,6 +69,7 @@ fi function set_autoexpand() { #Make pi expand rootfs on next boot mountdir=$(mktemp -d) + partprobe "$loopback" mount "$loopback" "$mountdir" if [ ! -d "$mountdir/etc" ]; then From 53a59cf9a004451760fb0e61a7e8310bb1a78d90 Mon Sep 17 00:00:00 2001 From: Drew Bonasera Date: Sat, 13 Jun 2020 17:10:19 -0400 Subject: [PATCH 07/18] Initial support for extended partition images :D --- pishrink.sh | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/pishrink.sh b/pishrink.sh index 2489b67..ea5c8eb 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -276,6 +276,11 @@ if (( $rc )); then fi partnum="$(echo "$parted_output" | tail -n 1 | cut -d ':' -f 1)" partstart="$(echo "$parted_output" | tail -n 1 | cut -d ':' -f 2 | tr -d 'B')" +if [ -z "$(parted -s "$img" unit B print | grep "$partstart" | grep logical)" ]; then + parttype="primary" +else + parttype="logical" +fi loopback="$(losetup -f --show -o "$partstart" "$img")" tune2fs_output="$(tune2fs -l "$loopback")" rc=$? @@ -288,11 +293,13 @@ fi currentsize="$(echo "$tune2fs_output" | grep '^Block count:' | tr -d ' ' | cut -d ':' -f 2)" blocksize="$(echo "$tune2fs_output" | grep '^Block size:' | tr -d ' ' | cut -d ':' -f 2)" -logVariables $LINENO beforesize parted_output partnum partstart tune2fs_output currentsize blocksize +logVariables $LINENO beforesize parted_output partnum partstart parttype tune2fs_output currentsize blocksize #Check if we should make pi expand rootfs on next boot -if [ "$should_skip_autoexpand" = false ]; then - set_autoexpand +if [ "$parttype" == "logical" ]; then + echo "WARNING: PiShrink does not yet support autoexpanding of this type of image" +elif [ "$should_skip_autoexpand" = false ]; then + set_autoexpand else echo "Skipping autoexpanding process..." fi @@ -357,7 +364,7 @@ if (( $rc )); then exit -13 fi -parted -s "$img" unit B mkpart primary "$partstart" "$newpartend" +parted -s "$img" unit B mkpart "$parttype" "$partstart" "$newpartend" rc=$? if (( $rc )); then error $LINENO "parted failed with rc $rc" From 66355825bd774b083057b13f6f9bae068ee53223 Mon Sep 17 00:00:00 2001 From: Drew Bonasera Date: Sun, 14 Jun 2020 18:36:41 -0400 Subject: [PATCH 08/18] Remove verbose option setting from zipping tool options Closes #147 --- pishrink.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/pishrink.sh b/pishrink.sh index ea5c8eb..b3f33a4 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -395,7 +395,6 @@ if [[ -n $ziptool ]]; then envVarname="${MYNAME^^}_${ziptool^^}" # PISHRINK_GZIP or PISHRINK_XZ environment variables allow to override all options for gzip or xz [[ $parallel == true ]] && options="${ZIP_PARALLEL_OPTIONS[$ziptool]}" [[ -v $envVarname ]] && options="${!envVarname}" # if environment variable defined use these options - [[ $verbose == true ]] && options="$options -v" # add verbose flag if requested if [[ $parallel == true ]]; then parallel_tool="${ZIP_PARALLEL_TOOL[$ziptool]}" From 2f5b275675e898d866c6d3dd7854ae9ec27ddb07 Mon Sep 17 00:00:00 2001 From: Drew Bonasera Date: Sun, 14 Jun 2020 18:39:41 -0400 Subject: [PATCH 09/18] Change error codes so shellcheck will stop yelling at me --- pishrink.sh | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/pishrink.sh b/pishrink.sh index b3f33a4..a26e828 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -62,7 +62,7 @@ if [[ $repair == true ]]; then (( $? < 4 )) && return fi error $LINENO "Filesystem recoveries failed. Giving up..." - exit -9 + exit 9 } @@ -167,7 +167,7 @@ Usage: $0 [-adhrspvzZ] imagefile.img [newimagefile.img] -d Write debug messages in a debug log file EOM echo "$help" - exit -1 + exit 1 } should_skip_autoexpand=false @@ -214,18 +214,18 @@ fi if [[ ! -f "$img" ]]; then error $LINENO "$img is not a file..." - exit -2 + exit 2 fi if (( EUID != 0 )); then error $LINENO "You need to be running as root." - exit -3 + exit 3 fi # check selected compression tool is supported and installed if [[ -n $ziptool ]]; then if [[ ! " ${ZIPTOOLS[@]} " =~ $ziptool ]]; then error $LINENO "$ziptool is an unsupported ziptool." - exit -17 + exit 17 else if [[ $parallel == true && $ziptool == "gzip" ]]; then REQUIRED_TOOLS="$REQUIRED_TOOLS pigz" @@ -240,7 +240,7 @@ for command in $REQUIRED_TOOLS; do command -v $command >/dev/null 2>&1 if (( $? != 0 )); then error $LINENO "$command is not installed." - exit -4 + exit 4 fi done @@ -254,7 +254,7 @@ if [ -n "$2" ]; then cp --reflink=auto --sparse=always "$1" "$f" if (( $? != 0 )); then error $LINENO "Could not copy file..." - exit -5 + exit 5 fi old_owner=$(stat -c %u:%g "$1") chown "$old_owner" "$f" @@ -272,7 +272,7 @@ rc=$? if (( $rc )); then error $LINENO "parted failed with rc $rc" info "Possibly invalid image. Run 'parted $img unit B print' manually to investigate" - exit -6 + exit 6 fi partnum="$(echo "$parted_output" | tail -n 1 | cut -d ':' -f 1)" partstart="$(echo "$parted_output" | tail -n 1 | cut -d ':' -f 2 | tr -d 'B')" @@ -319,13 +319,13 @@ checkFilesystem if ! minsize=$(resize2fs -P "$loopback"); then rc=$? error $LINENO "resize2fs failed with rc $rc" - exit -10 + exit 10 fi minsize=$(cut -d ':' -f 2 <<< "$minsize" | tr -d ' ') logVariables $LINENO currentsize minsize if [[ $currentsize -eq $minsize ]]; then error $LINENO "Image already shrunk to smallest size" - exit -11 + exit 11 fi #Add some free space to the end of the filesystem @@ -349,7 +349,7 @@ if (( $rc )); then mv "$mountdir/etc/rc.local.bak" "$mountdir/etc/rc.local" umount "$mountdir" losetup -d "$loopback" - exit -12 + exit 12 fi sleep 1 @@ -361,14 +361,14 @@ parted -s -a minimal "$img" rm "$partnum" rc=$? if (( $rc )); then error $LINENO "parted failed with rc $rc" - exit -13 + exit 13 fi parted -s "$img" unit B mkpart "$parttype" "$partstart" "$newpartend" rc=$? if (( $rc )); then error $LINENO "parted failed with rc $rc" - exit -14 + exit 14 fi #Truncate the file @@ -377,7 +377,7 @@ endresult=$(parted -ms "$img" unit B print free) rc=$? if (( $rc )); then error $LINENO "parted failed with rc $rc" - exit -15 + exit 15 fi endresult=$(tail -1 <<< "$endresult" | cut -d ':' -f 2 | tr -d 'B') @@ -386,7 +386,7 @@ truncate -s "$endresult" "$img" rc=$? if (( $rc )); then error $LINENO "trunate failed with rc $rc" - exit -16 + exit 16 fi # handle compression @@ -402,7 +402,7 @@ if [[ -n $ziptool ]]; then if ! $parallel_tool "${options}" "$img"; then rc=$? error $LINENO "$parallel_tool failed with rc $rc" - exit -18 + exit 18 fi else # sequential @@ -410,7 +410,7 @@ if [[ -n $ziptool ]]; then if ! $ziptool "${options}" "$img"; then rc=$? error $LINENO "$ziptool failed with rc $rc" - exit -19 + exit 19 fi fi img=$img.${ZIPEXTENSIONS[$ziptool]} From cc4ca215b4bd09c33ac8506b810d7d5ebec0e7e5 Mon Sep 17 00:00:00 2001 From: Drew Bonasera Date: Mon, 15 Jun 2020 18:41:42 -0400 Subject: [PATCH 10/18] Remove quoting that broke zip tool usage --- pishrink.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pishrink.sh b/pishrink.sh index a26e828..28e9cdf 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -399,7 +399,7 @@ if [[ -n $ziptool ]]; then if [[ $parallel == true ]]; then parallel_tool="${ZIP_PARALLEL_TOOL[$ziptool]}" info "Using $parallel_tool on the shrunk image" - if ! $parallel_tool "${options}" "$img"; then + if ! $parallel_tool ${options} "$img"; then rc=$? error $LINENO "$parallel_tool failed with rc $rc" exit 18 @@ -407,7 +407,7 @@ if [[ -n $ziptool ]]; then else # sequential info "Using $ziptool on the shrunk image" - if ! $ziptool "${options}" "$img"; then + if ! $ziptool ${options} "$img"; then rc=$? error $LINENO "$ziptool failed with rc $rc" exit 19 From 762acea7fc9ed73cce9824ed023d70b4ccf90a1d Mon Sep 17 00:00:00 2001 From: Drew Bonasera Date: Mon, 15 Jun 2020 18:56:06 -0400 Subject: [PATCH 11/18] Revert "Remove verbose option setting from zipping tool options" This reverts commit 66355825bd774b083057b13f6f9bae068ee53223. I removed a feature that was used so I'm adding it back as talked about in #147 --- pishrink.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/pishrink.sh b/pishrink.sh index 28e9cdf..6ad458d 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -395,6 +395,7 @@ if [[ -n $ziptool ]]; then envVarname="${MYNAME^^}_${ziptool^^}" # PISHRINK_GZIP or PISHRINK_XZ environment variables allow to override all options for gzip or xz [[ $parallel == true ]] && options="${ZIP_PARALLEL_OPTIONS[$ziptool]}" [[ -v $envVarname ]] && options="${!envVarname}" # if environment variable defined use these options + [[ $verbose == true ]] && options="$options -v" # add verbose flag if requested if [[ $parallel == true ]]; then parallel_tool="${ZIP_PARALLEL_TOOL[$ziptool]}" From a846e0c013470dad6a0065ebf4fb901cdeae81c1 Mon Sep 17 00:00:00 2001 From: Drew Bonasera Date: Mon, 15 Jun 2020 19:00:26 -0400 Subject: [PATCH 12/18] Fix spacing issue in usage --- pishrink.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pishrink.sh b/pishrink.sh index 6ad458d..623f736 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -158,7 +158,7 @@ help() { Usage: $0 [-adhrspvzZ] imagefile.img [newimagefile.img] -s Don't expand filesystem when image is booted the first time - -v Be verbose + -v Be verbose -r Use advanced filesystem repair option if the normal one fails -z Compress image after shrinking with gzip -Z Compress image after shrinking with xz From ad4657a0aa8d8f5984ec85d2d109f2071ad14003 Mon Sep 17 00:00:00 2001 From: Drew Bonasera Date: Wed, 17 Jun 2020 15:17:15 -0400 Subject: [PATCH 13/18] Remove NOOBS warning since we partly support it now and add VirtualBox warning --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 77e2930..38a4b72 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # PiShrink # + PiShrink is a bash script that automatically shrink a pi image that will then resize to the max size of the SD card on boot. This will make putting the image back onto the SD card faster and the shrunk images will compress better. In addition the shrinked image can be compressed with gzip and xz to create an even smaller image. Parallel compression of the image using multiple cores is supported. ## Usage ## + ``` Usage: $0 [-adhrspvzZ] imagefile.img [newimagefile.img] @@ -29,11 +31,16 @@ If you specify the `newimagefile.img` parameter, the script will make a copy of Default options for compressors can be overwritten by defining PISHRINK_GZIP or PSHRINK_XZ environment variables for gzip and xz. ## Prerequisites ## -If you are trying to shrink a [NOOBS](https://github.com/raspberrypi/noobs) image it will likely fail. This is due to [NOOBS partitioning](https://github.com/raspberrypi/noobs/wiki/NOOBS-partitioning-explained) being significantly different than Raspbian's. Hopefully PiShrink will be able to support NOOBS in the near future. + +If you are running PiShrink in VirtualBox you will likely encounter an error if you +attempt to use VirtualBox's "Shared Folder" feature. You can copy the image you wish to +shrink on to the VM from a Shared Folder, but shrinking directctly from the Shared Folder +is know to cause issues. If using Ubuntu, you will likely see an error about `e2fsck` being out of date and `metadata_csum`. The simplest fix for this is to use Ubuntu 16.10 and up, as it will save you a lot of hassle in the long run. ## Installation ## + ```bash wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh chmod +x pishrink.sh @@ -41,6 +48,7 @@ sudo mv pishrink.sh /usr/local/bin ``` ## Example ## + ```bash [user@localhost PiShrink]$ sudo pishrink.sh pi.img e2fsck 1.42.9 (28-Dec-2013) @@ -65,6 +73,7 @@ Shrunk pi.img from 30G to 3.1G ``` ## Contributing ## + If you find a bug please create an issue for it. If you would like a new feature added, you can create an issue for it but I can't promise that I will get to it. Pull requests for new features and bug fixes are more than welcome! From dfdf279278e96856ca7baa7c2fa6d923c6716e49 Mon Sep 17 00:00:00 2001 From: Drew Bonasera Date: Wed, 17 Jun 2020 15:21:29 -0400 Subject: [PATCH 14/18] Update usage info --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 38a4b72..e80200a 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,9 @@ Usage: $0 [-adhrspvzZ] imagefile.img [newimagefile.img] If you specify the `newimagefile.img` parameter, the script will make a copy of `imagefile.img` and work off that. You will need enough space to make a full copy of the image to use that option. -* `-r` will attempt to repair the filesystem if regular repairs fail +* `-s` prevents automatic filesystem expantion on the images next boot +* `-v` enables more verbose output +* `-r` will attempt to repair the filesystem using aditional options if the normal repair fails * `-z` will compress the image after shrinking using gzip. `.gz` extension will be added to the filename. * `-Z` will compress the image after shrinking using xz. `.xz` extension will be added to the filename. * `-a` will use option -f9 for pigz and option -T0 for xz and compress in parallel. From a7977b9960634825b469d0b8e952870db199c61d Mon Sep 17 00:00:00 2001 From: Terry Tsang Date: Wed, 26 Aug 2020 22:20:23 +0800 Subject: [PATCH 15/18] Fix log removal --- pishrink.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pishrink.sh b/pishrink.sh index 623f736..dbf6b09 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -308,7 +308,7 @@ if [[ $prep == true ]]; then info "Syspreping: Removing logs, apt archives, dhcp leases and ssh hostkeys" mountdir=$(mktemp -d) mount "$loopback" "$mountdir" - rm -rf "$mountdir/var/cache/apt/archives/*" "$mountdir/var/lib/dhcpcd5/*" "$mountdir/var/log/*" "$mountdir/var/tmp/*" "$mountdir/tmp/*" "$mountdir/etc/ssh/*_host_*" + rm -rvf $mountdir/var/cache/apt/archives/* $mountdir/var/lib/dhcpcd5/* $mountdir/var/log/* $mountdir/var/tmp/* $mountdir/tmp/* $mountdir/etc/ssh/*_host_* umount "$mountdir" fi From f6be7f3f50210efa9ac881dcb3d5941caaf660c0 Mon Sep 17 00:00:00 2001 From: Jonathan Lai Date: Wed, 9 Sep 2020 11:21:40 -0700 Subject: [PATCH 16/18] expantion -> expansion --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e80200a..43d07b8 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Usage: $0 [-adhrspvzZ] imagefile.img [newimagefile.img] If you specify the `newimagefile.img` parameter, the script will make a copy of `imagefile.img` and work off that. You will need enough space to make a full copy of the image to use that option. -* `-s` prevents automatic filesystem expantion on the images next boot +* `-s` prevents automatic filesystem expansion on the images next boot * `-v` enables more verbose output * `-r` will attempt to repair the filesystem using aditional options if the normal repair fails * `-z` will compress the image after shrinking using gzip. `.gz` extension will be added to the filename. From fa3c7a27406e7c0a1c7b8688e330f14a766be1ba Mon Sep 17 00:00:00 2001 From: freddii Date: Thu, 21 Jan 2021 22:57:36 +0100 Subject: [PATCH 17/18] fixed typos --- README.md | 4 ++-- pishrink.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 43d07b8..9b79397 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # PiShrink # PiShrink is a bash script that automatically shrink a pi image that will then resize to the max size of the SD card on boot. This will make putting the image back onto the SD card faster and the shrunk images will compress better. -In addition the shrinked image can be compressed with gzip and xz to create an even smaller image. Parallel compression of the image +In addition the shrunk image can be compressed with gzip and xz to create an even smaller image. Parallel compression of the image using multiple cores is supported. ## Usage ## @@ -24,7 +24,7 @@ If you specify the `newimagefile.img` parameter, the script will make a copy of * `-s` prevents automatic filesystem expansion on the images next boot * `-v` enables more verbose output -* `-r` will attempt to repair the filesystem using aditional options if the normal repair fails +* `-r` will attempt to repair the filesystem using additional options if the normal repair fails * `-z` will compress the image after shrinking using gzip. `.gz` extension will be added to the filename. * `-Z` will compress the image after shrinking using xz. `.xz` extension will be added to the filename. * `-a` will use option -f9 for pigz and option -T0 for xz and compress in parallel. diff --git a/pishrink.sh b/pishrink.sh index dbf6b09..79570b3 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -17,7 +17,7 @@ function info() { } function error() { - echo -n "$SCRIPTNAME: ERROR occured in line $1: " + echo -n "$SCRIPTNAME: ERROR occurred in line $1: " shift echo "$@" } From be00c478e08275a1d93d1d9db4c2dbe20cc817c9 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Sat, 14 Aug 2021 03:53:33 +0800 Subject: [PATCH 18/18] Force locale settings into POSIX MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In CJK (Chinese, Japanese and Korean) computing, graphic characters are traditionally classed into fullwidth. For users who use CJK locales, the colon in the output is ':', rather than ':'. The script cannot handle these characers, so forcing locale settings into English temporarily can solve this problem. --- pishrink.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pishrink.sh b/pishrink.sh index 79570b3..c7b1fb3 100755 --- a/pishrink.sh +++ b/pishrink.sh @@ -221,6 +221,14 @@ if (( EUID != 0 )); then exit 3 fi +# set locale to POSIX(English) temporarily +# these locale settings only affect the script and its sub processes + +export LANGUAGE=POSIX +export LC_ALL=POSIX +export LANG=POSIX + + # check selected compression tool is supported and installed if [[ -n $ziptool ]]; then if [[ ! " ${ZIPTOOLS[@]} " =~ $ziptool ]]; then