เป็นไปได้ไหมที่จะบูตโทรศัพท์ Android จากไดรฟ์ USB


17

มีวิธีการบูตโทรศัพท์ Android * จากไดรฟ์ USB ที่ขับเคลื่อนด้วยบัสหรือไม่? ถ้าเป็นเช่นนั้นอะไรคือขั้นตอนในการบรรลุเป้าหมายนี้?

* ตัวอย่างหนึ่งที่มีฟังก์ชั่น USB OTG

** เช่นแฟลชไดรฟ์

คำตอบ:


23

โปรดอธิบายว่าเป้าหมายที่กำหนดไว้คืออะไรและเพราะเหตุใด

โทรศัพท์ Android นั้นมี boot-loader ของตัวเองและไม่สามารถแทนที่ด้วยวิธีการอื่นได้

มันไม่เหมือนกับ BIOS ของพีซีที่คุณสามารถสลับลำดับการบูตเพื่อบู๊ตจากอุปกรณ์บางอย่างเช่น Network PXE, USB, HDD หลัก / รอง

แก้ไข:

หลังจากความคิดเห็นด้านล่างและในความสัมพันธ์กับคำถามของ OP

มีวิธีใดบ้างที่จะบูตโทรศัพท์ Android (เช่นที่มีฟังก์ชั่น USB OTG) ผ่านทางไดรฟ์ USB ที่ขับเคลื่อนด้วยบัส

บูตทั่วไปโหลดเดอร์ (* ซึ่งอยู่บนชิปเซ็ต) ไม่มีความรู้เกี่ยวกับ USB ฯลฯ เนื่องจาก lk (Little Kernel) มีความกังวลเกี่ยวกับการดักจับการกดแป้นพิมพ์เพื่อให้โหลดโซ่เข้าสู่การกู้คืนหรือบูตโดยตรงในสภาพแวดล้อม Android (เมื่อกดปุ่ม Vol + Down ในอินสแตนซ์นี้) - ในโค้ดหลอก ( นี่คือจากบริบท / กว้างยาวของ lk และที่อยู่หน่วยความจำที่เกี่ยวข้องกับวิธีการอ่านพาร์ติชั่นนั้นยากที่จะเขียนลงใน lk นี้ รู้วิธีประมวลผลตรรกะ! )

เคอร์เนล lk เป็นมาตรฐานโดยพฤตินัยโดย Qualcomm MSM สำหรับชิปเซ็ต (Snapdragon) และนำไปใช้โดยผู้ผลิตเช่น Sony, Motorola, LG, Samsung และสามารถพบได้ในแหล่ง AOSP bootable/bootloaderภายใต้

หาก ( กดปุ่มลดระดับเสียงหรือไม่ ) จากนั้น

  • chain-load kernel จาก/recoveryพาร์ติชั่นไปยังที่อยู่เฉพาะในหน่วยความจำและข้ามไปที่มันและเริ่มต้นการดำเนินการในการนำสภาพแวดล้อมการกู้คืน

อื่น

  • chain-load kernel จาก/systemพาร์ติชั่นไปยังที่อยู่เฉพาะในหน่วยความจำและข้ามไปที่มันและเริ่มการทำงานเพื่อนำสภาพแวดล้อมของ Android ขึ้นมา

จบถ้า

ในฐานะที่เป็นเมล็ดภายใน lk ถูก จำกัด สวยพิจารณาว่าภาพไบนารีของเคอร์เนลถูกเผาลงในชิปและดังนั้นการปรับเปลี่ยนวิธีการของมันไม่มี และนอกจากนี้ยังควรจะกล่าวว่า lk มีfastbootโปรโตคอลในการเตรียมการกระพริบ/boot, /recovery, /systemและ/dataพาร์ทิชัน มีสองลำดับในการบูต, การบูตหลักและการบูตรองตามที่:

  • Primary Boot -> lk (ขึ้นอยู่กับผลลัพธ์ของตรรกะ)
  • ไปที่บูตรอง -> /bootหรือ/recovery

