Ist es möglich, ein Android-Telefon von einem USB-Laufwerk zu starten?


16

Gibt es eine Möglichkeit, ein Android-Telefon * von einem USB-Laufwerk mit Bus-Stromversorgung ** zu starten? Wenn ja, was sind die Schritte, um dies zu erreichen?

* ZB eines mit USB-OTG-Funktionalität.

** ZB ein Flash-Laufwerk.

Antworten:


22

Bitte klären Sie, was das beabsichtigte Ziel ist und warum?

Android-Telefone verfügen über eigene Bootloader und können nicht auf andere Weise überschrieben werden.

Es ist nicht mit dem BIOS eines PCs vergleichbar, bei dem Sie die Startreihenfolge ändern können, um von bestimmten Geräten wie Network PXE, USB, primärer / sekundärer Festplatte zu starten.

Bearbeiten:

Nach den Kommentaren unten und in Bezug auf die Frage des OP

Gibt es eine Möglichkeit, ein Android-Telefon (z. B. eines mit USB-OTG-Funktionalität) über ein USB-Laufwerk mit Bus-Stromversorgung zu starten?

Der generische Bootloader (*, der sich auf dem Chipsatz befindet) hat keine Kenntnisse über USB usw., da der lk (Little Kernel) sich mehr darum kümmert, Tastatureingaben abzufangen, um sie in die Wiederherstellungsumgebung zu laden oder direkt in die Android-Umgebung zu booten (Wenn Sie in diesem Fall die Taste "Vol + Down" gedrückt halten) - im Pseudocode ( dies ist vom Kontext / Aspekt von lk abhängig). Außerdem sind die Speicheradressen, die das Lesen der Partitionen betreffen, in diesem lk fest codiert, so dass dies der Fall ist können die Logik verarbeiten! )

Der lk-Kernel ist der De-facto-Standard von Qualcomm für MSM-Chipsätze (Snapdragon) und wird von Herstellern wie Sony, Motorola, LG, Samsung übernommen und ist in der AOSP-Quelle unter zu finden bootable/bootloader.

Wenn ( Lautstärketaste gedrückt? ), dann

  • Laden Sie den Kernel mit der Kette von der /recoveryPartition in eine bestimmte Adresse im Speicher, springen Sie zu dieser und starten Sie die Ausführung, um die Wiederherstellungsumgebung aufzurufen

sonst

  • Laden Sie den Kernel mit der Kette von der /systemPartition in eine bestimmte Adresse im Speicher und springen Sie zu dieser und starten Sie die Ausführung, indem Sie die Android-Umgebung aufrufen.

ende wenn.

Da der Kernel in lk ziemlich begrenzt ist, ist das Binärimage des Kernels in den Chip eingebrannt und kann daher nicht geändert werden . Und sollte auch erwähnt werden , dass lk das enthält fastbootProtokoll in Vorbereitung auf zu blinken /boot, /recovery, /systemund /dataPartitionen. Es gibt zwei zu startende Sequenzen, den primären und den sekundären Start:

  • Primary Boot -> lk (abhängig vom Ergebnis der Logik)
  • Gehen Sie in Secondary Boot -> /bootoder/recovery

Nebenbemerkung: Samsung mag den PBL / SBL (der primären Bootloader bzw. den sekundären Bootloader) in seiner Fachsprache, wenn es um das Modden geht. Was Samsung betrifft, ist, dass in einigen Mobilteilen PBL und SBL möglicherweise verschlüsselt sind (Samsung Wave GT-S8500 ist ein solches Beispiel, bei dem die Portierung von Android fast unmöglich war, da DRM in den Bootloadern ein Albtraum war es extrem schwierig zu handhaben und zu modifizieren, aber es funktioniert irgendwie über einen Exploit im FOTA-Code!)

Aus diesem Grund gibt es keine zusätzlichen Funktionen wie OTG-Funktionen oder andere Funktionen wie serielle Kommunikation, Lesen von SD-Karten, Grafiken usw., da der lk-Kernel dadurch größer wird als vorgesehen. Mit anderen Worten, es ist die kleinstmögliche Kernelgröße, die dafür vorgesehen ist, dass nur der oben genannte Pseudocode auftritt.

