• topjohnwu's avatar
    Logical Resizable Android Partitions support · f1112fdf
    topjohnwu authored
    The way how logical partition, or "Logical Resizable Android Partitions"
    as they say in AOSP source code, is setup makes it impossible to early
    mount the partitions from the shared super partition with just
    a few lines of code; in fact, AOSP has a whole "fs_mgr" folder which
    consist of multiple complex libraries, with 15K lines of code just
    to deal with the device mapper shenanigans.
    
    In order to keep the already overly complicated MagiskInit more
    managable, I chose NOT to go the route of including fs_mgr directly
    into MagiskInit. Luckily, starting from Android Q, Google decided to
    split init startup into 3 stages, with the first stage doing _only_
    early mount. This is great news, because we can simply let the stock
    init do its own thing for us, and we intercept the bootup sequence.
    
    So the workflow can be visualized roughly below:
    
    Magisk First Stage --> First Stage Mount --> Magisk Second Stage --+
       (MagiskInit)         (Original Init)         (MagiskInit)       +
                                                                       +
                                                                       +
         ...Rest of the boot... <-- Second Stage <-- Selinux Setup  <--+
          (__________________ Original Init ____________________)
    
    The catch here is that after doing all the first stage mounting, /init
    will pivot /system as root directory (/), leaving us impossible to
    regain control after we hand it over. So the solution here is to patch
    fstab in /first_stage_ramdisk on-the-fly to redirect /system to
    /system_root, making the original init do all the hard work for
    us and mount required early mount partitions, but skips the step of
    switching root directory. It will also conveniently hand over execution
    back to MagiskInit, which we will reuse the routine for patching
    root directory in normal system-as-root situations.
    f1112fdf
getinfo.cpp 3.85 KB