¿Es posible crear un RAMDisk / Ramdrive para Android 4.x?

8

¿Es posible crear un ramdisk tmpfs de crecimiento automático en un Android 4.x rooteado? Si es así, ¿cómo?

Eadmaster
fuente
2
¿Para qué necesitas esto?
geffchang
almacenamiento temporal para varios archivos de documentos
eadmaster
1
La tarjeta SD no se limpia automáticamente en stutdown ...
eadmaster
2
@geffchang, ¿qué diferencia importa por qué necesita esto? Necesito esto también, por una razón totalmente diferente.
Michael
3
y en mi caso, el motivo es el almacenamiento temporal (Android puede matar mi proceso sin previo aviso en casi cualquier momento) sin necesidad de tocar el flash (ciclos de borrado limitados, mayor uso de energía, más lento, etc.)
Michael

Respuestas:

6

Si lo haces cat /proc/filesystems, deberías notar tmpfs . Entonces, si tienes acceso al mountcomando, deberías poder

  1. crear un directorio ( mkdir MYDIRECTORY)
  2. montar un sistema de archivos tmpfs allí ( mount -t tmpfs tmpfs MYDIRECTROY)

Por defecto, un montaje tmpfs usará la mitad de la RAM disponible en su sistema. Por lo tanto, en lugar de "crecimiento automático", puede pensar en él como "reducción automática", es decir, cuanto más lo use, menos RAM estará disponible. En el peor de los casos, su sistema podría comenzar a intercambiarse (lo cual no desea). Puede usar opciones para usar un tamaño de RAM diferente para ese montaje.

2017-02-28 Actualización: debido a las restricciones impuestas por Android, debe elegir un punto de montaje debajo de un que se pueda escribir en todas las aplicaciones. Como una tarjeta SD.

Nils
fuente
ok, todas las aplicaciones pueden escribir de esta manera:mount -o size=16M -t tmpfs tmpfs /data/local/tmp
eadmaster
@eadmaster, ¿qué parte de eso lo hace escribible para todos? ¿El tamaño o el punto de montaje? (no funciona para mí ...)
Michael
@Michael para qué atributos ves. si emite ls -Faldentro del directorio montado?
Nils
ls -Falen el directorio montado no da salida. Acabo de recibir el aviso de vuelta. Si enumero el directorio del padre, obtengodrwxrwxrwt root root 2014-04-06 20:18 tmp
Michael
@Michael si su sistema operativo está rooteado, debería poder acceder a él
eadmaster
3

Desde el enlace que el OP ha incluido, la parte clave lo resumió:

tmpfs es compatible con el kernel de Linux desde la versión 2.4 en adelante. [3] tmpfs (anteriormente conocido como shmfs) se basa en el código ramfs utilizado durante el arranque

El énfasis es mío, ¡de eso se trata RAMDisk! Permite que el núcleo monte temporalmente el sistema de archivos raíz y continúe ejecutando los scripts necesarios al inicio.

Lo mismo se aplica en este caso de Android, todos y cada uno de los boot.imgque se muestran en la /bootpartición, ya sea Odin, fastboot, Kies, Sony Update Software, Heimdall, etc., contienen el "código ramfs", que tiene una estructura de directorio que contiene los pertinentes. están incluidos:

  • /dev para archivos de dispositivo
  • /sbin para binarios del sistema
  • /syspara el uso de interactuar con los archivos del dispositivo después de /proc haber montado

El script de arranque lee la estructura del directorio ramfs y la monta después de montar con éxito /systemen la etapa inicial del arranque.

Como en relación con la palabra clave del OP en la pregunta:

crear un crecimiento automático ...

No crece automáticamente per se, sino que está limitado por la estructura ramfs y la cantidad de RAM disponible, y lo más importante, ¡desaparece al reiniciar!

La confusión proviene de la combinación de "RAMDisk" con "RAMDrive" indistintamente, técnicamente un RAMDrive, es un espacio de intercambio en la partición de intercambio nativa, que se encuentra comúnmente en Linux de escritorio Si está pensando en la antigua era de DOS, donde se usaba RAMDrive , para simular una unidad de disco residente en la memoria y los programas cuando se copian en ese disco y se cargan más rápido , no se ejecutan más rápido , en lugar de cargarse desde las viejas unidades de disco MFM / RLL ( alguna vez vea la lista del directorio DOS desplazarse muy lentamente en esas unidades ? ) esto, también era conocido como RAMDisk también! (Para empeorar las cosas, en aquel entonces, diferentes fabricantes producían RAMDRIVE.SYS o incluso RAMDISK.SYS!)

En el caso del punto de vista del kernel de Linux, tanto de escritorio como de Android, RAMDisk es tmpfs , ¡pero no está destinado a que los usuarios normales almacenen datos / documentos, etc., ya que es exclusivamente para el uso del kernel mismo!

Editar

Para tener en cuenta el comentario de @ nil a continuación, puede montarlo sí, pero viene con un costo, los recursos asignados a la tmpfsmitad se reducen a la mitad y usan la mitad del resto de la cantidad de RAM restante. Hablando de manera realista, no es una vía ideal para seguir desde el punto de vista de Android que se ejecuta en dispositivos.

Ahí es donde /sdcardentra, para almacenar datos / documentos del usuario solo por esa razón, de ahí que haya omitido el hecho de que puede, pero, de nuevo, ¿por qué ?

  • ¿Qué pasa si el usuario final olvida guardar los datos en el lugar correcto, porque eso se pierde al reiniciar!
t0mm13b
fuente
Entonces la respuesta corta es: Sí, puedes. mount -t tmpfs.
Nils
@Nils ¡No dije que sí! Eso se hace desde el momento en que el kernel se ha iniciado y se ejecuta mount -t tmpfs después de leer los ramfs (que tiene un script de inicio básico), una vez que está montado, el resto del sistema aparece como en el post-boot, que es el entorno de Android. Además, al hacer eso después, por ejemplo adb shell, ¡está reduciendo los recursos del sistema, especialmente en el caso de los teléfonos inteligentes con memoria y recursos limitados!
t0mm13b
1
No, montar un tmpfs no usará RAM. El uso comenzará cuando coloque archivos en él, al menos esto es lo que hacen mis servidores Linux. Y Android se ejecuta en Linux ...
Nils
@Nils Muy mala impresión. ¡Android no se ejecuta en Linux! El kernel es Linux, pero el espacio de usuario no es bash, etc., como una contraparte de escritorio completa. Utiliza la biblioteca bionic runtime, no glibc y dalvik / zygote desde allí en adelante hasta la pantalla de inicio de Android.
t0mm13b
tmpfs es kernel, no espacio de usuario. Entonces, supongo que ni siquiera es un módulo de núcleo, ya que es necesario durante el arranque para montar el initrd.
Nils