Ubuntu amb Android
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ó.
- 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.
Contingut
- 1 Permisos de superusuari (root)
- 2 Accés per terminal
- 3 Anotar l'arquitectura
- 4 Preparar l'espai
- 5 Obtenir una base de sistema operatiu
- 6 Adaptar la base
- 7 Muntar recursos d'Android
- 8 Entrar al nou sistema i establir serveis elementals
- 9 Obrir un compte d'usuari normal
- 10 Habilitar interfície gràfica
- 11 Obrir l'escriptori d'Ubuntu des d'Android
- 12 Sortida
- 13 Per repetir l'experiència
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
Instal·leu serveis i eines per evitar queixes (els paquets -ca són per la llengua catalana):
apt-get update apt-get install dbus mkdir -p /var/run/dbus apt-get install language-pack-ca
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:
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" 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 (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" 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 /sbin/m) i la resta en un script a Ubuntu (per exemple /sbin/x). D'aquesta manera, en un terminal ja només caldria fer:
su m x