Superponer directorios sobre Android

De GiLUG
Dreceres ràpides: navegació, cerca

Català - Castellano - English


Introducción: Android es un sistema operativo al que la empresa Google le ha recortado mucho las herramientas para administrar Linux como un sistema GNU. Para enmendar la falta de Chroot podemos superponer directorios de sistemas operativos GNU/Linux. Esta guía ayuda a hacer esta «debianización» con Ubuntu.

Notas:

  • Con este procedimiento (tal como es en 2012), Android ya no encuentra el contenido esperado en algunos directorios (como /etc o /lib), y es normal que no funcione bien. Para volver a la situación anterior, hay que detener y volver a iniciar el aparato.

Permisos de superusuario (root)

Es un requisito tener acceso "su" para administrar el sistema operativo. Puede ver la guía Abrir permisos en Android

Acceso por terminal

Terminal local

Siempre es recomendable tener una aplicación de Terminal (que se puede obtener libremente con F-Droid) disponible para poder hacer gestiones con mobilidad, pero las preparaciones largas y complejas es más comodo hacerlas desde un ordenador de escritorio controlando el aparato conectado por USB.

Control remoto

En la distribución Ubuntu GNU/Linux, a partir de la versión 12.10 en el repositorio universal hay disponible el paquete android-tools-adb que permite el control remoto a un aparato con Android en modo de depuración USB. Tambien hay un repositorio independente que proporciona android-tools para anteriores versiones.

Para utilizar el Android Debug Bridge (ADB) debe tener el aparato en marcha, conectado por USB, y con el modo de «Depuración de USB» habilitado en las opciones del desarrollador (developer) de Android.

ADB por USB
  • Para comprobar la conectividad:
adb devices

(debe mostrar una «lista» con un identificador raro que diga que es un dispositivo; device)

  • Para abrir una sesión de terminal en el aparato:
adb shell
  • Para iniciar una sesión como superusuario (root), y tener permisos de administración de Android:
su
  • Para finalizar como superusuario y después cerrar la sesión de terminal:
exit
exit
ADB por red

Muchas conexiones por USB son poco estables (se cortan muy a menudo y te das cuenta que escribes en tu ordenador), y en estos casos se resuelve por red (wifi). Cuando se hace esto es importante que el aparato no tenga conexión directa a internet (por ejemplo con el operador telefónico) y se trate de una comunicación por el Wifi local.

  • Desde Android, para ver los dispositivos de red que tiene activados (default... dev -->):
ip route list
  • Desde Android, para ver la dirección IP de un dispositivo de red (por ejemplo wlan0):
ifconfig wlan0
  • Para establecer desde el ordenador que la comunicación será via red (por ejeplo a la IP 192.168.1.122):
adb connect 192.168.1.122
  • Para abrir una sesión de terminal al aparato:
adb shell
  • Para iniciar una sesión como superusuario (root), y tener permisos de administración de Android:
su
  • Para finalizar como superusuario y después cerrar la sesión de terminal:
exit
exit
Notas adicionales
  • En esta guia, en donde se indican instrucciones escritas son para ser ejecutadas en una ventana de terminal local o remoto.
  • Si obtiene mensajes de tipo «Operation not permitted» suele ser porque no ha iniciado como superusuario (su)

Anotar la arquitectura

Se puede mirar qué generación de procesador utiliza Android con una de las siguientes instrucciones:

uname -m
cat /proc/cpuinfo

Si el procesador ARM del aparato soporta coma flotante (ARMv7 o superior, por ejemplo armv7l seria el caso), entonces se pueden utilizar paquetes «armhf» en lugar de «armel». Esto mejora la velocidad de algunos procesos.

Preparar el espacio

Para que funcionen los enlaces y accesos a dispositivo es necesario que el nuevo contenedor esté en una partición apropiada para GNU/Linux, como por ejemplo Ext3 o Ext4. Con la instrucción mount se puede ver el formato de cada volumen. Aquí un ejemplo de la información que puede dar (en negrita la información que nos interesa):

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

(se ha destacado cada ruta de acceso para el usuario y el formato de cada partición)

Una vez vistas las rutas compatibles, debe valorar el espacio libre que hay con esta instrucción:

df