Auch eine andere Art und Weise, es zu betrachten ist dies, und dies ist abhängig von der Android - Version - die USB - OTG - Funktionalität voll wird gebracht in der Android - Umgebung auf, das heißt , wenn die bekannte Home - Bildschirm angezeigt wird , dann OTG - Funktionalität aktiviert ist. Aus lks sicht ist das leider nicht der fall.

Wenn Sie neugierig sind, finden Sie hier den Qualcomm-Eintrag auf der obigen Seite, der Teil der winzigen C-Quelle ist, in der die ARM-Assembly enthalten ist und die in JellyBeans AOSP-Quelle in enthalten istbootable/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;
}

Henne / Ei-Problem hier: Ich wollte eine Antwort auf meine Frage, um Anwendungsfälle nach Machbarkeit einzugrenzen. Sie bitten mich, zuerst Use Cases zu nennen :) Daher kann ich meine Ziele vorerst nur vage klären. Eine Möglichkeit besteht darin, eine vollständige Festplattenverschlüsselung zu erreichen, indem von einem hardwareverschlüsselten USB-Laufwerk (Lok-It / dataShur / etc) gebootet wird, sodass die Eingabe eines Passcodes auf dem Laufwerk die Eingabe eines Entschlüsselungskennworts auf dem Android-Gerät überflüssig macht. Im Idealfall kann dies so erfolgen, dass nach dem Start des Telefons das Laufwerk entfernt wird und das Telefon bis zum nächsten Neustart noch einwandfrei funktioniert.
sampablokuper

Richtig ... Interessant - noch nie davon gehört - warum? Denkanstoß, wo würden Sie einen solchen Passcode eingeben? Android ICS aufwärts haben die Fähigkeit, das gesamte Volume IIRC zu verschlüsseln - Haben Sie sich das nicht angesehen?
t0mm13b

Der Passcode wird über die im Laufwerk integrierte Tastatur eingegeben. (Wenn Sie nicht wissen, was ich damit meine, schlagen Sie die von mir erwähnten Laufwerke nach.) Und ja, ich habe mir die integrierte Verschlüsselung von Android angesehen, aber (a) sie ist nicht ohne Nachteile (siehe z . B. Sicherheit). stackexchange.com/q/10529 ; v.gd/6hOcmd ), (b) es funktioniert nicht auf allen Handys, auch wenn ICS + ROMs von den Herstellern verfügbar sind (z. B. einige Xperia-Modelle), und (c) es gibt andere Potenzielle Anwendungsfälle, in denen ein Telefon / Tablet von einem USB-Massenspeichergerät gestartet werden kann, wären wünschenswert.
sampablokuper

Um ganz ehrlich zu sein, das ist nicht erreichbar. Zum einen gibt es keinen solchen Smartphone-Bootloader, der einfach aus einer höheren Perspektive "pausiert", bis ein Passcode eingegeben wird! Was Sie verlangen, geht über dieses Forum hinaus und erfordert eine spezielle, wenn nicht Nischenarena von benutzerdefinierten Bootloadern, um dies zu erreichen! Zunächst einmal - der generische Bootloader lk (in AOSP unter bootable / bootloader) wird von Qualcomm als De-facto- Version für seine Chipsätze übernommen, die unter anderem von Sony, LG und Motorola verwendet werden. Nur zu sagen, die Frage ist nicht konstruktiv!
t0mm13b

2
Kurz gesagt - es gibt keine Möglichkeit, dies zu tun. Sie scheinen zu vergessen, dass die Betonung meiner Kommentare in Bezug auf den Bootloader und die Tatsache, dass Smartphones auch keine BIOS haben, nur zu sagen sind.
t0mm13b

6

Es ist jedoch in gewissem Sinne möglich. Angesichts der in der Antwort von @ t0mm13b genannten Einschränkungen ist es sinnvoll, dass der erwähnte Bootloader (lk) dazu nicht in der Lage ist. Wir booten also einen benutzerdefinierten Kernel fastboot(zum Testen), der bootet, die OTG-Funktionalität aktiviert und sobald ein gültiger Kernel auf dem angeschlossenen OTG-Gerät gefunden wurde, diese in den Speicher kettet und die Steuerung an ihn übergibt. Dies könnte wahrscheinlich sogar in moderne benutzerdefinierte Wiederherstellungen wie TWRP integriert werden, die sowohl OTG- als auch (in einigen Fällen) MultiROM-Unterstützung bieten.

