
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 start
comando 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 show
saída e execute
btrfs fi resize DEVID:max /mount/path
isso deve ser quase instantâneo.