21 votos

¿Es posible arrancar un teléfono Android desde una unidad USB?

¿Existe alguna forma de arrancar un teléfono Android* desde una unidad USB alimentada por bus**? En caso afirmativo, ¿cuáles son los pasos para lograrlo?

* Por ejemplo, uno con funcionalidad USB OTG.

** Por ejemplo, una unidad flash.

26voto

Nick Pierpoint Puntos 7976

Por favor aclare cuál es el objetivo previsto y por qué?

Los teléfonos Android tienen sus propios boot-loaders y no pueden ser anulados por otros medios.

No es como la BIOS de una PC donde puedes cambiar el orden de inicio para arrancar desde ciertos dispositivos como la red PXE, USB, H.D.D Primario/Secundario...

Editar:

Después de los comentarios a continuación, y en relación con la pregunta del OP

¿Hay alguna manera de arrancar un teléfono Android (por ejemplo, uno con funcionalidad USB OTG) a través de una unidad USB alimentada por bus?

El boot-loader genérico (*que reside en el conjunto de chips) no tiene conocimiento de USB, etc., ya que el lk (Little Kernel) está más preocupado por atrapar pulsaciones de teclas para cargar en cadena en la recuperación o arrancar directamente en el entorno Android (Cuando se mantiene pulsada la tecla Vol+Abajo en este caso) - en pseudo-código (esto es desde el contexto/aspecto de lk, y también las direcciones de memoria relacionadas con cómo leer las particiones están codificadas en duro en este lk para que sepa cómo procesar la lógica!)

El kernel lk es el estándar de facto de Qualcomm para los conjuntos de chips MSM (Snapdragon) y adoptado por fabricantes como Sony, Motorola, LG, Samsung y se puede encontrar en la fuente AOSP bajo bootable/bootloader.

si (¿Se ha presionado la tecla de volumen abajo?) entonces

  • cargar en cadena el kernel desde la partición /recovery en una dirección específica en la memoria y saltar a ella y comenzar la ejecución, poniendo en marcha el entorno de recuperación

sino

  • cargar en cadena el kernel desde la partición /system en una dirección específica en la memoria y saltar a ella y comenzar la ejecución para poner en marcha el entorno Android.

fin si.

Dado que el kernel dentro de lk es bastante limitado, considerando que la imagen binaria del kernel está grabada en el chip y por lo tanto no se puede modificar. También debería mencionarse que lk contiene el protocolo fastboot en preparación para flashear las particiones /boot, /recovery, /system y /data. Hay dos secuencias de arranque, arranque primario y arranque secundario de la siguiente manera:

  • Arranque Primario -> lk (dependiendo del resultado de la lógica)
  • Ir a Arranque Secundario -> /boot o /recovery

Nota: Samsung tiene predilección por el PBL/SBL (que son el Cargador de Arranque Primario y el Cargador de Arranque Secundario, respectivamente) en su jerga cuando se trata de modificación. Lo curioso de Samsung es que, en algunos dispositivos, el PBL y el SBL pueden estar encriptados (Samsung Wave GT-S8500 es un ejemplo de eso, donde portar Android a él era casi imposible debido a la DRM dentro de los cargadores de arranque, lo cual era una pesadilla para tratar y hacía que modificarlo fuera extremadamente difícil, no obstante, está funcionando más o menos a través de un exploit en el código FOTA!)

Por eso no hay facilidades adicionales como la funcionalidad OTG u cualquier otra cosa como comunicaciones serie, lectura desde SDCard, gráficos, etc., ya que haría que el kernel lk fuera más grande de lo previsto. En otras palabras, es el tamaño de kernel más pequeño posible destinado a hacer que el pseudo-código anterior funcione.

También, otra forma de verlo es esta, y esto depende de la versión de Android - la funcionalidad USB OTG se activa completamente dentro del entorno Android, es decir, cuando aparece la pantalla de inicio habitual, entonces la funcionalidad de OTG está habilitada. Desafortunadamente, no es el caso cuando se mira desde la perspectiva de lk.

