Nagut, nachdem Nokia maemo/meego fallen hat lassen, und sich mein N900 langsam aber stetig auflöst, bin ich nun doch auf ein Android umgestiegen. Wenn schon, dann ein Nexus und das letztjährige ist schließlich derzeit recht günstig zu haben. Meine Anforderungen – nämlich root-Rechte und einen SSH-Server – sollten damit wohl erfüllbar sein, dachte ich, bis ich merkte, dass der darauf lauffähige SSH-Server (dropbear) kein SFTP unterstützt, was aber notwendig ist, um das Nexus in meine Desktop-Umgebung einzuhängen (via Nautilus: GVFS oder SSHFS). Und openssh? Hat noch niemand geschafft auf Android zu kompilieren, soweit ich sehen kann. Also richte ich mir doch eine debian Umgebung mittels chroot ein – das hat auch gleich den Vorteil, jede verfügbare Software aus dem umfangreichen debian-Pool installieren zu können; wichtig für mich vor allem: bash und openssh-server. Erforderlich ist natürlich ein Android mit root-Zugriff und installierter busybox!
Die Anleitung. Für das Erstellen des Image, habe ich mich hier orientiert: http://www.saurik.com/id/10.
1. Image erstellen
Wem das Erstellen zu mühsam ist, oder die Möglichkeit dazu nicht hat, kann gleich zum 2. Punkt springen und das von mir erstellte Image und Script verwenden.
Zunächst die Frage nach der Größe. Ich wähle wie saurik auch 750MB – das sollte für eine umfangreiche Konsolenumgebung genügen. Mit debootstrap lässt sich ein debian-Grundsystem in einem Verzeichnis installieren. Also auf einem debian/ubuntu/wasauchimmer System:
|
|
dd if=/dev/zero of=debian.img seek=749999999 bs=1 count=1 mke2fs -F debian.img mkdir debian mount -o loop debian.img debian debootstrap --verbose --arch armel --foreign wheezy debian http://ftp.at.debian.org/debian umount debian |
Das Image “debian.img” wird ins root des SD-Speichers kopiert. Weiter geht es am Handy selbst (bequemer per adb-shell oder ssh: normaler ssh-login geht ja mit dropbear immerhin). Das debian System mounte ich nach /data/local/debian:
|
|
cd /data/local mkdir debian mknod /dev/loop0 b 7 0 mount -o loop,noatime /storage/sdcard0/debian.img /data/local/debian |
Damit ist das Image auch schon eingehängt. Sinnvollerweise empfiehlt saurik noch das Setzen einiger Umgebungsvariablen. Danach kann die Installation von debian abgeschlossen werden:
|
|
export PATH=/usr/bin:/usr/sbin:/bin:$PATH export TERM=linux export HOME=/root chroot /data/local/debian /debootstrap/debootstrap --second-stage |
devpts, proc und sysfs muss ebenfalls gelinkt werden:
|
|
mount -t devpts devpts /data/local/debian/dev/pts mount -t proc proc /data/local/debian/proc mount -t sysfs sysfs /data/local/debian/sys |
Danach kann können wir die bash-shell innerhalb der neuen Umgebung starten:
|
|
chroot /data/local/debian /bin/bash |
Einmalig müssen jetzt einige Einstellungen gesetzt werden: Ort der Paketquellen (ich wähle debian sid), mtab verlinken, root-Passwort setzen (notwendig für SSH-Login), hostnamen setzen:
|
|
echo "deb http://ftp.at.debian.org/debian/ sid main non-free contrib" > /etc/apt/sources.list apt-get update rm -f /etc/mtab ln -s /proc/mounts /etc/mtab passwd root echo localhost > /etc/hostname |
Da ich in der Umgebung auch auf die Daten des Android-Systems zugreifen will, sind die Verzeichnisse anzulegen, die später gemountet werden:
|
|
mkdir /data mkdir /factory mkdir /system |
Auch die Zeichensatz- und Tastatureinstellungen, sowie die PATH-Variable sind einmalig zu setzen/konfigurieren:
|
|
apt-get install locales console-data keyboard-configuration echo export LANG=de_AT.UTF-8 >> /root/.bashrc echo export LC_ALL=de_AT.utf8 >> /root/.bashrc echo export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin >> /root/.bashrc export LC_ALL="de_AT.utf8" dpkg-reconfigure locales dpkg-reconfigure console-data dpkg-reconfigure keyboard-configuration |
Und schließlich noch die Software installieren, die wir wollen. Bequem über aptitude, oder schnell per apt-get; danach aufräumen. Ich wähle:
|
|
apt-get install openssh-server mc aircrack-ng ettercap-text-only dnsutils nmap mlocate less perl telnet lsof apt-get clean && apt-get autoclean |
Das wars. “exit” um wieder in die Android Shell zu gelangen. Um auf die angesprochenen Partitionen “system”, “factory” und besonders “data” zugreifen zu können, müssen wir sie in das debian-chroot mounten (von außerhalb):
|
|
mount -o bind /data /data/local/debian/data mount -o bind /factory /data/local/debian/factory mount -o bind /system /data/local/debian/system |
2. Image ein- und aushängen, SSHD starten, Automatisieren
Nach einem Neustart sind die mounts natürlich verloren. Neuerliches Ein- und Aushängen soll also möglichst einfach und schnell ausführbar werden…
Die Kommandos des künftigen Einhängens lauten wie folgt:
|
|
mknod /dev/loop0 b 7 0 mount -o loop,noatime /storage/sdcard0/debian.img /data/local/debian export PATH=/usr/bin:/usr/sbin:/bin:$PATH export TERM=linux export HOME=/root mount -t devpts devpts /data/local/debian/dev/pts mount -t proc proc /data/local/debian/proc mount -t sysfs sysfs /data/local/debian/sys mount -o bind /data /data/local/debian/data mount -o bind /factory /data/local/debian/factory mount -o bind /system /data/local/debian/system |
Die Daten des “sd-storage” befinden sich (zumindest auf dem Galaxy Nexus) dann unter “/data/media”.
BASH starten, SSHD starten und stoppen:
|
|
chroot /data/local/debian /bin/bash -l /etc/init.d/ssh start /etc/init.d/ssh stop |
Und um das Image wieder auszuhängen:
|
|
umount /data/local/debian/data umount /data/local/debian/factory umount /data/local/debian/system umount /data/local/debian/dev/pts umount /data/local/debian/proc umount /data/local/debian/sys umount /data/local/debian export HOME=/data/local losetup -d /dev/loop0 |
Einfach:
Das könnte man jetzt in einzelne Shell-Skripte speichern. Da es aber ohne Hardware-Tastatur mühsam ist, selbst einzelne Scripts zu starten, wäre es komfortabel, eine GUI zum (un)mounten des Images und zum Starten verschiedener Programme innerhalb der debian-Umgebung zu programmieren, damit man sich um das oben geschriebene gar nicht mehr kümmern muss. Ich habe als quick&dirty-Lösung ein kleines Shell-Script geschrieben, das das wichtigste per Knopfdruck ausführt. Dieses rufe ich gleich mit root-Rechten als “Shell” des hervorragenden Android Terminal Emulator auf, dabei muss allerdings der “Startbefehl” leer bleiben:


Downloads:
tools.sh – speichern unter /data/local (wenn du sie zuerst auf das sdcard-Verzeichnis speicherst, verschieben: “mv /storage/sdcard0/tools.sh /data/local” … dann ausführbar machen: “chmod 700 /data/local/tools.sh”
debian.img – für die, die kein eigenes Image erstellen wollen: das nach der Beschreibung erstellte debian sid (tagesaktuell vom 20.10.2012). Speichern unter: /storage/sdcard0. root-Passwort (etwa für ssh-login) ist “fotze” – einfach zu ändern mit “passwd”.
Per Tastendruck lassen sich also damit das debian-Image mounten (m) bzw. unmounten (u); der openssh-server starten (s) bzw. stoppen (k); die Shell von Android (a) bzw. die bash innerhalb des debian-chroot (d) starten, und anderes schnell ausführen ohne viel Tipparbeit. Ja sogar ettercap funktioniert ohne Einschränkungen :-)
Das sieht dann so aus:






Anmerkung: auch bei aufrechter SSH-Verbindung über WLAN geht dieses offenbar sehr schnell in einen Energiesparmodus, womit die Verbindung sehr langsam wird. Das kann (zumindest am Galaxy Nexus mit Android 4.1) dadurch verhindert werden, indem man das Display anlässt.
Viel Spaß!