Eu tenho um disco falhando em um btrfs RAID1, de modo que as gravações são duvidosas, mas as leituras funcionam principalmente. Como substituí-lo?

Eu tenho um disco falhando em um btrfs RAID1, de modo que as gravações são duvidosas, mas as leituras funcionam principalmente. Como substituí-lo?

Eu tenho um sistema de arquivos btrfs de dois discos, com os dados e metadados em RAID1 (por meio do recurso btrfs, não do mdraid). Os discos são unidades USB3, com dm-crypt na parte superior. Um dos discos está falhando (tem vários milhares de setores defeituosos e a gravação geralmente atinge o tempo limite). Obtive uma terceira unidade USB para substituir a que está com defeito. Como posso substituí-la?

Responder1

Acabou sendo uma PITA real. Primeiro, é importante notar que o btrfs agora tem um comando de substituição adequado, que é muito melhor do que adicionar novo, remover com falha.

Primeiro, comece particionando o novo disco e configurando o dm-crypt nele. Vá em frente e desbloqueie-o.

Se o seu disco não estivesse com tempo limite de gravação (o que aparentemente leva 360 segundos cada!), você poderia fazer um simples:

btrfs replace start -r /dev/mapper/luks-BAD-disk-uuid              \
                       /dev/mapper/luks-NEW-disk-uuid /mount/path

No entanto, isso resultará em gravações rotineiras no disco defeituoso e, se isso causar um tempo limite, você verá cerca de 30 segundos de cópia rápida, seguidos de 6 a 12 minutos de inatividade, aguardando o tempo limite.

Para evitar gravações nele, é possível configurar um snapshot usando o device-mapper. As leituras irão para o dispositivo defeituoso subjacente (o que geralmente é aceitável para leituras); as gravações irão para o armazenamento copy-on-write (COW). Primeiro, você precisa de um dispositivo de bloco adequadamente grande para o armazenamento COW. Criei um novo volume lógico para ele ( Watt-sdj1_dmsnap). Qualquer dispositivo de bloco deve funcionar – até mesmo um dispositivo de loop deve funcionar. Pessoalmente, sugiro um disco persistente, caso algo dê errado, mas se você estiver vivendo perigosamente e tiver RAM suficiente, um disco RAM funcionaria.

O meu exigiria aproximadamente 1,7 GB de espaço COW (para mover 2,24 TiB de uma unidade de 3 TB). Eu recomendo ser generoso com o espaço COW; acabar provavelmente seria uma coisa ruim, e você poderá liberar tudo quando terminar.

Em seguida, você precisa desmontar o sistema de arquivos btrfs, se ele estiver montado, e bloquear (parar) o dispositivo dm-crypt. Estou colocando o instantâneo abaixo da criptografia porque não quero dados não criptografados gravados no disco.

No meu caso, a partição é /dev/sdj1. Primeiro, para evitar erros, defina-o como somente leitura:

blockdev --setro /dev/sdj1
blockdev --setro /dev/sdj

(Mais tarde você pode configurá-lo novamente com --setrw). Agora, configure o snapshot:

dmsetup create sdj_divert --table "0 $(blockdev --getsz /dev/sdj1) snapshot /dev/sdj1 /dev/mapper/Watt-sdj1_dmsnap PO 8"

Para explicar rapidamente o que isso significa, uma tabela mapeadora de dispositivos tem o formato:setor inicial número de setores tipo de destino argumentos-alvo. O setor inicial é 0; o número de setores é igual ao tamanho de sdj1 (afinal, queremos fazer tudo); o tipo de destino é instantâneo. O destino do snapshot recebe vários argumentos:fonte-dev vaca-dev modo tamanho do pedaço. Estamos fornecendo um dispositivo de origem de /dev/sdj1; o dispositivo COW é aquele volume lógico que criei; o modo PO significappersistente (os metadados são gravados no disco, para que possam ser configurados novamente após uma reinicialização) eóverflow (se escrevermos muito no snapshot, a recuperação será possível). O tamanho do pedaço é o quão granular é o instantâneo; se escrevermos pelo menos um byte, todo o pedaço em torno desse byte será copiado (e consumirá espaço no instantâneo). 8 é 4K, então não haverá problemas de alinhamento.

Agora, finalmente, desbloqueie o dispositivo novamente – mas em vez de desbloquear /dev/sdj1, desbloqueie /dev/mapper/sdj_divert. Então vá em frente e monte o sistema de arquivos btrfs novamente.

Você pode verificar o uso do snapshot com dmsetup status sdj_divert; isso deveria dar algo como (mas com um número muito menor antes da barra):

0 5860524928 snapshot 914216/545259520 3568

As três primeiras coisas são o setor inicial, o número de setores e o tipo de destino. O próximo número é o número de setores usados ​​(antes da barra) e depois o número total de setores (após a barra). Então isso é uma fração do espaço usado. O número final é o número de setores utilizados para metadados, que já está incluído no número utilizado.

Agora, finalmente, você pode usar aquele btrfs replace startcomando simples no topo da resposta. Isso retornará imediatamente; observe o status executando btrfs replace status /mount/path.

Quando a substituição for concluída, confirme se o dispositivo defeituoso foi eliminado do sistema de arquivos (por exemplo, btrfs fi show /mount/path) e então você pode bloquear/fechar a unidade com falha e remover o instantâneo ( dmsetup remove sdj_divert). Então você pode liberar espaço COW (depois de limpá-lo, se estiver paranóico).

Há uma etapa final, tecnicamente opcional: meu dispositivo substituto é maior, mas o btrfs ainda não está usando o espaço extra. Para disponibilizá-lo para o btrfs, procure o devid na btrfs fi showsaída e execute

btrfs fi resize DEVID:max /mount/path

isso deve ser quase instantâneo.

informação relacionada