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

17

¿Hay alguna forma de iniciar un teléfono Android * desde una unidad USB alimentada por bus **? Si es así, ¿cuáles son los pasos para lograr esto?

* Por ejemplo, uno con funcionalidad USB OTG.

** Por ejemplo, una unidad flash.

sampablokuper
fuente

Respuestas:

23

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

Los teléfonos Android tienen sus propios cargadores de arranque y no pueden ser anulados por otros medios.

No es como el BIOS de una PC donde puede cambiar el orden de arranque para arrancar desde ciertos dispositivos como Network PXE, USB, HDD 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 cargador de arranque genérico (* que reside en el conjunto de chips) no tiene conocimiento de USB, etc., ya que lk (Little Kernel) está más preocupado por atrapar pulsaciones de teclas para encadenar en la recuperación o arrancar directamente en el entorno Android (Al mantener presionada la tecla Vol + Abajo en este caso) - en pseudocódigo ( esto es del contexto / aspecto de lk, y también, las direcciones de memoria relacionadas con cómo leer las particiones están codificadas en este lk, por lo que será ¡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 en bootable/bootloader .

si ( ¿se presiona la tecla Bajar volumen? ) entonces

  • cargar el núcleo en cadena desde la /recoverypartición a una dirección particular en la memoria y saltar a él e iniciar la ejecución, para abrir el entorno de recuperación

más

  • cargar el núcleo en cadena desde la /systempartición a una dirección particular en la memoria y saltar a él e iniciar la ejecución para abrir el entorno Android.

terminara si.

Como el núcleo dentro de lk es bastante limitado, teniendo en cuenta que la imagen binaria del núcleo se graba en el chip y, por lo tanto, no hay forma de modificarlo . Y también hay que mencionar que lk contiene el fastbootprotocolo de preparación para intermitentes /boot, /recovery, /systemy /dataparticiones. Hay dos secuencias para arrancar, arranque primario y arranque secundario tal como están:

  • Arranque primario -> lk (dependiendo del resultado de la lógica)
  • Vaya a Arranque secundario -> /booto/recovery

Nota al margen : Samsung aprecia el PBL / SBL (que es el cargador de arranque primario y el cargador de arranque secundario respectivamente) en su jerga cuando se trata de modificación. Lo que pasa con Samsung es que, en algunos teléfonos, PBL y SBL pueden estar encriptados (Samsung Wave GT-S8500 es uno de esos ejemplos, donde transferir Android a él era casi imposible debido al DRM dentro de los cargadores de arranque, lo cual era una pesadilla tratar y hacer que la modificación sea extremadamente difícil, sin embargo, ¡está funcionando a través de un exploit en el código FOTA!)

Esta es la razón por la cual no hay servicios adicionales, como la funcionalidad OTG o cualquier otra cosa, como comunicaciones en serie, lectura de tarjetas SD, gráficos, etc., ya que haría que el núcleo lk fuera más grande de lo previsto. En otras palabras, es el tamaño de núcleo más pequeño posible designado para hacer que suceda el pseudocódigo anterior.

Además, otra forma de verlo es esto, y esto depende de la versión de Android - la funcionalidad USB OTG está totalmente trajo dentro del entorno de Android, es decir, cuando los familiares que aparezca la pantalla de inicio, a continuación, la funcionalidad de OTG está habilitada. Desafortunadamente, no es el caso cuando se mira desde la perspectiva de lk.

Si tiene curiosidad, aquí está la entrada de Qualcomm en el lk anterior, que es parte de la pequeña fuente C que tiene el ensamblaje ARM incluido y se encuentra en la fuente AOSP de JellyBean enbootable/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("\nkernel  @ %x (%d bytes)\n", hdr->kernel_addr, hdr->kernel_size);
    dprintf("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("cmdline = '%s'\n", cmdline);

    cprintf("\nBooting Linux\n");

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

    boot_linux(hdr->kernel_addr);
    return 0;
}
t0mm13b
fuente
Cuestión de pollo / huevo aquí: Yo quería una respuesta a mi pregunta con el fin de reducir los casos de uso sobre la base de viabilidad; me está pidiendo que dé casos de uso primero :) Por lo tanto, solo puedo aclarar mis objetivos vagamente por ahora. Una podría ser lograr algo como el cifrado de disco completo arrancando desde una unidad USB cifrada por hardware (Lok-It / dataShur / etc.), de modo que ingresar un código de acceso en la unidad elimina la necesidad de ingresar una contraseña de descifrado en el dispositivo Android. Idealmente, esto podría hacerse de tal manera que, una vez que se inicia el teléfono, se pueda quitar la unidad, dejando el teléfono funcionando bien hasta el próximo reinicio.
sampablokuper
Correcto ... Interesante, nunca escuché un caso así, de todos modos, ¿por qué? Para reflexionar, ¿ dónde ingresaría un código de acceso? Android ICS hacia arriba tiene la capacidad de encriptar todo el volumen IIRC. ¿No lo ha investigado?
t0mm13b
El código de acceso se ingresaría utilizando el teclado integrado en la unidad. (Si no sabe a qué me refiero con esto, busque las unidades que mencioné). Y sí, he examinado el cifrado incorporado de Android, pero (a) no está exento de inconvenientes (consulte, por ejemplo, seguridad. stackexchange.com/q/10529 ; v.gd/6hOcmd ), (b) no funciona en todos los teléfonos, incluso aquellos que tienen ROM ICS + disponibles de los fabricantes (por ejemplo, algunos modelos Xperia), y (c) hay otros posibles casos de uso para los cuales sería deseable poder iniciar un teléfono / tableta desde un dispositivo de almacenamiento masivo USB.
sampablokuper
Para ser sincero, eso no es posible, para empezar no existe un gestor de arranque de teléfonos inteligentes que simplemente, desde una perspectiva de alto nivel, "pause" hasta que se ingrese un código de acceso. ¡Lo que está pidiendo está por encima y más allá de este foro y requiere un espacio especializado, si no un nicho de cargadores de arranque personalizados para lograr esto! Para empezar, el cargador de arranque genérico, lk (está en AOSP bajo arranque / cargador de arranque) es adoptado de facto por Qualcomm para sus conjuntos de chips que son utilizados por Sony, LG, Motorola, por nombrar solo algunos ... Solo digo, ¡la pregunta no es constructiva!
t0mm13b
2
En pocas palabras - no es cero manera de hacer eso, usted parece estar olvidando que el énfasis en mis comentarios en relación con el gestor de arranque y el hecho de que los teléfonos inteligentes no tienen BIOS es bien .... simplemente diciendo.
t0mm13b
7

