Я хочу запустить следующую команду от имени пользователя 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 не увидят изменений.
Мой случай, я полагаю, это та же причина для вас.
Перейдите в приложение «Менеджер суперпользователей», я полагаю, это SuperSU.
Перейдите в настройки и найдите «Разделение пространства имен монтирования» и проверьте, отмечен ли он. Снимите флажок с опции и перезагрузитесь.
SuperSU предоставил эту опцию, чтобы сделать вашу систему более безопасной, скрыв пространство имен монтирования одного приложения от других, поэтому, если вы что-то монтируете или отключаете, это видно только используемому приложению (UID) и ничему другому.
Кроме того, при запуске su
вы можете добавить параметр -m
, чтобы ваша оболочка имела контроль над пространством имен основного монтирования. Тогда ваши маунты будут работать глобально.
Судя по всему, теперь это функция безопасности Android SELinux — монтирование, инициированное большинством процессов, невидимо для других процессов. Смотрите этот ответ .
Связанный поток разработки ядра Android предлагает заменить ненужную системную службу (например /system/bin/debuggerd
, ) сценарием оболочки, который запускает нужную команду монтирования. Это вы запустите с start debuggerd
.
Обновление: это сработало для меня после перезагрузки.
Повелитель огня
I get the contents of the internal memory.)
-- Я не понимаю, как обычный пользователь вообще может видеть любой контент/data/media
без повышенных привилегий. Вы должны получить сообщение об ошибке в терминале, что-то вроде «Операция не разрешена». О вашем втором случае с ES, поскольку обычный пользователь ES не должен ничего показывать в/data
каталоге, и я не знаю, как перейти в определенное место напрямую с помощью ES (похоже, у него нет адресной строки). Тем не менее,/data/media
обычный пользователь все еще может получить к нему доступ с помощью терминала. Я проверил, работает хорошо.ZapperDJ