Multiboot

Материал из Toshiba AC100 wiki
Перейти к навигации Перейти к поиску

https://wiki.ubuntu.com/Specs/ARMSoftbootLoader

Что имеем

Сейчас можно без проблем сделать загрузку андроида или линукса по выбору. Для этого надо иметь загрузчик от android 2.1 (2-й и 4-й разделы).

  • В 6-й раздел шьем ядро андроида - т.е. получаем заводское состояние.
  • В 5-й раздел шьем ядро линукса для загрузки с sd карты или usb флешки.
  • При включении жмем кнопку Home и выбираем, что грузить.

Однако такой вариант не очень удобен, поэтому люди пытаются завести uboot или какой-либо другой вариант мультизагрузки.

Uboot

TODO : привести в человеческий вид

Особенности

Сразу опишу некоторые нюансы, т.к. многие не дочитывают до конца или пропускают нюансы.
1. Загрузочный скрипт должен быть запакован командой mkimage
2. initrd/initramfs образ должен быть запакован командой mkimage

Версии

  • mainline

Отсутствует поддержка клавиатуры. В 2016-11 не работает экран (патч ушел в мейллист, но не приянт)

  • Старая версия (2013 год)

Добавлена поддержка клавиатуры, экран работает. Отсутствует поддержка многих вещей, которые появились за последние несколько лет (extlinux, например)

  • 2016-11-nvec-v1-dev

Портирован патч с поддержкой клавиатуры. Добавлен фикс экрана

  • Особо не тестировалась*

Собранные версии

uboot.bin с работающим экраном (исходники на gitorious).

  • пока не работает встроенная клавиатура
  • некоторые модели usb клавиатур должны работать, но на #ac100 никто этого не смог добиться (видимо зависит от модели)

uboot-w-kbd.bin с экспериментальной поддержкой клавиатуры (исходники).

u-boot-2014-07-android.bin Binary from this branch https://github.com/ac100-ru/u-boot-ac100-exp/tree/v2014.07-android

Как работает u-boot

При использовании fastboot (загрузчик, с которым тошка шла по-умолчанию) ядро, инитрд, cmdline нужно было упаковать в boot образ и записать в 5 или 6 партицию. Бут образ из 6-й грузился по-умолчанию, из 5-й - по домику. При использовании u-boot'а бут образы не используются. Ядро и initrd должны лежать на файловой системе партиции. Cmdline задается в загрузочном скрипте. Загрузка происходит следующим образом: u-boot перебирает sd, emmc, usb и ищет там файл загрузочного скрипта (boot.scr). Если он его не находит, вываливается в командную строку (u-boot'а, линукса там никакого нет). Если скрипт находится, то выполняется этот скрипт. В скрипте задается cmdline, считывается в память ядро, инитрд, device tree (для ядер 3.8 и новее) и зовется команда загрузки (bootz или bootm).

Другими словами

U-Boot ставится в спец. разделы (boot0 и boot1) внутреннего накопителя и не занимает места на части накопителя, где расположена ОС. Устанавливается U-Boot в эти разделы сценарием switch-to-uboot (на AC100 нужно запустить sosboot, а затем выполнить сценарий switch-to-uboot). Для загрузки, U-Boot ищет сценарий с именем boot.scr (на самом деле есть еще имя, но это не так важно). Ищет он его в корне раздела и в каталоге /boot. Проверяются все разделы всех накопителей. Если сценарий не найден, будет выведена консоль U-Boot'а. boot.scr — текстовый файл с небольшим заголовком. В сценарии указаны команды для загрузки ядра, initramfs (опционально), dtb и сама команда запуска. Чтобы ядро бралось из другого места, нужно править сценарий.

Установка ОС

См. https://paz00.ru/index.php/Uboot_installation_ru установка ОС с u-boot'ом (https://paz00.ru/index.php/Uboot_installation en)

Загрузка в память

Иногда удобно проверять работу u-boot'а/ядра не заливая его на внутренний накопитель. Загрузить uboot в тошибу не меняя ничего на накопителе можно командой

nvflash

