Ubuntu amb Android

De GiLUG
La revisió el 22:12, 5 nov 2012 per Narcisgarcia (discussió | contribucions) (Ruta estable /system/bin)
Salta a: navegació, cerca

Català - Castellano - English


Introducció: Aquesta és una guia per fer funcionar un contenidor de Ubuntu GNU/Linux dins una sessió del sistema operatiu Android, i tenir així la funcionalitat d'un ordinador d'escriptori. És una guia molt detallada, també útil per qui vulgui crear un assistent o millorar el procediment.

Notes:

  • En el moment d'escriure aquesta guia (novembre del 2011), Canonical encara no ha enllestit la seva pròpia solució.
  • El total de descàrregues que es proposa pot arribar a 1GiB de dades; si les feu totes des de l'aparell tingueu en compte la tarifa de dades que us aplica el proveïdor d'accés a internet.
  • S'ha explorat la possibilitat d'utilitzar un contenidor LXC per tenir un contenidor completament normal, però no ha funcionat per l'ús que fa Android de bionic lic en comptes de GNU libc.

Permisos de superusuari (root)

És un requisit tenir accés "su" per administrar el sistema operatiu. Podeu veure la guia Obrir permisos amb Android

Accés per terminal

Terminal local

Sempre és recomanable tenir una aplicació de Terminal disponible per poder fer gestions amb mobilitat, però les preparacions llargues i complexes és més còmode fer-les des d'un ordinador d'escriptori controlant l'aparell connectat per USB.

Control remot

En la distribució Ubuntu GNU/Linux, a partir de la versió 12.10 al repositori universal hi ha disponible el paquet android-tools-adb que permet el control remot a un aparell amb Android en mode de depuració USB.

Per utilitzar el Android Debug Bridge (ADB) heu de tenir l'aparell en marxa, connectat per USB, i amb el mode de «Depuració d'USB» habilitat a les opcions del desenvolupador (developer) d'Android

ADB per USB
  • Per comprovar la connectivitat:
adb devices

(ha de sortir una «llista» amb un identificador estrany que digui que és un dispositiu; device)

  • Per obrir una sessió de terminal a l'aparell:
adb shell
  • Per iniciar una sessió com a superusuari (root), i tenir permisos d'administració d'Android:
su
  • Per finalitzar com a superusuari i després tancar la sessió de terminal:
exit
exit
ADB per xarxa