หมายเหตุด้านข้าง: Samsung ชื่นชอบ PBL / SBL (ซึ่งเป็น Primary Boot Loader และ Secondary Boot Loader ตามลำดับ) ในศัพท์แสงของพวกเขาเมื่อพูดถึงการดัดแปลง สิ่งที่เกี่ยวกับซัมซุงคือในมือถือบางรุ่น PBL และ SBL อาจถูกเข้ารหัส (Samsung Wave GT-S8500 เป็นตัวอย่างหนึ่งที่ทำให้การย้าย Android ไปเป็นเรื่องที่แทบจะเป็นไปไม่ได้เพราะ DRM อยู่ในบูตโหลดเดอร์ซึ่งเป็นฝันร้าย เพื่อจัดการและทำให้การดัดแปลงเป็นเรื่องยากมากอย่างไรก็ตามมันเป็นการทำงานผ่านการใช้ประโยชน์จากรหัส FOTA!)

นี่คือเหตุผลที่ไม่มีสิ่งอำนวยความสะดวกพิเศษเช่นฟังก์ชั่น OTG หรือสิ่งอื่นใดเช่นการสื่อสารแบบอนุกรมการอ่านจาก SDCard กราฟิก ฯลฯ เนื่องจากจะทำให้เคอร์เนล lk ใหญ่กว่าที่ตั้งใจไว้ กล่าวอีกนัยหนึ่งมันเป็นขนาดที่เล็กที่สุดที่เป็นไปได้ของเคอร์เนลที่ถูกกำหนดให้ทำโค้ดหลอกข้างต้นเกิดขึ้น

นอกจากนี้ยังมีวิธีการมองมันอีกนี้และนี้จะขึ้นอยู่กับรุ่น Android - ฟังก์ชั่น USB OTG อย่างเต็มที่นำขึ้นภายในสภาพแวดล้อมของ Android คือเมื่อปรากฏหน้าจอที่บ้านคุ้นเคยแล้วการทำงานของ OTG ถูกเปิดใช้งาน น่าเสียดายที่ไม่ใช่ในกรณีที่มองจากมุมมองของแอลเค

หากคุณสงสัยนี่คือรายการของ Qualcommที่ด้านบน lk ซึ่งเป็นส่วนหนึ่งของแหล่ง C ขนาดเล็กที่มีชุดประกอบ ARM และพบได้ในแหล่ง AOSP ของ Jellybeanbootable/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;
}

ปัญหาไก่ / ไข่ที่นี่: ฉันต้องการคำตอบสำหรับคำถามของฉันเพื่อ จำกัด กรณีการใช้งานให้แคบลงตามความเป็นไปได้ คุณกำลังขอให้ฉันให้ใช้กรณีแรก :) ดังนั้นฉันสามารถชี้แจงเป้าหมายของฉันได้ชัดเจนตอนนี้ หนึ่งอาจจะบรรลุ sth เช่นการเข้ารหัสดิสก์เต็มรูปแบบโดยการบูตจากไดรฟ์ USB เข้ารหัสฮาร์ดแวร์ (Lok-It / dataShur / ฯลฯ ) เพื่อให้ป้อนรหัสผ่านบนไดรฟ์ obviates จำเป็นต้องป้อนรหัสผ่านการถอดรหัสบนอุปกรณ์ Android โดยหลักการแล้วสามารถทำได้เช่นนี้เมื่อโทรศัพท์บูทแล้วไดรฟ์อาจถูกลบออกทำให้โทรศัพท์ยังทำงานได้ดีจนกว่าจะรีบูตครั้งถัดไป
sampablokuper

ถูกต้อง ... น่าสนใจ - ไม่เคยได้ยินเกี่ยวกับกรณีเช่นนี้ - แล้ว - ทำไม? อาหารสำหรับความคิดที่คุณจะป้อนรหัสผ่านดังกล่าวหรือไม่ Android ICS ขึ้นไปมีความสามารถในการเข้ารหัสระดับเสียงทั้งหมด IIRC - คุณไม่ได้ตรวจสอบเรื่องนั้นใช่ไหม
t0mm13b

