First of all, thanks petter (https://github.com/havlenapetr), Czech Samsung Galaxy developer, for idea and source codes.
What do I mean?
You have one ROM in internal memory as usual, and another one in folder on SD card ext partition. You can easily switch between them - just move rom from ext partition to some backup folder.
See guide in second post
How is it done?
Lets look on how android boots - its (roughly) like that:
1. Bootloader - forks between recovery, fastboot and normal bootSo, what we need to do is mount something else than internal memory in init. Init parses & runs simple scripts, which makes it simpler to mount sdcard folders.
2. Linux kernel - Unpacks its initrd, loads drivers and many more things, not important now
3. Init - kernel runs this program, which mounts android partitions, sets correct permissions to files, starts services, and in the end, starts android itself
4. Android - Dunno much about it yet, anyway not important now
We need to add mknod and bind mounting to init binary. Unfortunately, we dont have sources of init modified by LG (that thing is three(!) times larger than init compiled from AOSP, what the hell is in there?!). That is solved by running modified init, which parses "preinit.rc" with mounts and then runs LG init.
This would be all, if original LG init would not remount /system and /data from internal memory. Also, nearly every ROM has different init.rc, and wont boot without it.
To solve this, I created "import_boot" command in init, which copies *.rc files and LG init from ramdisk(well, its only folder with these files extracted from ramdisk for now) on sdcard ext partition. This command also puts comments out every line with mount /data, /system or /cache in init.rc file, so LG init wont remount them.
Commit: https://github.com/Tasssadar/init/co...616765ee043e83, https://github.com/Tasssadar/init/co...5c71237231436c and https://github.com/Tasssadar/init/co...229605bc517b52
Format of ROM on ext partition:
All files from paritions in internal memory copied to sd ext partition with preserved owners and permissions(!).
So, when I copy data, I do "cp -r -p /data/* /sd-ext/multirom/rom/data/" (I suggest to run this via adb shell while in recovery).
Currently, I mount /system, /data and /cache from sdcard. If one or more of these folders does not exist, its equivalent from internal memory is used.
It would be nice to have *.img files from nandroid backups instead of this, but as far as I know, they cant be just mounted.
As for *.rc files, I put them into /sd-ext/multirom/rom/boot folder. I would like to just copy boot.img and extract files in init, but I did not find way to extract it when I have hardly STL usable in init. I'd like to use kernel's internal decompressor, but I dont know how.
- Both ROMs must be compatible with one kernel - kernel is already loaded in init
- ROMs must be for same baseband, obviously
- Kernel modules(wifi, for example) of both ROMs must be compatible with one kernel. That can be easily solved by copying modules from one ROM to another, though.
- It will be slower than internal memory.
Integration with recovery
Definitely possible & usefull. This is integration in my modified AmonRa recovery: https://github.com/Tasssadar/Amon-Ra...b81e8c55dc3ee2
/system on sdcard can't be mounted read-only - I'd have to mount whole sdcard read-only. This is possible security hole, but you cant do much without root anyway, because of permissions. And if you have root, it does not matter if its read-only or not.
So, it is possible to have dual-boot. You can use it to develop ROMs(you can directly edit data in /data and /system), as backup ROM when you are testing something in internal memory which does not boot, and you need to call someone or when our devices will be so old that bad blocks in internal memory wont allow us to boot
But, as you can see, It is not something that average user could do, at least not yet. Maybe I could modify recovery to do everything for the user (copy data from /system, /data and /cache, extract *.rc files from boot) and create some flashable ZIPs which would modify the init.
But there are some problems - some ROMs may not be compatible with this and there are multiple recoveries out there, but theres not single one which is only for our phone - both AmonRa and ClockworkMod are developed for wide range of devices. Yes, both of them can be modified, but I doubt they creators would accept such inflexible and device-specific thing.
What do you think, is it worth it?
Tested ROMs (first one is in internal memory, second one is on SDcard)
- Megatron and stock v10a ROM - stock rom is slow
- Megatron and devoid #froyo-final - like ten times faster than stock xD
- LightRom(2.2.2) and devoid #froyo-final (and vice versa)
- Megatron and Megatron - both ROMs can have a2sd
- Megatron and Mik's CM7 6.5.8 - since v2
- Gingerbread 2.3.4 from Optimus Net and CM7 6.6.1 (thx eduardogouveia for testing)
- Stock 2.2.2 and CM7 6.5.8 (thx eduardogouveia for testing) - if you have ext4 partition, you need custom kernel for stock ROM.
- .void 2.3.4 and stock V20B (thx diazneoones for testing)
- CM7 6.5.8 and .void 2.3.4 (thx diazneoones for testing)
- CM7 nightlies and Lupohirp's СM9 (thx aquapp for testing)
- None found yet,
but when CM7 is on sdcard, it looses root. Trying to figure out why.- fixed in v10
PS: I hope I explained it correctly, not exactly good at this. Do not fear to ask, if you don't understand something.