Пользователь
0,0
рейтинг
19 февраля 2013 в 16:56

Андроид: [DirectoryBind] Простой способ связать внешнюю sd карту и внутреннюю память, чтобы освободить место

Сразу оговорюсь, что речь пойдет не о программах типа link2sd. Принцип похож, но связывать мы будем не программные каталоги, а каталоги данных этих программ, например /sdcard2/Navigon -> /sdcard/Navigon или /mnt/extSdCard/Books -> /sdcard/Books и т.д.
Кроме того, нам нужен рут (куда ж без него). Кстати, после того как я узнал про эту программу, это для меня очередной аргумент за root.

Многие владельцы андроид смартфонов или таблеток с небольшей встроеной памятью наверняка сталкивались со следущей проблемой: вставлена большая sd карта (например 16, 32 или даже 64 Гигабайт), но после установки нескольких тяжеловесных программ наше устройство или очередная программа с наглостью заявляет, что на карте не хватает места. Иногда сама программа небольшая, но после установки лезет в интернет и тянет на смартфон гигабайты данных.
В очередной раз получив сообщение «Нет места» и заглянув на карточку видим, что она практически пуста, зато внутренняя память устройства забита под завязку.
Это происходит потому, что внутренняя память часто используется как каталог по умолчанию для многих программ. Дело в том, что она монтируется как /sdcard, что исторически всегда было внешней sd картой (раньше так оно и было на всех смартфонах). Внешняя же sd карта монтируется в этом случае как /sdcard2, /mnt/sdcard2, /mnt/extSdCard или даже /sdcard/.externalSD. Я так понимаю, что это делается изготовителями, чтобы устройство работало из коробки, т.е. совсем без sd карты.

Многие «недобросовестные» программы всегда хотят читать/писать данные из/в каталог /sdcard/НазваниеПодставить. Редко это можно изменить в настройках программы.
В результате имеем, что имеем, и несколько возможностей чтобы поправить сложившееся положение:
  • перемонтировать каталоги: внешнюю sd карту на /sdcard, а внутреннюю на /sdcard2 (нужен рут, если нет в настройках). По моему недостаточно гибкий способ, т.к. теперь уже внутренняя память лежит у нас мертвым грузом. Еще один недостаток этого способа — скорость работы системы.
    Если вы все же решитесь пойти этим путем, внизу я добавил как это можно сделать.
  • создать символьную ссылку на внешние каталоги, как нам нужно, например
    ln -sf /mnt/externalSD/Books /sdcard/Books.
    Не работает, если файловая система не поддерживает симлинк (например fat).
  • при загрузке андроида примонтировать внешние каталоги на внутреннюю память, используя что-то типа
    mount -o bind /mnt/externalSD/Books /sdcard/Books
    и добавить это в автозагрузку, например используя Autostart (root), чтобы это происходило автоматически при включении или после перезагрузки устройства.

Два последних способа тоже не являются панацеей, т.к. требуют определенных навыков от пользователя, кроме того не достаточно «чисты», например известны проблемы при подключении смартфона к компьютеру через usb (не отмонтируются) и т.д.

Поправить положение поможет программа DirectoryBind, которую хороший человек slig из xda написал для себя и выложил на форуме для всеобщего пользования.
QR-код
QR-image

Хоть публика здесь технически подкованная, но для неискушенных читателей хабра нужно сделать пару пояснений. Как он сам написал (программа not idiot-proof), т.е. врядли пройдет тест на дурака.

После установки запускаем программу (первый раз естественно навечно разрешаем права Root), нажимаем меню затем «Preferences» и выставляем пути по умолчанию на внешнюю память «Default data path» например /sdcard/external_sd/ и внутреннюю память «Default target path» /sdcard/. Выходим из меню.

Нажимаем меню, затем «Add new entry»
screenshot

Теперь создадим новую связь каталогов, например перенесем папку CamScanner на внешнюю карту. Долгое нажатие на путь к папкам открывает небольшой встроеный файловый менеджер, в котором можно создать и/или выбрать папку. Папка на внешней карте должна быть создана (и пуста).
screenshot

Установив галочку в «Transfer files from target to data» файлы и папки будут перенесены из каталога /sdcard/CamScanner/ в каталог /sdcard/external_sd/CamScanner.
screenshot

Нужно заметить, что связи после создания не активируются автоматически (серая иконка дискеты, как на скрине внизу для gameloft). Для завершения связывания папок, выбираем галочками нужные связи и нажимаем меню -> «Bind checked». Иконки активных (связанных) папок должны стать зелеными.
screenshot

