PiShrink/pishrink.sh

82 lines
2.1 KiB
Bash
Raw Normal View History

2016-04-12 05:05:00 +02:00
#!/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
#Check that what we need is installed
A=`which parted 2>&1`
if (( $? != 0 )); then
echo "ERROR: parted is not installed."
exit -4
fi
A=`which bc 2>&1`
if (( $? != 0 )); then
echo "ERROR: bc is not installed."
exit -5
fi
2016-04-12 05:05:00 +02:00
#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
if [ `md5sum $mountdir/etc/rc.local | cut -d ' ' -f 1` != "a27a4d8192ea6ba713d2ddd15a55b1df" ]; then
echo Creating new /etc/rc.local
mv $mountdir/etc/rc.local $mountdir/etc/rc.local.bak
2016-04-12 05:05:00 +02:00
cat <<\EOF > $mountdir/etc/rc.local
#!/bin/bash
/usr/bin/raspi-config --expand-rootfs
rm -f /etc/rc.local; cp -f /etc/rc.local.bak /etc/rc.local; reboot
2016-04-12 05:05:00 +02:00
exit 0
EOF
chmod +x $mountdir/etc/rc.local
fi
umount $mountdir
2016-04-12 05:05:00 +02:00
#Shrink filesystem
e2fsck -f $loopback
minsize=`resize2fs -P $loopback | awk -F': ' ' { print $2 } '`
minsize=`echo $minsize+20000 | bc`
resize2fs -p $loopback $minsize
if [[ $? != 0 ]]; then
echo ERROR: resize2fs failed...
mount $loopback $mountdir
mv $mountdir/etc/rc.local.bak $mountdir/etc/rc.local
umount $mountdir
losetup -d $loopback
exit $rc
fi
2016-04-12 05:05:00 +02:00
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"