Apakah mungkin untuk mem-boot ponsel Android dari drive USB?

17

Apakah ada cara untuk mem-boot ponsel Android * dari drive USB yang didukung bus **? Jika demikian, apa langkah untuk mencapai ini?

* Misalnya satu dengan fungsi USB OTG.

** Misalnya flash drive.

sampablokuper
sumber

Jawaban:

23

Tolong jelaskan apa tujuan yang dimaksud dan mengapa?

Ponsel Android memiliki boot-loader sendiri dan tidak dapat diganti dengan cara lain.

Ini tidak seperti BIOS PC di mana Anda dapat mengubah urutan boot untuk boot dari perangkat tertentu seperti Network PXE, USB, HDD Utama / Sekunder.

Edit:

Setelah komentar di bawah ini, dan sehubungan dengan pertanyaan OP

Apakah ada cara untuk mem-boot ponsel Android (mis. Ponsel dengan fungsi USB OTG.) Melalui drive USB yang ditenagai bus

Boot-loader generik (* yang berada di chip-set) tidak memiliki pengetahuan tentang USB dll, karena lk (Little Kernel) lebih peduli tentang menjebak penekanan tombol untuk memasukkan rantai ke pemulihan atau untuk mem-boot langsung ke lingkungan Android (Ketika memegang kunci Vol + Down dalam contoh ini) - dalam pseudo-code ( ini dari konteks / aspek lk, dan juga, alamat memori yang berkaitan dengan cara membaca partisi adalah hard-coded ke lk ini sehingga akan tahu bagaimana memproses logika! )

Kernel lk adalah standar de-facto oleh Qualcomm untuk chipset MSM (Snapdragon) dan diadopsi oleh produsen seperti Sony, Motorola, LG, Samsung dan dapat ditemukan di sumber AOSP di bawah bootable/bootloader.

jika ( Apakah tombol Volume Turun ditekan? ) kemudian

  • rantai-load kernel dari /recoverypartisi ke alamat tertentu dalam memori dan lompat ke sana dan mulai eksekusi, dalam memunculkan lingkungan pemulihan

lain

  • rantai-load kernel dari /systempartisi ke alamat tertentu dalam memori dan lompat ke sana dan mulai eksekusi dalam membawa lingkungan Android.

berakhir jika.

Karena kernel di dalam lk sangat terbatas, mengingat bahwa citra biner dari kernel dibakar ke dalam chip dan karenanya tidak ada cara untuk memodifikasinya . Dan juga harus disebutkan bahwa lk berisi fastbootprotokol dalam persiapan untuk berkedip /boot, /recovery, /systemdan /datapartisi. Ada dua urutan untuk boot, boot primer dan boot sekunder apa adanya:

  • Boot Primer -> lk (tergantung pada hasil logika)
  • Pergilah ke Boot Sekunder -> /bootatau/recovery

Catatan: Samsung menyukai PBL / SBL (yang merupakan Boot Loader Primer dan Boot Loader Sekunder) di jargon mereka dalam hal modding. Hal tentang Samsung, adalah bahwa, di beberapa handset, PBL dan SBL dapat dienkripsi (Samsung Wave GT-S8500 adalah salah satu contohnya, di mana pengalihan Android ke hampir mustahil dilakukan karena DRM di dalam boot loader yang merupakan mimpi buruk. untuk menghadapi dan membuatnya modding sangat sulit, namun, itu semacam bekerja melalui exploit dalam kode FOTA!)

Inilah sebabnya mengapa tidak ada fasilitas tambahan seperti fungsi OTG atau hal lain seperti komunikasi serial, membaca dari SDCard, grafik dll karena itu akan membuat kernel lk lebih besar dari yang dimaksudkan. Dengan kata lain, itu adalah ukuran sekecil mungkin dari kernel yang ditunjuk untuk melakukan pseudo-code di atas.