รหัสผ่านจะถูกป้อนโดยใช้ปุ่มกดที่อยู่ในไดรฟ์ (หากคุณไม่ทราบว่าฉันหมายถึงอะไรให้ค้นหาไดรฟ์ที่ฉันพูดถึง) และใช่ฉันได้ดูการเข้ารหัสในตัวของ Android แล้ว แต่ (ก) ไม่ใช่การไม่มีข้อเสีย (ดูเช่นความปลอดภัย stackexchange.com/q/10529 ; v.gd/6hOcmd ), (b) ไม่สามารถใช้งานได้กับโทรศัพท์ทุกรุ่นแม้แต่โทรศัพท์ที่มี ICS + ROM จากผู้ผลิต (เช่นรุ่น Xperia บางรุ่น) และ (c) มีสิ่งอื่น ๆ กรณีการใช้งานที่อาจเกิดขึ้นซึ่งสามารถบู๊ตโทรศัพท์ / แท็บเล็ตจากอุปกรณ์จัดเก็บข้อมูล USB ได้เป็นที่ต้องการ
sampablokuper

จะค่อนข้างตรงไปตรงมาที่ไม่สามารถทำได้สำหรับการเริ่มต้นไม่มี bootloader มาร์ทโฟนดังกล่าวที่จะเพียงจากมุมมองระดับสูง "หยุด" จนกว่ารหัสจะถูกป้อน! สิ่งที่คุณต้องการคือเหนือและเหนือกว่าฟอรัมนี้และต้องการความเชี่ยวชาญเป็นพิเศษหากไม่ใช่เวทีเฉพาะของ bootloaders ที่กำหนดเองเพื่อให้ได้สิ่งนี้! สำหรับการเริ่มต้น - bootloader ทั่วไป, lk (ใน AOSP ภายใต้ bootable / bootloader) ถูกนำมาใช้เป็นde-พฤตินัยโดย Qualcomm สำหรับชิปเซ็ตของพวกเขาซึ่งถูกใช้โดยชอบของ Sony, LG, Motorola, ชื่อ แต่ไม่กี่ ... เพียงแค่พูดว่าคำถามนั้นไม่สร้างสรรค์!
t0mm13b

2
ในระยะสั้น - มีศูนย์วิธีการทำที่คุณดูเหมือนจะลืมว่าความสำคัญกับความคิดเห็นของฉันในความสัมพันธ์กับ bootloader และความจริงที่ว่ามาร์ทโฟนไม่ได้มี BIOS ทั้ง .... เพียงแค่บอกว่า
t0mm13b

7

มันเป็นไปได้ในแง่หนึ่งอย่างไรก็ตาม ด้วยข้อ จำกัด ที่กล่าวถึงในคำตอบของ @ t0mm13b มันสมเหตุสมผลแล้วที่ boot loader (lk) ที่กล่าวถึงนั้นไม่สามารถทำสิ่งนี้ได้ ดังนั้นเราจึงทำการบูตเคอร์เนลที่กำหนดเองจากfastboot(สำหรับการทดสอบ) ซึ่งบูทใด ๆ จะเปิดใช้งานฟังก์ชั่น OTG และเมื่อพบเคอร์เนลที่ถูกต้องบนอุปกรณ์ OTG ที่เชื่อมต่ออยู่ สิ่งนี้อาจรวมอยู่ในการกู้คืนแบบกำหนดเองที่ทันสมัยเช่น TWRP ซึ่งมีทั้ง OTG และ (ในบางกรณี) การสนับสนุน MultiROM

สิ่งนี้ถูกใช้เพื่อบูต Ubuntu บนแท็บเล็ต Nexus 9 โดยใช้วิธีการ:

  1. fastboot boot <otg_chainloader_kernel>
  2. <otg_chainloader_kernel> บู๊ตและเปิดใช้งาน OTG และรอให้อุปกรณ์ OTG เชื่อมต่อ
  3. อุปกรณ์ถูกตัดการเชื่อมต่อจากพีซีและแฟลชไดรฟ์ USB ที่มีอิมเมจที่สามารถบู๊ตได้จาก Ubuntu ซึ่งเชื่อมต่อผ่าน OTG
  4. <otg_chainloader_kernel> ตรวจจับลินุกซ์เคอร์เนลที่ถูกต้องบนอุปกรณ์ OTG และส่งการควบคุมไปยังมันหลังจากทำการสับมันเข้าไปในหน่วยความจำ

