Как запустить ADB прямо из initramfs?
Хочу написать свой debug-ramdisk. Пишу для этого свой init. Он монтирует /proc, /sys, /dev, /dev/usb-ffs, затем запускает adb. Но я получаю бутлуп, а не консоль adb с ПК. Код init-а:
#include <unistd.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
mount("proc", "/proc", "proc", 0, NULL);
mount("sysfs", "/sys", "sysfs", 0, NULL);
mount("tmpfs", "/dev", "tmpfs", 0, NULL);
mkdir("/dev/usb-ffs", 0777);
mount("adb", "/dev/usb-ffs", "functionfs", 0, NULL);
rename("/adbd", "/init");
execlp("/init", "/init", NULL);
return 0;
}
Пробовал даже через fork() + exec() - не помогает, ловлю бутлуп. Материалов вообще по замене Android-ового init-а толком нету, находил лишь тему ADB Offline в 4pda, да и там результатов 0.
Есть мысль сделать фреймбуферную консоль. Однако, во1, я вообще не знаю, как обращаться к Android-овому фреймбуферу. Во2, обратил ещё внимание на magiskinit:
~ # file ramdisk/magiskinit
ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, BuildID[md5/uuid]=b2642531700d89ae9db610791bbc1d85, not stripped
~ # file ramdisk/init
ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=955057ba47ec03b63af7a86769ceecf40d4a4e90, for GNU/Linux 3.7.0, not stripped
Есть мысль, пусть и абсурдная, что дело в типе файла. Но как перекомпилировать на SYSV - я не знаю. По-моему, это только пересборкой gcc делается...
Спросите: а зачем? Я хочу получить debug-консоль прямо на этапе загрузки. UART у меня только на Bluetooth адаптер, да и него чёрт доберешься. Ядро не поддерживает ни FBCON, ни LLCON.
Думал ещё написать свой аналог adbd - по крайней мере, я слыхал про libusb. Но тоже дико сложно, пойду на такое лишь в крайнем случае. Вопрос: есть ли вообще готовые инструменты для получения халявной консоли при загрузке??? Пусть они запускаются даже вместо /init, как у меня, пусть.