{"id":1386,"date":"2014-06-17T23:22:25","date_gmt":"2014-06-17T21:22:25","guid":{"rendered":"http:\/\/blog.rastersoft.com\/?p=1386"},"modified":"2014-06-17T23:22:25","modified_gmt":"2014-06-17T21:22:25","slug":"mejorando-debian-sobre-android","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=1386","title":{"rendered":"Mejorando Debian sobre Android"},"content":{"rendered":"<p>En la <a href=\"https:\/\/blog.rastersoft.com\/?p=1362\" target=\"_blank\">entrada anterior<\/a> expliqu\u00e9 como hice para arrancar una Debian en mi dispositivo AndroidTV. Hoy estuve retocando el c\u00f3digo para hacerlo m\u00e1s flexible y corregir algunos problemas de tipo pr\u00e1ctico que he encontrado al empezar a usarlo de manera regular.<\/p>\n<h3>Cambios en <em>launch_debian<\/em><\/h3>\n<p>El primer cambio ha sido en el propio <em>launch_debian<\/em>. Este binario es el encargado de detectar cuando se enchufa un disco externo y de lanzar la aplicaci\u00f3n <em>runlinux.sh<\/em> que est\u00e9 en su directorio ra\u00edz. El primer problema que resolv\u00ed en ella es permitir pasarle los directorios en donde montar la unidad externa, en donde buscar los dispositivos conectados, y el tipo de sistema de archivos que se quiere montar. Todo esto se puede especificar ahora desde la l\u00ednea de comandos si se desea (si no se indica nada, se utilizan los valores por defecto que coment\u00e9 en la anterior entrada).<\/p>\n<p>El segundo cambio es a\u00f1adir una FIFO para poder ejecutar comandos desde el entorno externo al <em>chroot<\/em>. El principal motivo es para poder ejecutar un apagado ordenado, pues desde dentro del entorno no se puede ejecutar, por ejemplo, un <em>shutdown -h now<\/em>. Para ello se crea la FIFO <em>\/dev\/chroot_ext_control<\/em>, que esperar\u00e1 a recibir alg\u00fan comando. De momento admite dos:<\/p>\n<ul>\n<li><em>halt<\/em> mata todos los procesos que est\u00e9n accediendo a alg\u00fan fichero en la unidad, y una vez hecho esto, la vuelve a montar como <em>s\u00f3lo-lectura<\/em>, para que no se corrompan los datos al apagar.<\/li>\n<li><em>reboot<\/em> lo mismo que <em>halt<\/em>, pero luego reinicia la m\u00e1quina<\/li>\n<\/ul>\n<p>Estos comandos se pueden emitir simplemente con <em>echo reboot &gt; \/dev\/chroot_ext_control<\/em> o <em>echo halt &gt; \/dev\/chroot_ext_control<\/em>.<\/p>\n<p><a href=\"http:\/\/www.rastersoft.com\/blogpic\/launch_debian.tar.bz2\" target=\"_blank\">El nuevo c\u00f3digo se puede descargar con este enlace<\/a>.<\/p>\n<p>Los par\u00e1metros que acepta la nueva versi\u00f3n desde la l\u00ednea de comandos son:<\/p>\n<ul>\n<li>-o opciones de montaje. La cadena que sigue se a\u00f1ade tal cual al comando <em>mount<\/em>, junto con <em>-o<\/em>. Esto permite a\u00f1adir opciones como <em>noatime<\/em>.<\/li>\n<li>-m ruta de montaje. La cadena que sigue indica la ruta donde se montar\u00e1 la unidad externa. Por defecto es <em>\/system\/debian<\/em>.<\/li>\n<li>-t tipo de sistema de ficheros. La cadena que sigue indica el tipo de sistema de ficheros que se pasar\u00e1 a <em>mount<\/em>. Por defecto es <em>ext4<\/em>.<\/li>\n<li>-c ruta de dispositivos. La cadena que sigue indica la ruta donde aparecen los ficheros de dispositivo, como <em>sda1<\/em>. Por defecto es <em>\/dev\/block<\/em>.<\/li>\n<li>-f ruta y fichero para la FIFO. La cadena que sigue indica la ruta y el fichero para la FIFO de control. Por defecto es <em>\/dev\/chroot_ext_control<\/em>.<\/li>\n<\/ul>\n<p>El motivo de poner la FIFO de control en <em>\/dev<\/em> es que, al ser un sistema de ficheros en RAM, no habr\u00e1 interferencias con otros posibles ficheros, y adem\u00e1s es accesible con el mismo nombre desde dentro y fuera del entorno <em>chroot<\/em>.<\/p>\n<h3>Cambios en el lanzador principal<\/h3>\n<p>El <em>script<\/em> situado en <em>\/system\/etc\/install-recovery.sh<\/em> tambi\u00e9n ha cambiado ligeramente. Ahora es as\u00ed:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">#!\/system\/bin\/sh\n\ncp \/system\/bin\/launch_debian \/dev\n\/dev\/launch_debian &amp;<\/pre>\n<\/div>\n<p>El motivo de hacer esto es que ahora <em>launch_debian<\/em> ya no muere al lanzar el entorno Debian, sino que sigue en marcha para responder a las peticiones de comandos emitidas a trav\u00e9s de la FIFO. Eso significa que si queremos actualizarlo no lo podemos hacer directamente, porque el fichero estar\u00e1 bloqueado. Por eso primero copiamos el ejecutable a <em>\/dev<\/em> (que tiene la ventaja de ser un disco RAM, y dado que el ejecutable es muy peque\u00f1o, no supone un desperdicio de memoria) y lo ejecutamos desde ah\u00ed: de esa forma el ejecutable original nunca se bloquea, y podemos reemplazarlo\u00a0<em>en caliente<\/em> y luego reiniciar para que se utilice la nueva versi\u00f3n.<\/p>\n<h3>Cambios en el lanzador de la jaula <em>chroot<\/em><\/h3>\n<p>El <em>script<\/em> situado en el disco duro, <em>runlinux.sh<\/em>, tambi\u00e9n ha cambiado un poco. Ahora es as\u00ed:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">#!\/system\/bin\/sh\n\n# stop the Android system\nstop\nsleep 1\n# stop the daemons to ensure that\n# they don't disturb the debian system\n# (can't kill them because INIT would\n#  relaunch them)\n# Also allows to send them to SWAP\nbusybox killall -SIGSTOP netd\nbusybox killall -SIGSTOP vold\nbusybox killall -SIGSTOP displayd\nbusybox killall -SIGSTOP ueventd\nbusybox killall -SIGSTOP debuggerd\nbusybox killall -SIGSTOP rild\nbusybox killall -SIGSTOP drmserver\nbusybox killall -SIGSTOP mediaserver\nbusybox killall -SIGSTOP installd\nbusybox killall -SIGSTOP servicemanager\n# undo changes to kernel variables\necho 0 &gt; \/proc\/sys\/kernel\/panic_on_oops\necho 18000000 &gt; \/proc\/sys\/kernel\/sched_latency_ns\necho 3000000 &gt; \/proc\/sys\/kernel\/sched_wakeup_granularity_ns\necho 0 &gt; \/proc\/sys\/vm\/overcommit_memory\necho 3000 &gt; \/proc\/sys\/vm\/dirty_expire_centisecs\necho 1024 &gt; \/dev\/cpuctl\/apps\/bg_non_interactive\/cpu.shares\necho 900000 &gt; \/dev\/cpuctl\/apps\/cpu.rt_runtime_us\necho 900000 &gt; \/dev\/cpuctl\/apps\/bg_non_interactive\/cpu.rt_runtime_us\n# mount proc, sys, dev, dev\/pts, dev\/cpuctl and \/system\nmount -o bind \/proc $1\/proc\nmount -o bind \/sys $1\/sys\nmount -o bind \/dev $1\/dev\nmount -o bind \/dev\/pts $1\/dev\/pts\nmount -o bind \/dev\/cpuctl $1\/dev\/cpuctl\nmount -o bind \/system $1\/android\nexport HOME=\/root\nexport LD_LIBRARY_PATH=\nexport PATH=\/sbin:\/bin:\/usr\/local\/sbin:\/usr\/local\/bin:\/usr\/sbin:\/usr\/bin\n# set the Framebuffer devices where standard apps expect them\ncp -a \/dev\/graphics\/* \/dev\n# launch our Debian system\n\/system\/bin\/busybox chroot $1 \/bin\/system.sh<\/pre>\n<\/div>\n<p>El primer cambio est\u00e1 en los distintos comandos <em>echo XXXXXX &gt;&#8230;<\/em>. Estos comandos pretenden restaurar los valores originales en diversas variables del n\u00facleo. Esto es porque Android est\u00e1 orientado hacia aplicaciones de usuario, por lo que, por ejemplo, le quita prioridad a las aplicaciones en segundo plano. Con estas opciones intento deshacer lo que se cambia en el fichero <em>init.rc<\/em>. Sin embargo es importante indicar que probablemente lo que cambie dependa de cada fabricante, as\u00ed que cada uno debe mirar qu\u00e9 es lo que se modifica.<\/p>\n<p>El siguiente cambio es que monto tambi\u00e9n <em>\/dev\/cpuctl<\/em>, algo que se me hab\u00eda pasado.<\/p>\n<p>Por \u00faltimo, monto el directorio <em>\/system<\/em> dentro del directorio <em>android<\/em> de la unidad montada. De esta manera se tiene acceso al sistema Android desde dentro de la jaula <em>chroot<\/em>, lo que permite, por ejemplo, actualizar el fichero <em>launch_debian<\/em>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En la entrada anterior expliqu\u00e9 como hice para arrancar una Debian en mi dispositivo AndroidTV. Hoy estuve retocando el c\u00f3digo para hacerlo m\u00e1s flexible y corregir algunos problemas de tipo pr\u00e1ctico que he encontrado al empezar a usarlo de manera regular. Cambios en launch_debian El primer cambio ha sido en el propio launch_debian. Este binario &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=1386\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Mejorando Debian sobre Android<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,7],"tags":[],"class_list":["post-1386","post","type-post","status-publish","format-standard","hentry","category-cacharreo","category-tutoriales"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/1386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1386"}],"version-history":[{"count":0,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/1386\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}