Как отследить работу /init?

Вообще, передо мной стояла задача понять, как /init и /(magisk)init монтируют блочные устройства? Android - не Linux, он не поддерживает devtmpfs и не использует udev. Для этого я решил сделать такую вещь, а именно: заменить /init в Ramdisk-e на свой, заранее подготовленный. Получилось так (девайс - Android 10, system-as-root):

 ~/ramdisk # ls
.backup apex dev magiskinit mnt init proc sys
 ~/ramdisk # cat ../src/init.cpp
#include <unistd.h>
#include <stdio.h>
#include <filesystem>
#include <string>
#include <vector>
#include <fstream>
#include <sys/mount.h>
using std::string, std::vector, std::ifstream, std::ofstream, std::ios, std::endl;

int main() {
    string devd;
    mount("proc", "/proc", "proc", 0, NULL);
    vector<string> devblks;
    vector<string> mounts;
    for (auto a : std::filesystem::directory_iterator("/dev")) {
        string pth = (a.path()).c_str();
        devblks.push_back(pth);
    }
    const bool mountext = std::filesystem::exists("/proc/mounts");
    if (mountext) {
        ifstream opn;
        opn.open("/proc/mounts", ios::in);
        while(getline(opn, devd)) {
            mounts.push_back(devd);
        }
        opn.close();
    }
    pid_t parent = fork();
    if (parent) {
        rename("/magiskinit", "/init");
        execlp("/init", "/init", NULL);
    } else {
        while (true) {
            bool ifext = std::filesystem::exists("/data/media/0");
            if (ifext) {
                ofstream itog;
                itog.open("/data/media/0/sys.log", ios::out);
                for (unsigned int k=0; k < devblks.size(); k++) {
                    itog << "Block: " << devblks[k] << endl;
                }
                for (unsigned int j=0; j < mounts.size(); j++) {
                    itog << "Mount: " << mounts[j] << endl;
                }
                itog.close();
                break;
            }
        }
    }
    return 0;
}

И... бутлуп. Видимо, наличие child-процесса не даёт сделать switch_root в /system.

И я ведь не могу заменить /init на скриптовый или вообще на bash. У меня нету ни UART, ни поддержки FBCON или LLCON => не смогу подключиться к консоли вот таким образом.

Интересно, а как вообще отследить запуск init-а? Ладно, пусть не при запуске системы из boot.img. Может, можно придумать что-то с chroot или QEMU?

Я думаю, мой способ бы заработал на девайсе с Android < 9 (т е ramdisk-as-root). Но как быть на Android 10+?


Ответы (0 шт):