Кстати если вы хотите присоединить еще и всю внешнюю карточку полностью рекомендую это сделать не так /sdcard/externalSD/, а с точкой впереди /sdcard/.externalSD/. Это спасет вас от таких неприятностей как двойные превьюшки в галереях, и т.д. Правда поможет не для всех галерей и плееров, т.к. некоторые ищут медиа и в скрытых каталогах.
Помучившись, я для себя решил, связывать только отдельные каталоги.

UPD. Кстати, внешняя SD карта значительно медленнее внутренней памяти, поэтому перенос данных программы на внешнюю SD, естественно замедляет работу этой программы. Это особенно нужно помнить решившим полностью поменять маунт-пойнты внутренней и внешней памяти, т.к. скорее всего все ваше устройство будет работать медленнее, чем раньше.

Надеюсь эта программа дополнит и вашу копилку полезных утилит для андроид устройств.


Если вы все-таки решились поменять местами внутреннюю и внешнюю память, т.е. переназначить внешнюю sd карту на /sdcard и в настройках устройства нет такой опции — имея рут, это можно легко сделать выполнив следущую операцию:
В Root-Explorer монтируем "/etc" как R/W (если R/O), находим файл "/etc/vold.fstab", сохраняем копию и открываем (длинным кликом) его в Text Editor.
В следующих двух строчках меняем название моунт точек местами:
dev_mount sdcard /mnt/sdcard emmc@fat /devices/platform/goldfish_mmc.0 ...
dev_mount sdcard /mnt/external_sd auto /devices/platform/goldfish_mmc.1 ...
на
dev_mount sdcard /mnt/external_sd emmc@fat /devices/platform/goldfish_mmc.0 ...
dev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.1 ...

Подробнее можно почитать здесь. Там же предлагают, как альтернативу, использовать другую интересную программу Root External 2 Internal SD.
Добавлю, что в обоих случаях, перед переключением, вам нужно скопировать все содержимое папки /sdcard на внешнюю sd карту.
Помните, что после переключения вся ваша система может работать медленней, чем раньше.
Будьте осторожны — нужно понимать, что все что вы делаете под рутом, вы делаете на свой страх и риск, и например сохранение неправильного «vold.fstab» может привести к невозможности загрузить устройство и для лечения нужно будет грузится в рекавери и править «vold.fstab» уже там.

