È possibile avviare un telefono Android da un'unità USB?


17

Esiste un modo per avviare un telefono Android * da un'unità USB alimentata dal bus **? In tal caso, quali sono i passaggi per raggiungere questo obiettivo?

* Ad esempio uno con funzionalità USB OTG.

** Ad esempio un'unità flash.

Risposte:


23

Si prega di chiarire qual è l'obiettivo previsto e perché?

I telefoni Android hanno i propri bootloader e non possono essere ignorati con altri mezzi.

Non è come un BIOS del PC in cui è possibile cambiare l'ordine di avvio per l'avvio da determinati dispositivi come Network PXE, USB, HDD primario / secondario ..

Modificare:

Dopo i commenti che seguono e in relazione alla domanda del PO

Esiste un modo per avviare un telefono Android (ad esempio uno con funzionalità USB OTG.) Tramite un'unità USB alimentata dal bus

Il caricatore di avvio generico (* che risiede sul set di chip) non ha alcuna conoscenza di USB ecc., Poiché lk (Little Kernel) è più preoccupato per il trapping delle sequenze di tasti al fine di caricare in catena il ripristino o avviare direttamente nell'ambiente Android (Quando si tiene premuto il tasto Vol + Giù in questo caso) - in pseudo-codice ( questo è dal contesto / aspetto di lk, e anche, gli indirizzi di memoria relativi a come leggere le partizioni sono hardcoded in questo lk quindi sapere come elaborare la logica! )

Il kernel lk è lo standard di fatto di Qualcomm per i chipset MSM (Snapdragon) e adottato da produttori come Sony, Motorola, LG, Samsung e può essere trovato nella fonte AOSP sotto bootable/bootloader.

se ( Viene premuto il tasto Volume giù? ) allora

  • carica a catena il kernel dalla /recoverypartizione in un indirizzo particolare in memoria, passa a esso e avvia l'esecuzione, per far apparire l'ambiente di recupero

altro

  • carica il kernel a catena dalla /systempartizione a un indirizzo particolare in memoria, passa a esso e avvia l'esecuzione per far apparire l'ambiente Android.

finisci se.

Dato che il kernel all'interno di lk è piuttosto limitato, considerando che l'immagine binaria del kernel viene masterizzata nel chip e quindi non c'è modo di modificarlo . E anche va detto che lk contiene il fastbootprotocollo in preparazione per lampeggianti /boot, /recovery, /systeme /datapartizioni. Esistono due sequenze di avvio, avvio primario e avvio secondario così com'è:

  • Avvio primario -> lk (a seconda dell'esito della logica)
  • Vai in avvio secondario -> /booto/recovery

Nota a margine : Samsung ama il PBL / SBL (che è rispettivamente il caricatore di avvio primario e il caricatore di avvio secondario) nel loro gergo quando si tratta di modding. La cosa su Samsung, è che, in alcuni telefoni, PBL e SBL potrebbero essere crittografati (Samsung Wave GT-S8500 ne è un esempio, in cui il porting di Android su di esso era quasi impossibile da fare a causa del DRM nei boot loader che era un incubo gestire e rendere il modding estremamente difficile, tuttavia, sta funzionando in qualche modo tramite un exploit nel codice FOTA!)

Questo è il motivo per cui non ci sono servizi extra come la funzionalità OTG o qualsiasi altra cosa come comunicazioni seriali, letture da SDCard, grafica ecc. In quanto renderebbe il kernel lk più grande di quanto previsto. In altre parole, è la dimensione più piccola possibile del kernel che è designata per far accadere solo lo pseudo-codice sopra riportato.

Inoltre, un altro modo di vedere le cose è questo, e questo dipende dalla versione Android - funzionalità OTG è completamente l'USB ha portato fino all'interno dell'ambiente di Android, vale a dire quando viene visualizzata la schermata casa familiare, quindi le funzionalità di OTG è abilitato. Sfortunatamente non è il caso di guardarlo dal punto di vista di LK.

Se sei curioso, ecco la voce Qualcomm nella sezione precedente che fa parte della minuscola sorgente C che ha incluso l'assemblaggio ARM e che si trova nella sorgente AOSP di JellyBean inbootable/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;
}

Problema Pollo / uovo qui: mi voleva una risposta alla mia domanda, al fine di limitare i casi d'uso sulla base di fattibilità; mi stai chiedendo di dare prima dei casi d'uso :) Quindi, per ora posso solo chiarire vagamente i miei obiettivi. Uno potrebbe essere quello di ottenere una crittografia completa del disco eseguendo l'avvio da un'unità USB crittografata dall'hardware (Lok-It / dataShur / ecc.), In modo che l'immissione di un passcode sull'unità eviti la necessità di inserire una password di decrittografia sul dispositivo Android. Idealmente, ciò potrebbe essere fatto in modo tale che, una volta avviato il telefono, l'unità possa essere rimossa, lasciando il telefono ancora funzionante fino al prossimo riavvio.
sampablokuper

Giusto ... Interessante - mai sentito parlare di un caso del genere - comunque - perché? Spunti di riflessione, dove inseriresti un tale passcode? Android ICS verso l'alto ha la capacità di crittografare l'intero volume IIRC - Non l'hai mai esaminato?
t0mm13b