nvflash --bl ./u-boot-dtb-tegra.bin --go

В этом случае нужно иметь рабочий скрипт загрузки для u-boot'а. Можно сделать полноценный образ, содержащий в себе u-boot, ядро и другие нужные компоненты:

  • получаем create_image.pl
git clone git://gitorious.org/uboot-ac100/create_bootimage.git
  • формируем uboot.cmd
setenv bootargs 'cma=64M'
bootz @KERNEL @INITRD @FDT
  • создаем boot-image.ram
create_image.pl uboot.bin zImage initrd.img tegra20-paz00.dtb uboot.cmd boot-image.ram
  • заливаем boot-image.ram в память
nvflash --bl boot-image.ram --go

tegrarcm

можно использовать tegrarcm:

tegrarcm --bct=ac100.bct --bootloader=boot-image.ram --loadaddr=0x108000

Загрузка с USB флешки

for-next загружается, 3.1 в процессе

% cat boot.cmd 
echo === boot.scr: boot from USB flash ===
setenv setargs
setenv bootargs 'console=ttyS0,115200 cma=64M'
usb dev 0
ext2load usb 0 0x1000000 /boot/zImage
ext2load usb 0 0x2000000 /boot/tegra20-paz00.dtb
ext2load usb 0 0x2200000 /boot/initrd-uboot
bootz 0x1000000 0x2200000 0x2000000

Запаковываем команды загрузки в образ

% ../u-boot/tools/mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "myscript" -d boot.cmd boot.scr
Image Name:   myscript
Created:      Sat Nov 24 23:57:51 2012
Image Type:   ARM Linux Script (uncompressed)
Data Size:    38 Bytes = 0.04 kB = 0.00 MB
Load Address: 00000000
Entry Point:  00000000
Contents:
   Image 0: 30 Bytes = 0.03 kB = 0.00 MB
% ls -la ./boot.scr
-rw-r--r-- 1 stuw users 102 Nov 24 23:57 ./boot.scr

И обязательно перепаковываем initrd.

% ../u-boot/tools/mkimage -n MyRamDisk -A arm -O linux -T ramdisk -C gzip -d initrd.img initrd-uboot
Image Name:   MyRamDisk
Created:      Sun Jan 20 20:23:04 2013
Image Type:   ARM Linux RAMDisk Image (gzip compressed)
Data Size:    1217437 Bytes = 1188.90 kB = 1.16 MB
Load Address: 00000000
Entry Point:  00000000

boot.scr нужно положить в /boot на sd карте. Если ядро не использует fdt - его не грузим и убираем последний параметр в команде bootz.

Запись uboot'а на место загрузчика

Не все описание точное, u-boot "подрос" :) U-Boot (by Stephen Warren) <range type="comment" id="438689">PaulFertser сообщил, что u-boot из main ветки у него работает!</range id="438689"> См. также t30-port-v2011.03-public (LCD Display driver commit, tegra keyboard support commit)

savalik не осилил заливку uboot на тошибу. Как он понял u-boot.bin (fastboot.stock.bin) составляет какую то часть от раздела EBT(4го). При запуске nvflash --bl u-boot.bin --go он загоняется в память устройства. Но для его зашивки надо использовать --updatebct (??? какие то ключи)

socketa4techx7 осилил заливку uboot на тошибу. На всякий случай: 1) Надо достать partitiontable и оригинальный bct.

nvflash --bl fastboot.bin --getpartitiontable ac100-pt.txt
nvflash -r --rawdeviceread 0 5000 00.bin
dd if=00.bin of=ac100.bct bs=4080 count=1

2) теперь запихнем оригинальный bct куда подальше и создадим пустой bct-образный файл:

cp ac100.bct ac100.bct.orig
dd if=/dev/zero of=ac100.bct seek=2704 bs=1 count=48 conv=notrunc

3) Зальём в тошку u-boot.

nvflash --bl fastboot.bin --bct ac100.bct --odmdata 0x800c0085 --download 4 u-boot.bin