ตอนนี้ถ้าคุณต้องการคุณสามารถบูตอิมเมจ Android ROM ที่ใช้งานร่วมกันได้ในลักษณะที่คล้ายกัน แต่จำไว้ว่าต้องเชื่อมต่อไดรฟ์ OTG กับอุปกรณ์จนกว่าคุณจะตัดสินใจกลับไปที่ OS ดั้งเดิม (เนื่องจากแอปทั้งหมดจะโหลด จากและข้อมูลทั้งหมดจะถูกเขียนไปยังแฟลชไดรฟ์ USB เว้นแต่ว่า Android ROM ทั้งหมดสามารถกำหนดค่าเป็น ramdisk (เคยได้ยิน Puppy Linux?) ซึ่งให้ความจุหน่วยความจำปัจจุบันของอุปกรณ์ Android ทั่วไปและขนาดของ ROM เองไม่สามารถใช้งานได้ในปัจจุบัน) สิ่งนี้จะช่วยยับยั้งการชาร์จขณะที่บู๊ตไปยัง OTG OS ได้เช่นกันบนอุปกรณ์ส่วนใหญ่ที่มีพอร์ตข้อมูล / เครื่องชาร์จแบบครบวงจร

แหล่งที่มา: กลุ่มย่อยXDA-Developers Nexus 9


มันอาจจะเป็นไปได้ที่จะทำเช่นนี้สำหรับ Android ดังนั้นฉันสามารถบูตแสดงตัวอย่าง N โดยไม่ต้องติดตั้ง
Suici Doga

@ SiiciDoga ฉันเดาว่า TWRP MultiROM รองรับ OTG Boot หรือไม่ มันใช้เทคนิคข้างต้น AFAIK เพียงแค่ไม่มีfastboots ทั้งหมด kexec-hardbootแพทช์สำหรับเคอร์เนลที่ใช้โดย TWRP MultiROM เป็นพื้นOTG-Chainloader-Kernelฉันพูดคุยเกี่ยวกับ
Tamoghna Chowdhury

ตอนนี้ยังขึ้นอยู่กับอุปกรณ์ที่คุณอาจต้องการลองฝึกหัดนี้ Nexus 9 และ Nexus Player มี TWRP แต่สิ่งที่ MultiROM ไม่สามารถใช้งานได้ (ปัญหา x64 / ARM64?) IDK เกี่ยวกับ Nexii ปัจจุบันเช่นกัน
Tamoghna Chowdhury

0

มันเป็นไปได้และฉันทำมันบน acer iconia แท็บเล็ตของฉัน !!!!

เชื่อมต่อแฟลชไดรฟ์กับพีซีของคุณและฟอร์แมตเป็น fat32 ใช้รูฟัสเพื่อพอร์ต iso / dd ไปยังแฟลชไดรฟ์ของคุณ

เชื่อมต่อเข้ากับ otg และเข้าสู่โทรศัพท์ / แท็บเล็ตของคุณ .. กดปุ่มเปิด / ปิดค้างไว้และแตะระดับเสียงลงหากไม่บูตให้ลองกดปุ่มเปิด / ปิดค้างไว้แล้วแตะระดับเสียงขึ้น

จากนั้นใช้ปุ่มปรับระดับเสียงไปยัง UDisk (แบรนด์แฟลชไดรฟ์ของคุณ) หรือ SATA; UDISK (ไม่จำเป็นต้องเป็นแบรนด์ usb ของคุณ, สามารถพูดได้ว่าที่จัดเก็บข้อมูล usb) และคลิกปุ่มเปิด / ปิดเพื่อยืนยัน

ดีฉันมีปัญหากับการบูทเข้าสู่เมนูดังนั้นฉันจึงพยายามหลีกเลี่ยงเคอร์เนลในการบู๊ตและหยุดแอนดรอยด์ในการบูต

ฉันคิดว่ามันเป็นแบบนี้: ฉันเชื่อมต่อกับพีซีแล้วลบสิ่งที่น่าเชื่อถือทั้งหมดออกจากแท็บเล็ต แต่คัดลอกโฟลเดอร์ Android

เคอร์เนลถูกลบและหลังจากบูตเชื่อมต่อกลับไปยังพีซีที่มีฮับ usb

หวังว่าฉันจะช่วย :)


นั่นต้องเป็น SoC ที่ยอดเยี่ยมบางอย่างซึ่งอาจสนับสนุน UEFI SoCs ไม่กี่คนที่ใช้วันนี้ในอุปกรณ์ Android ช่วยให้คุณสามารถกำหนดค่าการบูต
Irfan Latif
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.