3 votos

Android du y df muy diferentes: ¿Sistema de Archivos Corrupto?

En un decodificador Android Nougat (7.1.1), du y df de mi /data partición son muy diferentes:

$ adb shell du -sh /data
1.0G    /data
$ adb shell df -H /data
Filesystem      Size  Used Avail Use% Mounted on
/dev/block/sda9  10G   10G  469M  96% /data

No creo que se monte nada más bajo /data :

$ adb shell mount | grep "\/data"
/dev/block/sda9 on /data type ext4 (rw,seclabel,nosuid,nodev,relatime,discard,noauto_da_alloc,data=ordered)
$ adb shell mount | grep "sda9"
/dev/block/sda9 on /data type ext4 (rw,seclabel,nosuid,nodev,relatime,discard,noauto_da_alloc,data=ordered)

lsof me indica que hay docenas de procesos que mantienen cientos de pequeños archivos borrados del tipo

init          1       root    3w      CHR               1,11       0t0      14517 /dev/__kmsg__ (deleted)
ueventd     391       root    3w      CHR               1,11       0t0      14593 /dev/__kmsg__ (deleted)
  . . .
main        756       root  mem   unknown                                         /dev/ashmem/dalvik-large object space allocation (deleted)
main        756       root  mem   unknown                                         /dev/ashmem/dalvik-large object space allocation (deleted)
  . . .
omm.times  3934     system  mem   unknown                                         /dev/ashmem/dalvik-mark sweep sweep array free buffer (deleted)
omm.times  3934     system  mem   unknown                                         /dev/ashmem/dalvik-mark sweep sweep array free buffer (deleted)

Utilizando busybox Los resultados son diferentes ( df muestra un uso mucho menor), pero sigue habiendo una gran discrepancia entre du y df :

$ adb shell busybox du -sh /data
389.4M  /data
$ adb shell busybox df -h /data
Filesystem                Size      Used Available Use% Mounted on
/dev/block/bootdevice/by-name/userdata
                          9.7G      8.6G      1.1G  89% /data

Y utilizando toybox los resultados son similares a busybox :

$ adb shell toybox du -sh /data
389M    /data
$ adb shell toybox df -h /data
Filesystem      Size  Used Avail Use% Mounted on
/dev/block/sda9  10G  8.6G  1.1G  89% /data

Creo que es importante tener en cuenta que estos números siguen siendo similares después de un reinicio .

Además, quiero señalar que no puedo actualizar por OTA el Android de este dispositivo debido a que se está quedando sin espacio en el disco, a pesar de que la imagen de la OTA sólo tiene un tamaño de 1 GB. Este hecho me lleva a creer que los resultados de df son precisos en términos de espacio de disco real disponible.

Todos los comandos adb se ejecutan como Root, es decir, hice adb root antes de ejecutarlos. Pero a riesgo de que esta pregunta sea demasiado verbosa, aquí está todo lo que se ejecuta en el prompt de adb:

$ adb shell
Z:/ # whoami
root
Z:/ # du -sh /data
389M    /data
Z:/ # df -h /data
Filesystem      Size  Used Avail Use% Mounted on
/dev/block/sda9  10G  8.6G  1.1G  89% /data
10.197.12.14:/ # busybox du -sh /data
389.4M  /data
Z:/ # busybox df -h /data
Filesystem                Size      Used Available Use% Mounted on
/dev/block/bootdevice/by-name/userdata
                          9.7G      8.6G      1.1G  89% /data
Z:/ # toybox du -sh /data
389M    /data
Z:/ # toybox df -h /data
Filesystem      Size  Used Avail Use% Mounted on
/dev/block/sda9  10G  8.6G  1.1G  89% /data
Z:/ # 

Un usuario en los comentarios ha pedido lo siguiente:

Z:/ # while read num; do (( sum += num )); done <<< $(find /data -type f -exec stat -c%b {} +); expr $sum / 2048
393

Entiendo que du informa del espacio libre al escanear los nodos alcanzables, y que por lo tanto esto podría significar que mi sistema de archivos está corrupto. Sin embargo, por desgracia, esto es para los dispositivos en el campo, y no quiero tener que (y no creo que pueda) ejecutar fsck o e2fsck .

¿Qué puede estar causando la enorme diferencia entre du y df en este dispositivo, y cómo podría resolverse este problema? Estaré encantado de proporcionar más registros.

0 votos

df y du en su mayoría difieren un poco (véase aquí por qué) pero no tanto. Parece que hay algún problema con su du binario. Utilice uno diferente. Vea aquí lo que debe esperar: ¿Cómo se utiliza el espacio en disco en el dispositivo Android?

0 votos

Has llamado a ambos como "usuario normal". Así que df puede informar del "espacio libre" (también conocido como "Disk Free") normalmente - mientras que du sólo puede resumir lo que el usuario tiene acceso. No hay nada roto, funciona como está diseñado. Pruebe ambos como Root, ver la captura de pantalla por @alecxs