Juga, cara lain untuk melihat hal itu adalah ini, dan ini tergantung pada versi Android - USB OTG fungsi sepenuhnya dibawa up dalam lingkungan Android, yaitu ketika muncul home screen familiar, maka fungsi OTG ini diaktifkan. Sayangnya tidak demikian ketika melihatnya dari perspektif lk.

Jika Anda penasaran, inilah entri Qualcomm pada lk di atas yang merupakan bagian dari sumber C kecil yang menyertakan perakitan ARM dan ditemukan dalam sumber AOSP JellyBean dibootable/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
sumber
Masalah ayam / telur di sini: Saya ingin jawaban atas pertanyaan saya untuk mempersempit kasus penggunaan berdasarkan kelayakan; Anda meminta saya untuk memberikan use case terlebih dahulu :) Jadi, saya hanya dapat menjelaskan tujuan saya secara samar untuk saat ini. Seseorang mungkin mencapai sth seperti enkripsi disk penuh dengan mem-boot dari drive USB yang dienkripsi dengan perangkat keras (Lok-It / dataShur / etc), sehingga memasukkan kode sandi pada drive menghilangkan kebutuhan untuk memasukkan kata sandi dekripsi pada perangkat Android. Idealnya ini dapat dilakukan sedemikian rupa sehingga, setelah telepon di-boot, drive dapat dilepas, meninggalkan telepon masih berjalan dengan baik sampai reboot berikutnya.
sampablokuper
Benar ... Menarik - tidak pernah mendengar kasus seperti itu - lagi pula - mengapa? Makanan untuk dipikirkan, di mana Anda akan memasukkan kode sandi seperti itu? Android ICS ke atas memiliki kemampuan untuk mengenkripsi seluruh volume IIRC - Apakah Anda belum melihatnya?
t0mm13b
Kode sandi akan dimasukkan menggunakan keypad yang terpasang di drive. (Jika Anda tidak tahu apa yang saya maksud dengan ini, lihat drive yang saya sebutkan.) Dan ya, saya telah melihat ke dalam enkripsi bawaan Android, tetapi (a) ini bukan tanpa kekurangan (lihat, misalnya keamanan. stackexchange.com/q/10529 ; v.gd/6hOcmd ), (b) itu tidak bekerja pada semua ponsel, bahkan mereka yang memiliki ICS + ROM yang tersedia dari produsen (misalnya beberapa model Xperia), dan (c) ada yang lain kasus penggunaan potensial yang memungkinkan untuk mem-boot ponsel / tablet dari perangkat penyimpanan massal USB akan diinginkan.
sampablokuper
Sejujurnya, itu tidak mungkin, untuk awal tidak ada bootloader smartphone yang akan, dari perspektif tingkat tinggi, "jeda" sampai kode sandi dimasukkan! Apa yang Anda minta ada di atas dan di luar forum ini dan membutuhkan arena khusus bootloader khusus untuk mencapai hal ini! Sebagai permulaan - bootloader generik, lk (yang ada di AOSP di bawah bootable / bootloader) diadopsi sebagai de-facto oleh Qualcomm untuk chipset mereka yang digunakan oleh orang-orang seperti Sony, LG, Motorola, untuk menyebutkan beberapa ... hanya mengatakan, pertanyaannya tidak konstruktif!
t0mm13b
2
Singkatnya - ada nol cara untuk melakukan itu, Anda tampaknya melupakan bahwa penekanan pada komentar saya dalam kaitannya dengan bootloader dan fakta bahwa smartphone tidak memiliki BIOS yang baik .... hanya mengatakan.
t0mm13b
7

Namun, itu mungkin dalam beberapa hal. Mengingat keterbatasan yang disebutkan dalam jawaban @ t0mm13b, masuk akal bahwa boot loader yang disebutkan (lk) tidak mampu melakukan hal ini. Jadi, kami mem-boot kernel khusus dari fastboot(untuk pengujian), yang melakukan booting, mengaktifkan fungsionalitas OTG dan begitu kernel yang valid ditemukan pada perangkat OTG yang terhubung, rantai memuatnya ke dalam memori dan melewati kontrol ke sana. Ini bahkan mungkin dapat diintegrasikan ke dalam pemulihan kustom modern seperti TWRP yang memiliki OTG dan (dalam beberapa kasus) dukungan MultiROM.

