Почему разделы автоматически размонтируются через некоторое время?

У меня есть телефон Android под управлением Oreo 8.1.0. У меня есть два раздела на SD-карте. Один раздел в формате ext4. Я монтирую его с помощью:

mount -t ext4 -o rw /dev/block/mmcblk1p2 /data/sdext2

Но через некоторое время раздел автоматически размонтируется, и мне приходится монтировать его снова.

Даже когда он смонтирован, содержимое не отображается в приложениях для просмотра файлов, таких как MiXplorer и ES Explorer, и отображается только в терминале.

Итак, как лучше всего постоянно монтировать раздел ext4 в Android и в чем причина такого поведения?

Я использую приложение Magisk. Я сталкиваюсь с этой проблемой только тогда, когда запускаю ее в приложении терминала Android. Но когда я устанавливаю эту команду для выполнения при загрузке, помещая ее в каталог init.d и т. Д., Тогда она работает нормально, и раздел ext4 не размонтируется автоматически. Я не понимаю, почему он так работает в этом случае. Может ли кто-нибудь объяснить это?

Ответы (1)

КОРОТКИЙ ОТВЕТ

Перейдите в «Настройки Magisk» и установите Mount Namespace Modeзначение Global«один раз для всех». В приложении SuperSU отключите Mount Namespace Separation.
ИЛИ
Для одноразового решения используйте эту команду:

~$ su -mm -c 'mount <device> <mountpoint>'

ДЛИННЫЙ ОТВЕТ

но через некоторое время раздел автоматически размонтируется, и мне приходится снова его монтировать.

ПРОСТРАНСТВА ИМЕН ДЛЯ ANDROID
Такое поведение связано с тем, что пространство имен Mount реализовано в Android, начиная с Android-6, для изолирования/изолирования приложений. Чтобы контролировать доступ приложения к системным ресурсам и файловым системам, в частности к SDCard, каждое приложение (Dalvik или ART VM, которое обрабатывает байт-код Java в исполняемый двоичный файл .dex) запускается с помощью zygote (процесс инициализации Android) в новом пространстве имен монтирования, где оно может независимо размонтировать любую файловую систему (кроме rootfs) или перемонтировать, не затрагивая другие пространства имен. Каждый процесс, запускаемый приложением, живет в том же (или дополнительном) изолированном пространстве имен.
Обычно пространства имен mnt(mount) и net(network) включены в ядре Android по умолчанию. Другие пространства имен pidиuserutsможно включить путем пересборки ядра.

ГЛОБАЛЬНОЕ ПРОСТРАНСТВО ИМЕН
Самый первый процесс, запущенный ядром при загрузке: init вместе со всеми процессами ядра (kworkers и т. д.) и другими процессами демона инициализации (такими как ueventd, logd, servicemanager, vndbinder, mediaserver, netd и т. д.) живут в глобальном / корневом пространстве имен . . Когда мы устанавливаем моды (такие как Magisk, Xposed и т. д.), они также запускаются как процесс в корневом пространстве имен, обычно на начальном этапе процесса загрузки.
Файловые системы Android (настоящие или псевдо; /system, /data, /proc и т. д.) также изначально монтируются в глобальном пространстве имен. В пространстве имен приложения для всех подключений (включая rootfs) задано значение slave, так что любое новое подключение внутри них в корневом пространстве имен распространяется на пространство имен приложения, но не наоборот. См. распространение монтирования .

ИНСТРУМЕНТЫ NAMESPACE Команду
Linux lsnsможно использовать для просмотра всех пространств имен. Пространство имен монтирования может быть создано с помощью unshare -m. Для входа в пространство имен nsenterиспользуется легкодоступная оболочка SETNS. В большинстве случаев эти команды не работают без привилегий root.

СУПЕР ПОЛЬЗОВАТЕЛЬ И МОНТАЖ NS
Когда мы выполняем suкоманду в приложении эмулятора терминала, запускается новый процесс (оболочка) с повышенными возможностями. Этот процесс находится в том же пространстве имен монтирования, что и приложение Terminal. Таким образом, mountкоманда также выполняется в том же пространстве имен, и поэтому файловая система видна только в этом пространстве имен. Как только мы exitполучим эту оболочку, точка монтирования не будет отображать содержимое файловой системы. Если в пространстве имен нет запущенного процесса, он автоматически очищается.
Обратите внимание, что приложение полностью уничтожается, когда его процесс Dalvik завершается принудительной остановкой или управлением памятью Android .
Если приложение «Терминал» не было полностью уничтожено, suможет войти в то же пространство имен, только когдаInherited Namespaceопция включена в Magisk. Isolated Namespaceвсегда будет создавать новое пространство имен монтирования.

Теперь перейдем к вашему вопросу:

Даже когда он смонтирован, содержимое не отображается в приложениях для просмотра файлов, таких как MiXplorer и ES Explorer, и отображается только в терминале.

Это связано с тем, что проводники (приложения) работают в своих собственных пространствах имен монтирования. Запустите эту команду от имени пользователя root, чтобы получить обзор:

~# ps f -p2 --ppid 2 --deselect -o mntns,pid,cmd --sort=mntns

Вы можете использовать Termux для получения полной версии ps.

Когда я устанавливаю эту команду для выполнения при загрузке, помещая ее в каталог init.d в /etc, тогда она работает нормально, и раздел ext4 не размонтируется автоматически.

Это связано с тем, что скрипт init.d выполняется initв глобальном пространстве имен.

Итак, как лучше всего постоянно монтировать раздел ext4 в Android и в чем причина такого поведения?

Чтобы избежать всей загадки, всегда монтируйте часто используемые файловые системы в глобальном пространстве имен монтирования (хотя оно уязвимо для нарушений безопасности), если не требуется иное. Простая проверка, находимся ли мы в глобальном пространстве имен:

~# [ "$(readlink /proc/self/ns/mnt)" = "$(readlink /proc/1/ns/mnt)" ] && echo 'In Global NS.' || echo 'Not in Global NS.'

ПРИМЕЧАНИЕ. Этот тест работает только в исходном PID NS.

Другая возможность — создать пространство имен с расширением unshare -m --propagation shared. Теперь любые новые монтирования в этом пространстве имен будут распространяться на все пространства имен. Но это неприменимо к уже созданным пространствам имен приложений. mount --make-rshared /не работает (по крайней мере, для меня), если пространство имен изначально было создано с использованием slaveили privateраспространением.

Подробнее см . в этой теме .