Можно ли создать RAMDisk / Ramdrive для Android 4.x?

8

Можно ли создать автоматически растущий виртуальный диск tmpfs на рутованном Android 4.x? Если да, то как?

eadmaster
источник
2
Для чего вам это нужно?
Геффчанг
временное хранилище для различных файлов документов
eadmaster
1
SDCard не очищается автоматически при остановке ...
eadmaster
2
@geffchang какая разница, зачем ему это нужно? мне это тоже нужно, по совершенно другой причине.
Майкл
3
и в моем случае причина заключается в временном хранении (Android может убить мой процесс без предупреждения практически в любое время) без необходимости касания флэш-памяти (ограниченные циклы стирания, повышенное энергопотребление, медленное и т. д.)
Майкл,

Ответы:

6

Если вы делаете, cat /proc/filesystemsвы должны заметить tmpfs . Так что, если у вас есть доступ к mountкоманде, вы сможете

  1. создать каталог ( mkdir MYDIRECTORY)
  2. смонтируйте там файловую систему tmpfs ( mount -t tmpfs tmpfs MYDIRECTROY)

По умолчанию tmpfs-mount будет использовать половину доступной оперативной памяти в вашей системе. Таким образом, вместо «автоматического увеличения» вы можете думать об этом как об «автоматическом сжатии» - т.е. чем больше вы используете его, тем меньше оперативной памяти будет доступно. В худшем случае ваша система может начать замену (что вам не нужно). Вы можете использовать опции, чтобы использовать другой размер RAM для этого монтирования.

2017-02-28 Обновление: из-за ограничений, наложенных Android, вы должны выбрать точку монтирования ниже доступной для записи всем приложениям. Как SD-карта.

Nils
источник
хорошо, этот способ доступен для записи всем приложениям:mount -o size=16M -t tmpfs tmpfs /data/local/tmp
eadmaster
@eadmaster, какая часть этого делает его доступным для записи всем? размер или точка монтирования? (это не работает для меня ...)
Майкл
@ Майкл, какие атрибуты ты видишь. если вы выпускаете ls -Falв смонтированном каталоге?
Нильс
ls -Falв смонтированном каталоге ничего не выдает. Я просто получаю подсказку обратно. Если я перечислю каталог от родителя, я получуdrwxrwxrwt root root 2014-04-06 20:18 tmp
Майкл
@ Майкл, если ваша ОС рутирована, вы должны иметь к ней доступ
eadmaster
3

Из ссылки, которую вложил ОП, ключевая часть подвела его:

tmpfs поддерживается ядром Linux начиная с версии 2.4 и выше. [3] tmpfs (ранее известный как shmfs) основан на коде ramfs, используемом при загрузке

Акцент мой, вот что такое RAMDisk! Это позволяет ядру временно смонтировать корневую файловую систему и продолжить выполнение необходимых сценариев при запуске.

То же самое применимо в этом случае Android, каждый из которых, boot.imgкоторый передается в /bootраздел, будь то Odin, fastboot, Kies, Sony Update Software, Heimdall и т. Д., Содержит «код ramfs», который имеет структуру каталогов, содержащую соответствующие включены:

  • /dev для файлов устройства
  • /sbin для системных двоичных файлов
  • /sysдля использования взаимодействия с файлами устройства после /proc монтирования

Сценарий загрузки считывает структуру каталогов ramfs и монтирует ее после успешного монтирования /systemна самой ранней стадии загрузки.

Что касается ключевого слова ОП в вопросе:

создать авто-растущий ...

Само по себе оно не растет автоматически, скорее, оно ограничено структурой ramfs и объемом доступной оперативной памяти, и что более важно, оно исчезает при перезагрузке!

Путаница возникает из-за взаимозаменяемости «RAMDisk» с «RAMDrive» взаимозаменяемо, технически RAMDrive, это пространство подкачки в собственном разделе подкачки, обычно встречающееся в настольном Linux. Если вы думаете о старой эпохе DOS, где RAMDrive использовался для имитации дискового накопителя, находящегося в памяти, и программ, когда они копируются на этот диск и загружаются быстрее, а не выполняются быстрее , чем загрузка со старых дисков MFM / RLL (Вы когда-нибудь видели, как список каталогов DOS очень медленно прокручивается на этих дисках ? ) это также было известно как RAMDisk! (Что еще хуже, тогда разные производители выпускали RAMDRIVE.SYS или даже RAMDISK.SYS!)

В случае точки зрения ядра Linux, как настольного компьютера, так и Android, RAMDisk - это tmpfs , но он не предназначен для обычных пользователей для хранения данных / документов и т. Д. , Поскольку он предназначен исключительно для использования самим ядром!

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

Чтобы отметить комментарий @ nil ниже, вы можете смонтировать его да, но он идет с затратами, ресурсы, выделяемые на него, tmpfsделятся пополам и используют половину оставшегося объема из оставшегося объема оперативной памяти. Реально говоря, это не идеальный путь, чтобы продолжать с точки зрения Android, работающего на устройствах.

Вот /sdcardтут- то и возникает необходимость хранить пользовательские данные / документы только по этой причине, поэтому я и упустил тот факт, что вы можете, но опять же, почему ?

  • Что, если конечный пользователь забудет сохранить данные в нужном месте - потому что они будут потеряны при перезагрузке!
t0mm13b
источник
Итак, короткий ответ: да, вы можете. mount -t tmpfs,
Нильс
@ Nils Я не сказал, да! Это делается с того момента, как ядро ​​загрузилось и запускается mount -t tmpfs после чтения ramfs (который имеет сценарий инициализации barebones), после того, как он смонтирован, остальная часть системы запускается как после загрузки, то есть в среде Android. Кроме того, делая это впоследствии, например adb shell, вы сокращаете системные ресурсы, особенно в случае смартфонов с ограниченными памятью и ресурсами!
t0mm13b
1
Нет, монтирование tmpfs не будет использовать оперативную память. Использование начнется, когда вы положите в него файлы - по крайней мере, так делают мои Linux-серверы. И Android работает на Linux ...
Нильс
@ Нильс Очень неправильное впечатление. Android не работает на Linux! Ядро Linux, но пространство пользователя не bash и т. Д., Как полноценный аналог рабочего стола. Он использует бионическую библиотеку времени выполнения, без glibc и dalvik / zygote оттуда вверх на домашний экран Android.
t0mm13b
tmpfs - это ядро, а не пользовательское пространство. Поэтому я предполагаю, что это даже не модуль ядра, так как это необходимо во время загрузки для монтирования initrd.
Нильс