{"id":450,"date":"2009-03-30T10:43:29","date_gmt":"2009-03-30T08:43:29","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=450"},"modified":"2009-03-30T10:43:29","modified_gmt":"2009-03-30T08:43:29","slug":"risque-de-perte-de-donnees-avec-ext4","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2009\/03\/risque-de-perte-de-donnees-avec-ext4\/","title":{"rendered":"Risque de perte de donn\u00e9es avec ext4?"},"content":{"rendered":"<p>D&rsquo;ici quelques semaines, Ubuntu 9.04 sortira avec le support du tout nouveau syst\u00e8me de fichier <em>ext4<\/em>. il ne sera pas utilis\u00e9 par d\u00e9faut mais vous pourrez le choisir lorsque vous formatterez vos partitions.<br \/>\nCe nouveau file system a entre autres comme avantage de pouvoir travailler avec des volumes d&rsquo;1 exaoctet c&rsquo;est \u00e0 dire 10<sup>18<\/sup> octets et des fichiers juqu&rsquo;\u00e0 16 teraoctets (10<sup>12<\/sup>), de minimiser la fragmentation et de permettre d&rsquo;avoir plus de 32000 r\u00e9pertoires dans un r\u00e9pertoire. Il y a bien d&rsquo;autres caract\u00e9ristiques mais le but de cet article n&rsquo;est pas de les \u00e9num\u00e9rer. Celle qui justifie cet article et qui semble poser probl\u00e8me est que l&rsquo;allocation est diff\u00e9r\u00e9e. On parle de allocate-on-flush. En bref, cela veut dire que l&rsquo;allocation des blocs de donn\u00e9es se fait au moment o\u00f9 on \u00e9crit sur le disque alors que les autres syst\u00e8mes de fichiers le font bien plus t\u00f4t. Cette mesure permet de minimiser la fragmentation puisque la taille des blocs est d\u00e9termin\u00e9e en fonction de la taille r\u00e9elle du fichier \u00e0 \u00e9crire.<\/p>\n<p>Le probl\u00e8me c&rsquo;est que plusieurs utlisateurs, testant les versions alpha de <em>Jaunty<\/em>, ont rapport\u00e9 des probl\u00e8mes de perte de donn\u00e9es, des fichiers de configuration dont la taille se retrouvait \u00e0 z\u00e9ro apr\u00e8s un plantage de leur PC. Les programmes dont les fichiers de configuration on \u00e9t\u00e9 tronqu\u00e9s \u00e9taient utilis\u00e9s lors du plantage.<\/p>\n<p>Avant d&rsquo;\u00e9crire sur le disque, les donn\u00e9es sont dans une cache en m\u00e9moire. Si vous ouvrez un fichier avec le mode truncate et si un plantage intervient entre le moment o\u00f9 le fichier est ouvert et le moment o\u00f9 les donn\u00e9es sont r\u00e9ellement \u00e9crites sur le disque, vous perdez les donn\u00e9es qui se trouvaient pr\u00e9c\u00e9demment dans le fichier ainsi que les nouvelles donn\u00e9es.<\/p>\n<p>C&rsquo;est un probl\u00e8me connu et expliqu\u00e9 comme en atteste le <a href=\"https:\/\/bugs.launchpad.net\/ubuntu\/jaunty\/+source\/linux\/+bug\/317781\/comments\/45\">commentaire<\/a> fait par Th\u00e9odore Ts&rsquo;o (d\u00e9veloppeur noyau) pour un rapport de bug.<br \/>\nLa cause en est bien souvent des programmes pauvrement \u00e9crits. Il ne faut pas ouvrir un fichier en mode <em>truncate<\/em> puis \u00e9crire les donn\u00e9es dedans mais cr\u00e9er un fichier temporaire, \u00e9crire les donn\u00e9es dans ce fichier et finalement le renommer. Cette derni\u00e8re op\u00e9ration est atomique c&rsquo;est \u00e0 dire qu&rsquo;il ne peut rien arriver pendant l&rsquo;op\u00e9ration, un lien vers le fichier pointe sur l&rsquo;ancien ou le nouveau mais il n&rsquo;y a pas d&rsquo;\u00e9tat entre les deux. Donc si votre PC plante, sur le disque vous aurez soit l&rsquo;ancien fichier, soit le nouveau mais en aucun cas un fichier vide.<br \/>\nAvec <em>ext3<\/em>, les donn\u00e9es \u00e9taient \u00e9crites (flush) sur le disque dans un d\u00e9lai de 5 secondes. Avec <em>ext4<\/em>, ce d\u00e9lai est ind\u00e9termin\u00e9. Si vous voulez \u00eatre s\u00fbr que vos donn\u00e9es sont bien \u00e9crites sur le disques il va falloir ins\u00e9rer un <em>fsync()<\/em> qui va forcer l&rsquo;\u00e9criture sur le disque. La bonne fa\u00e7on de proc\u00e9der devient donc:<\/p>\n<pre class=\"codesource\">\r\nopen()    \/\/ ouvre un fichier temporaire\r\nwrite()   \/\/ \u00e9criture dans le fichier temporaire\r\nfsync()   \/\/ flush des donn\u00e9es encore en attente\r\nclose()   \/\/ on ferme le fichier\r\nrename()  \/\/ et on renomme le fichier\r\n<\/pre>\n<p>D&rsquo;apr\u00e8s Theodore Ts&rsquo;o:<\/p>\n<blockquote><p>\u00ab\u00a0Notez qu&rsquo;un close() ne garantit pas que les donn\u00e9es sont \u00e9crites sur le disque puisque le kernel diff\u00e8re l&rsquo;\u00e9criture sur le disque. Tous les syst\u00e8mes de fichiers ne font pas un flush des buffers lorsque le stream est ferm\u00e9 (closed). Si vous devez \u00eatre s\u00fbr que les donn\u00e9es sont physiquement \u00e9crites sur le disque, utilisez fsync().\u00a0\u00bb<\/p><\/blockquote>\n<p>Si vous comprenez l&rsquo;anglais, je vous sugg\u00e8re les liens suivant provenant du blog de Theodore Ts&rsquo;o:<\/p>\n<ul>\n<li><a href=\"http:\/\/thunk.org\/tytso\/blog\/2009\/03\/12\/delayed-allocation-and-the-zero-length-file-problem\/\">http:\/\/thunk.org\/tytso\/blog\/2009\/03\/12\/delayed-allocation-and-the-zero-length-file-problem\/<\/a><\/li>\n<li><a href=\"http:\/\/thunk.org\/tytso\/blog\/2009\/03\/15\/dont-fear-the-fsync\/\">http:\/\/thunk.org\/tytso\/blog\/2009\/03\/15\/dont-fear-the-fsync\/<\/a><\/li>\n<\/ul>\n<p>En conclusion, si vous voulez utiliser <em>ext4<\/em>, je vous conseille d&rsquo;attendre un peu que les applications vraiment mal \u00e9crite aient \u00e9t\u00e9 corrig\u00e9es et puis, un patch est pr\u00e9vu pour le kernel 2.6.30 (ou d\u00e9j\u00e0 le 2.6.29 ?) qui devrait minimiser les risques de perte de donn\u00e9es.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>D&rsquo;ici quelques semaines, Ubuntu 9.04 sortira avec le support du tout nouveau syst\u00e8me de fichier ext4. il ne sera pas utilis\u00e9 par d\u00e9faut mais vous pourrez le choisir lorsque vous formatterez vos partitions. Ce nouveau file system a entre autres comme avantage de pouvoir travailler avec des volumes d&rsquo;1 exaoctet c&rsquo;est \u00e0 dire 1018 octets [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/450"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=450"}],"version-history":[{"count":9,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/450\/revisions"}],"predecessor-version":[{"id":465,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/450\/revisions\/465"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=450"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=450"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=450"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}