Como substituir um dispositivo no sistema de arquivos BTRFS RAID-1?

6

Eu tenho um sistema de arquivos BTRFS RAID-1 com 2 pernas. Um disco precisa ser substituído devido a erros de leitura que ocorram novamente.

Assim, o plano é:

  1. adicione uma terceira perna - > O resultado deve ser: espelho de 3 vias
  2. remova o disco com defeito - > O resultado deve ser: espelho de 2 vias

Assim, fiz os seguintes passos:

btrfs dev add /dev/new_device /mnt/foo
btrfs balance /mnt/foo

Suponho que o btrfs faz a coisa certa, ou seja, crie um espelho de três vias.

A alternativa seria usar um filtro de equilíbrio, eu acho. Mas como o sistema de arquivos já é um RAID-1, isso não deveria ser necessário?

Estou um pouco preocupado porque um btrfs fi show imprime isso:

Antes do início do saldo:

    Total devices 3 FS bytes used 2.15TiB
    devid    1 size 2.73TiB used 2.16TiB path /dev/left
    devid    2 size 2.73TiB used 2.16TiB path /dev/right
    devid    3 size 2.73TiB used 0.00B path /dev/new_device

Durante o balanceamento:

    Total devices 3 FS bytes used 2.15TiB
    devid    1 size 2.73TiB used 1.93TiB path /dev/left
    devid    2 size 2.73TiB used 1.93TiB path /dev/right
    devid    3 size 2.73TiB used 458.03GiB path /dev/new_device

Quero dizer, parece que o btrfs equilibra metade do grupo RAID-1 existente em um único disco ... certo?

Assim, minha pergunta, preciso especificar um filtro de saldo para obter um espelho de três direções?

PS: O btrfs ainda suporta espelhos n-way? Uma observação no wiki do btrfs diz que isso não acontece - mas talvez esteja desatualizado? Oh garoto, cks tem um artigo bem recente sobre o limite de 2-way .

    
por maxschlepzig 04.09.2015 / 18:54

1 resposta

6

Atualmente, o btrfs não suporta sem retrovisores .

O Btrfs tem um subcomando de substituição especial:

btrfs replace start /dev/left /dev/new_device /mnt/foo

Lendo nas entrelinhas da página btrfs-replace man, esse comando deve poder usar as duas pernas existentes - por exemplo, para situações em que ambas as pernas tenham erros de leitura, mas ambos os conjuntos de erros são separados.

O comando btrfs replace é executado em segundo plano. Você pode verificar seu status por meio do subcomando status , por exemplo:

btrfs replace status /mnt/foo
45.4% done, 0 write errs, 0 uncorr. read errs

Como alternativa, também é possível adicionar um dispositivo ao arquivo de arquivos raid-1 e, em seguida, excluir uma perna existente:

btrfs dev add /dev/mapper/new_device /mnt/foo
btrfs dev delete /dev/mapper/right  /mnt/foo

O add deve retornar rapidamente, pois ele adiciona o dispositivo (emita btrfs fi show para confirmar).

O seguinte delete deve acionar um balanceamento entre os dispositivos restantes, de modo que cada extensão esteja disponível em cada dispositivo restante. Assim, o comando é potencialmente muito longo em execução. Esse método também funciona para lidar com a situação descrita na pergunta.

Em comparação com btrfs replace , o ciclo de adicionar / excluir envia spam ao syslog com mensagens de informação de baixo nível. Além disso, demora muito mais para terminar (por exemplo, 2-3 vezes mais, no meu sistema de teste com drives SATA de 3 TB, uso de 80% FS).

Por fim, após a substituição real, se os dispositivos mais novos forem maiores do que os dispositivos originais, você precisará emitir um btrfs fi resize em cada dispositivo para utilizar todo o espaço em disco disponível. Para o exemplo replace no topo, parece algo como:

btrfs fi resize <devid>:max /mnt/foo

em que devid representa o ID do dispositivo que btrfs fi show retorna.

    
por 04.09.2015 / 19:25

Tags