1. Stockage basé sur Flash
Cela dépend-il du type de disque (disques durs traditionnels par rapport aux disques à semi-conducteurs) ou de toute autre variable dont je n'ai peut-être pas connaissance? Cela se produit-il (s'il se produit) uniquement sous Linux ou est-ce présent dans d'autres systèmes d'exploitation?
Lorsque vous avez le choix, vous ne devez pas permettre à un stockage flash de perdre de l'énergie sans un arrêt complet.
Sur un stockage peu coûteux, comme les cartes SD, vous pouvez vous attendre à perdre des blocs d'effacement entiers (plusieurs fois plus grand que 4 Ko), ainsi que des données pouvant appartenir à des fichiers différents ou à des structures essentielles du système de fichiers.
Certains SSD coûteux peuvent prétendre offrir de meilleures garanties en cas de panne de courant. Cependant, des tests effectués par des tiers suggèrent que de nombreux disques SSD coûteux ne le font pas. La couche qui remappe les blocs pour "l'usure de nivellement" est complexe et propriétaire. Les échecs possibles incluent la perte de toutes les données sur le lecteur.
En appliquant notre cadre de test, nous testons 17 disques SSD de six fournisseurs différents en utilisant plus de trois mille cycles d’injection de pannes au total. Nos résultats expérimentaux révèlent que 14 des 17 périphériques SSD testés présentent des comportements de défaillance surprenants, y compris la corruption de bits, les écritures abrégées, les écritures non sérialisables, la corruption de métadonnées et la défaillance totale du périphérique.
2017: https://dl.acm.org/citation.cfm?id=2992782&preflayout=flat
2013: https://www.usenix.org/system/files/conference/fast13/fast13-final80.pdf?wptouch_preview_theme=enabled
2. Lecteurs de disque dur en rotation
Les disques durs rotatifs ont des caractéristiques différentes. Pour des raisons de sécurité et de simplicité, je recommande de supposer qu’ils ont la même incertitude pratique que le stockage flash.
Sauf si vous avez des preuves spécifiques, ce que vous n'avez manifestement pas. Je n'ai pas de chiffres comparatifs pour les disques durs.
Un disque dur peut laisser un secteur incomplètement écrit avec une mauvaise somme de contrôle, ce qui nous donnera un échec de lecture intéressant ultérieurement. De manière générale, ce mode de défaillance des disques durs est tout à fait attendu; Les systèmes de fichiers Linux natifs sont conçus dans cet esprit. Ils ont pour objectif de préserver le contrat de fsync()
face à ce type de panne d'alimentation. (Nous aimerions vraiment que cela soit garanti sur les SSD).
Cependant, je ne suis pas sûr que les systèmes de fichiers Linux y parviennent dans tous les cas, ni même si cela est possible.
Le prochain démarrage après ce type d'erreur peut nécessiter une réparation du système de fichiers. Ceci étant Linux, il est possible que la réparation du système de fichiers pose des questions que vous ne comprenez pas, où vous pouvez seulement appuyer sur Y et espérer qu’elles se régleront toutes seules.
2.1 Si vous ne connaissez pas le contrat fsync ()
Le contrat fsync () est une source de bonnes et de mauvaises nouvelles. Vous devez d'abord comprendre la bonne nouvelle.
Bonne nouvelle: il fsync()
est bien documenté que la manière correcte d'écrire des données de fichier, par exemple lorsque vous cliquez sur "enregistrer". Et il est généralement admis que, par exemple, les éditeurs de texte doivent remplacer les fichiers existants de manière atomique rename()
. Cela a pour but de vous assurer que vous conservez toujours l'ancien fichier ou récupérez le nouveau fichier (qui était fsync()
édité avant le changement de nom). Vous ne voulez pas vous retrouver avec une version à moitié écrite du nouveau fichier.
Mauvaise nouvelle: pendant de nombreuses années, appeler fsync () sur le système de fichiers Linux le plus répandu risquait de mettre tout le système en attente pendant des dizaines de secondes. Étant donné que les applications ne peuvent rien y faire, il était très courant d’utiliser de manière optimiste rename () sans fsync (), qui semblait relativement fiable sur ce système de fichiers.
Par conséquent, il existe des applications qui n'utilisent pas fsync () correctement.
La prochaine version de ce système de fichiers évitait généralement le blocage de fsync () - au moment même où il commençait à compter sur l'utilisation correcte de fsync ().
C'est vraiment pas terrible. La compréhension de cette histoire n’est probablement pas aidée par le ton dédaigneux et l’invective qui ont été utilisés par de nombreux développeurs du noyau en conflit.
La résolution actuelle est que le système de fichiers Linux le plus populaire prend en charge par défaut le modèle rename () sans nécessiter fsync ()implémente la "compatibilité bug-à-bug" avec la version précédente. Cela peut être désactivé avec l'option de montage noauto_da_alloc
.
Ce n'est pas une protection complète. Fondamentalement, il efface l'IO en attente au moment de renommer (), mais n'attend pas que l'IO se termine avant de renommer. C'est bien mieux qu'une fenêtre de danger de 60 secondes par exemple! Voir aussi la réponse à la question Quels systèmes de fichiers ont besoin de fsync () pour la sécurité contre les collisions lors du remplacement d'un fichier existant par rename ()?
Certains systèmes de fichiers moins populaires ne fournissent pas de protection. XFS refuse de le faire. Et UBIFS ne l’a pas implémentée non plus, elle pourrait apparemment être acceptée, mais elle nécessite beaucoup de travail pour la rendre possible. La même page indique qu'UBIFS présente plusieurs autres problèmes "TODO" concernant l'intégrité des données, y compris en cas de coupure de courant. UBIFS est un système de fichiers utilisé directement sur un stockage flash. J'imagine que certaines des difficultés mentionnées par UBIFS concernant le stockage flash pourraient être pertinentes pour les bogues SSD.