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