Si tienes curiosidad, aquí está la entrada de Qualcomm sobre el mencionado lk que es una parte del pequeño código C que tiene incluida la ensambladora ARM y se encuentra en la fuente AOSP de JellyBean en bootable/bootloader/legacy/usbloader/main.c

int boot_linux_from_flash(void)
{
    boot_img_hdr *hdr = (void*) raw_header;
    unsigned n;
    ptentry *p;
    unsigned offset = 0;
    const char *cmdline;

    if((p = flash_find_ptn("boot")) == 0) {
        cprintf("NO BOOT PARTITION\n");
        return -1;
    }

    if(flash_read(p, offset, raw_header, 2048)) {
        cprintf("CANNOT READ BOOT IMAGE HEADER\n");
        return -1;
    }
    offset += 2048;

    if(memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
        cprintf("INVALID BOOT IMAGE HEADER\n");
        return -1;
    }

    n = (hdr->kernel_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));
    if(flash_read(p, offset, (void*) hdr->kernel_addr, n)) {
        cprintf("CANNOT READ KERNEL IMAGE\n");
        return -1;
    }
    offset += n;

    n = (hdr->ramdisk_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));
    if(flash_read(p, offset, (void*) hdr->ramdisk_addr, n)) {
        cprintf("CANNOT READ RAMDISK IMAGE\n");
        return -1;
    }
    offset += n;

    dprintf("\nestado del kernel @ %x (%d bytes)\n", hdr->kernel_addr, hdr->kernel_size);
    dprintf("estado del ramdisk @ %x (%d bytes)\n\n\n", hdr->ramdisk_addr, hdr->ramdisk_size);

    if(hdr->cmdline[0]) {
        cmdline = (char*) hdr->cmdline;
    } else {
        cmdline = board_cmdline();
        if(cmdline == 0) {
            cmdline = "mem=50M console=null";
        }
    }
    cprintf("comando = '%s'\n", cmdline);

    cprintf("\nArrancando Linux\n");

    create_atags(ADDR_TAGS, cmdline,
                 hdr->ramdisk_addr, hdr->ramdisk_size);

    boot_linux(hdr->kernel_addr);
    return 0;
}

0 votos

Problema del huevo/gallina aquí: Yo quería una respuesta a mi pregunta para poder reducir los casos de uso basados en la viabilidad; me estás pidiendo que dé los casos de uso primero :) Entonces, solo puedo clarificar vagamente mis objetivos por ahora. Uno de ellos podría ser lograr algo como la encriptación completa del disco al arrancar desde una unidad USB encriptada por hardware (Lok-It/dataShur/etc), de manera que al ingresar un código en la unidad se evite la necesidad de ingresar una contraseña de desencriptación en el dispositivo Android. Idealmente esto podría hacerse de tal manera que, una vez que el teléfono esté arrancado, la unidad pueda ser retirada, dejando el teléfono funcionando correctamente hasta el próximo reinicio.

0 votos

Correcto... Interesante, nunca había oído hablar de un caso así- de todos modos- ¿por qué? Algo para reflexionar, ¿dónde ingresarías un código de acceso así? Android ICS en adelante tiene la capacidad de cifrar todo el volumen si no me equivoco- ¿No has investigado eso?

0 votos

El código de acceso se introduciría utilizando el teclado incorporado en la unidad. (Si no sabes a qué me refiero con esto, busca las unidades que mencioné). Sí, he investigado sobre la encriptación incorporada en Android, pero (a) no está libre de inconvenientes (ver, por ejemplo, security.stackexchange.com/q/10529; v.gd/6hOcmd), (b) no funciona en todos los teléfonos, incluso en aquellos que tienen ROMs ICS+ disponibles de los fabricantes (por ejemplo, algunos modelos Xperia), y (c) existen otros posibles casos de uso en los que ser capaz de arrancar un teléfono/tableta desde un dispositivo de almacenamiento masivo USB sería deseable.

