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

Смартфоны, кажется, умирают после двух лет использования, как будто они знали, что вы только что заплатили последний взнос.
Распространенной причиной, по-видимому, является выход из строя внутренней памяти.
Я отчаянно пытаюсь спасти свой телефон от этой жестокой судьбы.
Идея, которая у меня изначально была, казалась простой, но Интернет, похоже, не разделял моего оптимизма.
Идея такая:
- создать ext4 разделы на sd карте
- монтировать при загрузке разделы sdcard в /dataи /cache(а может быть /preloadи /efsесли они когда-нибудь будут записаны)

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

Я видел все приложения (app2sd, link2sd, DirecoryBind, s2e, вы называете это), и все они, кажется, перемещают подкаталоги, а не main /data.
Любая помощь будет высоко оценена.
Спасибо!

Добро пожаловать в Android энтузиастов! Вы пробовали использовать функцию поиска на нашем сайте и проверяли используемые теги (к большинству из них прикреплена вики)? Этот вопрос уже задавался здесь не раз. Кроме того, у меня есть 2 телефона на Android, которыми я пользуюсь уже 5 и более лет, мое текущее основное устройство я использую около 3 лет. Пока ничего не умерло (кроме одной сд карты, которую легко заменили).
Привет @Izzy, я много нашел о том, как увеличить память, ничего не отвечая на фактический вопрос в заголовке. Это именно моя точка зрения, легко выбросить и заменить SD-карту, чего не скажешь о телефоне.
Я считаю, что в Android Marshmallow эта функция встроена, но она не так актуальна для всех остальных, кто все еще использует Lollipop и старше. Надеюсь, может помочь некоторым пользователям.
@ LJD200 почти верно. MM позволяет объединить два. Но OP хочет использовать только внешнее и вообще не трогать внутреннее - так что это не годится.
Только что прошил CyanogenMod 13 (Android 6) НОЧНУЮ версию. Я сдался через 2 дня поисков и безответных форумов, и я начал смотреть видео о замене emmc :-) ахах! @Izzy, однократная запись может быть в порядке, чего я хочу избежать, так это постоянной замены файлов приложениями или самим Android.
В основном это означало бы привязку DirectoryBind /dataк какому-то месту на внешней карте, и то же самое для /cache. Все остальное в основном только для чтения.
@Izzy, могу я сделать это с помощью DirectoryBind? Это просто? 2 раздела ext4 на SD-карте привязаны к /data и /cache? Тем временем я слежу за тем, как продвигается Android Marshmallow. Эмулируемое хранилище находится в emmc, не в восторге!
Сам я никогда не пользовался DirectoryBind, поэтому не могу сказать, насколько это просто на самом деле. Я знаю только, что это возможно с технической точки зрения.
Некоторое время назад я нашел этот пост . Смонтируйте папку с внешней SD-карты как / data , и, похоже, ее принимают все. Тем не менее я не могу понять это: все, что я вижу, это раздел DATA, монтируемый на SD-карте, файлы все еще хранятся в разделе! Я заметил, что @Izzy предлагает это как решение даже в последние дни.
Похоже, ты прав, Клаудио: просто точка монтирования находится там, а реальное хранилище все еще там, где оно всегда было. Я бы сказал, поместите комментарий, чтобы указать на это. Но кроме этого, ответ там не связан с DirectoryBind.
Не могу комментировать, недостаточно репутации. Мне подходит любое решение, лишь бы оно работало.

Ответы (3)

Эврика!
Вот как я это сделал:

Раздел SD-карты и формат

Не зная, какие разделы я мог бы переместить, я решил воссоздать свою SD-карту с точно такой же компоновкой внутренней памяти моего Samsung Galaxy S III.
USERDATAэто последний раздел, и для этого есть веская причина:
размер моей SD-карты больше, чем внутренняя память, и лучшим вариантом было расширение USERDATAдо самого дальнего сектора.

На моем Linux-компьютере была проделана следующая работа:

parted /dev/sdb mklabel gpt \
mkpart  BOTA0      ext2     8192s          16383s \
mkpart  BOTA1      ext2    16384s          24575s \
mkpart  EFS        ext2    24576s          65535s \
mkpart  PARAM      ext2    65536s          81919s \
mkpart  BOOT       ext2    81920s          98303s \
mkpart  RECOVERY   ext2    98304s         114687s \
mkpart  RADIO      ext2   114688s         180223s \
mkpart  CACHE      ext2   180224s        2277375s \
mkpart  SYSTEM     ext2  2277376s        5423103s \
mkpart  HIDDEN     ext2  5423104s        6569983s \
mkpart  OTA        ext2  6569984s        6586367s \
mkpart  USERDATA   ext2  6586368s       60749824s

Хорошо, разделы созданы.
Теперь, все еще имитируя свое Android-устройство, я соответствующим образом форматирую разделы:

# /efs
mkfs.ext4  /dev/sdb3   -E root_owner=1001:1000
# /system
mkfs.ext4  /dev/sdb9   -E root_owner=0:0         -L system
# /cache
mkfs.ext4  /dev/sdb8   -E root_owner=1000:2001
# /preload
mkfs.ext4  /dev/sdb10  -E root_owner=0:0
# /data
mkfs.ext4  /dev/sdb12  -E root_owner=1000:1000

SD-карта готова, теперь я могу «резервировать» файлы из emmc в соответствующий раздел SD-карты, заботясь о сохранении атрибутов файлов.

Редактироватьfstab

