- Monta un archivo rellenado con ceros como dispositivo de loop y compara el antes y el después de
mkfs.ext4, mostrando a nivel de byte qué estructuras coloca ext4 sobre el espacio vacío - El archivo de prueba tiene un tamaño de 8 bloques creado con
/dev/zero, y la imagen está compuesta como bloques de 1024 bytes de ancho y 64 bytes de alto, de modo que cada píxel corresponde a un byte - Como solo con la salida de
odes difícil leer la estructura de ext4, compara en imágenes la distribución de bytes entre el estado rellenado con 0x00 y el estado posterior amkfs.ext4 - Los bytes con valor 0x00 pueden parecer espacio vacío aunque sean datos propiedad de ext4, por lo que con la visualización básica es difícil distinguir por completo las estructuras asignadas
- Después de copiar un archivo de 1024 bytes de
/dev/urandom, busca ese mismo patrón y lo marca con color para identificar juntos los metadatos de ext4 y la ubicación de los datos del usuario
Crear una imagen ext4 sobre un archivo vacío
- Es un experimento para comprobar qué estructura de bytes agrega ext4 cuando se ejecuta
mkfs.ext4sobre una unidad vacía rellenada solo con 0x00 - Como manipular una unidad en uso como
/dev/sdaconddes peligroso, en vez de un disco secundario de una VM se usa un archivo común como dispositivo de loop mountyumountpueden manejar directamente el archivo loop sin necesidad delosetupmount -o loop <foo_file> <bar_dir>umount <bar_dir>
Configuración del archivo de bloques para el experimento
- El experimento siempre parte de un archivo vacío creado con
ddusando/dev/zerocomo entrada - El tamaño del archivo se calcula para que la imagen final se vea como 8 bloques
- Cada bloque tiene 1024 píxeles/bytes de ancho
- 64 píxeles/bytes de alto
- El comando de creación es el siguiente
dd if=/dev/zero of=blockfile.ext4 bs=$((64 * 1024)) count=8
- Justo después de crearlo, la salida de
odmuestra un estado predecible completamente rellenado con 0x00 - El tamaño de la unidad usada es demasiado pequeño para incluir journal, así que la visualización con journal queda como proyecto para después
Estructura visible después de mkfs.ext4
- Tras ejecutar
mkfs.ext4, en el archivo que antes solo tenía 0x00 aparecen varios valores, revelando la estructura del sistema de archivos creada por ext4 - Pero la salida de bytes de
odes demasiado detallada para entender la distribución completa - Si se convierte en una imagen donde cada píxel representa un byte, el archivo de bloques puede verse desde una perspectiva más amplia
- La imagen del archivo vacío muestra una unidad completamente en 0x00, y la imagen posterior a
mkfs.ext4muestra dónde se colocan los datos de ext4 en el disco
Cómo distinguirlos de los datos del usuario
- La imagen básica no distingue directamente entre bytes de ext4 y bytes ajenos a ext4
- Aunque un byte pertenezca a datos de ext4, si su valor es 0x00 se mostrará con el mismo color que otros bytes 0x00
- Para distinguir los datos de ext4 de los datos “del usuario”, se crea un archivo de 1024 bytes desde
/dev/urandomy se copia al dispositivo de loop montado - Al leer el blockfile, el código de visualización comprueba si los siguientes 1024 bytes coinciden con los 1024 bytes del archivo de referencia
- Si coinciden, esos 1024 píxeles se colorean como datos del usuario
- Con este método se obtiene una imagen en la que aparecen juntas la estructura creada por ext4 y los datos del archivo de usuario copiado
Animación y comparación con ext2
- Después de las imágenes estáticas, se crea un GIF animado basado en el mismo método
- Entre cada frame, el archivo de datos del usuario se copia tres veces a la unidad
- Tiene más fuerza visual que hacer
cpsolo una vez por frame - Además reduce el tamaño del GIF
- Tiene más fuerza visual que hacer
- También se ofrece como comparación una animación similar para ext2
Enlaces de referencia
- Wikipedia: panorama general de ext4
- ext4 wiki: wiki de ext4
- Admin Guide: guía de administración de ext4 del kernel
- e2fsprogs: herramientas del sistema de archivos ext
- ext4 Data Structures and Algorithms: documentación sobre estructuras de datos y algoritmos de ext4
1 comentarios
Opiniones de Hacker News
Hace unos años hice una visualización gráfica real de ext4 en FOSDEM; el video está aquí y la visualización empieza alrededor del minuto 20:
https://archive.fosdem.org/2019/schedule/event/nbdkit/
La parte de la charla donde hablo del trim del sistema de archivos "azul" puede ser confusa: parece que el proyector de FOSDEM no mostraba bien el azul claro que yo estaba usando. No me di cuenta durante la presentación, y en la pantalla de mi laptop se veía bien. En el blog también hay un video complementario con los colores renderizados correctamente: https://rwmj.wordpress.com/2018/11/04/nbd-graphical-viewer/
Como mucha gente intenta simplificar el uso de las computadoras, parece que están desapareciendo elementos que despertaban la curiosidad de forma natural y enseñaban poco a poco, aunque nadie intentara enseñarlos explícitamente.
Un ejemplo es ese pequeño indicador que mostraba que el disco estaba trabajando, como la luz roja del disco duro en las computadoras antiguas. Si parpadeaba con cierto patrón y venía acompañado de una satisfactoria secuencia de lecturas rápidas del disco, uno sabía que esta vez el juego sí iba a cargar de verdad. Me parece un buen compromiso dejar, aunque sea escondida, una vista avanzada para que la vean los curiosos; es muy probable que esas personas se conviertan en la próxima generación de nerds de la computación que muevan el mundo.
Hay una utilidad llamada pixd que genera una visualización de datos similar desde la línea de comandos: https://github.com/FireyFly/pixd
Sin embargo, solo muestra una representación estática de datos binarios, y no es tan vistosa como el GIF animado de buredoranna, donde los cambios del sistema de archivos aparecen con el tiempo. Este tipo de arreglos de píxeles puede ser útil si se coloca sobre una curva de Hilbert en lugar de dibujarlo línea por línea. Aprendí este método del plugin cantordust de Ghidra, y 3blue1brown ofrece una intuición matemática de por qué los arreglos de píxeles con curvas de Hilbert funcionan bien.
https://inside.battelle.org/blog-details/battelle-publishes-open-source-binary-visualization-tool
https://www.youtube.com/watch?v=3s7h2MHQtxc&t=311s
Me pareció interesante la demo de nbdkit para visualizar la E/S del sistema de archivos: https://rwmj.wordpress.com/2018/11/04/nbd-graphical-viewer/
Inspirado por este artículo, probé este experimento:
dd if=/dev/zero bs=1K count=$(( 256 * 3 )) of=a.ext4mfks.ext4 a.ext4mkdir asudo mount a.ext4 acd asudo chown 1000:1000 .python3 -c 'open("a", "wb").write(b"\xff\x00\x00" * 2000)'python3 -c 'open("b", "wb").write(b"\xff\xff\x00" * 2000)'python3 -c 'open("c", "wb").write(b"\xff\x00\xff" * 2000)'cd ..sudo umount a(echo -n 'P6\n512 512\n255\n' ; cat a.ext4 ) > a.ppmconvert a.ppm a.pngEl resultado, a.png, es reversible. Si se convierte de nuevo a un archivo
.ppmy se saltan los primeros 15 bytes, debería salir un.ext4válido.Muy bueno. Este tipo de visualización de datos ayuda muchísimo a entender detalles de cómo un formato de disco realmente distribuye los datos en el disco, por ejemplo cómo preasigna cuidadosamente metadatos para cierto uso.
Me habría gustado ver qué pasa cuando se llena todo el espacio, pero lamentablemente la animación termina antes de ese punto.
Es un buen recuerdo de infancia haberme sentado frente a la computadora viendo correr el desfragmentador de Windows 95/98: https://academy.avast.com/hs-fs/hubfs/New_Avast_Academy/how_to_defrag_your_pc_hard_drive_academy_refresh/img-06.png?width=600&name=img-06.png
Me recordó a innodb_ruby: https://github.com/jeremycole/innodb_ruby
Es un conjunto de herramientas muy útil para visualizar y aprender la estructura de InnoDB. Aquí hay un ejemplo de uso: https://blog.jcole.us/2014/10/02/visualizing-the-impact-of-ordered-vs-random-index-insertion-in-innodb/
Si el autor ve este comentario: convertir el GIF a video reduciría los bytes transferidos y permitiría a los usuarios usar controles de video como pausar, buscar y ajustar la velocidad.
Por ejemplo, se puede convertir con algo como
ffmpeg -i ext4.gif -pix_fmt yuv420p -c:v libx264 ext4.mp4.Con Kaitai IDE se pueden visualizar varios formatos binarios a nivel de bytes, e incluso de bits. Si no recuerdo mal, también hay un archivo de definición para ext4.
Al ver este diagrama, me pregunto si hay sistemas de archivos que permitan guardar los metadatos en un dispositivo separado.
Por ejemplo, dejando los datos en un HDD y los metadatos en un SSD conectado. Dicho eso, los metadatos son mucho más fáciles de cachear en memoria, así que no creo que el beneficio alcance para compensar la complejidad adicional.
https://klarasystems.com/articles/openzfs-understanding-zfs-vdev-types/