Как я могу смонтировать SD-карту в формате ext4 с правильными разрешениями (с рутом)?

Я вижу здесь некоторые упоминания о создании SD-карты в формате ext4, но нет руководства. Этот тесно связанный вопрос предполагает, что это невозможно сделать, но мой вопрос отличается тем, что мой телефон специально рутирован.

Я отформатировал свою карту как ext4 (таблица разделов GUID); мой телефон Cyanogenmod установил его в /mnt/fuse/sdcard1. Я следовал инструкциям здесь, чтобы смонтировать карту в /storage/sdcard1, создав следующий скрипт в/data/local/userinit.sh

#!/system/bin/sh
REALMNT=/mnt/fuse/sdcard1_real
if ! [ -d "$REALMNT" ]; then
  mkdir "$REALMNT" || exit 1
fi
mount -t ext4 /dev/block/mmcblk1p1 "$REALMNT"
sdcard "$REALMNT" /storage/sdcard1 1023 1023 &

Я перезапустил и попытался скопировать файл (используя ES File Explorer) и вставить его в его родительский каталог, что не удалось:

/storage/sdcard1/foo/bar.mp3: open failed: EACCES (Permission denied).

Я действительно могу нормально воспроизвести файл, поэтому я могу его открыть. FWIW, когда я пытаюсь скопировать из исходной точки монтирования ( /mnt/fuse/sdcard1), я получаю немного другую ошибку:

Failed to copy the file bar.mp3

Я использую Samsung Galaxy S3 с Cyanogenmod 10.2.0-i9300.

== РЕДАКТИРОВАТЬ ==

su
ls -l /mnt/fuse
drwxrwxr-x media_rw media_rw   2014-03-04 22:08 sdcard1

Это все. В sdcard1_realэтом каталоге нет, значит скрипт не работает?

== РЕДАКТИРОВАТЬ2 ==

Я попытался изменить сценарий для устранения неполадок. Скрипт запускается нормально, но потом вылетает mkdir "$REALMNT"с ошибкой /data/local/userinit.sh[6]: : not found.

== РЕДАКТИРОВАТЬ3 ==

Я знаю, что скрипт не работает, поэтому его исправление может решить мой вопрос, но мне показалось интересным следующее. Я отформатировал свою SD-карту на своем компьютере с Linux и перенес на нее некоторые файлы. Как ни странно, ошибки прав доступа возникают только в тех подкаталогах, которые я создал. В корне раздела (через /storage/sdcard1) у меня уже есть права на запись.

Как root, пожалуйста, выполните ls -l /mnt/fuse/и ls -l /mnt/fuse/sdcard1_real. Затем отредактируйте свой вопрос, чтобы включить результаты. Я предполагаю , что «неправильные права доступа к файлам» — либо для монтирования, либо для foo/каталога на карте. Помните, что ext4 поддерживает полные права доступа к файлам *nix, в т.ч. пользователя и группы.
Вы вводите suтерминал, чтобы получить root. Возможно, вам потребуется подтвердить предоставление разрешения на телефоне, если вы делаете это в первый раз.
Либо скрипт не работает, либо вообще не выполняется. Возможно, вы захотите добавить некоторые отладочные данные, например echo Script executed > /mnt/fuse/sdcard1/test.log, и проверить, работает ли он вообще. Если это так, сделайте предыдущую строку mount -t ext4 /dev/block/mmcblk1p1 "$REALMNT" 2> /mnt/fuse/sdcard1/test.logи проверьте сообщение об ошибке. Или выполните скрипт вручную, чтобы увидеть: su /data/local/userinit.sh.
@Izzy touchпоказывает, что скрипт запущен. Я попытался выполнить скрипт вручную с помощью su /data/local/userinit.sh, но это не удалось. Я также пробовал su echo fooи получаю аналогичную ошибку: Unknown id: echo.
Что касается вашего EDIT3, см. мой первый комментарий: ext4 поддерживает полные права доступа к файлам *nix, в т.ч. пользователя и группы . Вы создали эти каталоги с пользователем, которого нет на вашем устройстве Android, поэтому они принадлежат «неизвестному пользователю/неизвестной группе». Если вы не предоставили доступ для записи в «мир», только root мог писать туда. Вы должны ознакомиться с этими основами *nix при использовании такой файловой системы на портативном носителе ;) Что касается скрипта, я снова предлагаю добавить дополнительную отладочную информацию, например, использовать echoдля вывода каждой команды до ее выполнения и перенаправить вывод ошибок с помощью 2>>.
@Izzy Если я правильно понимаю, цель сценария - исправить эти несоответствия разрешений? Я сделал больше отладки, но, возможно, EDIT2 не был достаточно ясен. Сценарий работал до exit 1, затем произошел сбой с указанной ошибкой.
Может быть, сценарий запускается слишком рано, и /mnt/fuseего нет, когда вы пытаетесь mkdir(попробуйте поставить ls /mntперед mountкомандой)? Если это так, mkdir -p "$REALMNT" || exit 1можно обойти это, но я не уверен в побочных эффектах, когда система пытается создать /mnt/fuseпозже, а она уже существует.
@IrfanLatif У меня больше нет телефона с SD-картой, но, в отличие от вашего ответа по ссылке, я не помню никаких проблем с «каждое приложение будет создавать файлы со своим собственным UID», согласно моему ответу ниже. Я не могу проверить это больше, к сожалению. В любом случае, надеюсь, ваша ссылка будет полезна для некоторых здесь.