Этот способ можно использовать совместно с DirectoryBind, только теперь наоборот «Default target path» (/sdcard) и все связи созданные в DirectoryBind будут указывать на внешнюю карту.
sebres @sebres
карма
60,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (24)

  • –2
    Спасибо, теперь я понял, почему в китайских телефонах, даже в относительно дорогих ставят всего 1 ГБ встроенной памяти — изначально подразумевается, что пользователь будет использовать только внешнюю карту.
  • 0
    Не за что.
    1 ГБ встроенной памяти
    видел китайфоны и со встроеными 2-я и 4-я а таблетки даже с 8-ю и 16-ю ГБ. Но почти ни одного не видел с возможностью из коробки переназначить /sdcard на внешний носитель.
    • 0
      Все смартфоны Fly с Android 4.0 и выше по уполчанию монтируют флеш-карту как sdcard, а внутреннюю — как sdcard2. При отсутствии же флешки внутренняя монтируется как sdcard, так что все хорошо. Вот только MTK заявили, что горячая замена не поддерживается, так что перемонтирование на живую проверить не получится.
  • 0
    Данная программа очень радует, но только до первого перезапуска устройства. Маунтит она далеко не мгновенно и очень часто глючит, т.ч. это явно не панацея. Геймлофтовские игры часто заново начинают качать свой кеш.

    PS Пробовал её пару месяцев назад, может за это время что-то поменялось.

    Для решения проблемы просто поменял внутреннюю и внешнюю карты местами (8 и 32 Гб). На внутренней храню музыку, на внешней игры и видео.
    • 0
      Пользую не так давно на нескольких устройствах (всем семейством так сказать), никаких глюков пока не замечалось…
      Раньше мучился жил на связке «mount-o/Autostart»
      очень часто глючит
      А можно чуть подробнее?
      • 0
        У меня такое ощущение, что она проставляет симлинки (или их фатовский аналог) только после полной загрузки телефона, причём как-то рандомно. Бывает, что работает сразу, бывает, что срабатывает только через 5 минут после запуска телефона.

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

        После пары таких проколов, я её просто снёс, т.к. ждать пол часа закачки кеша каждый раз, когда забыл, что теперь у меня есть эта утилитка — выше моего терпения. + ещё и вручную переносить сейвы
        • 0
          Она слушает и срабатывает после BOOT_COMPLETED. Может у вас лежит что-то, что задерживает это событие? Или сервисы для этих игрушек тоже в автостарте (тоже на BOOT_COMPLETED)? В ES Task Manager есть «Аутостарт-Менеджер» посмотрите им и прибейте не нужные сервисы в автозагрузке.
          Она проставляет симлинки
          Не, она использует mount -o, т.е. естественно цель-каталог должен быть пуст.
          • +1
            Слишком много настроек и запары, проще 1 раз поменять местами внутреннюю и внешнюю карты в fsvob и забыть про эти все глюки и настройки, как про страшный сон.
            • 0
              Простите, неправильно написал /etc/vold.fstab.
              • 0
                Я уже добавил вариант с vold.fstab внизу статьи, т.к. сам иногда пользовался таким способом. Хотя для некоторых устройств дополнительно с подменой sdcard использую и DirectoryBind, только теперь наоборот target на внешней карте.
            • 0
              Не совсем аргумент — вы замедляете тем самым всю систему в целом, а не только конкретную программу.
              • 0
                Не замечал просадки производительности на SDHC class 10. Может на более слабых и есть просадки, но на современных не видел никаких проблем. Причём 10 класс сейчас уже довольно сильно устарел и по цене совпадает с 16.
                Видео 1080p с неё спокойно читается, т.ч. производительность явно достаточная.
  • 0
    А есть такое приложение, которое запускаешь, нажимаешь одну кнопку и вуаля! — я могу устанавливать на свой анроид сколько угодно приложений, если у меня вставлена пустая 16гиговая карточка.
    • 0
      Попробуйте программу Root External 2 Internal SD. Не совсем в один клик, но все же…
      И да, link2sd и ко тоже никто не отменял…
      • +1
        Спасибо большое!
        Вроде работает.
    • 0
      Сколько угодно не получится, по опыту систему начинает колбасить после нескольких сотен установленных приложений. Это не зависит от свободной памяти.
  • –1
    4PDA теперь на хабре.
    • 0
      [OT] А многочисленные обзоры и новости вас не смущают… Давайте вообще закроем хабы Android, iPhone и ко. А лучше линк заместо них на 4PDA.
      ….кстати 4PDA каким местом-то (и где там про это).
      [/OffTop]
      • 0
        Неужели простейший скрипт с mount достоин отдельной статьи?
        • +1
          — если статья сэкономит кому то кучу времени,
          — если в коментариях меня ткнут носом в программу сто раз лучшую чем DirectoryBind,
          — еще 5 если…
          то да.
          А если вам не интересно, пройдите мимо / минусните статью в конце концов, но не оставляйте больше оффтоп комментариев, pls.
          Мне например, не интересно дискутировать на тему «Какой размер экрана будет у samsung galaxy в следующем году».
  • +1
    На HTC Desire помог только a2sd -xdata, полный перенос всего содержимого /data на карточку. Но работает система медленнее даже на SDXC при этом.
    • 0
      работает система медленнее ...
      Да, спасибо, забыл написать про это, правда на SDXC не замечал, только на SDHC.
      Кстати, кто-нибудь пробовал exFat на андроид, например через Paragon exFAT, NTFS & HFS+? exFat вроде должен быть специально оптимирован для SD (SDXC). Действительно ли быстрее?
  • –1
    Делал такое руками, но при апдейте аппликухи какой-то у неё сменился юзер, и ессно она выпала.
    У этой прожки как с этим?
  • 0
    Спасибо за пост! Оказался очень полезным.

    Поменял местами SD карты:
    1. установил Root Explorer
    2. с его помощью отредактировал файл /etc/vold.fstab

    dev_mount sdcard /mnt/sdcard auto /devices/virtual/block/nandj
    dev_mount extsd /mnt/extsd auto /devices/platform/sunxi-mmc.1/mmc_host /devices/platform/sunxi-mmc.0/mmc_host

    поменял на

    dev_mount extsd /mnt/sdcard auto /devices/virtual/block/nandj
    dev_mount sdcard /mnt/extsd auto /devices/platform/sunxi-mmc.1/mmc_host /devices/platform/sunxi-mmc.0/mmc_host

    девайс: GLOBEX GU701C

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.