9voto

Es posible en cierto sentido, sin embargo. Dadas las limitaciones mencionadas en la respuesta de @t0mm13b, tiene sentido que el cargador de arranque mencionado (lk) no sea capaz de hacer esto. Por lo tanto, arrancamos un kernel personalizado desde fastboot (para pruebas), que arranca, habilita la funcionalidad de OTG y una vez que se encuentra un kernel válido en el dispositivo OTG conectado, lo carga en memoria y le pasa el control. Esto probablemente incluso podría integrarse en recuperaciones personalizadas modernas como TWRP que tienen soporte tanto para OTG como (en algunos casos) MultiROM.

Esto ha sido utilizado para arrancar Ubuntu en una tablet Nexus 9, utilizando el siguiente método:

  1. fastboot boot
  2. arranca y habilita OTG y espera a que se conecte un dispositivo OTG.
  3. El dispositivo se desconecta de la PC y se conecta una unidad flash USB con una imagen de Ubuntu arrancable a través de OTG.
  4. detecta un kernel de Linux válido en el dispositivo OTG y le pasa el control después de cargarlo en memoria.

Ahora, si quisieras, podrías arrancar una imagen de ROM de Android compatible de manera similar, pero recuerda que la unidad OTG tendría que mantenerse conectada al dispositivo hasta que decidas regresar al sistema operativo nativo (ya que todas las aplicaciones se cargarían desde, y todos los datos se escribirían en la unidad flash USB, a menos que la ROM de Android completa pudiera configurarse como un ramdisk (¿alguna vez escuchaste hablar de Puppy Linux?), lo cual, dadas las capacidades de memoria actuales de los dispositivos Android comunes y el tamaño de la ROM en sí, es actualmente imposible). Además, esto precluye la carga mientras se arranca en el sistema operativo OTG, en la mayoría de dispositivos con puertos de datos/cargador unificados.

Fuente: Foro de XDA-Developers Nexus 9

0 votos

¿Sería posible hacer esto para Android para poder arrancar la vista previa de N sin tener que instalarla?

0 votos

@SuiciDoga, ¿supongo que TWRP MultiROM tiene soporte para OTG Boot? Utiliza la técnica anterior que yo sepa, solo que sin todos los fastboot. El parche kexec-hardboot para el kernel utilizado por TWRP MultiROM es básicamente el OTG-Chainloader-Kernel del que hablo.

0 votos

Ahora eso también depende del dispositivo en el que quieras intentar este ejercicio. El Nexus 9 y el Nexus Player tienen TWRP, pero el problema de MultiROM no funciona en ellos (¿problemas x64/ARM64?). Tampoco sé sobre los actuales Nexii.

0voto

Kevin Puntos 1182

¡Es posible y lo hice en mi tablet Acer Iconia!

Conecta una unidad flash a tu PC y formatea a fat32 usa rufus para llevar la iso/dd a tu unidad flash

Conéctala a OTG y a tu teléfono/tableta.. mantén presionada la tecla de encendido y toca el volumen hacia abajo si no arranca intenta manteniendo presionada la tecla de encendido y tocando el volumen hacia arriba

Luego, usando las teclas de volumen muévete a UDisk (la marca de tu unidad flash) o SATA; UDISK (no tiene que ser la marca de tu USB, puede decir almacenamiento USB) y presiona la tecla de encendido para confirmar

Bueno, tuve serios problemas para arrancar en el menú, así que de alguna manera logré evitar que iniciara el kernel y así detener el arranque de Android

Creo que fue así: me conecté a la PC, luego borré todos los activos de la tableta, pero copié la carpeta de Android

se eliminó el kernel y después del arranque se volvió a conectar a la PC con un concentrador USB

Bueno, ¡espero haberte ayudado! :)

2 votos

Eso debe ser algún SoC excepcional, podría estar soportando UEFI. No muchos SoCs utilizados en dispositivos Android en estos días te permiten configurar el orden de arranque.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X