23 votos

¿Recuperar contenido eliminado de la partición de userdata?

Así sucedió que Amanda tuvo un momento de rubia y borró todos sus hilos en la aplicación de SMS por error. Sí, "Eliminar todos los hilos" probablemente no debería ser tan fácil de invocar.

El teléfono es un ZTE Blade, con todos sus datos de usuario almacenados de manera inconveniente en un sistema de archivos YAFFS2.

Tengo una copia de seguridad antigua, pero los SMS que necesito recuperar son de después de eso. Probablemente haya algunos en la tarjeta SIM, así que pedí un lector de SIM. Sospecho que los veinte o así que tiene son principalmente spam de operadores de red, de todos modos.

Entonces, maldigo mi ineficaz plan de respaldo y prometo respaldar los SMS en futuro en GMail.

Mientras tanto, resuelvo recuperar mmssms.db, o lo que quede de él.

Primero, conecto adb y verifico los montajes, luego intento copiar el bloque a una imagen en la tarjeta SD:

dd if=/dev/block/mtdblock6 of=/sdcard/data.img 

No tuve suerte. Razono que desmontar forzosamente sería una mala idea, y probablemente no funcionaría de todos modos.

Entonces, subo una copia de busybox enlazada estáticamente a la tarjeta SD y uso la opción conv=noerror.

Lo que terminé teniendo fue un archivo que seguía aumentando de tamaño hasta que la tarjeta SD se llenó.

¿Qué estoy haciendo mal? ¿ClockworkMod toma una imagen en el verdadero sentido o simplemente respalda los archivos y los empaca en una imagen? ¿Existe un programa de recuperación de YAFFS2? (Los dos documentos que he leído hacen parecer factible pero no he visto ni siquiera código PoC)

Cualquier pista sería recibida con gratitud.

Editar: El teléfono está rooteado. Muy rooteado :)

Edición adicional:

La mayoría de los mensajes encontrados en mmssms.db-wal:

ls -al /data/data/com.android.providers.telephony/databases
drwxrwx--x    1 radio    radio         2048 Jul 17 20:16 .
drwxr-xr-x    1 radio    radio         2048 Oct 26  2011 ..
-rw-rw----    1 root     root         60416 Jul 17 20:16 mmssms.db
-rw-rw----    1 radio    radio        32768 Jul 17 16:18 mmssms.db-shm
-rw-rw----    1 radio    radio       628832 Jun 30 19:23 mmssms.db-wal
-rw-rw-rw-    1 root     root         60416 Jul 17 20:16 mmssms.db.xxx
-rw-rw----    1 radio    radio       132096 Jun 18 13:25 telephony.db
-rw-rw----    1 radio    radio        32768 Jul 16 22:14 telephony.db-shm
-rw-rw----    1 radio    radio       106928 Jul 16 22:14 telephony.db-wal

Con suerte, SMS Backup & Restore permitirá una fusión.

0 votos

¿Está tu cuchilla enraizada?

0 votos

@Mandy: En cuanto a tu otra pregunta: Yaffs2 es un sistema de archivos flash que tiene protección de nivelación de desgaste para el almacenamiento flash subyacente (tiene un modelo de datos estructurado en registro donde las escrituras no son en el lugar, sino que van siempre a la cola del "registro" y el espacio no utilizado se recupera desde la cabeza. Muy simplemente explicado). Si no escribiste demasiado, probablemente puedas encontrar instancias antiguas de archivos. Al ignorar la parte de la cola justo antes de la eliminación, podrías tener suerte. Aún no he realizado el tallado de archivos para YAFFS2.

0 votos

19voto

Nick Pierpoint Puntos 7976

La base de datos de sms se guarda en /data/data/com.android.providers.telephony/databases/mmssms.db que es lo que quieres hacer.

Lo mejor que puedes hacer, es lo siguiente, no conectes el cable USB aún:

  1. Reinicia en la Recuperación de ClockWorkmod.
  2. Ve a Mounts and Storage
  3. Selecciona mount /data
  4. Conecta el USB
  5. Desde la ventana de comandos de Windows o desde la terminal, adb shell
  6. Dado que estás en la Recuperación de ClockworkMod, eres root por defecto, ahora haz esto cp /data/data/com.android.providers.telephony/databases/mmssms.db /sdcard/MySmsDatabase.db
  7. Sal de la adb shell escribiendo esto: exit
  8. Ahora tu base de datos está copiada en la tarjeta SD.
  9. Sal de la Recuperación de ClockworkMod y simplemente reinicia, la recuperación unmount /data por ti.

En este punto tu base de datos está copiada. Y puede ser extraída de forma segura utilizando algo como SqliteMan. HTH.

Edit: El OP estaba interesado en saber cómo realizar un volcado. - Sigue leyendo :)

Cuando invocas esto (con el USB conectado y dentro de la adb shell)

sh-4.1# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00500000 00020000 "recovery"
mtd1: 00500000 00020000 "boot"
mtd2: 00120000 00020000 "splash"
mtd3: 00080000 00020000 "misc"
mtd4: 02580000 00020000 "cache"
mtd5: 0d700000 00020000 "system"
mtd6: 0cb80000 00020000 "userdata"
mtd7: 00020000 00020000 "oem"
mtd8: 00180000 00020000 "persist"

Saber qué partición es la clave.. Por ejemplo, desde mi Blade, puedo ver que userdata está en la partición mtd6, en la cual la información de la partición real se puede encontrar dentro de /dev/mtd/mtdX así que se trata de hacer esto usando cat:

cat /dev/mtd/mtd6 > /sdcard/myuserdata.dump

Y a partir de ahí, tomando el /sdcard/myuserdata.dump, dependiendo del sistema de archivos utilizado en esa partición, se puede montar a través de bucle. La experiencia puede variar y por supuesto, es una situación de gallina y huevo, para hacer todo eso, el dispositivo necesita estar rooteado.

0 votos

Eso fue muy útil, todos (o al menos la mayoría) de los SMS eliminados estaban en mmssms.db-wal: ¡Muchas gracias por el útil consejo!

0 votos

Mi pregunta sigue en pie, entonces, ¿es posible eliminar una imagen si la situación lo exige?

0 votos

Sí, enmendaré la respuesta... :)

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X