Como o btrfs scrub funciona e o que faz?

19

O que exatamente o btrfs scrub faz? De acordo com a página do manual, que não é totalmente clara, ele faz alguma verificação de erro. Que tipo de verificação de erro? Quão confiável é? É capaz de recuperar alguns erros? Como funciona? Funciona em todos os discos btrfs?

Petr
fonte
3
Contexto: o BTRFS armazena somas de verificação, para poder sempre saber se um arquivo (ou metadados) está ok ou se foi corrompido. Quase todos os outros sistemas de arquivos como o ext4 não possuem soma de verificação, portanto, eles não impedem a leitura de um arquivo corrompido por uma unidade defeituosa (que está prestes a morrer e já começou a corromper os dados). Esse é um recurso importante de proteção de dados no BTRFS e isso possibilita a depuração.
basic6

Respostas:

23

Não sei se faz mais alguma coisa, mas sei que, no mínimo btrfs scrub, a limpeza de dados em disco completo. Basicamente, ele lê todos os dados * no disco, recalcula sua soma de verificação e compara a soma de verificação recomputada com a armazenada. Quando as somas de verificação armazenadas e recomputadas não coincidem, o sistema sabe que há corrupção.

Depois que a corrupção é detectada, o comportamento depende da configuração do seu disco. Por exemplo, se você tiver RAID 1 (espelhamento), btrfs scrubpoderá corrigir dados corrompidos, copiando uma versão não corrompida de outro disco. Se todas as cópias de alguns dados estiverem corrompidas (por exemplo, danos em vários discos ou não ter cópias redundantes), não há muito o btrfs scrubque fazer além de avisá-lo.

A razão pela qual isso é importante é que os discos rígidos são apenas 99,999999999999% confiáveis ​​na leitura e gravação de bits. Portanto, a cada poucos terabytes de E / S de dados, é provável que haja um erro. Embora os erros possam ser e sejam detectados (e corrigidos, supondo que uma cópia redundante ainda seja válida) durante o acesso normal ao disco, a limpeza de rotina do disco completo é capaz de encontrar e corrigir erros antes que se acumule o suficiente para que todas as cópias dos mesmos dados sejam corrompidas.

* Estou usando "dados" em vez de "arquivo" para incluir também metadados. O Btrfs armazena arquivos e metadados correspondentes (incluindo somas de verificação) em blocos de dados, todos os quais são somados e verificados por btrfs scrub.

Veja também:

Mark Haferkamp
fonte
Não contei, mas estou disposto a adivinhar que a sua confiabilidade está abaixo de algumas ordens de magnitude. Os HDDs de consumo costumam ter uma taxa de UBE de 10 ^ -14 bits. Em outras palavras, um erro de leitura irrecuperável por 10 ^ 14 bits lidos. O problema é que isso é para um setor completo; você obtém o setor completo ou não obtém absolutamente nada (ou essa é a ideia; erros silenciosos são outra xícara de chá). Portanto, o erro é amplificado pelo tamanho do setor, que nas unidades de formato avançado é de 32.768 bits. Portanto, a taxa de erro real é mais parecida com 10 ^ -10 a 10 ^ -11 erros de leitura.
um CVn
@ MichaelKjörling Acho que os setores não importam aqui .... Tenho registros dos últimos 29 btrfs de dois discos rígidos internos de 1 TB do meu computador. A quantidade de dados variou entre 270 e 300 GiB (para um total de 1,35 * 10 ^ 14 a 1,49 * 10 ^ 14 bits lidos para todos os scrubs combinados). Foram encontrados 3 erros durante essas operações. Supondo que a E / S não-scrub não causou nem apodreça bit fixo, isso representa apenas 2 a 2¼ vezes a taxa de erro esperada de unidades "99,999999999999% confiável". Mesmo com apenas setores de 4096 bits, acho que seu argumento esperaria que minhas unidades tivessem milhares de erros até agora.
Mark Haferkamp
@ MichaelKjörling Até onde eu entendo as folhas de especificações do fabricante (Seagate e WD), são erros de bits e não setores inteiros que morrem. E o número de noves na resposta é otimista: 100-1/10^14tem 16 noves e o post tem apenas 14 (correspondendo a 10 ^ 12).
Luc
@ Luc É bom se a morte do setor for menos comum; setores morrendo significa que a unidade está (talvez) realmente falhando e pode precisar de substituição. Os erros de bits levam à corrupção de dados silenciosa, que pode ser barulhenta o suficiente para restaurar a partir de backups. Nota matemática: O cálculo real é 1-10^n, que é convertido em porcentagem porque os humanos não gostam de decimais à esquerda. Além disso, deixei de mencionar no meu comentário anterior que as unidades estão no RAID 1 (portanto, os mesmos dados 270-300 GiB estão em cada uma delas), o que corrige outro erro aparente de cálculo.
Mark Haferkamp
5

