Warum werden Partitionen nach einiger Zeit automatisch ausgehängt?

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?

Ich verwende die Magisk-App. Ich habe dieses Problem nur, wenn ich es in der Android-Terminal-App ausführe. Aber wenn ich diesen Befehl so einstelle, dass er beim Booten ausgeführt wird, indem ich ihn in das init.d-Verzeichnis usw. platziere, funktioniert es normal und die ext4-Partition wird nicht automatisch ausgehängt. Ich verstehe nicht, warum es in diesem Fall so funktioniert. Könnte es jemand erklären?

Antworten (1)

KURZE ANTWORT

Gehen Sie zu den Magisk-Einstellungen und stellen Sie sie Mount Namespace Modeauf ein Globalfü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>'

LANGE ANTWORT

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 pidunduserutskann 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, nsentersteht 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. suDieser Prozess befindet sich im selben Mount-Namespace wie die Terminal-App. Der mountBefehl wird also auch im selben Namensraum ausgeführt und das Dateisystem ist daher nur innerhalb dieses Namensraums sichtbar. Sobald wir exitdiese 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, sudarf derselbe Namespace nur dann eingegeben werdenInherited NamespaceOption ist in Magisk aktiviert. Isolated Namespaceerstellt 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 slaveoder privatepropagation erstellt wurde.

Weitere Informationen finden Sie in diesem Threadbeitrag .