Moltes connexions per USB són poc estables (es tallen molt sovint i te n'adones que escrius al teu ordinador), i en aquests casos es resol per xarxa (wifi). Quan es fa això és important que l'aparell no tingui connexió directa a internet (per exemple amb l'operador telefònic) i es tracti d'una comunicació pel Wifi local.

  • Des d'Android, per veure els dispositius de xarxa que té activats:
ip route list
  • Des d'Android, per veure l'adreça IP d'un dispositiu de xarxa (per exemple wlan0):
ifconfig wlan0
  • Per establir des de l'ordinador que la comunicació serà via xarxa (per exemple a la IP 192.168.1.122):
adb connect 192.168.1.122
  • Per obrir una sessió de terminal a l'aparell:
adb shell
  • Per iniciar una sessió com a superusuari (root), i tenir permisos d'administració d'Android:
su
  • Per finalitzar com a superusuari i també tancar la sessió de terminal:
exit
exit
Notes addicionals
  • En aquesta guia, on s'indiquen instruccions escrites són per executar en una finestra de terminal local o remot.
  • Si teniu missatges de tipus «Operation not permitted» sol ser perquè no heu iniciat com a superusuari (su)

Anotar l'arquitectura

Es pot mirar quina generació de processador utilitza Android amb la instrucció:

uname -m

Si el processador ARM de l'aparell suporta coma flotant (ARMv7 o superior, per exemple armv7l seria el cas), aleshores es poden utilitzar paquets «armhf» en comptes de «armel». Això millora la velocitat d'alguns processos.

Preparar l'espai

Per a què funcionin els enllaços i accessos a dispositiu cal que el nou contenidor estigui en una partició apropiada per GNU/Linux, com per exemple Ext3 o Ext4. Amb la instrucció mount es pot veure el format de cada volum, i amb aquesta sintaxi es veu molt clar:

mount | cut -f 1-5 -d ' ' | sed -e 's/ on / /g' | sed -e 's/ type / /g' | cut -f 2-3 -d ' '

I es pot filtrar veure només les que ens interessa:

mount | cut -f 1-5 -d ' ' | sed -e 's/ on / /g' | sed -e 's/ type / /g' | cut -f 2-3 -d ' ' | sed -e '/ext.$/!d'

Una vegada vistes les rutes compatibles, cal que valoreu l'espai lliure que hi ha amb aquesta instrucció:

df

Si a l'espai lliure (Free) no s'anota la unitat de mesura (100K, 100M, 100G), vol dir que s'expressa en K (KiB). A tenir en compte també que la ruta /cache funciona «com una paperera interna» el seu contingut pot ser esborrat.

Necessiteu almenys 100MiB per una instal·lació elemental (core sol), però podem arribar a utilitzar 2 o 3GiB si instal·lem totes les grans aplicacions d'escriptori d'ús comú, apart de comptar amb una mica d'espai de treball. Igualment es poden fer instal·lacions «per totes les butxaques».

Per la resta de guia suposarem que heu escollit la partició /data, i aleshores el nou sistema operatiu el poseu a /data/ubuntu. Heu d'habilitar doncs els permisos d'escriptura, execució, dispositius i superusuari a la partició, i crear el subdirectori:

mount -o remount,rw,dev,exec,suid,noatime /data
PuntArrel="/data/ubuntu"
mkdir "$PuntArrel"
cd "$PuntArrel"

Obtenir una base de sistema operatiu

Aquesta seria la manera de construïr-lo des d'un altre ordinador (suposant arquitectura per armhf):

sudo debootstrap --verbose --arch=armhf --foreign precise precise-armhf
  • Per transportar l'arbre de directoris d'un dispositiu a un altre, cal copiar-ho amb permisos de superusuari, per tal que els atributs i propietaris de fitxers i directoris no es perdin pel camí. Per obrir així un explorador de carpetes amb Ubuntu, es pot executar (Alt+F2) «gksudo nautilus».

Però aquí també proposem la manera de fer-ho completament des de l'aparell amb Android: descarregant una base preparada (del web oficial) amb només una d'aquestes instruccions, segons la versió i variant que necessiteu (es publicaran més versions a cdimage.ubuntu.com):

wget http://cdimage.ubuntu.com/ubuntu-core/releases/quantal/release/ubuntu-core-12.10-core-armhf.tar.gz
wget http://cdimage.ubuntu.com/ubuntu-core/releases/precise/release/ubuntu-core-12.04.1-core-armhf.tar.gz
wget http://cdimage.ubuntu.com/ubuntu-core/releases/oneiric/release/ubuntu-core-11.10-core-armel.tar.gz
wget http://cdimage.ubuntu.com/releases/precise/release/ubuntu-12.04-preinstalled-desktop-armhf+ac100.tar.gz
wget http://cdimage.ubuntu.com/releases/oneiric/release/ubuntu-11.10-preinstalled-desktop-armel+ac100.tar.gz

Nota: Les «preinstaled» porten tot el programari d'una instal·lació típica, però també elements que cal netejar per engegar el contenidor.

Amb el fitxer descarregat, toca desempaquetar-lo:

tar -xzf ubuntu-core-12.04.1-core-armhf.tar.gz
rm ubuntu-core-12.04.1-core-armhf.tar.gz

Adaptar la base

Corregiu alguns enllaços dins el directori de la base, per adequar-los més a la situació:

if [ -d /acct ] ; then mkdir -p acct ; fi
cd var
if [ -L run ] ; then rm run ; ln -s ../run run ; fi
if [ -L lock ] ; then rm lock ; ln -s ../run/lock lock ; fi
cd "$PuntArrel"

Netegeu directoris que de vegades venen amb contingut per una instal·lació nadiua (aquest pas potser no sigui imprescindible):

if [ -d proc ] ; then rm -R proc/* ; fi
if [ -d dev ] ; then rm -R dev/* ; fi
if [ -d sys ] ; then rm -R sys/* ; fi

Muntar recursos d'Android

mount -o bind "/proc" "$PuntArrel/proc"
mount -o bind "/dev" "$PuntArrel/dev"
mount -o bind "/dev/pts" "$PuntArrel/dev/pts"
mount -o bind "/sys" "$PuntArrel/sys"
if [ -d /acct ] ; then mount -o bind "/acct" "$PuntArrel/acct" ; fi
if [ -d /dev/cpuctl ] ; then mount -o bind "/dev/cpuctl" "/data/amoreos/precise-preinstaled/dev/cpuctl" ; fi

Si voleu fer disponibles les carpetes d'usuari d'Android, cal mirar quines particions hi ha muntades. Es pot fer amb un simple mount o amb aquesta instrucció que simplifica la informació:

mount | sed -e '/ \/mnt\//!d' | sed -e '/^\//!d' | cut -f 2,3 -d ' ' | cut -f 2- -d '/' | cut -f 1 -d ' ' | sed -e 's/^/\//g'

Si per exemple volem muntar /mnt/sdcard fem:

mkdir -p "$PuntArrel/mnt/sdcard"
mount -o bind "/mnt/sdcard" "$PuntArrel/mnt/sdcard"

Entrar al nou sistema i establir serveis elementals

Des de la incorporació del sistema d'inici de serveis Upstart, els contenidors Chroot no inicien els serveis com una instal·lació normal, i cal fer-ho manualment.

chroot "$PuntArrel" /bin/su
mount -a

Assegurar-se que hi figuri alguna cosa muntada, per a què no fallin algunes utilitats:

if [ "$(mount)" = "" ] ; then mount -o bind /selinux /selinux ; fi

Completar el debootstrap si és el cas, a la mateixa arquitectura:

if [ -x /debootstrap/debootstrap ] ; then /debootstrap/debootstrap --second-stage ; fi

Pedaç per evitar error d'inici de serveis Upstart:

dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl

Configureu la xarxa:

echo "nameserver 4.2.2.2" > /etc/resolv.conf
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
echo "nameserver 8.8.4.4" >> /etc/resolv.conf
echo "127.0.0.1 localhost" > /etc/hosts

Comproveu si hi ha repositoris establerts:

cat /etc/apt/sources.list

(Si no hi havia res, o els «universe» estan deshabilitats amb #, escriviu-los amb les següents instruccions)

echo "deb http://ports.ubuntu.com/ precise main universe" > /etc/apt/sources.list
echo "# deb-src http://ports.ubuntu.com/ precise main universe" >> /etc/apt/sources.list
echo "" >> /etc/apt/sources.list
echo "deb http://ports.ubuntu.com/ precise-updates main universe" >> /etc/apt/sources.list
echo "# deb-src http://ports.ubuntu.com/ precise-updates main universe" >> /etc/apt/sources.list
echo "" >> /etc/apt/sources.list
echo "deb http://ports.ubuntu.com/ precise-security main universe" >> /etc/apt/sources.list
echo "# deb-src http://ports.ubuntu.com/ precise-security main universe" >> /etc/apt/sources.list
apt-get update

Instal·leu serveis i eines per evitar queixes (els paquets -ca són per la llengua catalana):

Nota: si apareix algun requadre de pregunta o missatge, es canvia d'opció amb el TABulador i es polsen els botons amb l'espai.
apt-get install dbus
mkdir -p /var/run/dbus
apt-get install language-pack-ca
update-locale
LlenguaPredeterminada="ca_ES.UTF-8"
export LANG="$LlenguaPredeterminada"
export LANGUAGE="$LlenguaPredeterminada"
echo "LANG=\"$LlenguaPredeterminada\"" >> /etc/default/locale
echo "LANGUAGE=\"$LlenguaPredeterminada\"" >> /etc/default/locale

Inicieu el servei DBus del qual en depenen moltes aplicacions (no es pot aprofitar el d'Android):

DbusPid="$(dbus-daemon --system --print-pid --fork)"

Instal·leu escriptori i aplicacions que us interessi. Aquest procés pot trigar MOLT:

apt-get install sudo ubuntu-desktop libreoffice libreoffice-l10n-ca

Obrir un compte d'usuari normal

Utilitzant l'escriptori i aplicacions com a usuari normal (no root) millora la seguretat i l'admissió per part d'alguns components que ho requereixen.

cp -a /etc/adduser.conf /etc/adduser.conf.bak
cat /etc/adduser.conf.bak | sed -e 's/^#EXTRA_GROUPS=/EXTRA_GROUPS=/g' > /etc/adduser.conf
NomUsuari=usuari
adduser --add_extra_groups --gecos "" $NomUsuari

Incloure el nou compte ($NomUsuari) al grup comú d'usuaris i grups d'administració que hi hagi:

usermod --append --groups users $NomUsuari
usermod --append --groups sudo $NomUsuari
usermod --append --groups adm $NomUsuari
usermod --append --groups admin $NomUsuari

Crear un grup especial on incloure-hi l'usuari, per a què pugui obrir ports d'entrada.

addgroup --gid 3003 sockets
usermod --append --groups sockets $NomUsuari

Habilitar interfície gràfica

Tot i que ja ha aparegut alguna eina X-Server per utilitzar aplicacions en pantalla directament sense control remot, de moment exposem el mètode tradicional 2011-2012 (suposant que la pantalla de l'aparell té una resolució de 1280x720):

apt-get install xvfb x11vnc xtightvncviewer
if [ "$Copyrect" = "" ] ; then CrOptions="-nowirecopyrect -noscrollcopyrect" ; else CrOptions="-ncache" ; fi
MesOpcions="-create -localhost -xrandr $CrOptions -rfbport 5900 -nopw -forever -permitfiletransfer -nevershared -scale 1/1"
echo "x11vnc $MesOpcions -env FD_GEOM=${1:-1280x720x16} -afteraccept 'x-session-manager &' -logfile '.x11vnc.log'" > /tmp/xvnc.sh
chmod a+rx /tmp/xvnc.sh
su -l $NomUsuari -c /tmp/xvnc.sh

Es quedarà esperant connexions (veureu PORT=5900). Cal no tancar aquest terminal mentre es vulgui tenir Ubuntu disponible.

Obrir l'escriptori d'Ubuntu des d'Android

Es pot utilitzar qualsevol programa de control remot per VNC, que es pot trobar fàcilment amb el gestor de paquets F-Droid.

Es connecta a l'adreça localhost i amb el port normal 5900. Sense usuari (nickname) ni tampoc contrasenya (password). Teniu un accés prou segur perquè només admetrà connexions des del mateix aparell.

Sortida

Si voleu tornar a utilitzar Android n'hi ha prou amb tancar el VNC, o símplement minimitzar-lo per fer altres coses. Si atureu l'aparell amb Android no passa res; és com si també aturéssiu l'escriptori d'Ubuntu com si fos un ordinador.

Si voleu aturar el sistema Ubuntu sense aturar ni reiniciar Android, heu de sortir de la sessió del mateix escriproti d'Ubuntu, igual com si ho fessiu d'un ordinador normal: amb el botó d'aturar l'ordinador, però l'opció de sortir com a usuari. Si veieu una finestra de terminal també tancant-la es finalitza la sessió. Amb les següents indicacions fareu una sortida completament neta.

Aturar serveis: A la finestra de Terminal on teníeu el x11vnc esperant connexions, si aquest encara espera, el podeu interrompre amb {Control} + {C}. Després la resta:

kill $DbusPid
rm -f /var/run/dbus/pid
if [ "$(mount | grep -e "/selinux")" != "" ] ; then umount /selinux ; fi
umount -a
exit

Si per exemple heu muntat la carpeta d'Android /mnt/sdcard :

umount "$PuntArrel/mnt/sdcard"
if [ -d /dev/cpuctl ] ; then umount "/data/amoreos/precise-preinstaled/dev/cpuctl" ; fi
if [ -d /acct ] ; then umount "$PuntArrel/acct" ; fi
umount "$PuntArrel/sys"
umount "$PuntArrel/dev/pts"
umount "$PuntArrel/dev"
umount "$PuntArrel/proc"
exit
exit

Per repetir l'experiència

  • Si no heu finalitzat la sessió dins Ubuntu, símplement podeu tornar a connectar amb el programa-client de VNC.
  • El millor, és clar és poder tenir icones directes a l'escriptori, tant per muntar el contenidor com per connectar amb l'escriptori per VNC. Aquest wiki agraïrà molt les aportacions sobre aquest tema.

En altres casos, com per exemple que hagueu aturat l'aparell o finalitzat Ubuntu completament, escriviu aquestes instruccions en una finestra de Terminal (dades del mateix exemple d'aquesta pàgina, que cal personalitzar):

su
mount -o remount,rw,dev,exec,suid,noatime /data
PuntArrel="/data/ubuntu"
mount -o bind "/proc" "$PuntArrel/proc"
mount -o bind "/dev" "$PuntArrel/dev"
mount -o bind "/dev/pts" "$PuntArrel/dev/pts"
mount -o bind "/sys" "$PuntArrel/sys"
if [ -d /acct ] ; then mount -o bind "/acct" "$PuntArrel/acct" ; fi
if [ -d /dev/cpuctl ] ; then mount -o bind "/dev/cpuctl" "/data/amoreos/precise-preinstaled/dev/cpuctl" ; fi
mount -o bind "/mnt/sdcard" "$PuntArrel/mnt/sdcard"
chroot "$PuntArrel" /bin/su
mount -a
if [ "$(mount)" = "" ] ; then mount -o bind /selinux /selinux ; fi
DbusPid="$(dbus-daemon --system --print-pid --fork)"
NomUsuari=usuari
if [ "$Copyrect" = "" ] ; then CrOptions="-nowirecopyrect -noscrollcopyrect" ; else CrOptions="-ncache" ; fi
MesOpcions="-create -localhost -xrandr $CrOptions -rfbport 5900 -nopw -forever -permitfiletransfer -nevershared -scale 1/1"
echo "x11vnc $MesOpcions -env FD_GEOM=${1:-1280x720x16} -afteraccept 'x-session-manager &' -logfile '.x11vnc.log'" > /tmp/xvnc.sh
chmod a+rx /tmp/xvnc.sh
su -l $NomUsuari -c /tmp/xvnc.sh

Connectar amb l'aplicació-client de VNC a l'adreça localhost i amb el port normal 5900. Sense usuari ni tampoc contrasenya.

Evidentment el millor és tenir les instruccions scripts (fitxers de text executables): del primer «mount» fins al «chroot» en un script a Android (per exemple /system/bin/m) i la resta en un script a Ubuntu (per exemple /system/bin/x). D'aquesta manera, en un terminal ja només caldria fer:

su
m
x

Com veure les coses més grans

Hi ha aparells de butxaca que tenen una gran densitat de punts en una pantalla tàctil, és a dir, molta resolució en una pantalla tant petita. Aprofitar tota la resolució en aquestes situacions fa difícil encertar els elements de l'escriptori amb el dit.

Si amb l'exemple d'aquesta guia volem veure les coses el doble de grans, canviem la resolució de 1280x720 per 640x360, i l'escala de 1/1 per 2/1. Això significa dividir per 2 la resolució i augmentar la petita imatge al doble per a què igualment empleni la pantalla. L'operació es pot fer en qualsevol proporció; aquí un exemple per per-ho a dos terços (que implica un 50% d'augment):

MesOpcions="-create -localhost -xrandr $CrOptions -rfbport 5900 -nopw -forever -permitfiletransfer -nevershared -scale 3/2"
echo "x11vnc $MesOpcions -env FD_GEOM=${1:-853x480x16} -afteraccept 'x-session-manager &' -logfile '.x11vnc.log'" > /tmp/xvnc.sh

1280/3x2 = 853 ; 720/3x2 = 480 ; escala 3/2