Dies wurde tatsächlich verwendet, um Ubuntu auf einem Nexus 9-Tablet mit der folgenden Methode zu starten:

  1. fastboot boot <otg_chainloader_kernel>
  2. <otg_chainloader_kernel> bootet und aktiviert OTG und wartet auf den Anschluss des OTG-Geräts.
  3. Das Gerät ist vom PC getrennt und ein USB-Stick mit einem startfähigen Ubuntu-Image ist über OTG mit ihm verbunden.
  4. <otg_chainloader_kernel> Erkennt einen gültigen Linux-Kernel auf dem OTG-Gerät und übergibt ihm die Kontrolle, nachdem er in den Speicher geladen wurde.

Wenn Sie möchten, können Sie jetzt auf ähnliche Weise ein kompatibles Android-ROM-Image starten. Beachten Sie jedoch, dass das OTG-Laufwerk mit dem Gerät verbunden bleiben muss, bis Sie zum nativen Betriebssystem zurückkehren (da alle Apps geladen würden) und alle Daten würden auf das USB - Flash - Laufwerk geschrieben, es sei denn, das gesamte Android - ROM könnte als Ramdisk konfiguriert werden (jemals von Puppy Linux gehört?) ROM selbst ist derzeit unpraktisch). Dies verhindert, dass die meisten Geräte mit einheitlichen Daten- / Ladeanschlüssen auch beim Booten mit OTG OS aufgeladen werden.

Quelle: XDA-Developers Nexus 9-Unterforum


Könnte es möglich sein, dies für Android zu tun, damit ich die N-Vorschau ohne Installation booten kann
Suici Doga

@ SuiciDoga, ich denke TWRP MultiROM unterstützt OTG Boot? Es verwendet die oben genannte Technik AFAIK, nur ohne all die fastboots. Der kexec-hardbootPatch für den von TWRP MultiROM verwendeten Kernel ist im Grunde das, worüber OTG-Chainloader-Kernelich spreche .
Tamoghna Chowdhury

Das hängt auch davon ab, auf welchem ​​Gerät Sie diese Übung ausprobieren möchten. Das Nexus 9 und der Nexus Player haben TWRP, aber das MultiROM-Ding funktioniert nicht (x64 / ARM64-Probleme?). IDK auch über das aktuelle Nexii.
Tamoghna Chowdhury

0

Es ist möglich und ich habe es auf meinem Acer Iconia Tablet gemacht !!!

Schließen Sie ein Flash-Laufwerk an Ihren PC an und formatieren Sie es mit Fat32. Verwenden Sie Rufus, um die ISO / DD auf Ihr Flash-Laufwerk zu portieren

Schließen Sie es an otg und an Ihr Telefon / Tablet an. Halten Sie die Ein- / Aus-Taste gedrückt und tippen Sie auf die Lautstärke, wenn es nicht startet. Halten Sie die Ein- / Aus-Taste gedrückt und tippen Sie auf die Lautstärke

Wechseln Sie dann mit den Lautstärketasten zu UDisk (der Marke Ihres Flash-Laufwerks) oder SATA. UDISK (es muss nicht unbedingt Ihre USB-Marke sein, es kann USB-Speicher heißen) und klicken Sie zur Bestätigung auf die Einschalttaste

Nun, ich hatte ernsthafte Probleme mit dem Booten des Menüs, also habe ich es irgendwie geschafft, den Kernel nicht zu booten und damit den Android zu stoppen, um zu booten

Ich denke, es war wie folgt: Ich habe eine Verbindung zum PC hergestellt und dann alle Assects vom Tablet gelöscht, aber den Android-Ordner kopiert

kernel wurde entfernt und nach dem booten mit einem usb hub wieder mit dem pc verbunden

Nun hoffe ich habe geholfen :)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.