0 votos

Gracias, @IrfanLatif. He añadido los resultados de busybox a la pregunta original.

2voto

Izzy Puntos 45544

df significa "Disco Libre". Esto significa que sólo necesita comprobar con la "información global del sistema de archivos" el espacio libre (accesible para todos los usuarios). El tamaño del propio sistema de archivos también está "globalmente disponible". La diferencia, lógicamente, es el "espacio usado". Hecho.

du funciona de forma diferente: no a nivel de sistema de archivos, sino a nivel de archivos. Tiene que buscar cada directorio y archivo por separado, recoger su tamaño y sumarlo. Así que sólo puede tener en cuenta aquello a lo que tiene acceso.

Ahora has ejecutado ambos comandos como "usuario normal" - que no tiene permiso para recorrer, por ejemplo /data/data (donde se almacenan todos los datos de las aplicaciones). Así que sólo puede sumar una parte de lo que ocupa el espacio en /data . ¿Podría ejecutar ambos comandos como usuario Root (como la captura de pantalla en el comentario de alecxs muestra), los números estarían mucho más cerca - ya que normalmente Root puede acceder a todos los archivos. Aunque como de nuevo Alex señala correctamente: todavía hay SELinux que podría denegar el acceso completo, lo que, según él, es un problema conocido para mtk-su en el FireTV stick de Amazon, y podría ser el culpable aquí, y el montaje aislado espacios de nombres podría ser otra razón para los archivos invisibles.

TL;DR: no hay ni una corrupción del sistema de archivos, ni una rotura du binario necesariamente causante de la diferencia. Puede que todo funcione como está diseñado. Si quieres asegurarte, puedes ejecutar fsck (si lo prefieres, en modo de sólo lectura) para descartar lo primero - y establecer un caso de prueba en un lugar diferente para lo segundo.

1 votos

Según el comentario en mi descripción, ya ejecuté du y df como Root. Aquí está la confirmación: $ adb shell Z:/ # su Z:/ # whoami Root Z:/ # du -sh /data 389M /data Z:/ # df -H /data Filesystem Size Used Avail Use% Mounted on /dev/block/sda9 10G 9.2G 1.1G 89% /data

0 votos

Sí, disculpas, se me pasó eso en los últimos párrafos (me distraje con esas enormes imágenes en los comentarios de abajo, no sé por qué SE meanhile las muestra en línea, mala idea en mi opinión). Si quieres, puedo eliminar mi respuesta como "no válida". O puedo dejarlo como podría ayudar a los que no son conscientes de los diferentes enfoques.

0 votos

Prefiero que lo borres porque no responde directamente a la pregunta (y había comprobado que estos procedimientos deben hacerse como Root en otro lugar). Gracias.

1voto

zippy Puntos 31

La partición /data estaba efectivamente corrompida.

Después de correr e2fsck -p /dev/block/sda9 Aquí está la actualización du y df (de nuevo, después de hacer un adb root ):

$ adb shell du -s /data
1.3G    /data
$ adb shell df -H /data
Filesystem      Size  Used Avail Use% Mounted on
/dev/block/sda9  10G  1.5G  8.9G  15% /data

Después de arreglar el sistema de archivos, el dispositivo funcionó correctamente y se actualizó con éxito a partir de entonces.

(Tenga en cuenta que descubrí que tenía que ejecutar e2fsck con el -p opción; por alguna razón no se ejecutaría de forma interactiva).

Una parte de la producción de la anterior e2fsck comando es

data contains a file system with errors, check forced.
data: Deleted inode 163845 has zero dtime.  FIXED.
data: Deleted inode 163847 has zero dtime.  FIXED.
data: Deleted inode 163849 has zero dtime.  FIXED.
   . . . [snip ] . . .
data: Deleted inode 213003 has zero dtime.  FIXED.
data: Deleted inode 262223 has zero dtime.  FIXED.
data: Deleted inode 303108 has zero dtime.  FIXED.
data: 5203/655360 files (2.0% non-contiguous), 186831/2621440 blocks

Había un total de 140 líneas del tipo data: Deleted inode...

Por cierto, suponemos que este problema se debió posiblemente a que el sistema de archivos se llenó de registros, lo que provocó la corrupción durante el siguiente intento de descarga de actualizaciones OTA: Esas descargas fallaron, pero a partir de entonces dejaron el sistema de archivos en un estado corrupto. Los siguientes intentos de esas descargas parecían corromper aún más el sistema de archivos.

Muchas gracias a @alecxs por su insistencia y detalles relevantes. (Sin embargo, tenga en cuenta que para ejecutar e2fsck la partición /dev/block/sda9 tuvo que ser desmontada).

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