Смущает множество местоположений виртуальной /sdcard/

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

Все эти пути содержат одни и те же файлы:

/sdcard/
/storage/sdcard0/
/storage/emulated/0/
/storage/emulated/legacy/

Какой путь является «настоящим»? А как насчет других путей? Для чего они используются, почему они существуют?

Ответы (2)

Рекомендуемая лекция: Почему /sdcard/ превратилась в /sdcard/0/ с 4.2? .

Вкратце: это связано с многопользовательской функциональностью, представленной в Jelly Bean:

  • /storage/emulated/0/: насколько мне известно, это относится к "эмулируемой MMC" ("часть владельца"). Обычно это внутренний. Здесь «0» означает пользователя, «0» — это первый пользователь, он же владелец устройства. Если вы создадите дополнительных пользователей, это число будет увеличиваться для каждого.
  • /storage/emulated/legacy/как и прежде, но указывая на часть работающего в данный момент пользователя (для владельца это будет симлинк на /storage/emulated/0/). Так что этот путь должен привести каждого пользователя к своей «части».
  • /sdcard/: Согласно комментарию Shywim , это символическая ссылка на...
    • /mnt/sdcard(Андроид < 4.0)
    • /storage/sdcard0(Андроид 4.0+)
  • /storage/sdcard0/: Поскольку legacyбрелка здесь нет (см. комментарии ниже), то "0" в данном случае скорее идентифицирует само устройство (карту). В конце концов, можно было бы подключить кард-ридер к другой SDCard через OTG, что тогда стало бы /storage/sdcard1(нет доказательств, просто предположение, но я бы сказал хорошее)

Хотя можно прийти к выводу, что также должен быть a /storage/sdcard/legacy, его нет (см. комментарии) — что вполне логично с моим предположением о том, что числа здесь не связаны с пользователем, а скорее с возможными несколькими картами: " 0" всегда будет тем, что находится в слоте для карты устройства, поэтому здесь нет необходимости в "устаревшей символической ссылке".

Спасибо! И нет, /storage/sdcard/legacyпути нет.
Странный. Но это может быть связано с тем, что на реальной SD-карте почти нет разрешений (из-за того, что файловая система FAT их не поддерживает). Отмечая разницу ( /sdcard0/по сравнению с /emulated/0), «0» здесь может быть предназначен для случая, когда вы подключаете несколько SDCard через устройство чтения карт и режим USB-хоста. Просто предположение, не факт, но я бы сказал, хорошее.
/sdcard/это просто символическая ссылка на /storage/sdcard0/. В более старой версии, чем 4.0.0, это /mnt/sdcard/.
И я предполагаю, что на Android 4.0+ /mnt/sdcard/это символическая ссылка на /storage/sdcard0/? Поскольку оба они доступны для навигации на моем Nexus 4.
Я бы сказал так, да.
Ваш комментарий о /storage/sdcard0/противоречит ответу на вопрос, который вы связали , где вы говорите, что «0» sdcard0связан с идентификатором пользователя.
@superuser Нет. Прочтите еще раз — и обратите внимание, где стоит косая черта: /sdcard0это первая SD-карта, а /sdcard/0часть SD-карты первого пользователя :) Кроме того, здесь запрашивается 4.0+ — в то время как эти многопользовательские вещи были введен только с 4.2+.
В Android6 (Marshmallow) /storage/emulated/legacy становится пустым (по крайней мере, на устройствах Nexus), где до обновления до Marshmallow он содержал то же, что и /storage/emulated/0.

Да, немного сбивает с толку, но это альтернативные пути для размещения памяти.

/mnt/sdcard0/ (внутренняя виртуальная SD-карта)

и, Иззи, вы правы, если подключено больше устройств, но названия могут отличаться в зависимости от устройства.

бывший. /mnt/sdcard1/ (физическая SD-карта в слоте SD)

но другие устройства, такие как USB-накопитель, подключаемый с помощью адаптера, могут называться

/mnt/media_rw/usbdisk (Android Kitkat 4.4 и выше?) или /mnt/usbdisk (jellybean 4.1–4.2)

Да, наименование может зависеть от устройства/производителя/ПЗУ. Но обычно /mnt/*во всех этих случаях это только символическая ссылка — с «настоящими монтированиями», расположенными ниже /storage:)
Ну у меня под mnt тоже есть папка shell . Я часто переключаю ПЗУ устройства, и поэтому для тех ромов, которые делают внешнюю SD-карту памятью по умолчанию, папка оболочки ведет себя как моя внутренняя память, а для других ромов, которые не меняют SD-карту как внутреннюю память, оболочка даже не приходит в картину. Он просто остается в папке со всеми неповрежденными данными, но недоступен для локального файлового менеджера. Хотел узнать, что именно.