Comment fonctionne btrfs scrub et que fait-il?

19

Que fait exactement btrfs scrub? Selon la page de manuel, qui n'est absolument pas claire, il vérifie les erreurs. Quel genre de vérification d'erreur? Est-il fiable? Est-il capable de récupérer des erreurs? Comment ça marche? Cela fonctionne-t-il sur chaque disque btrfs?

Petr
la source
3
Contexte: BTRFS stocke des sommes de contrôle, il est donc toujours capable de dire si un fichier (ou des métadonnées) est correct ou s'il a été corrompu. Presque tous les autres systèmes de fichiers comme ext4 n'ont pas de somme de contrôle, ils ne vous empêcheront donc pas de lire un fichier qui a été corrompu par un mauvais lecteur (qui est sur le point de mourir et a déjà commencé à corrompre des données). Il s'agit d'une fonctionnalité de protection des données importante dans BTRFS, ce qui rend le nettoyage possible.
basic6

Réponses:

23

Je ne sais pas si cela fait autre chose, mais je sais qu'au moins btrfs scruble nettoyage des données sur le disque complet est effectué. Fondamentalement, il lit toutes les données * sur le disque, recalcule sa somme de contrôle et compare la somme de contrôle recalculée à celle stockée. Lorsque les sommes de contrôle stockées et recalculées ne correspondent pas, le système sait qu'il y a corruption.

Une fois la corruption détectée, le comportement dépend de la configuration de votre disque. Par exemple, si vous avez RAID 1 (mise en miroir), vous btrfs scrubpouvez corriger les données corrompues en copiant une version non corrompue à partir d'un autre disque. Si toutes les copies de certaines données sont corrompues (par exemple, des dommages sur plusieurs disques ou ne pas avoir de copies redondantes en premier lieu), il n'y a pas grand btrfs scrub-chose d'autre à faire que de vous avertir.

La raison pour laquelle cela est important est que les disques durs ne sont fiables qu'à 99,99999999999999% en lecture et en écriture. Ainsi, sur quelques téraoctets d'E / S de données, il y a probablement une erreur. Bien que des erreurs puissent être et soient détectées (et corrigées, en supposant qu'une copie redondante est toujours valide) pendant l'accès normal au disque, le nettoyage complet du disque de routine est capable de trouver et de corriger les erreurs avant de s'accumuler suffisamment pour que toutes les copies des mêmes données soient corrompues.

* J'utilise "données" au lieu de "fichier" pour inclure également les métadonnées. Btrfs stocke les fichiers et les métadonnées correspondantes (y compris les sommes de contrôle) dans des blocs de données, qui sont tous vérifiés et vérifiés par btrfs scrub.

Voir également:

  • Btrfs -> Arbre de contrôle et nettoyage sur Wikipedia: informations techniques sur le nettoyage des données de btrfs.
  • Problème d'anniversaire -> Tableau de probabilité sur Wikipédia: Traiter "l'espace de hachage" comme "le nombre de blocs de données" et le "nombre d'éléments hachés" comme "le nombre de blocs de données corrompus", cela donne la probabilité qu'il y ait un bloc de données avec les deux copies corrompu dans une configuration RAID 1.
Mark Haferkamp
la source
Je n'ai pas compté, mais je suis prêt à deviner que votre chiffre de fiabilité est de quelques ordres de grandeur. Les disques durs grand public sont généralement spécifiés à un taux UBE de 10 ^ -14 bits. En d'autres termes, une erreur de lecture irrécupérable par 10 ^ 14 bits lus. Le problème est qu'il s'agit d'un secteur complet; soit vous obtenez le secteur complet, soit vous n'obtenez rien du tout (ou c'est l'idée; les erreurs silencieuses sont une autre tasse de thé entièrement). L'erreur est donc amplifiée par la taille du secteur, qui avec les lecteurs Advanced Format est de 32 768 bits. Par conséquent, le taux d'erreur réel ressemble plus à des erreurs de réécriture de 10 ^ -10 à 10 ^ -11.
un CVn
@ MichaelKjörling Je ne pense pas que les secteurs importent ici .... J'ai des enregistrements des 29 derniers scrub btrfs des deux disques durs internes de 1 To de mon ordinateur. La quantité de données a varié entre 270 et 300 Gio (pour un total de 1,35 * 10 ^ 14 à 1,49 * 10 ^ 14 bits lus pour tous les scrubs combinés). Il y a eu 3 erreurs trouvées lors de ces gommages. En supposant que les E / S sans frottement n'entraînent ni la rotation des bits fixes, cela ne représente que 2 à 2¼ fois le taux d'erreur attendu des lecteurs "99,999999999999% fiables". Même avec seulement des secteurs de 4096 bits, je pense que votre argument s'attendrait à ce que mes lecteurs aient déjà eu des milliers d'erreurs.
Mark Haferkamp
@ MichaelKjörling Pour autant que je comprends les fiches techniques du fabricant (Seagate et WD), ce sont des erreurs de bits et non des secteurs entiers qui meurent. Et le nombre de neuf dans la réponse est même optimiste: 100-1/10^14a 16 neuf et celui de la poste n'en a que 14 (correspondant à 10 ^ 12).
Luc
@Luc C'est bien si la mort du secteur est moins courante; les secteurs mourants signifient que le disque est (peut-être) en fait en panne et pourrait avoir besoin d'être remplacé. Les erreurs de bits conduisent simplement à une corruption silencieuse des données, qui peut être rendue suffisamment bruyante pour restaurer à partir de sauvegardes. Note mathématique: Le calcul réel est 1-10^n, qui est ensuite converti en pourcentage car les humains n'aiment pas les décimales principales. De plus, j'ai négligé de mentionner dans mon commentaire précédent que les disques sont en RAID 1 (d'où les mêmes données de 270 à 300 Gio sur chacun d'eux), ce qui corrige une autre erreur de calcul apparente.
Mark Haferkamp
5

S'étendant sur l'excellente réponse de Mark Haferkamp, ​​la btrfs scrublecture de toutes les données au lieu de tous les fichiers est une propriété critique et est en fait ce qui la rend si utile. N'oubliez pas, btrfs a un support RAID intégré. Supposons que vous ayez un système de fichiers btrfs couvrant deux disques que vous avez configuré pour utiliser RAID1. Dans ce cas, lorsque vous écrivez dans un fichier, cette écriture est répliquée sur les deux disques. (Cela devient plus compliqué avec un exemple plus complexe, mais dans ce cas simple, c'est toujours ce qui se passe.) Cependant, lorsque vous lisez à partir de ce fichier, la lecture ne frappe qu'un seul disque (car c'est un gaspillage de lire le fichier deux fois sauf si la première copie est inutilisable pour une raison quelconque).

