¿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.
¿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.
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...
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
/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ónsino
/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:
/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;
}
Problema del huevo/gallina aquí: Yo quería una respuesta a mi pregunta para poder reducir los casos de uso basados en la viabilidad; tú 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.
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?
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.
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:
fastboot boot
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
¿Sería posible hacer esto para Android para poder arrancar la vista previa de N sin tener que instalarla?
@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.
¡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! :)
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.