Differences between revisions 1 and 37 (spanning 36 versions)
Revision 1 as of 2012-03-13 18:47:49
Size: 968
Editor: ?NeilStockbridge
Comment:
Revision 37 as of 2014-09-29 14:52:33
Size: 7796
Comment: transparent boot integration
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= Debian chroot on Android = #language en
~-[[DebianWiki/EditorGuide#translation|Translation(s)]]: none-~
----
== Installing a Debian chroot on Android ==
Line 3: Line 6:
This is an account of installing vanilla full-fat Debian squeeze in a chroot on Android. There are a number of free and non-free apps for Android that allow you to run a Debian chroot on an Android device. Three free ones of note are [[http://sven-ola.dyndns.org/repo/debian-kit-en.html|DebianKit]], [[https://github.com/meefik/linuxdeploy|Linux Deploy]] and [[https://github.com/guardianproject/lildebi/wiki|Lil' Debi]] (a Debian GSoC supported project with a DD as a main dev). [[https://github.com/corbinlc/gnuroot|GNURoot]] is another option that lets you install a limited Debian environment without root access.
Line 5: Line 8:
This was tested on a Vodafone 845 ( a re-branded !HuaWei u8120 / Joy / Ascend).
=== DebianKit ===

DebianKit aims to provide a single Debian install directly in parallel with the existing Android install. This is possible since Android uses almost none of the standard UNIX paths, so Debian can just be copied directly onto the same file system. The one notable exception is that Android has a symlink to `/system/etc` at `/etc`, and there are a few files in `/system/etc`.


=== Lil' Debi ===

Lil' Debi uses cdebootstrap to run the full install process on the Android device, then manage starting and stopping the chroot. It aims to provide a single Debian install in parallel with Android while touching the Android internals as little as possible. It provides a complete Debian install process and transparent boot integration. The app includes the `debian-keyring.gpg` so cdebootstrap fully verifies the packages it downloads from the beginning. It calls `/etc/init.d/rc 2` on boot and `/etc/init.d 0` on shutdown to provide boot integration.


== Installing a chroot manually ==

This is an account of installing vanilla Debian in a chroot on Android.

This was tested on a Vodafone 845 (a re-branded !HuaWei u8120 / Joy / Ascend).
Line 9: Line 27:
 * Set CPU to 710 MHz with the ''performance'' governor. YMMV  * Set CPU to 710 MHz with the ''interactiveX'' governor. YMMV
Line 13: Line 31:
Then, on a workstation ( any architecture), insert the uSD card, and: Then, on a workstation (any architecture), insert the µSD card, and:
Line 16: Line 34:
  sudo debootstrap --arch=armel --variant=minbase --foreign squeeze /media/PHONE\ CARD/squeeze http://mirror.local:9999/debian sudo debootstrap --arch=armhf --variant=minbase --foreign wheezy /media/PHONE\ CARD/debian http://http.debian.net/debian
Line 19: Line 37:
Then remove the uSD card and replace it in the phone, then: {{{#!wiki note
You will need to use [[ArmEabiPort|--arch=armel]] if your phone is too old to support ARMv7.
}}}

{{{#!wiki note
If you have a local mirror, replace the URL above with your local mirror.
}}}

Then remove the µSD card and replace it in the phone, start [[https://play.google.com/store/apps/details?id=berserker.android.apps.sshdroid|SSHDroid]] (which provides chroot command). Then SSH to the phone, then:
Line 22: Line 48:
  mount -o remount,exec,dev /mnt/sdcard/
  chroot /mnt/sdcard/squeeze/ /bin/bash
  debootstrap/debootstrap --second-stage
export SDCARD=/sdcard
export ROOT=$SDCARD/debian
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH
export HOME=/root
mount -o remount,exec,dev,suid $SDCARD
for f in dev dev/pts proc sys ; do mount -o bind /$f $ROOT/$f ; done
chroot $ROOT /bin/bash -l
debootstrap/debootstrap --second-stage
Line 26: Line 57:

Then build up the Debian system as you normally would a minimal installation.

Many thanks to all the people whose hard work made it so trivial for me to install the environment I know and love on my phone.

If you need to run binaries from inside the chroot outside the chroot, you can use ld.so:

{{{
export SDCARD=/mnt/sdcard
export ROOT=$SDCARD/debian
export LD_LIBRARY_PATH=$ROOT/lib:$ROOT/lib/arm-linux-gnueabi:$ROOT/lib/arm-linux-gnueabihf:$ROOT/usr/lib:$ROOT/usr/lib/arm-linux-gnueabi:$ROOT/usr/lib/arm-linux-gnueabihf
cd $ROOT
./lib/ld-linux-*.so* bin/ls
}}}

== Available memory ==

Android pre-loads applications (in some case that the user has never started) when there is free memory. This reduces the memory available to applications in a chroot.

It looks like the `*_MEM` properties in `/init.rc` along with the `/sys/module/lowmemorykiller/parameters/minfree` could help.

Zygote starts !SystemServer and !SystemServer restarts zygote, so simply killing one of them won't work. The Android-native way of getting rid of zygote and all that descends from it is to just use the 'stop' command (in a script or through a remote (root) shell), to restart the whole Android environment you'd use the 'start' command:

{{{
stop # to stop zygote
# now do whatever you want without Android getting in the way. Once you're ready just use:
start # to start zygote
}}}

The display is now blank and ready for SDL. The input devices only partly work with SDL on the 8120 (write your own code to read `/dev/input/event*`) but graphics work well.

== AF_INET privelages ==

On android, you will need to add at least one group 3003 aid_inet for those processes which require access to creating sockets (other security guarded systems particular to Android may need addressing for other applications, search for 3003 aid_inet on the web for more detail).

== exim4 and mailman chroot on Android ==

As well as altering inet access, the Debian-exim user will have to be added to group 3003. Further, if you experience trouble in the exim mainlog for creating sockets during DNS, try dropping privelages by adding "deliver_drop_privilege=true" to the exim4.conf.template file.
For mailman, the standard setup is required, as per the README.Debian file in /usr/share/doc. However the user list must also be added to the group 3003 to allow it to send mail.


== Running GUI along side Android ==

You can also try running GUI apps and desktop environments along side Android. There are a number of X11 Server apps on the Google Play store that do a great job. One such X11 app is "XServer XSDL" which is free in the Google Play store.

An example of how to get this working. Start the chroot, start the X11 Server app, add "export DISPLAY=127.0.0.1:0" to your running chroot, then start your app or desktop environment, at this point you should see it open in the X11 Server app. YMMV though, not all Android devices have the ram or cpu to run this.

== Integrate the Debian boot process ==

Debian gives you a huge array of server software to install and run on your Android device in a chroot. It is possible to start and stop everything using the `rc` scripts that all daemons in Debian install. If you don't want the shutdown procedure to halt/power-off your phone, you need to remove some rc init scripts. This doesn't always work, so when you run stop in Debian, it might poweroff your phone. We got it working on Blandroid by running these commands in the debian shell (via ssh is probably the easiest):

<pre>
 update-rc.d -f halt remove
 update-rc.d -f reboot remove
</pre>

On CyanogenMod, we had to remove a lot more scripts to prevent it from shutting down, like `sendsigs`. But then `/etc/init.d/rc 0` no longer shutdown all of the Debian services.

<pre>
 update-rc.d -f halt remove
 update-rc.d -f reboot remove
 update-rc.d -f sendsigs remove
 update-rc.d -f umountfs remove
 update-rc.d -f umountroot remove
</pre>

You probably want to remove all of the networking stuff from your Debian chroot and let Android handle it, otherwise you might have Debian and Android fighting over the network config. Also, you need to replace the Debian call to kill all processes, because it will also kill all Android processes. Instead projects like Lil' Debi and [[https://github.com/dnschneid/crouton|Crouton]] (Debian chroot for ChromeOS) have a custom script to kill all processes running in the chroot.

The scripts to call to start and stop everything automatically:
* start: `/etc/init.d/rc 2`
* stop: `/etc/init.d/rc 0`

Translation(s): none


Installing a Debian chroot on Android

There are a number of free and non-free apps for Android that allow you to run a Debian chroot on an Android device. Three free ones of note are DebianKit, Linux Deploy and Lil' Debi (a Debian GSoC supported project with a DD as a main dev). GNURoot is another option that lets you install a limited Debian environment without root access.

DebianKit

?DebianKit aims to provide a single Debian install directly in parallel with the existing Android install. This is possible since Android uses almost none of the standard UNIX paths, so Debian can just be copied directly onto the same file system. The one notable exception is that Android has a symlink to /system/etc at /etc, and there are a few files in /system/etc.

Lil' Debi

Lil' Debi uses cdebootstrap to run the full install process on the Android device, then manage starting and stopping the chroot. It aims to provide a single Debian install in parallel with Android while touching the Android internals as little as possible. It provides a complete Debian install process and transparent boot integration. The app includes the debian-keyring.gpg so cdebootstrap fully verifies the packages it downloads from the beginning. It calls /etc/init.d/rc 2 on boot and /etc/init.d 0 on shutdown to provide boot integration.

Installing a chroot manually

This is an account of installing vanilla Debian in a chroot on Android.

This was tested on a Vodafone 845 (a re-branded HuaWei u8120 / Joy / Ascend).

  • First, the phone was rooted by side-loading z4root

  • CyanogenMod 7.2.0-RC0 22b was flashed. This might not be necessary though

  • Set CPU to 710 MHz with the interactiveX governor. YMMV

  • Side-loaded SSHDroid
  • The SD card was formatted with the MBR scheme and a single ext3 partition was created. 15 sectors were left over

Then, on a workstation (any architecture), insert the µSD card, and:

sudo debootstrap --arch=armhf --variant=minbase --foreign  wheezy  /media/PHONE\ CARD/debian  http://http.debian.net/debian

You will need to use --arch=armel if your phone is too old to support ARMv7.

If you have a local mirror, replace the URL above with your local mirror.

Then remove the µSD card and replace it in the phone, start SSHDroid (which provides chroot command). Then SSH to the phone, then:

export SDCARD=/sdcard
export ROOT=$SDCARD/debian
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH
export HOME=/root
mount -o remount,exec,dev,suid $SDCARD
for f in dev dev/pts proc sys ; do mount -o bind /$f $ROOT/$f ; done
chroot $ROOT /bin/bash -l
debootstrap/debootstrap --second-stage

Then build up the Debian system as you normally would a minimal installation.

Many thanks to all the people whose hard work made it so trivial for me to install the environment I know and love on my phone.

If you need to run binaries from inside the chroot outside the chroot, you can use ld.so:

export SDCARD=/mnt/sdcard
export ROOT=$SDCARD/debian
export LD_LIBRARY_PATH=$ROOT/lib:$ROOT/lib/arm-linux-gnueabi:$ROOT/lib/arm-linux-gnueabihf:$ROOT/usr/lib:$ROOT/usr/lib/arm-linux-gnueabi:$ROOT/usr/lib/arm-linux-gnueabihf
cd $ROOT
./lib/ld-linux-*.so* bin/ls

Available memory

Android pre-loads applications (in some case that the user has never started) when there is free memory. This reduces the memory available to applications in a chroot.

It looks like the *_MEM properties in /init.rc along with the /sys/module/lowmemorykiller/parameters/minfree could help.

Zygote starts SystemServer and SystemServer restarts zygote, so simply killing one of them won't work. The Android-native way of getting rid of zygote and all that descends from it is to just use the 'stop' command (in a script or through a remote (root) shell), to restart the whole Android environment you'd use the 'start' command:

stop # to stop zygote
# now do whatever you want without Android getting in the way. Once you're ready just use:
start # to start zygote

The display is now blank and ready for SDL. The input devices only partly work with SDL on the 8120 (write your own code to read /dev/input/event*) but graphics work well.

AF_INET privelages

On android, you will need to add at least one group 3003 aid_inet for those processes which require access to creating sockets (other security guarded systems particular to Android may need addressing for other applications, search for 3003 aid_inet on the web for more detail).

exim4 and mailman chroot on Android

As well as altering inet access, the Debian-exim user will have to be added to group 3003. Further, if you experience trouble in the exim mainlog for creating sockets during DNS, try dropping privelages by adding "deliver_drop_privilege=true" to the exim4.conf.template file. For mailman, the standard setup is required, as per the README.Debian file in /usr/share/doc. However the user list must also be added to the group 3003 to allow it to send mail.

Running GUI along side Android

You can also try running GUI apps and desktop environments along side Android. There are a number of X11 Server apps on the Google Play store that do a great job. One such X11 app is "XServer XSDL" which is free in the Google Play store.

An example of how to get this working. Start the chroot, start the X11 Server app, add "export DISPLAY=127.0.0.1:0" to your running chroot, then start your app or desktop environment, at this point you should see it open in the X11 Server app. YMMV though, not all Android devices have the ram or cpu to run this.

Integrate the Debian boot process

Debian gives you a huge array of server software to install and run on your Android device in a chroot. It is possible to start and stop everything using the rc scripts that all daemons in Debian install. If you don't want the shutdown procedure to halt/power-off your phone, you need to remove some rc init scripts. This doesn't always work, so when you run stop in Debian, it might poweroff your phone. We got it working on Blandroid by running these commands in the debian shell (via ssh is probably the easiest):

<pre>

  • update-rc.d -f halt remove update-rc.d -f reboot remove

</pre>

On ?CyanogenMod, we had to remove a lot more scripts to prevent it from shutting down, like sendsigs. But then /etc/init.d/rc 0 no longer shutdown all of the Debian services.

<pre>

  • update-rc.d -f halt remove update-rc.d -f reboot remove update-rc.d -f sendsigs remove update-rc.d -f umountfs remove update-rc.d -f umountroot remove

</pre>

You probably want to remove all of the networking stuff from your Debian chroot and let Android handle it, otherwise you might have Debian and Android fighting over the network config. Also, you need to replace the Debian call to kill all processes, because it will also kill all Android processes. Instead projects like Lil' Debi and Crouton (Debian chroot for ChromeOS) have a custom script to kill all processes running in the chroot.

The scripts to call to start and stop everything automatically: * start: /etc/init.d/rc 2 * stop: /etc/init.d/rc 0