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

9

Я вижу некоторые упоминания о создании 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.

== EDIT ==

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

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

== EDIT2 ==

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

== EDIT3 ==

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

Sparhawk
источник
1
От имени пользователя 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.
Иззи
@ Иззи touchпоказывает, что скрипт работает. Я попытался выполнить скрипт вручную su /data/local/userinit.sh, но это не удалось. Я также попробовал su echo foo, и получить подобную ошибку: Unknown id: echo.
Sparhawk
Что касается вашего EDIT3, см. Мой первый комментарий: ext4 поддерживает полные разрешения * nix для файлов, в т.ч. пользователь и группы . Вы создали эти каталоги с пользователем, которого нет на вашем Android-устройстве, поэтому они принадлежат «неизвестному пользователю / неизвестной группе». Если вы не предоставили права на запись в «world», только root может писать туда. Вы должны ознакомиться с этими * nix основами при использовании такой файловой системы на переносных носителях;) Что касается сценария, я снова предлагаю добавить еще некоторую отладочную информацию, например, использовать echoдля вывода каждой команды перед ее выполнением и перенаправлять вывод ошибок с помощью 2>>,
Иззи

Ответы:

6

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

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

Приглашения $и #указывают, поэтому не вводите их.

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

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

Sparhawk
источник
нужно -R для рекурсии, если chown -R media_rw: media_rw / mnt / media_rw / sdcard1
m3asmi
1

Не уверен, что это какая-то помощь, но, возможно, проблема в том, что вы пытаетесь смонтировать не в том месте? Это мой рабочий скрипт, который работает на 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">

user59177
источник
Спасибо. Я немного разочаровался в этом, так как у меня было слишком много заряда батареи с моим сценарием. Поскольку это исправлено в багажнике, я больше не буду беспокоиться об обходном пути. Спасибо, хотя и +1.
Sparhawk
@Sparhawk: Не уверен, какую версию CYM вы используете, но моя SD-карта не устанавливается автоматически.
Луис А. Флорит
@ LuisA.Florit Я не уверен, что ты хотел ответить на этот ответ . Во всяком случае, я использую 11-20140804-SNAPSHOT-M9-i9300. Я отправил больше информации в другом ответе .
Sparhawk
@Sparhawk: Моя карта даже не смонтирована, и процедура монтирования в Настройках завершается неудачно. Может быть, проблема связана с моим вопросом здесь ( suне удается смонтировать ): android.stackexchange.com/questions/82089/… `Я использую cm-11-20140804-SNAPSHOT-M9-mondrianwifi.zip.
Luis A. Florit
@ LuisA.Florit Не совсем уверен. Может быть, задать новый вопрос?
Sparhawk
0

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

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

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

Исправлено по умолчанию? Новое изменение в github.

Sparhawk
источник
0

Здесь симпелин

#!/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 на внешний sd

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

Вы можете изменить «extSdCard» на «sdcard1», где смонтирована ваша внешняя sdcard

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

Ykg
источник