blob: 6de3a8caf94224f6586cbd05cb7e6cc6c8f33629 [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. Dutta33370db2010-02-25 11:39:07 -080058echo here > /etc/foo
Koushik K. Dutta1a7ee532010-02-21 17:52:30 -080059mkfstab.sh > /etc/fstab
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080060
Koushik K. Duttac788c262010-02-20 17:25:03 -080061if [ "$1" == "" ]; then
62 echo "Usage: $0 {backup|restore} [/path/to/nandroid/backup/]"
Koushik K. Dutta981b0cd2010-02-22 08:53:34 -080063 echo "- backup will store a full system backup on /sdcard/nandroid"
Koushik K. Duttac788c262010-02-20 17:25:03 -080064 echo "- restore path will restore the last made backup for boot, system, recovery and data"
65 exit 0
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080066fi
67
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080068case $1 in
Koushik K. Duttac788c262010-02-20 17:25:03 -080069 backup)
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080070 mkyaffs2image=`which mkyaffs2image`
71 if [ "$mkyaffs2image" == "" ]; then
72 mkyaffs2image=`which mkyaffs2image-arm-uclibc`
73 if [ "$mkyaffs2image" == "" ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -080074 echo "error: mkyaffs2image or mkyaffs2image-arm-uclibc not found in path"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080075 exit 1
76 fi
77 fi
78 dump_image=`which dump_image`
79 if [ "$dump_image" == "" ]; then
80 dump_image=`which dump_image-arm-uclibc`
81 if [ "$dump_image" == "" ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -080082 echo "error: dump_image or dump_image-arm-uclibc not found in path"
Koushik K. Dutta33370db2010-02-25 11:39:07 -080083 exit 2
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080084 fi
85 fi
Koushik K. Duttac788c262010-02-20 17:25:03 -080086 break
87 ;;
88 restore)
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080089 flash_image=`which flash_image`
90 if [ "$flash_image" == "" ]; then
91 flash_image=`which flash_image-arm-uclibc`
92 if [ "$flash_image" == "" ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -080093 echo "error: flash_image or flash_image-arm-uclibc not found in path"
Koushik K. Dutta33370db2010-02-25 11:39:07 -080094 exit 3
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -080095 fi
96 fi
Koushik K. Dutta466e67a2010-02-21 19:29:32 -080097 unyaffs=`which unyaffs`
98 if [ "$unyaffs" == "" ]; then
99 echo "error: unyaffs not found in path"
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800100 exit 4
Koushik K. Dutta466e67a2010-02-21 19:29:32 -0800101 fi
Koushik K. Duttac788c262010-02-20 17:25:03 -0800102 break
103 ;;
104esac
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800105
106# 1
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800107RECOVERY=`cat /proc/cmdline | grep "androidboot.mode=recovery"`
108if [ "$RECOVERY" == "foo" ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800109 echo "error: not running in recovery mode, aborting"
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800110 exit 5
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800111fi
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800112if [ ! "`id -u 2>/dev/null`" == "0" ]; then
113 if [ "`whoami 2>&1 | grep 'uid 0'`" == "" ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800114 echo "error: must run as root, aborting"
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800115 exit 6
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800116 fi
117fi
118
119
Koushik K. Duttac788c262010-02-20 17:25:03 -0800120case $1 in
121 restore)
122 ENERGY=`cat /sys/class/power_supply/battery/capacity`
123 if [ "`cat /sys/class/power_supply/battery/status`" == "Charging" ]; then
124 ENERGY=100
125 fi
126 if [ ! $ENERGY -ge 30 ]; then
127 echo "Error: not enough battery power"
128 echo "Connect charger or USB power and try again"
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800129 exit 7
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800130 fi
Koushik K. Duttac788c262010-02-20 17:25:03 -0800131 RESTOREPATH=$2
132 if [ ! -f $RESTOREPATH/nandroid.md5 ]; then
133 echo "error: $RESTOREPATH/nandroid.md5 not found, cannot verify backup data"
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800134 exit 8
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800135 fi
Koushik K. Dutta466e67a2010-02-21 19:29:32 -0800136 umount /system 2>/dev/null
137 umount /data 2>/dev/null
138 mount -o rw /system || FAIL=1
139 mount -o rw /data || FAIL=2
140 case $FAIL in
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800141 1) echo "Error mounting system read-write"; umount /system /data /cache; exit 9;;
142 2) echo "Error mounting data read-write"; umount /system /data /cache; exit 10;;
Koushik K. Dutta466e67a2010-02-21 19:29:32 -0800143 esac
144
Koushik K. Duttac788c262010-02-20 17:25:03 -0800145 echo "Verifying backup images..."
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800146 CWD=$PWD
147 cd $RESTOREPATH
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800148 md5sum -c nandroid.md5
149 if [ $? -eq 1 ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800150 echo "error: md5sum mismatch, aborting"
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800151 exit 11
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800152 fi
Koushik K. Dutta007439b2010-02-22 19:01:54 -0800153 for image in boot; do
Koushik K. Duttac788c262010-02-20 17:25:03 -0800154 echo "Flashing $image..."
155 $flash_image $image $image.img
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800156 done
Koushik K. Dutta466e67a2010-02-21 19:29:32 -0800157 curdir=$(pwd)
158 for image in system data cache; do
159 echo "Unpacking $image..."
160 cd /$image
161 rm -rf *
162 unyaffs $curdir/$image.img
163 cd $curdir
164 done
165 sync
166 umount /system
167 umount /data
168 echo "Restore done"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800169 exit 0
Koushik K. Duttac788c262010-02-20 17:25:03 -0800170 ;;
171 backup)
172 break
173 ;;
174 *)
175 echo "Usage: $0 {backup|restore} [/path/to/nandroid/backup/]"
Koushik K. Dutta981b0cd2010-02-22 08:53:34 -0800176 echo "- backup will store a full system backup on /sdcard/nandroid"
Koushik K. Duttac788c262010-02-20 17:25:03 -0800177 echo "- restore path will restore the last made backup for boot, system, recovery and data"
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800178 exit 12
Koushik K. Duttac788c262010-02-20 17:25:03 -0800179 ;;
180esac
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800181
182# 2.
Koushik K. Duttac788c262010-02-20 17:25:03 -0800183echo "mounting system and data read-only, sdcard read-write"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800184umount /system 2>/dev/null
185umount /data 2>/dev/null
186umount /sdcard 2>/dev/null
187mount -o ro /system || FAIL=1
188mount -o ro /data || FAIL=2
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800189mount /sdcard || FAIL=3
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800190case $FAIL in
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800191 1) echo "Error mounting system read-only"; umount /system /data /sdcard; exit 13;;
192 2) echo "Error mounting data read-only"; umount /system /data /sdcard; exit 14;;
193 3) echo "Error mounting sdcard read-write"; umount /system /data /sdcard; exit 15;;
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800194esac
195
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800196TIMESTAMP="`date +%Y%m%d-%H%M`"
Koushik K. Dutta01098d22010-02-25 11:07:19 -0800197BASEDIR=/sdcard/nandroid
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800198if [ ! -z "$2" ]; then
Koushik K. Dutta01098d22010-02-25 11:07:19 -0800199 BASEDIR=$2
200fi
201
202DESTDIR=$BASEDIR/$TIMESTAMP
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800203if [ ! -d $DESTDIR ]; then
204 mkdir -p $DESTDIR
205 if [ ! -d $DESTDIR ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800206 echo "error: cannot create $DESTDIR"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800207 umount /system 2>/dev/null
208 umount /data 2>/dev/null
209 umount /sdcard 2>/dev/null
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800210 exit 16
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800211 fi
212else
213 touch $DESTDIR/.nandroidwritable
214 if [ ! -e $DESTDIR/.nandroidwritable ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800215 echo "error: cannot write to $DESTDIR"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800216 umount /system 2>/dev/null
217 umount /data 2>/dev/null
218 umount /sdcard 2>/dev/null
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800219 exit 16
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800220 fi
221 rm $DESTDIR/.nandroidwritable
222fi
223
224# 3.
Koushik K. Duttac788c262010-02-20 17:25:03 -0800225echo "checking free space on sdcard"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800226FREEBLOCKS="`df -k /sdcard| grep sdcard | awk '{ print $4 }'`"
227# we need about 130MB for the dump
228if [ $FREEBLOCKS -le 130000 ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800229 echo "error: not enough free space available on sdcard (need 130mb), aborting."
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800230 umount /system 2>/dev/null
231 umount /data 2>/dev/null
232 umount /sdcard 2>/dev/null
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800233 exit 17
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800234fi
235
236
237
238if [ -e /dev/mtd/mtd6ro ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800239 echo -n "Dumping splash1 from device over tcp to $DESTDIR/splash1.img..."
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800240 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 -0800241 echo "done"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800242 sleep 1s
Koushik K. Duttac788c262010-02-20 17:25:03 -0800243 echo -n "Dumping splash2 from device over tcp to $DESTDIR/splash2.img..."
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800244 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 -0800245 echo "done"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800246fi
247
248
249# 5.
250for image in boot recovery misc; do
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800251 # 5a
252 DEVICEMD5=`$dump_image $image - | md5sum | awk '{ print $1 }'`
253 sleep 1s
254 MD5RESULT=1
255 # 5b
Koushik K. Duttac788c262010-02-20 17:25:03 -0800256 echo -n "Dumping $image to $DESTDIR/$image.img..."
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800257 ATTEMPT=0
258 while [ $MD5RESULT -eq 1 ]; do
259 let ATTEMPT=$ATTEMPT+1
260 # 5b1
Koushik K. Duttac788c262010-02-20 17:25:03 -0800261 $dump_image $image $DESTDIR/$image.img
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800262 sync
263 # 5b3
Koushik K. Duttac788c262010-02-20 17:25:03 -0800264 echo "${DEVICEMD5} $DESTDIR/$image.img" | md5sum -c -s -
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800265 if [ $? -eq 1 ]; then
266 true
267 else
268 MD5RESULT=0
269 fi
270 if [ "$ATTEMPT" == "5" ]; then
Koushik K. Duttac788c262010-02-20 17:25:03 -0800271 echo "fatal error while trying to dump $image, aborting"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800272 umount /system
273 umount /data
274 umount /sdcard
Koushik K. Dutta33370db2010-02-25 11:39:07 -0800275 exit 18
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800276 fi
277 done
Koushik K. Duttac788c262010-02-20 17:25:03 -0800278 echo "done"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800279done
280
281# 6
282for image in system data cache; do
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800283 # 6a
Koushik K. Duttac788c262010-02-20 17:25:03 -0800284 echo -n "Dumping $image to $DESTDIR/$image.img..."
285 $mkyaffs2image /$image $DESTDIR/$image.img
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800286 sync
Koushik K. Duttac788c262010-02-20 17:25:03 -0800287 echo "done"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800288done
289
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800290
291# 7.
Koushik K. Duttac788c262010-02-20 17:25:03 -0800292echo -n "generating md5sum file..."
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800293CWD=$PWD
294cd $DESTDIR
295md5sum *img > nandroid.md5
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800296cd $CWD
Koushik K. Duttac788c262010-02-20 17:25:03 -0800297echo "done"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800298
299# 8.
Koushik K. Duttac788c262010-02-20 17:25:03 -0800300echo "unmounting system, data and sdcard"
Koushik K. Dutta8ce0be42010-02-20 15:59:06 -0800301umount /system
302umount /data
303umount /sdcard
304
305# 9.
Koushik K. Duttac788c262010-02-20 17:25:03 -0800306echo "Backup successful."