Sin embargo, es posible en cierto sentido. Dadas las limitaciones mencionadas en la respuesta de @ t0mm13b, tiene sentido que el gestor de arranque mencionado (lk) sea incapaz de hacerlo. Entonces, iniciamos un núcleo personalizado desde fastboot(para pruebas), que arranca, habilita la funcionalidad OTG y una vez que se encuentra un núcleo válido en el dispositivo OTG que está conectado, lo carga en cadena en la memoria y le pasa el control. Esto probablemente incluso podría integrarse en recuperaciones personalizadas modernas como TWRP que tienen soporte OTG y (en algunos casos) MultiROM.

Esto realmente se ha utilizado para arrancar Ubuntu en una tableta Nexus 9, usando el método:

  1. fastboot boot <otg_chainloader_kernel>
  2. <otg_chainloader_kernel> arranca y habilita OTG y espera a que se conecte el dispositivo OTG.
  3. El dispositivo está desconectado de la PC y la unidad flash USB que tiene una imagen de arranque de Ubuntu está conectada a través de OTG.
  4. <otg_chainloader_kernel> detecta un núcleo Linux válido en el dispositivo OTG y le pasa el control después de cargarlo en cadena en la memoria.

Ahora, si lo desea, puede iniciar una imagen ROM de Android compatible de manera similar, pero recuerde que la unidad OTG debería mantenerse conectada al dispositivo hasta que decida 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 toda la ROM de Android se pueda configurar como un disco RAM (¿alguna vez se supo de Puppy Linux?), lo que, dada la capacidad de memoria actual de los dispositivos Android comunes y el tamaño del La ROM en sí misma es actualmente poco práctica). Eso impide cargar mientras se inicia en OTG OS, también, en la mayoría de los dispositivos con puertos de datos / cargador unificados.

Fuente: XDA-Developers Nexus 9 subforum

Tamoghna Chowdhury
fuente
¿Podría ser posible hacer esto para Android para poder iniciar la vista previa de N sin instalar?
Suici Doga
@SuiciDoga, supongo que TWRP MultiROM es compatible con OTG Boot? Utiliza la técnica anterior AFAIK, solo que sin todos los fastboots. El kexec-hardbootparche para el núcleo utilizado por TWRP MultiROM es básicamente el OTG-Chainloader-Kernelque hablo.
Tamoghna Chowdhury
Ahora eso también depende del dispositivo en el que quieras probar este ejercicio. El Nexus 9 y el Nexus Player tienen TWRP, pero la cosa de MultiROM no funciona en ellos (¿problemas x64 / ARM64?). IDK sobre el Nexii actual, también.
Tamoghna Chowdhury
0

es posible y lo hice en mi tableta acer iconia !!!!

conecte una unidad flash a su PC y formatee a fat32 use rufus para portar el iso / dd a su unidad flash

conéctelo a otg y a su teléfono / tableta ... mantenga presionada la tecla de encendido y toque el volumen hacia abajo si no se inicia, intente mantener presionada la tecla de encendido y toque el volumen hacia arriba

luego, usando las teclas de volumen, pase a UDisk (la marca de su unidad flash) o SATA; UDISK (no tiene que ser su marca usb, puede decir almacenamiento usb) y haga clic en la tecla de encendido para confirmar

bueno, tuve problemas con el sistema de arranque en el menú, así que de alguna manera me las arreglé para evitar que el kernel se iniciara y así detuve el arranque de Android

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

Se eliminó el núcleo y después del arranque se volvió a conectar a la PC con un concentrador USB

bueno espero haber ayudado :)

EliteXD
fuente
Eso debe ser un SoC excepcional, podría ser compatible con UEFI. No muchos SoC utilizados en estos días en dispositivos Android le permiten configurar el orden de arranque.
Irfan Latif