Superposar directoris sobre Android

De GiLUG
La revisió el 11:33, 3 abr 2013 per Narcisgarcia (discussió | contribucions)
(dif) ← Versió més antiga | Versió actual (dif) | Versió més nova → (dif)
Salta a: navegació, cerca

Català - Castellano - English


Introducció: Android és un sistema operatiu al qual l'empresa Google li ha retallat molt les eines per administrar Linux com un sistema GNU. Per esmenar la mancança de Chroot podem superposar directoris de sistemes operatius GNU/Linux. Aquesta guia ajuda a fer aquesta «debianització» amb Ubuntu.

Notes:

  • Amb aquest procediment (tal com és el 2012), Android ja no troba el contingut esperat en alguns dels directoris (com /etc o /lib), i és normal que no funcioni bé. Per tornar a la situació anterior, cal aturar i tornar a engegar l'aparell.

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 (que es pot obtenir lliurement amb F-Droid) 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. També hi ha un repositori independent que proporciona android-tools per anteriors versions.

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 mostrar 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 (default... dev -->):
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 ser executades en una finestra de terminal local o remot.
  • Si obteniu 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 una de les següents instruccions:

uname -m
cat /proc/cpuinfo

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. Aquí un exemple de la informació que pot donar (en negreta la informació que ens interessa):

rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/platform/omap/omap_hsmmc.1/by-name/FACTORYFS /system ext4 ro,relatime,barrier=1,data=ordered 0 0
/dev/block/platform/omap/omap_hsmmc.1/by-name/DATAFS /data ext4 rw,nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc,discard 0 0
/dev/block/platform/omap/omap_hsmmc.1/by-name/CACHE /cache ext4 rw,nosuid,nodev,noatime,errors=panic,barrier=1,nomblk_io_submit,data=ordered 0 0
/dev/block/platform/omap/omap_hsmmc.1/by-name/EFS /efs ext4 rw,relatime,barrier=1,data=ordered 0 0
/sys/kernel/debug /sys/kernel/debug debugfs rw,relatime 0 0
/dev/fuse /mnt/sdcard fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

(s'ha destacat cada ruta d'accés per l'usuari i el format de cada partició)

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» i el seu contingut pot ser esborrat.

Necessiteu almenys 100MiB per una instal·lació elemental (core sol), o cap a 250MiB per un debootstrap, però es pot arribar a utilitzar 2 o 3GiB si instal·leu 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 Ubuntu 12.10 per arquitectura amb armhf) en una partició Ext2/Ext3:

sudo debootstrap --verbose --arch=armhf --foreign quantal ubuntu

Alternativa: Podeu descarregar un paquet .tar.gz en un altre ordinador i desempaquetar-lo també amb permisos de superusuari:

(es publicaran més versions a cdimage.ubuntu.com, i altres distribucions tenen equivalents)

Copieu la carpeta sencera:

A) En una memòria externa de format Ext2/Ext3 per després ficar-la a l'aparell i copiar des d'allà a /data/ubuntu. 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».
B) Mitjançant adb directament al directori de destinació de l'aparell, i fer crear els directoris buits:
DirAparell="/data/ubuntu"
DirDesempaquetat="ubuntu-core-12.10-core-armhf"
adb push "$DirDesempaquetat" "$DirAparell"
cd "$DirDesempaquetat"
Dirs="$(find . -type d)"
for Actual in $Dirs ; do if [ "$(ls $Actual)" = "" ] ; then echo "mkdir -p \"$DirAparell/$Actual\"" >> /tmp/mkdirs.tmp ; fi ; done
adb push /tmp/mkdirs.tmp "$DirAparell"
adb shell su -c $DirAparell/mkdirs.tmp
adb shell su -c rm $DirAparell/mkdirs.tmp
rm /tmp/mkdirs.tmp
cd ..

Adaptar la base

A l'aparell d'Android, corregiu alguns enllaços dins el directori de la base, per adequar-los més a la situació:

su
PuntArrel="/data/ubuntu"
cd "$PuntArrel"
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 directoris sobre Android

Munteu els directoris d'interès, i obriu una sessió com a usuari d'Ubuntu (root)

mount -o remount,rw /
Directoris="bin etc lib sbin usr var"
if [ ! -d /tmp ] && [ -d tmp ] ; then Directoris="$Directoris tmp" ; fi
if [ -x debootstrap/debootstrap ] ; then Directoris="$Directoris debootstrap" ; fi
for Actual in $Directoris ; do mkdir -p "/$Actual" ; mount -o bind "$PuntArrel/$Actual" "/$Actual" ; done
/bin/su
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:$PATH"

Restabliu el propietari (root) de l'arbre de directoris:

chown -R 0:0 .

Completeu 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 (per confirmar si és necessari):

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 (exemple per Ubuntu 12.10, anomenat «quantal»):

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/ quantal main universe" > /etc/apt/sources.list
echo "# deb-src http://ports.ubuntu.com/ quantal main universe" >> /etc/apt/sources.list
echo "" >> /etc/apt/sources.list
echo "deb http://ports.ubuntu.com/ quantal-updates main universe" >> /etc/apt/sources.list
echo "# deb-src http://ports.ubuntu.com/ quantal-updates main universe" >> /etc/apt/sources.list
echo "" >> /etc/apt/sources.list
echo "deb http://ports.ubuntu.com/ quantal-security main universe" >> /etc/apt/sources.list
echo "# deb-src http://ports.ubuntu.com/ quantal-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 wireless-tools
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)"