Esta pagina se ve mejor con JavaScript habilitado

Journaling

 ·  🎃 kr0m

El SO por temas de eficiencia guarda durante un tiempo todos los cambios realizados sobre el sistema de ficheros en RAM, cuando ha almacenado unos cuantos cambios se vuelcan a disco, esto se hace de este modo porque las escriutras prolongadas son mas eficientes que las puntuales y para permitir al SO organizar de forma eficiente donde escribir los datos. El journaling de un sistema de ficheros es un area del disco, un fichero o incluso puede ser un disco separado donde se anotan todas las operaciones a realizar, por ejemplo mover ficheros, eliminarlos, crearlos…, estas anotaciones se hacen de forma inmediata.


Hay dos tipos de journal:

Físicos:

Se escriben todos los cambios de la metainformación y datos en este disco antes de volcarlos al disco final, suele tratarse de una unidad mas pequeña y rápida que el disco final.

Suponiendo que tenemos un fichero y vamos a guardar datos haciendo que este crezca:

  • El SO guarda los datos nuevos en RAM
  • Vuelca al journal físico los cambios de tamaño en el inodo  y los datos
  • Cuando al SO le parece oportuno vuelca los datos de la RAM al disco final

Si surge algún problema mientras se escribe en el disco de journal la información parcial tendrá un CRC incorrecto, se descartará y se perderán los cambios, pero el sistema de ficheros seguirá en un estado consistente, si la información está en el journal pero no en el disco final se reconstruye desde el journal.


Lógicos:

Suele ser la parte mas rápida del disco, existen varios modos de operar, los permitidos por Ext4 son:

Writeback Mode:

data=writeback: Solo se realiza journal de la metainformación NO de los datos, se trata del sistema de journaling mas rápido.

Primero escribiría la metainformación en el journal, luego en la tabla de inodos del sistema de ficheros y finalmente volcaría los datos al disco, si la escritura se interrumpe mientras se actualiza la tabla de inodos en el arranque se leerá el journal y se verá que debería de haber una entrada en la tabla que no existe, se generará y se escribirá un fichero de ese tamaño con basura para que el sistema de ficheros siga consistente. Por otro lado si se interrumpe la operación mientras se están volcando los datos al disco tendremos en el journal que el fichero ocupa X(lo que ocuparía se se hubiese terminado de escribir) y en el sistema de ficheros tenemos un tamaño de Y, los datos a medio escribir en el fichero, en el reinicio se detectaría que X != Y por lo tanto se ha corrompido el fichero, se rellena con basura hasta ocupar X perdiendo así el fichero :(, pero el sistema de ficheros estará en un estado consistente ya que todos los ficheros empiezan y terminan donde indica la tabla de inodos.

Ordered Mode:

data=ordered: Solo se realiza journal de los metadatos pero se escribe a disco mediante transacciones, este sistema es un poco mas lento que writeback.

Se relacionan los metadatos con los datos de tal modo que se forman “auto-mágicamente” transacciones atómicas, estas transacciones se escriben a disco y luego se escribe la metainformación en el journal, si ocurre algún problema mientras se vuelcan las transacciones al disco se pierden los datos del fichero, pero el sistema de ficheros siempre estará en un estado consistente ya que no pueden haber datos por un lado y metadatos por otro ya que los dos forman una unidad atómica e indivisible.

NOTA: No logro entender porque se escribe en el journal una vez escritos los datos y metadatos en el disco, agradecería que alguien me aclarase este punto por e-mail: kr0m@alfaexploit.com

Journal Mode:

data=journal: Se escribe tanto los datos como los metadatos en el journal y finalmente al disco

Esto supone una penalización considerable en el rendimiento del sistema de I/O pero obtenemos una mayor fiabilidad, el funcionamiento es idéntico al de un journal físico, solo se pierde la info del fichero en caso de no terminar la escritura en el journal.


Algunas referencias que pueden resultar de interés:
http://www.ibm.com/developerworks/library/l-journaling-filesystems/
https://www.kernel.org/doc/Documentation/filesystems/ext4.txt
http://www.ibm.com/developerworks/library/l-anatomy-ext4/
https://ext4.wiki.kernel.org/index.php/Main_Page?
http://en.wikipedia.org/wiki/Journaling_file_system

Si te ha gustado el artículo puedes invitarme a un RedBull aquí