Si en el espacio libre (Free) no se anota la unidad de medida (100K, 100M, 100G), significa que se expresa en K (KiB). A tener en cuenta tambien que la ruta /cache funciona «como una papelera interna» y su contenido puede ser borrado.

Necesita almenos 100MiB para una instalación elemental (core solo), o cerca de 250MiB para un debootstrap, pero se puede llegar a utilizar 2 o 3GiB si instala todas las grandes aplicaciones de escritorio de uso común, aparte de contar con un poco de espacio de trabajo. Igualmente se pueden hacer instalaciones «para todos los bolsillos».

Para el resto de guía supondremos que ha escogido la partición /data, y entonces el nuevo sistema operativo lo pone en /data/ubuntu. Debe habilitar entonces los permisos de escritura, ejecución, dispositivos y superusuario en la partición, y crear el subdirectorio:

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

Obtener una base de sistema operativo

Esta seria la manera de construirlo desde otro ordenador (suponiendo Ubuntu 12.10 para arquitectura con armhf) en una partición Ext2/Ext3:

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

Alternativa: Puede descargar un paquete .tar.gz en otro ordenador y desempaquetarlo tambien con permisos de superusuario:

(se publicaran más versiones en cdimage.ubuntu.com, y otras distribuciones tienen equivalentes)

Compie la carpeta entera:

A) En una memoria externa de formato Ext2/Ext3 para después meterla en el aparato y copiar desde ahí en /data/ubuntu. Para transportar el árbol de directorios de un dispositivo a otro, se debe copiar con permisos de superusuario, para que los atributos y propietarios de ficheros y directorios no se pierdan por el camino. Para abrir así un explorador de carpetas con Ubuntu, se puede ejecutar (Alt+F2) «gksudo nautilus».
B) Mediante adb directamente al directorio de destino del aparato, y haciendo crear los directorios vacíos:
DirAparato="/data/ubuntu"
DirDesempaquetado="ubuntu-core-12.10-core-armhf"
adb push "$DirDesempaquetado" "$DirAparato"
cd "$DirDesempaquetado"
Dirs="$(find . -type d)"
for Actual in $Dirs ; do if [ "$(ls $Actual)" = "" ] ; then echo "mkdir -p \"$DirAparato/$Actual\"" >> /tmp/mkdirs.tmp ; fi ; done
adb push /tmp/mkdirs.tmp "$DirAparato"
adb shell su -c $DirAparato/mkdirs.tmp
adb shell su -c rm $DirAparato/mkdirs.tmp
rm /tmp/mkdirs.tmp
cd ..

Adaptar la base

En el aparato de Android, corrija algunos enlaces dentro del directorio de la base, para adecuarlos más a la situación:

su
PuntoRaiz="/data/ubuntu"
cd "$PuntoRaiz"
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 "$PuntoRaiz"

Limpie directorios que a veces vienen con contenido para una instalación nativa (este paso quizás no sea 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

Montar directorios sobre Android

Monte los directorios de interés, y abra una sesión como usuario de Ubuntu (root)

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

Restablezca el propietario (root) del árbol de directorios:

chown -R 0:0 .

Complete el debootstrap si es el caso, en la misma arquitectura:

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

Parche para evitar error de inicio de servicios Upstart (por confirmar si es necesario):

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

Configure la red:

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

Compruebe si hay repositorios establecidos (ejemplo para Ubuntu 12.10, llamado «quantal»):

cat /etc/apt/sources.list

(Si no había nada, o los «universe» estan deshabilitados con #, escríbalos con las siguientes instrucciones)

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

Instale servicios y herramientas para evitar quejas (los paquetes -es son para el idioma castellano):

Nota: si aparece algún cuadro de pregunta o mensaje, se cambia de opción con el TABulador y se pulsan los botones con el espacio.
apt-get install dbus wireless-tools
mkdir -p /var/run/dbus
apt-get install language-pack-es
update-locale
IdiomaPredeterminado="es_ES.UTF-8"
export LANG="$IdiomaPredeterminado"
export LANGUAGE="$IdiomaPredeterminado"
echo "LANG=\"$IdiomaPredeterminado\"" >> /etc/default/locale
echo "LANGUAGE=\"$IdiomaPredeterminado\"" >> /etc/default/locale

Inicie el servicio DBus del que dependen muchas aplicaciones (no se puede aprovechar el de Android):

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