Ответы (4)

Предположительно , это было исправлено несколько месяцев назад, но люди до сих пор сообщают о проблемах. Я могу читать элементы на карте, но не имею разрешения на запись. Чтобы это исправить, я объединил стратегии из нескольких источников .

  1. Карта разделов с таблицей разделов MS-DOS и файловой системой ext4. Я использовал GParted на своем настольном компьютере (Linux).
  2. Вставьте карту в телефон. (Возможно, теперь у вас не будет прав на запись.)
  3. Откройте эмулятор терминала , установленный по умолчанию в Cyanogenmod.
  4. Введите следующее (я рекомендую WiFi Keyboard для больших блоков текста). Дайте эмулятору привилегии root, когда он их запрашивает.

Подсказки $и #указывают, поэтому не вводите их.

$ su
# chown media_rw:media_rw /mnt/media_rw/sdcard1
# chmod g+w /mnt/media_rw/sdcard1

Это изменяет разрешения SD-карты. Владелец и группа меняются с systemна media_rw, а группе также предоставляется доступ на запись.

нужно -R для рекурсивного chown -R media_rw:media_rw /mnt/media_rw/sdcard1

Не уверен, что это поможет, но, возможно, проблема в том, что вы пытаетесь смонтировать не в том месте? Это мой рабочий скрипт, который работает на S3 mini с CM11:

#!/system/bin/sh
REALMNT=/mnt/media_rw/sdcard1
if ! [ -d "$REALMNT" ]; then
mkdir "$REALMNT" || exit 1
fi
mount -t ext4 -o rw,noatime /dev/block/mmcblk1p1 "$REALMNT"
sdcard "$REALMNT" /storage/sdcard1 1023 1023 

Расположение REALMNT уже существовало, поэтому, конечно, mkdir никогда не вызывался. И media_rw/sdcard1 уже принадлежит media_rw

Мне также пришлось обновить /etc/permissions/platform.xml, чтобы включить: <group id="media_rw"/>в:<permission name="android.permission.WRITE_EXTERNAL_STORAGE">

Спасибо. Я несколько отказался от этого, так как у меня также было высокое использование батареи с моим скриптом. Поскольку он закреплен в багажнике, я больше не буду искать обходной путь. Однако спасибо и +1.
@Sparhawk: Не уверен, какую версию CYM вы используете, но моя SD-карта не монтируется автоматически.
@LuisA.Florit Я не уверен, что вы хотели ответить на этот ответ . Во всяком случае, я использую 11-20140804-SNAPSHOT-M9-i9300. Я разместил больше информации в другом ответе .
@Sparhawk: Моя карта даже не смонтирована, и процедура монтирования в настройках не удалась. Возможно, проблема связана с моим вопросом здесь ( suне удается смонтировать ): android.stackexchange.com/questions/82089/… `Я использую cm-11-20140804-SNAPSHOT-M9-mondrianwifi.zip.
@LuisA.Florit Не совсем уверен. Может быть, задать новый вопрос?
@Sparhawk: я задал несколько вопросов о CYM и не получил ни одного ответа. Даже не особо используя CYM, я столкнулся с несколькими ошибками (такими как эта), и никто не смог дать подсказку ни о какой из них (ни на stackexchange, ни на форуме CYM). Думаю поставить другой кастомный ROM, более солидный. Это просто не работает должным образом для меня.
Я использовал этот скрипт в Stock Android 4.4.4 (Galaxy Note 4), но файлы в /storage/sdcard1/ отображаются с правами собственности 0.1015 вместо 1023.1023, что, конечно, дает много ошибок «отказано в доступе». Есть идеи, почему?

Адасдадасд опубликовал ответ, который я хотел принять, но с тех пор он был удален. Я воспроизведу его ниже и приму свой ответ, но если adasdadasd появится снова, пожалуйста, сделайте репост, и я удалю это и приму ваш.

https://jira.cyanogenmod.org/browse/CYAN-332

https://github.com/CyanogenMod/android_packages_providers_MediaProvider/commit/faf3f77b9222554227740aed8127714ea9e3f407

Исправлено по умолчанию? Новое изменение на гитхабе.

Здесь простота

#!/system/bin/sh
REALMNT="/mnt/media_rw/extSdCard"
mount -t ext4 -o rw,noatime /dev/block/mmcblk1p1     "$REALMNT"
sdcard "$REALMNT" /storage/extSdCard 1023 1023 &

А здесь ext4 с возможностью записи на внешней сд

#!/system/bin/sh
chown media_rw:media_rw /mnt/media_rw/extSdCard
chmod g+w /mnt/media_rw/extSdCard

Вы можете изменить «extSdCard» на «sdcard1», где установлена ​​​​внешняя SD-карта.

Я использовал стокром с Kingroot, но я попробовал Supersu, у него проблемы с монтированием файловой системы.