Ini sebenarnya telah digunakan untuk mem-boot Ubuntu pada tablet Nexus 9, menggunakan metode:

  1. fastboot boot <otg_chainloader_kernel>
  2. <otg_chainloader_kernel> melakukan booting dan memungkinkan OTG dan menunggu perangkat OTG terhubung.
  3. Perangkat terputus dari PC dan USB flash drive yang memiliki gambar Ubuntu yang dapat dibooting terhubung ke sana melalui OTG.
  4. <otg_chainloader_kernel> mendeteksi kernel Linux yang valid pada perangkat OTG dan memberikan kontrol kepadanya setelah rantai memuatnya ke dalam memori.

Sekarang, jika Anda mau, Anda bisa mem-boot image ROM Android yang kompatibel dengan cara yang sama, tetapi ingat bahwa drive OTG harus tetap terhubung ke perangkat sampai Anda memutuskan untuk kembali ke OS asli (karena semua aplikasi akan memuat dari, dan semua data akan ditulis ke USB flash drive, kecuali seluruh ROM Android dapat dikonfigurasi sebagai ramdisk (pernah mendengar tentang Puppy Linux?), yang, mengingat kapasitas memori saat ini dari perangkat Android umum dan ukuran ROM itu sendiri saat ini tidak praktis). Itu menghalangi pengisian saat di-boot ke OTG OS, juga, pada sebagian besar perangkat dengan port data / charger terpadu.

Sumber: subforum Nexus 9 Pengembang XDA

Tamoghna Chowdhury
sumber
Mungkinkah melakukan ini untuk Android sehingga saya dapat mem-boot pratinjau N tanpa menginstal
Suici Doga
@SuiciDoga, saya kira TWRP MultiROM mendukung OTG Boot? Ia menggunakan teknik AFAIK di atas, hanya tanpa semua fastboots. The kexec-hardbootpatch untuk kernel yang digunakan oleh TWRP MultiROM pada dasarnya adalah OTG-Chainloader-Kernelsaya berbicara tentang.
Tamoghna Chowdhury
Nah, itu juga tergantung pada perangkat apa yang ingin Anda coba latihan ini. Nexus 9 dan Nexus Player memang memiliki TWRP, tetapi MultiROM tidak berfungsi pada mereka (masalah x64 / ARM64?). IDK tentang Nexii saat ini juga.
Tamoghna Chowdhury
0

itu mungkin dan saya melakukannya pada tablet acer iconia saya !!!!

menghubungkan flash drive ke pc Anda dan format ke FAT32 menggunakan rufus untuk port iso / dd ke flash drive Anda

sambungkan ke otg dan ke ponsel / tablet Anda .. tahan tombol daya dan ketuk volume jika tidak bisa boot coba tahan tombol daya dan ketuk volume ke atas

kemudian menggunakan tombol volume pindah ke UDisk (merek flash drive Anda) atau SATA; UDISK (itu tidak harus merek usb Anda, bisa dikatakan penyimpanan usb) dan klik tombol daya untuk konfirmasi

baik, saya punya masalah sevior dengan boot ke menu, jadi saya entah bagaimana berhasil menghindari kernel untuk boot dan dengan itu menghentikan android untuk boot

Saya pikir itu seperti ini: saya terhubung ke PC, kemudian menghapus semua assect dari tablet, tetapi menyalin folder Android

kernel telah dihapus dan setelah boot terhubung kembali ke pc dengan hub usb

semoga saya membantu :)

EliteXD
sumber
Itu pasti SoC yang luar biasa, mungkin mendukung UEFI. Tidak banyak SoC yang digunakan hari ini di perangkat Android memungkinkan Anda mengkonfigurasi urutan boot.
Irfan Latif