commit ca4de5aa4e3f0846a01a7ba816de6fca9a77a04c Author: Drew Bonasera Date: Mon Apr 11 23:05:00 2016 -0400 Initial Commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..68119d2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2016 Drew Bonasera + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + diff --git a/README b/README new file mode 100644 index 0000000..1f38e4a --- /dev/null +++ b/README @@ -0,0 +1,30 @@ +# 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. +`Usage: ./pishrink imagefile.img` + +## Example ## +```bash +[user@localhost PiShrink]$ sudo ./shrink.sh pi.img +e2fsck 1.42.9 (28-Dec-2013) +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +/dev/loop1: 88262/1929536 files (0.2% non-contiguous), 842728/7717632 blocks +resize2fs 1.42.9 (28-Dec-2013) +resize2fs 1.42.9 (28-Dec-2013) +Resizing the filesystem on /dev/loop1 to 773603 (4k) blocks. +Begin pass 2 (max = 100387) +Relocating blocks XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +Begin pass 3 (max = 236) +Scanning inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +Begin pass 4 (max = 7348) +Updating inode references XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +The filesystem on /dev/loop1 is now 773603 blocks long. + +Shrunk pi.img from 30G to 3.1G +``` + +## Credits ## +Thanks to SirLagz for the code to shrink http://sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/ \ No newline at end of file diff --git a/pishrink.sh b/pishrink.sh new file mode 100755 index 0000000..6e30d58 --- /dev/null +++ b/pishrink.sh @@ -0,0 +1,57 @@ +#!/bin/bash +#Args +img=$1 + +#Usage checks +if [[ -z $img ]]; then + echo "Usage: $0 imagefile.img" + exit -1 +fi +if [[ ! -e $img ]]; then + echo "ERROR: $img is not a file..." + exit -2 +fi +if (( EUID != 0 )); then + echo "ERROR: You need to be running as root." + exit -3 +fi + +#Gather info +beforesize=`ls -lah $img | cut -d ' ' -f 5` +partinfo=`parted -m $img unit B print` +partnumber=`echo "$partinfo" | grep ext4 | awk -F: ' { print $img } '` +partstart=`echo "$partinfo" | grep ext4 | awk -F: ' { print substr($2,0,length($2)-1) } '` +loopback=`losetup -f --show -o $partstart $img` + +#Make pi expand rootfs on next boot +mountdir=`mktemp -d` +mount $loopback $mountdir +mv $mountdir/etc/rc.local $mountdir/etc/rc.expand.tmp +cat <<\EOF > $mountdir/etc/rc.local +#!/bin/sh +/usr/bin/raspi-config --expand-rootfs; mv -f /etc/rc.expand.tmp /etc/rc.local; reboot +exit 0 +EOF +chmod +x $mountdir/etc/rc.local +umount $loopback + +#Shrink filesystem +e2fsck -f $loopback +minsize=`resize2fs -P $loopback | awk -F': ' ' { print $2 } '` +minsize=`echo $minsize+20000 | bc` +resize2fs -p $loopback $minsize +sleep 1 + +#Shrink partition +losetup -d $loopback +partnewsize=`echo "$minsize * 4096" | bc` +newpartend=`echo "$partstart + $partnewsize" | bc` +part1=`parted $img rm 2` +part2=`parted $img unit B mkpart primary $partstart $newpartend` + +#Truncate the file +endresult=`parted -m $img unit B print free | tail -1 | awk -F: ' { print substr($2,0,length($2)-1) } '` +truncate -s $endresult $img +aftersize=`ls -lah $img | cut -d ' ' -f 5` + +echo "Shrunk $img from $beforesize to $aftersize" \ No newline at end of file