Expandir a excelente resposta de Mark Haferkamp, btrfs scrubler todos os dados em vez de todos os arquivos é uma propriedade crítica e é realmente o que a torna tão útil. Lembre-se, o btrfs tem suporte RAID embutido. Digamos que você tenha um sistema de arquivos btrfs que abrange duas unidades que você configurou para usar o RAID1. Nesse caso, quando você grava em um arquivo, essa gravação é replicada nos dois discos. (Fica mais complicado com um exemplo mais complexo, mas, neste caso simples, é sempre o que acontece.) No entanto, quando você lê esse arquivo, a leitura atinge apenas um disco (porque é um desperdício ler o arquivo duas vezes a menos que a primeira cópia seja inutilizável por algum motivo).

Agora diga que sua segunda unidade btrfs está se degradando e começando a corromper dados no seu sistema de arquivos. Quando você lê blocos deste disco, o btrfs notará que a soma de verificação não corresponde e restaurará o bloco dentro da banda a partir de uma cópia em bom estado - a cópia na primeira unidade. Ele retornará os dados para o aplicativo que está chamando read()(ou o que for) como se nada tivesse acontecido.

Mas e se o btrfs não decidir ler no segundo disco? Lembre-se, há duas cópias, para que ele possa ler do primeiro ou do segundo disco. Se ler do primeiro disco, não notará nada de errado. A única vez que notará que algo está errado é quando o primeiro disco também é degradado. Agora você está realmente pronto, já que é tarde demais para recuperar os dados - a cópia do segundo disco foi corrompida por um tempo e a primeira cópia (que é o que você usaria para restaurar o segundo disco) também está corrompida!

É aqui que btrfs scrubentra. Ele lê todos os dados , nem todos os arquivos. Isso inclui metadados, mas também cópias secundárias de arquivos que normalmente não estariam no caminho de leitura. Quando ele lê essas cópias secundárias, isso cria uma oportunidade para a correção de erros em banda do btrfs ativar e restaurar os dados de uma cópia redundante.

strugee
fonte
2
Tem certeza de que na leitura RAID1 é feita apenas em 1 disco? Pelo menos com o mdadm RAID, este não deve ser o caso. A leitura deve ocorrer em paralelo nos dois discos, mas com dados diferentes, o que significa que deve ser duas vezes mais rápido que a leitura de um disco. O aumento de desempenho de leitura é um dos principais recursos do RAID 1. #
1578 Petr Petr
@ Pet sim, você está correto. blocos individuais são lidos apenas de um disco.
strugee
@Etr: Para elaborar, - em uso normal, nem o MDADM nem o BTRFS leem as duas cópias dos mesmos dados dos dois discos. Eles lêem apenas uma cópia. - O MDADM é capaz de balancear a carga e distribuir a leitura pelas cópias para obter o dobro da velocidade de leitura. (porque todas as cópias A vão para o disco 1 e todas as cópias B vão para o disco 2. Como o mdadm usará exatamente 2 discos). - O BTRFS tem mais dificuldades. (porque as cópias A e B vão para os 2 discos (de 2 ou mais discos) com mais espaço livre no momento - ou seja: as 2 cópias serão distribuídas aleatoriamente entre todos os discos atuais)
DrYak
e com relação à segurança: - o MDADM e o BTRFS tentam a outra cópia em caso de problema. - para o MDADM, o único problema que ele pode detectar é "o disco não responde" (porque não tem idéia dos arquivos armazenados acima) - para o BTRFS, além disso, ele pode detectar corrupção de dados silenciosa (porque os dados estão com soma de verificação e, portanto, camada RAID Btrfs' sabe se uma cópia pode ser confiável ou se ele deve buscar outra cópia)
DrYak
Por último, mas não menos importante, com relação ao RAID5 / 6: - no MDADM, ele simplesmente funciona . (Mas não detectará corrupções silenciosas) - no momento, a corrupção silenciosa do BTRFS não é tratada (porque é mais fácil buscar outra cópia (no RAID1) em vez de fazer o cálculo da Erasure Coding para adivinhar qual membro da faixa está corrompido e deve ser reconstruído a partir dos dados / paridade restantes). Em outras palavras: a partir de hoje (agosto de 2017) não use o RAID5 / 6 da btrfs.
DrYak