Crear y habilitar una partición de intercambio de almacenamiento interno en Android Kitkat rooteado

Sistema: teléfono Android 4.4 rooteado (ROM real: CM 11 Milestone 6) con 1 GB de RAM, mucho espacio de almacenamiento interno, pero sin ranura para tarjeta SD. El esquema de partición de mi teléfono es CyanogenMod 11 sin modificar.

Problema: el controlador lowmemorykiller/OOM en mi teléfono sigue eliminando procesos vitales del sistema, como la pantalla de bloqueo, incallui o acore, lo que provoca, en el mejor de los casos, bloqueos prolongados y, con mayor frecuencia, bloqueos del sistema suaves y duros. Probablemente estoy ejecutando aplicaciones que empujan la memoria RAM más allá del mínimo del sistema, y ​​está haciendo una elección subóptima de proceso en segundo plano para eliminar. Busqué afinar lowmemkiller pero no llegué a ninguna parte.

Como el problema es la RAM y no la CPU, quiero intentar habilitar el intercambio basado en el almacenamiento interno en lugar de zRAM como una solución alternativa, que el teléfono debería manejar. Pero no puedo encontrar instrucciones claras sobre cómo hacerlo. Cada página de instrucciones que encontré es de escritorio, no específica de Android, específica de almacenamiento externo (tarjeta SD) ("partición que usa USB + Windows"), asume que desea un intercambio basado en archivo, no en partición, o sugiere una aplicación de Google Play para usar. Ninguno explica paso a paso cómo hacerlo.

Suponiendo que he leído las advertencias y conozco los riesgos, y quiero seguir adelante de todos modos, ¿cómo lo hago? Realmente solo quiero obtener una lista de los comandos de consola de ejemplo para usar el intercambio basado en particiones. Supongo que va algo como esto:

  1. Cambie el tamaño de las particiones o subparticiones existentes para crear espacio libre para una partición de intercambio dedicada de tamaño fijo.
  2. Cree o defina una nueva partición en el espacio libre y asegúrese de que esté formateada como intercambio, o el sistema operativo la formateará o usará como intercambio en el arranque.
  3. Edite algunos otros archivos del sistema para asegurarse de que el intercambio se monte y habilite correctamente en el arranque, para que el sistema operativo pueda reconocerlo y usarlo. (fstab, o algo más?)
  4. Deshabilite o reduzca la prioridad de zRAM y edite el intercambio a aproximadamente 20-30.
  5. Reinicie, cruce los dedos y espero haberlo hecho bien.

Mi nivel actual de experiencia *nix: Sé que Linux usa particiones y subparticiones, que las nuevas particiones y los cambios de partición probablemente necesiten que edite manualmente fstab u otros archivos, y que también se necesiten ediciones manuales para garantizar que las particiones se montarán/habilitarán/utilizarán en bota. No he usado los comandos reales ni he cambiado los archivos reales, así que no sé qué esperar. Me siento cómodo con la consola, pero esta es un área un poco nueva para mí.

¿Cómo hago esto, paso a paso, y cuáles son los comandos que usaría si no son obvios? Puedo calcular el resto de eso.

Respuestas (2)

Solo una idea en bruto, no probada / verificada por mí mismo:

El intercambio también se puede establecer mediante un archivo de intercambio, por lo que podría probar fácilmente si funciona. Pruebe a través adb shellde o una aplicación de terminal, después de convertirse en root, si los comandos , y están dddisponibles mkswap. swaponSi es así, puedes probar:

# create a file to be used for swapping
# (adjust the filename to where the file should reside, and the count
# to the size in kb it should occupy)
dd if=/dev/zero of=</path/to/swapfile> bs=1024 count=65536

# initialize the file for swap use
# (use the file created in the previous step)
mkswap </path/to/swapfile>

# enable swapping
swapon </path/to/swapfile>

# to disable swapping to that file:
# swapoff </path/to/swapfile>

Hay formas de ajustar esto (por ejemplo, establecer valores específicos para swappiness ), pero con los pasos descritos puede probar fácilmente si funciona, sin gran peligro de romper cosas. Ni siquiera es necesario reiniciar. En el mejor de los casos, simplemente funciona; en el peor de los casos, no funciona, y es posible que deba eliminar manualmente el </path/to/swapfile>;)

