Symlink/Mount/Bind in Root erstellen [geschlossen]

Ich möchte (über make) auf meinem Android-Handy kompilieren. Ich habe Root-Zugriff.

Ich habe fast alles eingerichtet. Aber da ist dieser Haken. Alle Konfigurationsdateien haben einen Shebang von #!/bin/sh . Ich kann sie mit $SHELL configure ausführen. Ich habe auch $CONFIG_SHELL gesetzt. Aber einige configure-Dateien führen andere Shell-Skripte aus und geben /bin/sh: no such file or directory .

Ich denke darüber nach, einen Symlink /bin/sh -> /system/bin/sh zu erstellen. Ich habe irgendwo gelesen, dass das Root-Dateisystem die Ramdisk ist und alle Änderungen daran in der Datei init.rc vorgenommen werden müssen . Wenn ich dies also erreichen möchte, müsste ich zuerst ein Verzeichnis ‚bin‘ erstellen und dann einen Symlink ‚sh‘ darin erstellen. Ich bezweifle, dass ln in init.rc funktionieren wird.

Ich habe diese andere Idee. Erstellen Sie irgendwo ein Verzeichnis ‚bin‘, vorzugsweise im Datenverzeichnis von Terminal IDE (ich verwende das). Dann erstellen Sie dort einen Symlink sh -> /system/bin/sh. Erstellen Sie dann 'bin' in / through und verwenden Sie mounten Sie den ersten bin in /bin durch init.rc

Drittens kann ich einfach mkdir bin und cp /system/bin/sh /bin/sh

Außerdem schlagen alle diese Methoden fehl und führen zu einem Startfehler, wenn eines der Quellverzeichnisse nicht gefunden werden kann.

Ich möchte wissen, welche Methode sicherer ist und ob es eine sicherere Alternative gibt?

Erstellen Sie ein Nandroid-Backup, bevor Sie Ihre Sachen erledigen. Das ist die sicherste Vorgehensweise!
@Firelord Das ist für mich selbstverständlich. Ich habe mein Telefon viel zu oft gemauert, um kein Nandroid-Backup zu erstellen.

Antworten (1)

@vishalbiswas Damit das funktioniert, müssen Sie möglicherweise auch PATH und LD_LIBRARY_PATH exportieren

Sie können Ihr erforderliches Setup tatsächlich per Skript ausführen und dieses Skript an xbin senden, damit es als ausführbar ausgeführt wird. Sie würden sich also so etwas ansehen, um das Skript so einzurichten, wie es für Sie funktioniert

#!/system/bin/sh
mount -o rw,remount /
mkdir /bin && mkdir /lib
chmod 755 /bin /lib
mount -o bind /system/bin /bin
mount -o bind /system/lib /lib
export PATH=/bin && export LD_LIBRARY_PATH=/lib

das obige ist lose, basteln Sie ein wenig daran, um es jetzt zu schließen, meistens in umgekehrter Reihenfolge

#!/system/bin/sh
umount /bin && umount /lib
mount -o ro,remount /

Die Verzeichnisse /bin und /lib sollten beim Neustart verschwinden, da sie im RAM leben, und Sie sollten PATH und LD_LIBRARY_PATH nicht aufheben müssen, da diese Variablen beim Schließen Ihrer Terminalinstanz damit sterben sollten.

Der andere Ansatz besteht darin, ein schnörkelloses Chroot-Arm-Linux in der zweiten Partition Ihrer externen SD-Karte einzurichten. Ich verwende Debian und habe meine init.environ.rc wie folgt angepasst

# set up the global environment
on init
    export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/gcc/bin:/system/xbin:/bin:/usr/bin:/usr/sbin
    export LD_LIBRARY_PATH /system/lib:/system/gcc/lib:/system/vendor/lib
    export ANDROID_BOOTLOGO 1
    export ANDROID_ROOT /system
    export ANDROID_ASSETS /system/app
    export ANDROID_DATA /data
    export ANDROID_STORAGE /storage
    export ASEC_MOUNTPOINT /mnt/asec
    export LOOP_MOUNTPOINT /mnt/obb
    export BOOTCLASSPATH [blah blah jars blah xD ]

# Debian CHROOT
    export DEBIAN_ROOT /debian
    export TMPDIR /tmp
    mount -t proc none /debian/proc
    mount -t sysfs none /debian/sys
    mount -o bind /dev /debian/dev
    mount -o bind /proc/net /debian/proc/net
    mount -t devpts none /debian/dev/pts

Bei diesem Ansatz sollte Ihr Dateimanager die Verzeichnisse Ihrer Chroot-Partitionsdateien lesen, und das alles ohne Probleme. Ich benutze Total Commander.

EDIT- ich habe den nötigen Eintrag in der fstab vergessen es geht wie folgt, wieder an das Schema deines Gerätes anpassen

/dev/block/platform/msm_sdcc.2/by-num/p2              /debian      ext4    rw,errors=panic                               wait

Hier ist das Tutorial, das ich von http://whiteboard.ping.se/Android/Debian gelernt habe

Suchen Sie jedoch nach einem ziemlich aktuellen Distributions-Image. Solange Sie nicht versuchen, ein per Bind gemountetes Verzeichnis zu löschen, ohne es vorher UNMOUNTET zu haben [ich habe das übrigens noch nie gemacht], werden Sie Ihr System nicht versehentlich löschen.

Ich mache es derzeit manuell, indem ich diese Ordner erstelle. Während Ihr Ansatz cool aussieht, suche ich nicht nach einer vollständigen Chroot-Umgebung. Allerdings werde ich meine SD mit ext4 partitionieren. Ich bin dabei, es mit einem Skript zu automatisieren, wie Sie es vorgeschlagen haben.
@vishalbiswas Hallo nochmal, dies wird keine "vollständige" Chroot sein. Nur Terminalarbeit! =) Ich persönlich denke, dass es auf diesen Geräten keinen Sinn macht, das gesamte X-Setup VNC oder auf andere Weise einrichten zu wollen. Sobald Sie eingerichtet sind, werden Sie glücklich sein. Wenn Sie LP verwenden, müssen Sie möglicherweise daran denken, dass alle Binärdateien, die Sie kompilieren, PIE (positionsunabhängige ausführbare Datei) sein müssen. Übergeben Sie -fPIE an der gcc-Befehlszeile. -fPIC sollte auch funktionieren.
Ich meinte über die Debian-Chroot
@vishalbiswas Ich spreche von der Chroot, es ist nur Terminal, kein Xserver, kein VNC, es wird nicht benötigt. Wenn Sie umschalten müssen, öffnen Sie Ihr Terminal, exportieren Sie Ihren Pfad, exportieren Sie PATH=/bin:/sbin:/usr/bin:/usr/sbin:$PATH chroot /debian /bin/bash und Sie befinden sich am Terminal in Debian