Корневые команды на эмуляторе терминала не работают в масштабах всей системы

Я хочу запустить следующую команду от имени пользователя root в эмуляторе терминала Android .

mount -o bind /storage/extSdCard /data/media

Я проверил это на Samsung Galaxy S3 с CyanogenMod 11, и он работает, как и ожидалось. Когда я вхожу /data/mediaс помощью другого приложения, такого как файловый менеджер ES File Explorer , я получаю содержимое внешней SD-карты вместо внутренней памяти.

Проблема в том, что это не работает на другом S3, который у меня есть, на этом работает стандартная прошивка TouchWiz версии 4.3 и рутирован с помощью CF-Auto-Root . Я также пытался использовать пользовательское ядро ​​Адама , и оно тоже не работает.

Когда я запускаю команду на терминале, а затем набираю ls /data/mediaкак root, он показывает содержимое внешней SD-карты, но если я запускаю другой терминал как обычный пользователь (не root) и набираю ту же команду, я получаю содержимое внутренней Память. То же самое произойдет, если я попытаюсь получить доступ /data/mediaс помощью файлового менеджера ES File Explorer.

Таким образом, кажется, что команды root действуют только для пользователя root, а не для других пользователей в масштабе всей системы. Что может быть причиной такого поведения?

ОБНОВЛЕНИЕ: Хорошо, мой плохой, я не правильно выразился. Это правда, что обычный пользователь не может получить доступ к /data/media. А вот /data/mediaистинное расположение файлов во внутренней памяти. Существует множество путей, по которым Android делает эту память доступной для обычных пользователей, например /sdcardили /storage/sdcard0, оба из которых указывают на /data/media/0файловую систему FUSE.

Мое мнение заключается в том, что если я создам папку с именем 0на внешней SD-карте, а затем привяжу ее /storage/extSdCardк /data/media, когда система попытается получить доступ /sdcard, или /storage/sdcard0она получит содержимое, /storage/extSdCard/0поскольку /data/mediaоно больше не указывает на внутреннюю память, а вместо этого на внешний SD.

Это работает, как и ожидалось, на CM11, когда я запускаю как root

mount -o bind /storage/extSdCard /data/media

Затем, если я получаю доступ /sdcardк терминалу как пользователь root или обычный пользователь, я получаю доступ к содержимому /storage/extSdCard/0. То же самое происходит, если я использую ES File Explorer в обычном или корневом режимах.

Но когда я делаю то же самое на стоковой прошивке 4.3 с рутом, это не работает. Только пользователь root на терминале может видеть изменения, обычный пользователь на терминале и обычный пользователь и пользователь root в ES File Explorer не увидят изменений.

I get the contents of the internal memory.)-- Я не понимаю, как обычный пользователь вообще может видеть любой контент /data/mediaбез повышенных привилегий. Вы должны получить сообщение об ошибке в терминале, что-то вроде «Операция не разрешена». О вашем втором случае с ES, поскольку обычный пользователь ES не должен ничего показывать в /dataкаталоге, и я не знаю, как перейти в определенное место напрямую с помощью ES (похоже, у него нет адресной строки). Тем не менее, /data/mediaобычный пользователь все еще может получить к нему доступ с помощью терминала. Я проверил, работает хорошо.
Да, вы правы, я плохо выразился. Я отредактировал вопрос, предоставив дополнительную информацию

Ответы (2)

Мой случай, я полагаю, это та же причина для вас.

Перейдите в приложение «Менеджер суперпользователей», я полагаю, это SuperSU.

Перейдите в настройки и найдите «Разделение пространства имен монтирования» и проверьте, отмечен ли он. Снимите флажок с опции и перезагрузитесь.

SuperSU предоставил эту опцию, чтобы сделать вашу систему более безопасной, скрыв пространство имен монтирования одного приложения от других, поэтому, если вы что-то монтируете или отключаете, это видно только используемому приложению (UID) и ничему другому.

Кроме того, при запуске suвы можете добавить параметр -m, чтобы ваша оболочка имела контроль над пространством имен основного монтирования. Тогда ваши маунты будут работать глобально.

Судя по всему, теперь это функция безопасности Android SELinux — монтирование, инициированное большинством процессов, невидимо для других процессов. Смотрите этот ответ .

Связанный поток разработки ядра Android предлагает заменить ненужную системную службу (например /system/bin/debuggerd, ) сценарием оболочки, который запускает нужную команду монтирования. Это вы запустите с start debuggerd.

Обновление: это сработало для меня после перезагрузки.