У меня есть телефон Android под управлением Oreo 8.1.0. У меня есть два раздела на SD-карте. Один раздел в формате ext4. Я монтирую его с помощью:
mount -t ext4 -o rw /dev/block/mmcblk1p2 /data/sdext2
Но через некоторое время раздел автоматически размонтируется, и мне приходится монтировать его снова.
Даже когда он смонтирован, содержимое не отображается в приложениях для просмотра файлов, таких как MiXplorer и ES Explorer, и отображается только в терминале.
Итак, как лучше всего постоянно монтировать раздел ext4 в Android и в чем причина такого поведения?
Перейдите в «Настройки 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
иuser
uts
можно включить путем пересборки ядра.
ГЛОБАЛЬНОЕ ПРОСТРАНСТВО ИМЕН
Самый первый процесс, запущенный ядром при загрузке: 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
распространением.
Подробнее см . в этой теме .
Джонни789