1
+ #! /bin/bash
2
+ # Args
3
+ img=$1
4
+
5
+ # Usage checks
6
+ if [[ -z $img ]]; then
7
+ echo " Usage: $0 imagefile.img"
8
+ exit -1
9
+ fi
10
+ if [[ ! -e $img ]]; then
11
+ echo " ERROR: $img is not a file..."
12
+ exit -2
13
+ fi
14
+ if (( EUID != 0 )) ; then
15
+ echo " ERROR: You need to be running as root."
16
+ exit -3
17
+ fi
18
+
19
+ # Gather info
20
+ beforesize=` ls -lah $img | cut -d ' ' -f 5`
21
+ partinfo=` parted -m $img unit B print`
22
+ partnumber=` echo " $partinfo " | grep ext4 | awk -F: ' { print $img } ' `
23
+ partstart=` echo " $partinfo " | grep ext4 | awk -F: ' { print substr($2,0,length($2)-1) } ' `
24
+ loopback=` losetup -f --show -o $partstart $img `
25
+
26
+ # Make pi expand rootfs on next boot
27
+ mountdir=` mktemp -d`
28
+ mount $loopback $mountdir
29
+ mv $mountdir /etc/rc.local $mountdir /etc/rc.expand.tmp
30
+ cat << \EOF > $mountdir /etc/rc.local
31
+ #!/bin/sh
32
+ /usr/bin/raspi-config --expand-rootfs; mv -f /etc/rc.expand.tmp /etc/rc.local; reboot
33
+ exit 0
34
+ EOF
35
+ chmod +x $mountdir /etc/rc.local
36
+ umount $loopback
37
+
38
+ # Shrink filesystem
39
+ e2fsck -f $loopback
40
+ minsize=` resize2fs -P $loopback | awk -F' : ' ' { print $2 } ' `
41
+ minsize=` echo $minsize +20000 | bc`
42
+ resize2fs -p $loopback $minsize
43
+ sleep 1
44
+
45
+ # Shrink partition
46
+ losetup -d $loopback
47
+ partnewsize=` echo " $minsize * 4096" | bc`
48
+ newpartend=` echo " $partstart + $partnewsize " | bc`
49
+ part1=` parted $img rm 2`
50
+ part2=` parted $img unit B mkpart primary $partstart $newpartend `
51
+
52
+ # Truncate the file
53
+ endresult=` parted -m $img unit B print free | tail -1 | awk -F: ' { print substr($2,0,length($2)-1) } ' `
54
+ truncate -s $endresult $img
55
+ aftersize=` ls -lah $img | cut -d ' ' -f 5`
56
+
57
+ echo " Shrunk $img from $beforesize to $aftersize "
0 commit comments