Il passcode verrebbe inserito usando la tastiera integrata nell'unità. (Se non sai cosa intendo con questo, cerca le unità che ho citato.) E sì, ho esaminato la crittografia integrata di Android, ma (a) non è privo di inconvenienti (vedi, ad esempio, sicurezza. stackexchange.com/q/10529 ; v.gd/6hOcmd ), (b) non funziona su tutti i telefoni, anche quelli con ROM ICS + disponibili dai produttori (ad esempio alcuni modelli Xperia) e (c) ce ne sono altri sarebbero auspicabili casi d'uso potenziali per i quali poter avviare un telefono / tablet da un dispositivo di archiviazione di massa USB.
sampablokuper,

Ad essere sinceri, ciò non è realizzabile, per cominciare non esiste un tale bootloader per smartphone che semplicemente, da una prospettiva di alto livello, "si fermerà" fino a quando non viene inserito un passcode! Quello che stai chiedendo è al di là di questo forum e richiede un'arena specializzata, se non di nicchia, di bootloader personalizzati per raggiungere questo obiettivo! Per cominciare: il generico bootloader, lk (è in AOSP sotto bootable / bootloader) è adottato di fatto da Qualcomm per i suoi chipset che viene utilizzato da artisti del calibro di Sony, LG, Motorola, per citarne solo alcuni ... solo dicendo, la domanda non è costruttiva!
t0mm13b

2
In breve - non v'è nulla modo di fare che, ti sembra di essere dimenticando che l'accento sulla i miei commenti in relazione al bootloader e il fatto che gli smartphone non hanno BIOS è neanche .... solo dicendo.
t0mm13b,

7

È possibile in un certo senso, tuttavia. Date le limitazioni menzionate nella risposta di @ t0mm13b, ha senso che il citato boot loader (lk) non sia in grado di farlo. Quindi, avviamo un kernel personalizzato da fastboot(per il test), che si avvia, abilita la funzionalità OTG e una volta trovato un kernel valido sul dispositivo OTG che è collegato, li carica in memoria e gli passa il controllo. Questo potrebbe probabilmente anche essere integrato nei moderni ripristini personalizzati come TWRP che hanno sia il supporto OTG che (in alcuni casi) MultiROM.

Questo è stato effettivamente utilizzato per avviare Ubuntu su un tablet Nexus 9, usando il metodo:

  1. fastboot boot <otg_chainloader_kernel>
  2. <otg_chainloader_kernel> avvia e abilita OTG e attende la connessione del dispositivo OTG.
  3. Il dispositivo è disconnesso dal PC e l'unità flash USB con l'immagine Ubuntu avviabile è collegata ad esso tramite OTG.
  4. <otg_chainloader_kernel> rileva un kernel Linux valido sul dispositivo OTG e gli passa il controllo dopo averlo caricato a catena in memoria.

Ora, se lo desideri, puoi avviare un'immagine ROM ROM Android compatibile in un modo simile, ma ricorda che l'unità OTG dovrebbe essere mantenuta connessa al dispositivo fino a quando deciderai di tornare al sistema operativo nativo (poiché tutte le app verrebbero caricate da e tutti i dati verrebbero scritti sull'unità flash USB, a meno che l'intera ROM Android non potesse essere configurata come un ramdisk (mai sentito parlare di Puppy Linux?), che, date le attuali capacità di memoria dei comuni dispositivi Android e le dimensioni del La stessa ROM è attualmente poco pratica). Ciò preclude la ricarica anche durante l'avvio sul sistema operativo OTG, sulla maggior parte dei dispositivi con porte dati / caricatore unificate.

Fonte: subforum XDA-Developers Nexus 9


Potrebbe essere possibile farlo per Android in modo da poter avviare l'anteprima N senza installare
Suici Doga

@SuiciDoga, suppongo che TWRP MultiROM supporti OTG Boot? Utilizza la tecnica AFAIK sopra, solo senza tutte le fastboots. La kexec-hardbootpatch per il kernel usata da TWRP MultiROM è fondamentalmente la OTG-Chainloader-Kernelparola di cui parlo.
Tamoghna Chowdhury,

Ora dipende anche dal dispositivo su cui potresti voler provare questo esercizio. Il Nexus 9 e il Nexus Player hanno TWRP, ma la cosa MultiROM non funziona su di essi (problemi x64 / ARM64?). Anche IDK sull'attuale Nexii.
Tamoghna Chowdhury,

0

è posible e l'ho fatto sul mio tablet acer iconia !!!!

collegare un'unità flash al PC e formattare su fat32 utilizzare rufus per eseguire il port dell'iso / gg sull'unità flash

collegalo a otg e nel tuo telefono / tablet .. tieni premuto il tasto di accensione e tocca il volume se non si avvia prova a tenere premuto il tasto di accensione e tocca il volume su

quindi usando i tasti del volume passa a UDisk (il marchio della tua unità flash) o SATA; UDISK (non deve essere il tuo marchio USB, può dire memoria USB) e fare clic sul tasto di accensione per confermare

beh, ho avuto grossi problemi con l'avvio nel menu, quindi in qualche modo sono riuscito a evitare l'avvio del kernel e quindi fermare l'avvio di Android

penso che sia stato così: mi sono collegato al pc, quindi ho eliminato tutti gli insetti dal tablet, ma copiando la cartella Android

il kernel è stato rimosso e dopo l'avvio è stato ricollegato al PC con un hub USB

bene spero di aver aiutato :)


Deve essere un SoC eccezionale, potrebbe supportare UEFI. Non molti SoC utilizzati in questi giorni nei dispositivi Android consentono di configurare l'ordine di avvio.
Irfan Latif,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.