Как отследить работу /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+?