34a1da07 |
1 | #!/bin/bash |
941f5584 |
2 | # run/kill Android from Linux, the hackjob script |
34a1da07 |
3 | # (c) Grazvydas "notaz" Ignotas, 2012 |
4 | set -e -x |
5 | |
6 | if [ "`id -u`" != "0" ]; then |
941f5584 |
7 | # gksudo causes logging not to work somehow.. |
8 | # so use it to only ask for password, use sudo to re-run the script |
9 | gksudo -m "Android needs root privileges to run, please enter your password" id |
10 | exec sudo -n $0 |
34a1da07 |
11 | fi |
12 | |
13 | root=/mnt/android |
14 | mpoint_main=`pwd` |
15 | kernel_ver=`uname -r` |
941f5584 |
16 | exitcode=1 |
34a1da07 |
17 | |
941f5584 |
18 | trap onexit INT QUIT TERM EXIT |
19 | trap '' HUP |
34a1da07 |
20 | |
21 | err() |
22 | { |
23 | zenity --error --text "$1" |
24 | echo "$1" |
25 | } |
26 | |
27 | onexit() |
28 | { |
29 | set +e +x |
30 | |
31 | list="/sbin/ueventd /system/bin/logcat /system/bin/sh /system/bin/servicemanager |
32 | /system/bin/vold /system/bin/netd /system/bin/rild /system/bin/installd /sbin/adbd |
33 | /system/bin/mediaserver /system/bin/keystore /system/bin/debuggerd |
34 | /system/bin/dbus-daemon" |
35 | for pr in $list; do |
36 | pb=`basename $pr` |
37 | p=`ps -C $pb -o pid=,cmd= | grep $pr | awk '{print $1}'` |
38 | test -n "$p" && echo kill $p $pr && kill $p |
39 | done |
40 | for pr in $list; do |
41 | pb=`basename $pr` |
42 | p=`ps -C $pb -o pid=,cmd= | grep $pr | awk '{print $1}'` |
43 | test -n "$p" && echo kill -9 $p $pr && kill -9 $p |
44 | done |
45 | list2=`ps ax | grep -v grep | grep -e ':.. /system/' -e ':.. /data/' -e ' android\.' | awk '{print $1}'` |
46 | list3=`lsof | grep '/dev/binder' | awk '{print $2}' | uniq` |
47 | for p in $list2 $list3; do |
48 | test -n "$p" && echo kill $p && kill $p |
49 | done |
50 | |
51 | sleep 0.5 |
52 | |
941f5584 |
53 | for i in `seq 4`; do |
34a1da07 |
54 | sdmounts=`grep -e '\.android_secure' -e 'secure/asec' -e 'mnt/sdcard' /proc/mounts` |
55 | if [ -n "$sdmounts" ]; then |
56 | echo "$sdmounts" | awk '{print $2}' | xargs umount |
57 | fi |
58 | |
941f5584 |
59 | omounts=`grep "$root/" /proc/mounts | awk '{print $2}'` |
60 | if [ -n "$omounts" ]; then |
61 | for m in $omounts; do |
62 | if ! umount $m; then |
63 | umount -i $m |
64 | fi |
65 | done |
66 | fi |
67 | |
68 | sleep 0.5 |
34a1da07 |
69 | if umount $root; then |
70 | break; |
71 | fi |
72 | done |
73 | |
74 | if ! pidof X > /dev/null; then |
75 | # need to restore SGX, X and friends |
76 | rmmod bufferclass_ti omaplfb pvrsrvkm |
77 | /etc/init.d/pvr-init start |
78 | rmmod wl1251_sdio # hmh |
79 | /etc/init.d/NetworkManager start |
80 | /etc/init.d/slim-init start |
81 | fi |
941f5584 |
82 | |
83 | if ! ps a | grep -q 'pnd_run.*run_gingerbread.sh'; then |
84 | # something killed pnd_run, have to clean up for it |
85 | cat > /tmp/clean_android.sh <<EOF |
86 | #!/bin/bash |
87 | trap '' HUP |
88 | sleep 3 |
89 | umount $mpoint_main |
90 | umount $mpoint_main # needed twice?? |
91 | losetup -a | awk -F ':' '{ print \$1 }' | xargs losetup -d 2> /dev/null |
92 | rm $0 |
93 | EOF |
94 | cd /tmp/ |
95 | chmod +x /tmp/clean_android.sh |
96 | /tmp/clean_android.sh & |
97 | sleep 1 |
98 | fi |
99 | exit $exitcode |
34a1da07 |
100 | } |
101 | |
102 | |
103 | # logger, binder and ashmem |
104 | delay=0 |
105 | if ! test -e /dev/log_events; then |
106 | modprobe logger |
107 | delay=0.5 |
108 | fi |
109 | if ! test -e /dev/binder; then |
110 | modprobe binder |
111 | delay=0.5 |
112 | fi |
113 | if ! test -e /dev/ashmem; then |
114 | modprobe ashmem |
115 | delay=0.5 |
116 | fi |
117 | sleep $delay |
118 | if test ! -e /dev/log_events -o ! -e /dev/binder -o ! -e /dev/ashmem; then |
119 | err "could not load required Android modules,\n\ |
120 | perhaps you are running unsupported\nfirmware/kernel." |
121 | exit 1 |
122 | fi |
123 | |
124 | if ! test -e rootfs.ext2; then |
125 | if ! cp -v pandora/default_rootfs.ext2 rootfs.ext2; then |
126 | err "file copy failed, not enough space?" |
127 | exit 1 |
128 | fi |
129 | fi |
130 | |
131 | if ! test -e data.ext4; then |
132 | size=`zenity --entry --text="\ |
133 | Android needs a partition to store it's data and installed programs.\n\ |
134 | This will be stored in preallocated file of size that you have to select now.\n\ |
135 | Android documentation recommends at least 150MB, going below 50MB will cause\n\ |
136 | problems, as well as over 2GB if you are running from FAT partitioned card.\n\n\ |
137 | Please select size of Android data partition (in megabytes):\n\ |
138 | (creation may take several minutes after you press OK)" \ |
139 | --entry-text=150` |
140 | if test -z "$size" || ! dd if=/dev/zero of=data.ext4 bs=1M count=$size; then |
141 | err "failed to create file, not enough space? bad input?" |
142 | exit 1 |
143 | fi |
144 | if ! mkfs.ext4 -O ^has_journal -m 0 -F data.ext4; then |
145 | err "failed to create filesystem" |
146 | exit 1 |
147 | fi |
148 | fi |
149 | |
150 | if ! fsck.ext4 -y data.ext4 || ! fsck.ext2 -y rootfs.ext2; then |
151 | if [ "$?" -ge "4" ]; then |
152 | err "file corruption detected, try clearing appdata." |
153 | exit 1 |
154 | fi |
155 | fi |
156 | |
157 | mkdir -p $root |
158 | mount -o loop,rw,noatime rootfs.ext2 $root |
159 | mount --bind $mpoint_main/system/ $root/system/ |
160 | mount -o loop,rw,noatime data.ext4 $root/data |
161 | |
941f5584 |
162 | mkdir -p $root/vendor/ |
34a1da07 |
163 | |
164 | # handle SGX |
165 | mkdir -p $root/vendor/pvr |
166 | echo "0 0 android" > $root/vendor/pvr/egl.cfg |
167 | |
168 | # load the right SGX driver |
169 | sgx_kernel_loaded=false |
170 | if ! grep -q '1.5.15.2766' /proc/pvr/version 2> /dev/null; then |
171 | echo have to change SGX kernel driver |
172 | /etc/init.d/pvr-init stop || true |
173 | if test -d $mpoint_main/pandora/pvr/$kernel_ver; then |
174 | # found with this android release |
175 | pvrbase=$mpoint_main/pandora/pvr/$kernel_ver |
176 | elif test -d /lib/modules/$kernel_ver/kernel/drivers/gpu/pvr/1.5.15.2766; then |
177 | # found in firmware |
178 | pvrbase=/lib/modules/$kernel_ver/kernel/drivers/gpu/pvr/1.5.15.2766 |
179 | fi |
180 | |
181 | if [ "x$pvrbase" != "x" ]; then |
182 | if insmod $pvrbase/pvrsrvkm.ko && insmod $pvrbase/omaplfb.ko; then |
183 | sgx_kernel_loaded=true |
184 | # optional |
185 | insmod $pvrbase/bufferclass_ti.ko || true |
186 | fi |
187 | fi |
188 | else |
189 | sgx_kernel_loaded=true |
190 | fi |
191 | |
192 | sgx_user_ready=false |
193 | #if false; then |
194 | if $sgx_kernel_loaded; then |
195 | es=`cat /etc/powervr-esrev` |
196 | if [ "x$es" = "x" ]; then |
197 | err "unable to determine SGX version" |
198 | else |
199 | es="es$es" |
200 | # for some braindead reason 103 is named 121 too |
201 | sgx_ver=121 |
202 | if [ "$es" = "es5" ]; then |
203 | sgx_ver=125 |
204 | else |
205 | ln -fs /system/lib/$es/libGLESv2_POWERVR_SGX530_121.so $root/vendor/pvr/ |
206 | ln -fs /system/lib/$es/libGLESv1_CM_POWERVR_SGX530_121.so $root/vendor/pvr/ |
207 | fi |
208 | ln -fs /system/bin/$es/pvrsrvinit $root/vendor/pvr/ |
209 | ln -fs /system/lib/$es/libPVRScopeServices.so $root/vendor/pvr/ |
210 | ln -fs /system/lib/$es/libglslcompiler.so $root/vendor/pvr/ |
211 | ln -fs /system/lib/$es/libsrv_um.so $root/vendor/pvr/ |
212 | ln -fs /system/lib/$es/libIMGegl.so $root/vendor/pvr/ |
213 | |
214 | echo "0 1 POWERVR_SGX530_$sgx_ver" >> $root/vendor/pvr/egl.cfg |
215 | sgx_user_ready=true |
216 | fi |
217 | fi |
218 | |
219 | if ! $sgx_user_ready; then |
220 | err "SGX driver load failed, no 3D support" |
221 | fi |
222 | |
223 | # stop X and interfering things, get wifi ready |
224 | set +e |
225 | if pidof xfce4-session > /dev/null; then |
226 | user=`cat /tmp/currentuser` |
227 | # most often doesn't work :( |
228 | #if ! test -z "$user"; then |
229 | # su -c 'xfce4-session-logout --logout' $user |
230 | #fi |
231 | fi |
232 | /etc/init.d/NetworkManager stop |
233 | modprobe mac80211 |
234 | /etc/init.d/wl1251-init start |
235 | /etc/init.d/slim-init stop |
236 | sleep 1 # for wlan0, hmh.. |
237 | chvt 2 & # may hang.. |
238 | sleep 1 |
239 | killall chvt 2> /dev/null || true |
240 | ifconfig wlan0 down |
241 | set -e |
242 | |
941f5584 |
243 | cp -v /etc/pointercal $root/vendor/ |
244 | cp -v /lib/modules/$kernel_ver/kernel/drivers/net/wireless/wl1251/wl1251_sdio.ko $root/vendor/ |
34a1da07 |
245 | mkdir -p $root/vendor/firmware |
941f5584 |
246 | cp -v /lib/firmware/brf6300.bin $root/vendor/firmware/ |
34a1da07 |
247 | |
248 | # some cleanup |
249 | rm -rf $root/acct/uid/* |
250 | |
251 | chroot $root /init & |
252 | |
253 | # wait for a message |
254 | while true; do |
255 | sleep 1 |
256 | |
257 | if nc -V 2> /dev/null | grep -q GNU; then |
258 | # GNU nc always fails |
259 | msg=`nc -l -p 36936 localhost || true` |
260 | else |
261 | msg=`nc -l localhost 36936` |
262 | fi |
263 | if [ "x$msg" = "xquit" ]; then |
264 | break |
265 | fi |
266 | echo "unknown message: $msg" |
267 | done |
268 | |
269 | # real init can't be killed this way |
270 | killall init |
941f5584 |
271 | |
272 | # done, run exit handler indirectly |
273 | exitcode=0 |