Supposons maintenant que votre deuxième lecteur btrfs se dégrade et commence à corrompre les données de votre système de fichiers. Lorsque vous lisez des blocs à partir de ce disque, btrfs remarquera que la somme de contrôle ne correspond pas et restaurera le bloc intrabande à partir d'une copie connue - la copie sur le premier lecteur. Il retournera les données à l'application appelant read()(ou autre) comme si rien ne s'était passé.

Mais que se passe-t-il si btrfs ne décide pas de lire à partir du deuxième disque? N'oubliez pas qu'il y a deux copies, il peut donc lire à partir du premier ou du deuxième disque. S'il lit à partir du premier disque, il ne remarquera rien de mal. La seule fois où il remarquera que quelque chose ne va pas, c'est quand le premier disque se dégrade également. Maintenant, vous êtes vraiment arrosé car il est trop tard pour récupérer les données - la copie du deuxième disque a été corrompue pendant un certain temps, et la première copie (qui est celle que vous auriez utilisée pour restaurer le deuxième disque) est maintenant corrompue aussi!

C'est là btrfs scrubqu'intervient. Il lit toutes les données , pas tous les fichiers. Cela inclut les métadonnées, mais également des copies secondaires de fichiers qui ne se trouveraient pas normalement dans le chemin de lecture. Lorsqu'il lit ces copies secondaires, cela crée une opportunité pour la correction d'erreurs intrabande de btrfs de lancer et de restaurer les données à partir d'une copie redondante.

strugee
la source
2
Etes-vous sûr qu'en lecture RAID1, la lecture ne se fait qu'à partir d'un seul disque? Au moins avec mdadm RAID, cela ne devrait pas être le cas. La lecture doit avoir lieu en parallèle à partir des deux disques, mais avec des données différentes, ce qui signifie qu'elle doit être deux fois plus rapide que la lecture à partir d'un disque. L'amélioration des performances de lecture est l'une des principales caractéristiques de RAID 1.
Petr
@Petr oui, vous avez raison. les blocs individuels ne sont lus qu'à partir d'un seul disque.
strugee
@Petr: Pour élaborer, - dans des conditions normales d'utilisation, ni MDADM ni BTRFS ne lisent les deux copies des mêmes données des deux disques. Ils n'en ont lu qu'un seul exemplaire. - MDADM est capable d'équilibrer la charge et de distribuer la lecture sur plusieurs copies pour obtenir deux fois la vitesse de lecture. (car toutes les copies A vont sur le disque 1, et toutes les copies B vont sur le disque 2. Comme mdadm utilisera exactement 2 disques). - BTRFS a plus de difficultés. (parce que les copies A et B iront sur les 2 disques (sur 2 disques ou plus ) ayant le plus d'espace libre pour le moment - c'est-à-dire: les 2 copies seront réparties de manière aléatoire sur tous les disques actuels)
DrYak
et concernant la sécurité: - MDADM et BTRFS essaieront l'autre copie en cas de problème. - pour MDADM, le seul problème qu'il peut détecter est "le disque ne répond pas" (car il n'a aucune idée réelle des fichiers stockés ci-dessus) - pour BTRFS, il peut en outre détecter une corruption de données silencieuse (car les données sont résumées, et ainsi la couche RAID du BTRFS sait si une copie peut être approuvée ou si elle doit en récupérer une autre)
DrYak
dernier point mais non le moindre concernant RAID5 / 6: - dans MDADM, cela fonctionne . (Mais ne détectera pas les corruptions silencieuses) - dans BTRFS, la corruption silencieuse pour l'instant n'est pas gérée (car il est plus facile de simplement récupérer une autre copie (en RAID1) plutôt que de faire le calcul du codage d'effacement pour deviner quel membre de la bande est corrompu et doit être reconstruit à partir des données restantes / parité). En d'autres termes: à partir d'aujourd'hui (août 2017) n'utilisez pas le RAID5 / 6 de btrfs.
DrYak