blob: 738299d2f1970628245e705561ac8b5d9ca9bd80 [file] [log] [blame]
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -08001#!/sbin/sh
2
Koushik K. Duttac788c262010-02-20 17:25:03 -08003# nandroid v2.1 - an Android backup tool for the G1 by infernix and brainaid
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -08004
5# Requirements:
6
7# - a modded android in recovery mode (JF 1.3 will work by default)
8# - adb shell as root in recovery mode if not using a pre-made recovery image
9# - busybox in recovery mode
10# - dump_image-arm-uclibc compiled and in path on phone
11# - mkyaffs2image-arm-uclibc compiled and installed in path on phone
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080012
13# Reference data:
14
15# dev: size erasesize name
16#mtd0: 00040000 00020000 "misc"
17#mtd1: 00500000 00020000 "recovery"
18#mtd2: 00280000 00020000 "boot"
19#mtd3: 04380000 00020000 "system"
20#mtd4: 04380000 00020000 "cache"
21#mtd5: 04ac0000 00020000 "userdata"
22#mtd6 is everything, dump splash1 with: dd if=/dev/mtd/mtd6ro of=/sdcard/splash1.img skip=19072 bs=2048 count=150
23
24# We don't dump misc or cache because they do not contain any useful data that we are aware of at this time.
25
Koushik K. Duttac788c262010-02-20 17:25:03 -080026# Logical steps (v2.1):
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080027#
28# 0. test for a target dir and the various tools needed, if not found then exit with error.
29# 1. check "adb devices" for a device in recovery mode. set DEVICEID variable to the device ID. abort when not found.
30# 2. mount system and data partitions read-only, set up adb portforward and create destdir
31# 3. check free space on /cache, exit if less blocks than 20MB free
32# 4. push required tools to device in /cache
33# 5 for partitions boot recovery misc:
34# 5a get md5sum for content of current partition *on the device* (no data transfered)
35# 5b while MD5sum comparison is incorrect (always is the first time):
36# 5b1 dump current partition to a netcat session
37# 5b2 start local netcat to dump image to current dir
38# 5b3 compare md5sums of dumped data with dump in current dir. if correct, contine, else restart the loop (6b1)
39# 6 for partitions system data:
40# 6a get md5sum for tar of content of current partition *on the device* (no data transfered)
41# 6b while MD5sum comparison is incorrect (always is the first time):
42# 6b1 tar current partition to a netcat session
43# 6b2 start local netcat to dump tar to current dir
44# 6b3 compare md5sums of dumped data with dump in current dir. if correct, contine, else restart the loop (6b1)
45# 6c if i'm running as root:
46# 6c1 create a temp dir using either tempdir command or the deviceid in /tmp
47# 6c2 extract tar to tempdir
48# 6c3 invoke mkyaffs2image to create the img
49# 6c4 clean up
50# 7. remove tools from device /cache
51# 8. umount system and data on device
52# 9. print success.
53
54
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080055RECOVERY=foo
56
Koushik K. Duttac788c262010-02-20 17:25:03 -080057echo "nandroid-mobile v2.1"
Koushik K. Dutta1a7ee532010-02-21 17:52:30 -080058mkfstab.sh > /etc/fstab
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080059
Koushik K. Duttac788c262010-02-20 17:25:03 -080060if [ "$1" == "" ]; then
61 echo "Usage: $0 {backup|restore} [/path/to/nandroid/backup/]"
Koushik K. Dutta981b0cd2010-02-22 08:53:34 -080062 echo "- backup will store a full system backup on /sdcard/nandroid"
Koushik K. Duttac788c262010-02-20 17:25:03 -080063 echo "- restore path will restore the last made backup for boot, system, recovery and data"
64 exit 0
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080065fi
66
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080067case $1 in
Koushik K. Duttac788c262010-02-20 17:25:03 -080068 backup)
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080069 mkyaffs2image=`which mkyaffs2image`
70 if [ "$mkyaffs2image" == "" ]; then
71 mkyaffs2image=`which mkyaffs2image-arm-uclibc`
72 if [ "$mkyaffs2image" == "" ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -080073 echo "error: mkyaffs2image or mkyaffs2image-arm-uclibc not found in path"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080074 exit 1
75 fi
76 fi
77 dump_image=`which dump_image`
78 if [ "$dump_image" == "" ]; then
79 dump_image=`which dump_image-arm-uclibc`
80 if [ "$dump_image" == "" ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -080081 echo "error: dump_image or dump_image-arm-uclibc not found in path"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080082 exit 1
83 fi
84 fi
Koushik K. Duttac788c262010-02-20 17:25:03 -080085 break
86 ;;
87 restore)
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080088 flash_image=`which flash_image`
89 if [ "$flash_image" == "" ]; then
90 flash_image=`which flash_image-arm-uclibc`
91 if [ "$flash_image" == "" ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -080092 echo "error: flash_image or flash_image-arm-uclibc not found in path"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080093 exit 1
94 fi
95 fi
Koushik K. Dutta466e67a2010-02-21 19:29:32 -080096 unyaffs=`which unyaffs`
97 if [ "$unyaffs" == "" ]; then
98 echo "error: unyaffs not found in path"
99 exit 1
100 fi
Koushik K. Duttac788c262010-02-20 17:25:03 -0800101 break
102 ;;
103esac
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800104
105# 1
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800106RECOVERY=`cat /proc/cmdline | grep "androidboot.mode=recovery"`
107if [ "$RECOVERY" == "foo" ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800108 echo "error: not running in recovery mode, aborting"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800109 exit 1
110fi
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800111if [ ! "`id -u 2>/dev/null`" == "0" ]; then
112 if [ "`whoami 2>&1 | grep 'uid 0'`" == "" ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800113 echo "error: must run as root, aborting"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800114 exit 1
115 fi
116fi
117
118
Koushik K. Duttac788c262010-02-20 17:25:03 -0800119case $1 in
120 restore)
121 ENERGY=`cat /sys/class/power_supply/battery/capacity`
122 if [ "`cat /sys/class/power_supply/battery/status`" == "Charging" ]; then
123 ENERGY=100
124 fi
125 if [ ! $ENERGY -ge 30 ]; then
126 echo "Error: not enough battery power"
127 echo "Connect charger or USB power and try again"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800128 exit 1
129 fi
Koushik K. Duttac788c262010-02-20 17:25:03 -0800130 RESTOREPATH=$2
131 if [ ! -f $RESTOREPATH/nandroid.md5 ]; then
132 echo "error: $RESTOREPATH/nandroid.md5 not found, cannot verify backup data"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800133 exit 1
134 fi
Koushik K. Dutta466e67a2010-02-21 19:29:32 -0800135 umount /system 2>/dev/null
136 umount /data 2>/dev/null
137 mount -o rw /system || FAIL=1
138 mount -o rw /data || FAIL=2
139 case $FAIL in
140 1) echo "Error mounting system read-write"; umount /system /data /cache; exit 1;;
141 2) echo "Error mounting data read-write"; umount /system /data /cache; exit 1;;
142 esac
143
Koushik K. Duttac788c262010-02-20 17:25:03 -0800144 echo "Verifying backup images..."
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800145 CWD=$PWD
146 cd $RESTOREPATH
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800147 md5sum -c nandroid.md5
148 if [ $? -eq 1 ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800149 echo "error: md5sum mismatch, aborting"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800150 exit 1
151 fi
Koushik K. Dutta007439b2010-02-22 19:01:54 -0800152 for image in boot; do
Koushik K. Duttac788c262010-02-20 17:25:03 -0800153 echo "Flashing $image..."
154 $flash_image $image $image.img
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800155 done
Koushik K. Dutta466e67a2010-02-21 19:29:32 -0800156 curdir=$(pwd)
157 for image in system data cache; do
158 echo "Unpacking $image..."
159 cd /$image
160 rm -rf *
161 unyaffs $curdir/$image.img
162 cd $curdir
163 done
164 sync
165 umount /system
166 umount /data
167 echo "Restore done"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800168 exit 0
Koushik K. Duttac788c262010-02-20 17:25:03 -0800169 ;;
170 backup)
171 break
172 ;;
173 *)
174 echo "Usage: $0 {backup|restore} [/path/to/nandroid/backup/]"
Koushik K. Dutta981b0cd2010-02-22 08:53:34 -0800175 echo "- backup will store a full system backup on /sdcard/nandroid"
Koushik K. Duttac788c262010-02-20 17:25:03 -0800176 echo "- restore path will restore the last made backup for boot, system, recovery and data"
177 exit 1
178 ;;
179esac
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800180
181# 2.
Koushik K. Duttac788c262010-02-20 17:25:03 -0800182echo "mounting system and data read-only, sdcard read-write"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800183umount /system 2>/dev/null
184umount /data 2>/dev/null
185umount /sdcard 2>/dev/null
186mount -o ro /system || FAIL=1
187mount -o ro /data || FAIL=2
188mount /sdcard || mount /dev/block/mmcblk0 /sdcard || FAIL=3
189case $FAIL in
Koushik K. Duttac788c262010-02-20 17:25:03 -0800190 1) echo "Error mounting system read-only"; umount /system /data /sdcard; exit 1;;
191 2) echo "Error mounting data read-only"; umount /system /data /sdcard; exit 1;;
192 3) echo "Error mounting sdcard read-write"; umount /system /data /sdcard; exit 1;;
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800193esac
194
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800195TIMESTAMP="`date +%Y%m%d-%H%M`"
Koushik K. Dutta981b0cd2010-02-22 08:53:34 -0800196DESTDIR="/sdcard/nandroid/$TIMESTAMP"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800197if [ ! -d $DESTDIR ]; then
198 mkdir -p $DESTDIR
199 if [ ! -d $DESTDIR ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800200 echo "error: cannot create $DESTDIR"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800201 umount /system 2>/dev/null
202 umount /data 2>/dev/null
203 umount /sdcard 2>/dev/null
204 exit 1
205 fi
206else
207 touch $DESTDIR/.nandroidwritable
208 if [ ! -e $DESTDIR/.nandroidwritable ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800209 echo "error: cannot write to $DESTDIR"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800210 umount /system 2>/dev/null
211 umount /data 2>/dev/null
212 umount /sdcard 2>/dev/null
213 exit 1
214 fi
215 rm $DESTDIR/.nandroidwritable
216fi
217
218# 3.
Koushik K. Duttac788c262010-02-20 17:25:03 -0800219echo "checking free space on sdcard"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800220FREEBLOCKS="`df -k /sdcard| grep sdcard | awk '{ print $4 }'`"
221# we need about 130MB for the dump
222if [ $FREEBLOCKS -le 130000 ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800223 echo "error: not enough free space available on sdcard (need 130mb), aborting."
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800224 umount /system 2>/dev/null
225 umount /data 2>/dev/null
226 umount /sdcard 2>/dev/null
227 exit 1
228fi
229
230
231
232if [ -e /dev/mtd/mtd6ro ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800233 echo -n "Dumping splash1 from device over tcp to $DESTDIR/splash1.img..."
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800234 dd if=/dev/mtd/mtd6ro of=$DESTDIR/splash1.img skip=19072 bs=2048 count=150 2>/dev/null
Koushik K. Duttac788c262010-02-20 17:25:03 -0800235 echo "done"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800236 sleep 1s
Koushik K. Duttac788c262010-02-20 17:25:03 -0800237 echo -n "Dumping splash2 from device over tcp to $DESTDIR/splash2.img..."
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800238 dd if=/dev/mtd/mtd6ro of=$DESTDIR/splash2.img skip=19456 bs=2048 count=150 2>/dev/null
Koushik K. Duttac788c262010-02-20 17:25:03 -0800239 echo "done"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800240fi
241
242
243# 5.
244for image in boot recovery misc; do
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800245 # 5a
246 DEVICEMD5=`$dump_image $image - | md5sum | awk '{ print $1 }'`
247 sleep 1s
248 MD5RESULT=1
249 # 5b
Koushik K. Duttac788c262010-02-20 17:25:03 -0800250 echo -n "Dumping $image to $DESTDIR/$image.img..."
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800251 ATTEMPT=0
252 while [ $MD5RESULT -eq 1 ]; do
253 let ATTEMPT=$ATTEMPT+1
254 # 5b1
Koushik K. Duttac788c262010-02-20 17:25:03 -0800255 $dump_image $image $DESTDIR/$image.img
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800256 sync
257 # 5b3
Koushik K. Duttac788c262010-02-20 17:25:03 -0800258 echo "${DEVICEMD5} $DESTDIR/$image.img" | md5sum -c -s -
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800259 if [ $? -eq 1 ]; then
260 true
261 else
262 MD5RESULT=0
263 fi
264 if [ "$ATTEMPT" == "5" ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800265 echo "fatal error while trying to dump $image, aborting"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800266 umount /system
267 umount /data
268 umount /sdcard
269 exit 1
270 fi
271 done
Koushik K. Duttac788c262010-02-20 17:25:03 -0800272 echo "done"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800273done
274
275# 6
276for image in system data cache; do
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800277 # 6a
Koushik K. Duttac788c262010-02-20 17:25:03 -0800278 echo -n "Dumping $image to $DESTDIR/$image.img..."
279 $mkyaffs2image /$image $DESTDIR/$image.img
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800280 sync
Koushik K. Duttac788c262010-02-20 17:25:03 -0800281 echo "done"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800282done
283
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800284
285# 7.
Koushik K. Duttac788c262010-02-20 17:25:03 -0800286echo -n "generating md5sum file..."
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800287CWD=$PWD
288cd $DESTDIR
289md5sum *img > nandroid.md5
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800290cd $CWD
Koushik K. Duttac788c262010-02-20 17:25:03 -0800291echo "done"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800292
293# 8.
Koushik K. Duttac788c262010-02-20 17:25:03 -0800294echo "unmounting system, data and sdcard"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800295umount /system
296umount /data
297umount /sdcard
298
299# 9.
Koushik K. Duttac788c262010-02-20 17:25:03 -0800300echo "Backup successful."