Ich habe ein Android-Telefon mit Oreo 8.1.0. Ich habe zwei Partitionen auf der SD-Karte. Eine Partition ist ext4-formatiert. Ich mounte es mit:
mount -t ext4 -o rw /dev/block/mmcblk1p2 /data/sdext2
Aber nach einiger Zeit wird die Partition automatisch ausgehängt und ich muss sie erneut einhängen.
Selbst wenn es gemountet ist, sind die Inhalte in Datei-Explorer-Apps wie MiXplorer und ES Explorer nicht sichtbar und sind nur im Terminal sichtbar.
Was ist also der beste Weg, um die ext4-Partition dauerhaft in Android zu mounten, und was ist der Grund für ein solches Verhalten?
Gehen Sie zu den Magisk-Einstellungen und stellen Sie sie Mount Namespace Mode
auf ein Global
für alle Mal ein. Deaktivieren Sie in der SuperSU-AppMount Namespace Separation
.
ODER
Verwenden Sie für eine einmalige Lösung stattdessen diesen Befehl:
~$ su -mm -c 'mount <device> <mountpoint>'
aber nach einiger Zeit wird die Partition automatisch ausgehängt und ich muss sie erneut einhängen.
ANDROID-NAMESPACES
Dieses Verhalten ist auf Mount Namespace zurückzuführen, der von Android seit Android-6 zum Zweck des Sandboxing/Isolation von Apps implementiert wurde. Um den Zugriff der App auf Systemressourcen und Dateisysteme – insbesondere SDCards – zu kontrollieren, wird jede App (Dalvik oder ART VM, die Java-Bytcode in ausführbare .dex-Binärdateien verarbeitet) von Zygote (einem Android-Init-Prozess) in einem neuen Mount-Namespace gestartet, wo dies möglich ist Unmounten Sie unabhängig jedes Dateisystem (außer rootfs) oder remounten Sie es, ohne andere Namespaces zu beeinflussen. Jeder Prozess, den die App startet, befindet sich im selben (oder weiteren) isolierten Namespace.
Normalerweise sind mnt
(mount)- und net
(network)-Namespaces im Android-Kernel standardmäßig aktiviert. Andere Namensräume pid
unduser
uts
kann durch Neuaufbau des Kernels aktiviert werden.
GLOBAL NAMESPACE
Der allererste Prozess, der vom Kernel beim Booten gestartet wird: init zusammen mit allen Kernelprozessen (kworkers etc.) und anderen init-Daemon-Prozessen (wie ueventd, logd, servicemanager, vndbinder, mediaserver, netd etc.) leben im Global / Root Namespace . Wenn wir Mods (wie Magisk, Xposed usw.) installieren, starten sie auch als Prozess im Root-Namespace, normalerweise in der Anfangsphase des Startvorgangs.
Android-Dateisysteme (echt oder pseudo; /system, /data, /proc usw.) werden ebenfalls anfänglich im globalen Namespace gemountet. Im Namespace einer App sind alle Mounts (einschließlich rootfs) auf festgelegt slave
, sodass alle neuen Mounts darin im Root-Namespace an den Namespace der App weitergegeben werden, aber nicht umgekehrt. Siehe Mount-Propagation .
Der Linux-Befehl NAMESPACE TOOLSlsns
kann verwendet werden, um alle Namespaces anzuzeigen. Der Mount-Namespace kann erstellt werden von unshare -m
. Um einen Namensraum einzugeben, nsenter
steht ein leicht verfügbarer SETNS-Wrapper zur Verfügung. In den meisten Fällen funktionieren diese Befehle nicht ohne Root-Rechte.
SUPER USER UND MOUNT NS Wenn wir einen Befehl in einer Terminal-Emulator-App
ausführen , wird ein neuer Prozess (Shell) mit erhöhten Fähigkeiten gestartet. su
Dieser Prozess befindet sich im selben Mount-Namespace wie die Terminal-App. Der mount
Befehl wird also auch im selben Namensraum ausgeführt und das Dateisystem ist daher nur innerhalb dieses Namensraums sichtbar. Sobald wir exit
diese Shell ausgeführt haben, zeigt der Mountpoint keine Dateisysteminhalte mehr an. Wenn es in einem Namespace keinen laufenden Prozess gibt, wird er automatisch bereinigt.
Bitte beachten Sie, dass eine App vollständig beendet wird, wenn ihr Dalvik-Prozess durch Force Stop oder durch die Speicherverwaltung von Android beendet wird .
Wenn die Terminal-App nicht vollständig beendet wurde, su
darf derselbe Namespace nur dann eingegeben werdenInherited Namespace
Option ist in Magisk aktiviert. Isolated Namespace
erstellt immer einen neuen Mount-Namespace.
Nun zu deiner Frage:
Selbst wenn es gemountet ist, sind die Inhalte in Datei-Explorer-Apps wie MiXplorer und ES Explorer nicht sichtbar und sind nur im Terminal sichtbar.
Dies liegt daran, dass Explorer (Apps) in ihren eigenen Mount-Namespaces ausgeführt werden. Führen Sie diesen Befehl als root aus, um sich einen Überblick zu verschaffen:
~# ps f -p2 --ppid 2 --deselect -o mntns,pid,cmd --sort=mntns
Sie können Termux für eine Vollversion von ps
.
Wenn ich diesen Befehl so einstelle, dass er beim Booten ausgeführt wird, indem ich ihn in das init.d-Verzeichnis in / etc platziere, funktioniert er normal und die ext4-Partition wird nicht automatisch ausgehängt.
Dies liegt daran, dass dieses init.d-Skript im globalen Namensraum ausgeführt wird init
.
Was ist also der beste Weg, um die ext4-Partition dauerhaft in Android zu mounten, und was ist der Grund für ein solches Verhalten?
Um dem ganzen Rätsel zu entkommen, mounten Sie Ihre häufig aufgerufenen Dateisysteme immer im Global Mount Namespace (obwohl es anfällig für Sicherheitsverletzungen ist), sofern nicht anders erforderlich. Eine einfache Überprüfung, ob wir uns im globalen Namensraum befinden:
~# [ "$(readlink /proc/self/ns/mnt)" = "$(readlink /proc/1/ns/mnt)" ] && echo 'In Global NS.' || echo 'Not in Global NS.'
HINWEIS: Dieser Test funktioniert nur im anfänglichen PID NS.
Eine andere Möglichkeit besteht darin, Namensräume mit zu erstellen unshare -m --propagation shared
. Jetzt werden alle neuen Mounts in diesem Namespace an alle Namespaces weitergegeben. Dies gilt jedoch nicht für Namespaces bereits erstellter Apps. mount --make-rshared /
funktioniert (zumindest bei mir) nicht, wenn der Namespace ursprünglich mit slave
oder private
propagation erstellt wurde.
Weitere Informationen finden Sie in diesem Threadbeitrag .
jonny789