Бинго! (по мотивам http://ac100.grandou.net/swarren_brain_dump) Траблы: разрешение экрана кривовато, шрифт мелковат. Зы. бинарник, который я заливал, я взял из последнего L4T.(по непонятным причинам сработало 1 раз). <range type="comment" id="521845">Вообще говоря, толку от u-boot сейчас мало - он не поддерживает дисплей и клавиатуру. Так что пока рассматриваем другие варианты.</range id="521845">

Так же советуемая Паулом putusb Муромца не работает из за какой то банальщины вроде неправильного импортирования модулей. (Муромцу подзатыльник за то что все сломал.)

Сборка

Для v2016.11-nvec-v1-dev

git clone https://github.com/ac100-ru/u-boot-ac100-exp.git
cd u-boot-ac100-exp
git checkout -b v2016.11-nvec-v1-dev origin/v2016.11-nvec-v1-dev
make ARCH=arm CROSS_COMPILTE=arm-linux-gnueabi- paz00_config
make ARCH=arm CROSS_COMPILTE=arm-linux-gnueabi- # опционально добавить -j <количество потоков>

Для старых версий

git clone git://git.denx.de/u-boot-tegra.git
cd u-boot-tegra
make paz00_config
CROSS_COMPILE=arm-linux-gnueabi- make

http://pastebin.com/Ff5ydM1p -- печальный выхлоп в виде сегфолта в конце. http://dl.dropbox.com/u/32472722/ac100_stuff/u-boot.bin bootloader failed NvError 0x0

nvflash\nvflash\nvflash.exe --bl nvflash\nvflash\fastboot.stock.bin --bct ac100.bct --odmdata 0x800c0085 --download 4 u-boot.bin <range type="comment" id="636874">делает кирпич. </range id="636874">да и в целом odmdata 0x800c0085 кажется нам не идет.

Загрузка ядра из boot образа

Буду расписывать на основе http://ac100.grandou.net/abootimg#output_examples Видно, что: page size = 2048 bytes kernel size = 3146584 bytes ramdisk size = 2310081 bytes

В нулевом секторе находится заголовок. Начиная с первого сектора идет ядро. Потом initrd. Ядро занимает (3146584 + 2048 - 1) / 2048 байт = 1537 секторов. Ramdisk: (2310081 + 2048 - 1) / 2048 байт = 1128 секторов.

6-я партиция начинается с сектора 5376 и ее размер 4096 секторов (сектор - 2048 байт, какой размер блока у убута - не знаю). Ядро: начало 5376+1=5377, размер 1537 секторов Как вытащить cmdline - пока не знаю. надо руками вбивать :(

U-boot работает с секторами по 512 байт и не видит скрытые области на ностеле тошибы. Поэтому нужно сделать дополнительные корректировки (на примере 116-й модели, бут партиции по 2 МБ). Т.к. скрытые области на 116-й модели по 2 МБ, то скрытыми будут 2048 секторов. Пересчитаем смещение ядра: 5377-2048=3329 Т.е. u-boot использует сектора по 512 байт, а мы считали все для секторов в 2048 байт, нужно пересчитать значения для скармливания u-boot'у: Ядро: начало 3329*4=13316 (0x3404), размер 1537*4=6148 (0x1804)

Команда для считывания ядра из 6-й партиции будет такая: mmc read 0x1000000 0x3404 0x1804

Варианты меню загрузки

Устаревший вариант: Bootmenu

Тестовая сборка: Test/sos-uboot-r5-2013-09-23.bin

Для записи uboot'а на место постоянного загрузчика: загрузить образ в память, выполнить ./switch_to_uboot

НЕПРОВЕРЕННЫЙ ВАРИАНТ

Должен выдать меню из следующих пунктов:

Boot kernel

Boot recovery

Boot from SD

Boot from USB

Uboot

setenv bootmenu_0 "Boot kernel  =setenv bootargs console=tty0 console=ttyS0,115200n8 CMA=64M quiet splash;\
mmc dev 0;\
ext2load mmc 0 0x1000000 /boot/zImage;\
ext2load mmc 0 0x2000000 /boot/tegra20-paz00.dtb;\
ext2load mmc 0 0x2200000 /boot/initrd-uboot;\
bootz 0x1000000 0x2200000 0x2000000;"

setenv bootmenu_1 "Boot recovery=setenv bootargs console=tty0 console=ttyS0,115200n8 CMA=64M quiet splash;
mmc dev 0;\
ext2load mmc 0 0x1000000 /boot/zImage-recovery;\
ext2load mmc 0 0x2000000 /boot/tegra20-paz00.dtb;\
ext2load mmc 0 0x2200000 /boot/initrd-recovery-uboot;\
bootz 0x1000000 0x2200000 0x2000000;"

setenv bootmenu_2 "Boot from SD =setenv bootargs console=tty0 console=ttyS0,115200n8 CMA=64M quiet splash;\
mmc dev 1;\
ext2load mmc 1 0x1000000 /boot/zImage;\
ext2load mmc 1 0x2000000 /boot/tegra20-paz00.dtb;\
ext2load mmc 1 0x2200000 /boot/initrd-uboot;\
bootz 0x1000000 0x2200000 0x2000000;"

setenv bootmenu_3 "Boot from USB=setenv bootargs console=tty0 console=ttyS0,115200n8 CMA=64M quiet splash;\
usb dev 0;\
ext2load usb 0 0x1000000 /boot/zImage;\
ext2load usb 0 0x2000000 /boot/tegra20-paz00.dtb;\
ext2load usb 0 0x2200000 /boot/initrd-uboot;\
bootz 0x1000000 0x2200000 0x2000000;"

bootmenu 20


Меню для Андроида

echo === AC100 Android Bootmenu ===
setenv bootmenu_0 "Boot LNX  =mmc dev 0; ext2load mmc 0:2 0x1000000 /boot/zImage;\
                                         ext2load mmc 0:2 0x2200000 /boot/initrd.gz;\
                                         bootz 0x1000000 0x2200000;"
setenv bootmenu_1 "Boot SOS  =mmc dev 0; ext2load mmc 0:1 0x1000000 /boot/zImage;\
                                         ext2load mmc 0:1 0x2200000 /boot/initrd.gz;\
                                         bootz 0x1000000 0x2200000;"
setenv bootmenu_2 "Boot from SD =setenv bootargs console=tty0; mmc dev 1;\
                                         ext2load mmc 1 0x1000000 /boot/zImage;\
                                         ext2load mmc 1 0x2200000 /boot/initrd.gz;\
                                         bootz 0x1000000 0x2200000;"
setenv bootmenu_3 "Boot from USB=setenv bootargs $cmdline; usb dev 0;\
                                         ext2load usb 0 0x1000000 /boot/zImage;\
                                         ext2load usb 0 0x2200000 /boot/initrd.gz;\
                                         bootz 0x1000000 0x2200000 0x2000000;"
bootmenu 20
echo === Toshiba AC100 Bootmenu ===
setenv bootmenu_0 "Boot LNX CM-10.1 =ext2load mmc 0:2 0x1000000 /boot/zImage-boot-cm-10-1; ext2load mmc 0:2 0x2200000 /boot/initrd-boot-cm-10-1.gz; bootz 0x1000000 0x2200000;"
setenv bootmenu_1 "Boot SOS CM-10.1 =ext2load mmc 0:1 0x1000000 /boot/zImage-recovery-cm-10-1; ext2load mmc 0:1 0x2200000 /boot/initrd-recovery-cm-10-1.gz; bootz 0x1000000 0x2200000;"
setenv bootmenu_2 "Boot LNX UBUNTU-12.10 =ext2load mmc 0:2 0x1000000 /boot/zImage-lubuntu-12-10; ext2load mmc 0:2 0x2200000 /boot/initrd-lubuntu-12-10; bootz 0x1000000 0x2200000;"
setenv bootmenu_3 "Boot from SD fat=fatload mmc 1:1 0x1000000 /boot/zImage; fatload mmc 1:1 0x2200000 /boot/initrd.gz; bootz 0x1000000 0x2200000;"
setenv bootmenu_4 "Boot from USB ext2=ext2load usb 0:1 0x1000000 /boot/zImage; ext2load usb 0:1 0x2200000 /boot/initrd.gz; bootz 0x1000000 0x2200000 0x2000000;"
bootmenu 5

Новый вариант: Extlinux

В новых версиях u-boot появилась поддержка syslinux скриптов для создания меню загрузки.
README в исходниках U-Boot

Пример конфигурации:

TIMEOUT 1000
DEFAULT default
ONTIMEOUT exit
MENU TITLE Boot menu

LABEL default
        MENU LABEL Default
        LINUX /boot/zImage
        FDTDIR /boot/
        APPEND root=/dev/mmcblk0p1 plymouth.enable=0 console=ttyS0,115200n8

LABEL failsafe
        MENU LABEL Failsafe
        LINUX /boot/zImage-failsafe
        FDT /boot/tegra20-paz00.dtb
	INITRD /boot/initrd-uboot
        APPEND root=/dev/mmcblk0p1 plymouth.enable=0 console=ttyS0,115200n8 console=tty

LABEL exit
	MENU LABEL Local boot script (boot.scr)
	LOCALBOOT 1
  1. При использовании FDTDIR для выбора dtb файла при загрузке используются переменные окружения SYS_SOC и SYS_BOARD.

EFI вариант с помощью GRUB

Пример вывода из последних сборок openSUSE где включена только EFI загрузка:

U-Boot SPL 2016.11 (Dec 22 2016 - 23:44:52)linux-4.18.12-1-default.gz 
Trying to boot from RAMt 
grub> 
grub> 
U-Boot 2016.11 (Dec 22 2016 - 23:44:52 +0300)
grub> 
TEGRA20
Model: Toshiba AC100 / Dynabook AZ
Board: Compal Paz00
DRAM:  512 MiB
MMC:   Tegra SD/MMC: 0, Tegra SD/MMC: 1
*** Warning - bad CRC, using default environment

nvec: nvec_probe
NVEC initialization...
request-gpios flags: 0xa
nvec: nvec_set_bus_speed
tegra_nvec_kbd_probe
tegra kbc is initialized
tegra_nvec_kbd_start: Tegra nvec keyboard ready
In:    tegra-nvec-kbc
Out:   vidconsole
Err:   vidconsole
Net:   No ethernet found.
Hit any key to stop autoboot:  0 
switch to partitions #0, OK
mmc1 is current device
Scanning mmc 1:1...
Found EFI removable media binary efi/boot/bootarm.efi
reading efi/boot/bootarm.efi
813056 bytes read in 59 ms (13.1 MiB/s)
libfdt fdt_check_header(): FDT_ERR_BADMAGIC
## Starting EFI application at 0x01000000 ...
Scanning disks on usb...
Scanning disks on mmc...
MMC Device 2 not found
MMC Device 3 not found
Found 6 disks
Welcome to GRUB!

EFI партиция - hd1,gpt1 BOOT партиция - hd1,gpt2

Надо понять какой нужен grub'у конфиг. Чтобы откатиться на boot.scr достаточно написать exit.

Разное

Bootable флаг в U-Boot

Описание как в U-Boot считывается bootable флаг

Скрипты от nvidia для прошивки U-Boot

https://github.com/NVIDIA/tegra-uboot-flasher-scripts https://github.com/NVIDIA/tegra-uboot-scripts


Патчи Нвек в Mainline U-Boot

http://patchwork.ozlabs.org/project/uboot/list/?submitter=Andrey+Danin&state=*&archive=both

Persistent enviroment location

This settings live in include/configs/paz00.h

/* Environment in eMMC, at the end of 2nd "boot sector" */
#define CONFIG_ENV_IS_IN_MMC
#define CONFIG_ENV_OFFSET (-CONFIG_ENV_SIZE)
#define CONFIG_SYS_MMC_ENV_DEV 0
#define CONFIG_SYS_MMC_ENV_PART 2
<srwarren> Typically it's at the end of /dev/mmcblk0boot1 for devices that boot from eMMC
<srwarren> IIRC, 0==main data, 1==boot0, 2==boot1

Factory kernel 2.6.32-9 with U-Boot

Uncompressing Linux.................................................................................................................................................................................. done, booting the kernel.

Error: unrecognized/unsupported machine ID (r1 = 0x00000c38).

Available machine support:

ID (hex)        NAME
00000d05        Tegra 2 Development System
00000aab        NVIDIA Harmony Development System
00000b6f        NVIDIA Ventana Development System

Please check your kernel config and/or bootloader.

how to override this machine ID?

0x00000c38 is 3128 decimal, defined in arch/arm/include/asm/mach-types.h in U-Boot.

#define MACH_TYPE_PAZ00                3128

load U-Boot default enviroment settings

env default -a

kexec-based

Подробно об установке и настройке написано на вики grandou. Замечение: на флешке сразу boot партиция не нашлась, пришлось жать S для рескана. Замечание: у меня android 2.1 и ядро 3.0 не загрузились. При загрузке андроида никаких изменений, а 3.0 не смогло разобраться с usb устройствами. Рут линухов был на флешке. Для андроида cmdline использовал пустой. Возможно это из-за наличия SMP и THUMBEE - тут

<Tequila> Hi all, I just pulled my "ac100-multiboot" project at https://gitorious.org/~tequila/ac100/tequilas-ac100-multiboot <Tequila> It is based on kexecboot <Tequila> the used kernel is a recent one with little changes to permit kexec syscall <Tequila> I heavily changed the kernel so it it build in less than 2Mb <Tequila> but the most important things for the kernel to work with kexec is to have SMP and THUMBEE disabled... <Tequila> btw I'm not fully sure the ac100 is well shutdown during the kexec reboot so some stuff may not work well on the reboot <marvin24> Tequila: nice, which stuff does not work after reboot/restart? <marvin24> is there some userinterface, or just a cmdline? <Tequila> check the first screenshot at http://kexecboot.org/screenshots <Tequila> after reboot I'm not fully sure for now I didn't test every case. For now my old F14 install doesn't see anymore the wifi device but this may be another problem, so I can't confirm for the moment <Tequila> and I'm too busy to really test <Tequila> I'm just using a 64M SDCARD with a /boot folder including a boot.cfg and zImage & initrd.img <Tequila> so no cmdline (unless you customize the firmware of course) but a nice and simple UI <Tequila> I'm currently building again the firmware from https://gitorious.org/ac100/tequilas-ac100-multiboot/archive-tarball/master to be sure everything is working <Tequila> If any one want to build his own multiboot firmware, just start "./build_all", the kernel and kexecboot will be build with the built buildroot toolchain... you'll only need abootimg womewhere in the path <Tequila> of course it takes few hours... <Tequila> I'll provide the firmware if the one I'm building is still okay on my device <xranby> Tequila: does it work? <Tequila> xranby: yes, it works on my device <xranby> Tequila: cool which OS/kernels do you multiboot using it? <Tequila> only linux, it uses kexecboot. I didn't test Android but it should work too <Tequila> kexec is a linux feature: booting a linux kernel from a running linux kernel <Tequila> and I'm still the only one who test it... <Tequila> *tested it I mean

Замечание: kexec will load kernel with following cmdline: 'root=<selected device> rootfstype=<FS on selected device> rootwait mtdparts=<mtdparts tag from current kernel cmdline> fbcon=<fbcon tag from current kernel cmdline> <selected item cmdline from boot.cfg if any>' (How kexecboot works)


Мультизагрузка без дополнительных программ

После танцев с бубнами по вышеописанным вариантам мультизагрузки, остановился на следующем. Всё делается очень просто, ручками ;)

Суть: сохранить в два файла загрузчики андроида и линукса из раздела 6 (LNX), и командой в терминале андроида или линукса записывать тот, который нужно перед перезагрузкой тошибы.

Как сделать:

1. До установки Linux на Toshiba сохранить загрузчик андроида в файл (нужен установленный 'Эмулятор терминала' с поддержкой рута):

Запускаем терминал на андроиде и переходим в режим рута командой su

su

Создаём папку для образов загрузки например в /data/local/bootimg командой mkdir

mkdir /data/local/bootimg

Сохраняем загрузчик андроида командой dd

dd if=/dev/block/mmcblk0p2 of=/data/local/bootimg/p2-boot-android.img

(6-й раздел с загрузчиком андроид видит как устройство /dev/block/mmcblk0p2) (можете скинуть этот файл на usb-флешу, чтобы потом скопировать в линукс, тогда монтирование раздела user-data описанное ниже можно пропустить, а забрать файл с флешки)

2. Теперь можно установить Linux на Toshiba (естественно не на внутреннюю SD-карту, а на внешнюю :).

3. После того, как Linux установлен и работает, нужно сохранить его загрузчик в файл, забрать у андроида ранее сохранённый файл и положить в андроид файл с загрузчиком линукса. После этого создать два простых скриптика на перезапись загрузчика и перезагрузку:

Запускаем терминал в линуксе и переходим в режим рута командой sudo

sudo bash

[sudo] password for user: (введите ваш юзеровский пароль)

Создаём папку для образов загрузки, например в /usr/local/bootimg

mkdir /usr/local/bootimg

Сохраняем загрузчик линукса командой dd

dd if=/dev/mmcblk0p2 of=/usr/local/bootimg/p2-boot-linux.img

(6-й раздел с загрузчиком линукс видит как устройство /dev/mmcblk0p2)

Теперь нужно подмонтировать раздел user_data андроида в линукс (зачастую, например Ubuntu, автоматом монтируют разделы внутренней SD-карты в каталоге /media, можете просто там посмотреть), если линукс его не смонтировал (если вы ранее скопировали файл с загрузчиком на usb-флешку, то просто заберите с неё)

mkdir /mnt/adata (создадим куда монтировать)
mount -t ext4 /dev/mmcblk0p6 /mnt/adata (подмонтировали раздел андроида)

копируем загрузчик андроида в линукс, а загрузчик линукса в адндроид

cp /mnt/adata/local/bootimg/p2-boot-android.img /usr/local/bootimg
cp /usr/local/bootimg/p2-boot-linux.img /mnt/adata/local/bootimg

Теперь осталось только создать два простеньких скрипта для переключения: скрипт для переключения на загрузку андроида из линукса создаём в каталоге /usr/local/bin любым редактором или просто командой cat

cat <<END > /usr/local/bin/switch2android
  1. !/bin/bash

dd if=/usr/local/bootimg/p2-boot-android.img of=/dev/mmcblk0p2 reboot END

делаем этот скрипт исполяемым файлом командой chmod

chmod 755 /usr/local/bin/switch2android

Ну и сразу сделаем и скрипт для переключения в линукс из андроида

cat <<END > /mnt/adata/local/bin/switch2linux
  1. !/system/bin/sh

dd if=/data/local/bootimg/p2-boot-linux.img of=/dev/block/mmcblk0p2 reboot END

делаем исполняемым

chmod 755 /mnt/adata/local/bin/switch2linux

Ну вот, как бы всё.

Теперь, чтобы переключиться на загрузку андроида, просто наберите в терминале линукса команду

sudo switch2android

А в андроиде, запустите Эмулятор Терминала, вы полните переход в режим рута командой su, и наберёте команду

switch2linux

Надеюсь, приведённый вариант мультизагрузки будет для вас приемлемым (не сто раз в день ведь перегружаетесь :). Зато стопроцентно не будет никаких проблем с определением устройств тошибы при загрузке линукса, как могут возникать при использовании дополнительных мультизагрузчиков.

Дуал бут изменением cmdline


Общая концепция: Линукс и андроид используют одно ядро, переключение cmdline на загрузку другой ос делается в онлайн на тоше с помощью abootimg. По смыслу близко к uboot. Сохраняется таблица партиций андроида, но последняя партиция делиться на 2 части, часть под линукс самая большая.

  • abootimg собран под андроид и включен в последние сборки с суидными правами.
    • Потестить что он работает и дает нужный эффект
  • Придумать таблицу разделов подходящую для такой схемы.