В не слишком старых версиях Android fstabфайл всегда находится по адресу /.
Файлы /хранятся в BOOTразделе ( boot.img);
пришло время научиться редактировать файл boot.img.
Вот два очень полезных руководства, которые помогут вам начать работу:
HOWTO: Распаковать, отредактировать и переупаковать загрузочные образы Работа с
boot.img Android
небольшая подсказка:
Отредактируйте виртуальный диск на вашем Android-устройстве.
Я провел три дня в отчаянии, пытаясь сделать это на своем компьютере, я думаю, это вопрос «порядка байтов».

При редактировании виртуального диска выполните сортировку name-list(стандартный ввод) для cpio.
Я провел три года, разочаровываясь в случайных повторяющихся неудачах.


Мое fstabдо:

/dev/block/mmcblk0p3        /efs            ext4        noatime,nosuid,nodev,journal_async_commit,errors=panic      wait
/dev/block/mmcblk0p9        /system         ext4        ro,noatime      wait
/dev/block/mmcblk0p8        /cache          ext4        noatime,nosuid,nodev,journal_async_commit,errors=panic      wait
/dev/block/mmcblk0p10       /preload        ext4        noatime,nosuid,nodev,journal_async_commit       wait
/dev/block/mmcblk0p12       /data           ext4        noatime,nosuid,nodev,noauto_da_alloc,journal_async_commit,errors=panic      wait,check,encryptable=footer

Мое fstabпосле:

/dev/block/mmcblk0p3        /efs            ext4        noatime,nosuid,nodev,journal_async_commit,errors=panic      wait
/dev/block/mmcblk1p9        /system         ext4        ro,noatime      wait
/dev/block/mmcblk1p8        /cache          ext4        noatime,nosuid,nodev,journal_async_commit,errors=panic      wait
/dev/block/mmcblk1p10       /preload        ext4        noatime,nosuid,nodev,journal_async_commit       wait
/dev/block/mmcblk1p12       /data           ext4        noatime,nosuid,nodev,noauto_da_alloc,journal_async_commit,errors=panic      wait,check,encryptable=footer

Все, что я изменил, это номер блока (от 0 до 1).
Я еще не мог осмелиться переехать EFS, кто-то сказал, что как-то вы можете заблокировать устройство, играя с этим, все еще изучая тему; Я знаю, что Android продолжает писать EFS(я слежу за этим).

Выводы и дополнительные вопросы

Вот как я переместил большую часть данных из внутренней памяти на внешнюю SD-карту.
Как и ожидалось, все работает немного вяло, но Android, кажется, в идеальном рабочем состоянии;
Я всегда могу инвестировать в более быструю SD-карту в будущем.
Я сделал все это со своим стандартным ПЗУ Samsung Galaxy S III, вам, очевидно, придется адаптироваться к вашим обстоятельствам.
Когда я, наконец, установил CyanogenMod 13 (нам не нужна стандартная прошивка, не так ли!?), все было немного по-другому.
С вайпом /dataCM тратит некоторое время на загрузку /dataи в определенный момент просто сдается, перезагружается и переходит в режим восстановления.
После нескольких попыток я сдался и переместил /systemво внутреннюю память, теперь все нормально.
я знаю это/systemмонтируется только для чтения, но я заметил, что срок службы emmc определяется как количество циклов чтения/записи, возможно, предполагая, что, в отличие от жестких дисков, чтение так же вредно, как и запись.
Если это так, я был бы очень признателен, если бы кто-нибудь мог сказать мне, почему в CM я не могу успешно переместить файлы /system.

Что за производительность?
Привет @Jonathan, это было давно. Как я уже сказал, все было довольно вяло, иногда это действовало мне на нервы, и в итоге я переустановил свежую ОС традиционным способом. Я использовал карту памяти Kingston 32GB Micro SD U1 HC I Class 10 за 5 фунтов стерлингов, возможно, было бы неплохо вложить средства в карту с более высокими характеристиками. Дайте нам знать, как это происходит для вас. Кстати, моему телефону скоро исполнится 7 лет и, скрестим пальцы, он до сих пор в добром здравии 🥳

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

Когда вы включаете устройство, оно запрограммировано на загрузку из определенного места в памяти. Эта ячейка памяти жестко привязана к внутренней памяти.

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

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

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

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

Этого никогда не произойдет... Сделать загрузку и загрузку произвольного кода (две отдельные вещи, обе труднодостижимые) намного проще, просто стереть их прошлые попытки заблокировать его.
Спасибо @kumar за эту полезную информацию. Возможно, в моем описании это было неочевидно, но я никогда не стремился найти boot.imgдругое место, кроме EMMC.

Мне удалось успешно загрузиться с SD-карты на QMobile Z8:

  • Репликация таблицы разделов eMMC путем разделения SD-карты на машину с Ubuntu с использованием partedиfdisk
  • Прошивка образов заводских прошивок в эти вновь созданные разделы с помощьюdd
  • Изменение файлов fstab.qcom и init.tegra.rc в ядре ( boot.img) и файлов recovery.fstab и eventd.rc в рекавери TWRP, чтобы инициировать монтирование и загрузку с SDCard вместо внутренней памяти

Это удалось после некоторых экспериментов. Я думаю, что этот метод должен быть применим к любому устройству с аналогичной конфигурацией. Однако редактируемые файлы могут отличаться от устройства к устройству.

Если вы хотите поместить на SD-карту только внешние данные приложений, а не весь раздел, вы можете отредактировать fstab в boot.img и список хранения в framework-res.apk на Android 5 и старше.

Подробнее: [КАК] ЗАГРУЗИТЬ С SD-КАРТЫ [УСПЕШНО] на QMobile Z8 с BRICKED/DEAD eMMC