dd funcionó una vez que reemplacé -if/-of con if=/of=, respectivamente. mkswap no dio ninguna respuesta (podría ser así si no hay un problema para informar). swapon falló (el mensaje fue mínimo: "swapon failed for /path/and/file"). Sin opción detallada para swapon, 3 GB de repuesto; No pude ver cómo aprender cuál era el problema.
Perdón por el error tipográfico con -if/-of(arreglado). ¿Con qué tamaño de archivo has probado? ¿En qué almacenamiento se encuentra el archivo de intercambio (por ejemplo, una tarjeta externa o interna)?
Una cosa más que me viene a la mente: puede ser que el núcleo no tenga soporte de intercambio. Puedes comprobarlo con esta aplicación .
Acabo de comprobar y dice que es compatible. Probé 512 MB en el almacenamiento interno /sdcard/swap.file (como se menciona en el OP, no tiene tarjeta SD ni almacenamiento externo). Dice que puede funcionar, a juzgar por el mensaje "felicidades, puedes hacerlo". Entonces... ¿cuáles son los comandos de la consola para hacerlo? Alternativamente, podría ser un problema de permisos o ruta y los comandos anteriores están bien, ¿qué permisos/ruta debo usar en Android para un archivo de intercambio de prueba?
Actualización Acabo de verificar nuevamente, usando una ruta diferente (/cache/swap.file en lugar de /sdcard/swap.file) y ahora aparentemente funciona, freeaumentó a ( 128MB zRAM+ la cantidad de KB que designé swap.file). No he probado si se conserva al reiniciar, pero los comandos anteriores parecen funcionar. Entonces parece que depende de la ruta. Entonces, la siguiente pregunta es... ¿cómo configuro un archivo/partición contiguo para el intercambio y dónde colocar un archivo o cómo modificar la partición? La /cachepartición es demasiado pequeña para un intercambio de 400 MB. Además, me gustaría tenerlo en un lugar más "visible", si Android lo permite.
Actualización 2 Se pierde al reiniciar. Pero al menos los comandos funcionan. Entonces, ¿necesito cambiar algo (¿supongo?) en fstab/init/lo que sea para mantenerlo definido y activo al reiniciar? Prefiero aprender a hacerlo correctamente que simplemente lanzar un script pirateado para ejecutar estos comandos en cada inicio, si hay una forma "adecuada" de hacerlo.
Si desea cambiar algo en init, deberá modificar la imagen de inicio (ya que los archivos init se vuelven a crear desde allí en cada inicio). La automatización podría establecerse por otros medios, por ejemplo, usando Tasker para ejecutar el swaponcomando después de cada arranque (no es necesario repetir los otros pasos). En cuanto a la ubicación, podrías probar /data/local.
/data/localparece funcionar bien como ubicación. ¿Android tiene una forma estándar (nativa) de definir un archivo de intercambio o una partición de forma permanente o, de no ser así, ejecutar un script en el momento del arranque para definirlo? Me gustaría usar métodos nativos si es posible, yo mismo, en lugar de descargar "aún más aplicaciones" que normalmente solo empaquetan métodos nativos de todos modos :) [Y es posible que desee editar la respuesta original nuevamente, dejó el "-" antes de if=/of =]
Qué asco, ¿cómo se pueden poner dos errores tipográficos en un solo lugar? #D Gracias, solucioné eso. Pero no, AFAIK no hay una forma "nativa" de intercambio, excepto quizás algunas ROM personalizadas seleccionadas. Claro que podría usar una partición de intercambio, pero considerando el medio utilizado, podría desgastarlo rápidamente. Prefiero recomendar usar un archivo y volver a crearlo de vez en cuando para evitar eso, como lo hizo automáticamente la aplicación "vieja" llamada "Swapper" (ya no está en Google Play, aunque existe una aplicación con el mismo nombre). allá). // Por cierto: ¿Considera aceptar la respuesta (haga clic en la marca de verificación junto a ella)? ;)
Por cierto. swapon </path/to/swapfile>no funcionó para mí, pero envolver el archivo con un dispositivo de bucle funcionó:losetup /dev/block/loop0 </path/to/swapfile>; swapon /dev/block/loop0

Yo estaba teniendo el mismo problema. Intenté 4 aplicaciones, todas fallaron. Sé cómo hacer esto en otras distribuciones de Linux, que también se muestran manualmente arriba, aún fallaron. Probé otras ideas dadas anteriormente: moverse a otros puntos de montaje. La mayoría te son negados, otros son demasiado pequeños para que valga la pena.

Luego se dio cuenta al correrdf

Vi una salida como esta:

/storage/sdcard0
/mnt/media_rw/sdcard0

Usar el /mnten lugar de /storageo /sdcardparece haberme permitido habilitar el intercambio con éxito.