Btrfs RAID1: Como substituir uma unidade de disco que não está mais lá fisicamente?

3

Eu tenho um sistema RAID1 btrfs com o seguinte estado:

# btrfs filesystem show
Label: none  uuid: 975bdbb3-9a9c-4a72-ad67-6cda545fda5e
        Total devices 2 FS bytes used 1.65TiB
        devid    1 size 1.82TiB used 1.77TiB path /dev/sde1
        *** Some devices missing

O dispositivo em falta é uma unidade de disco que falhou completamente e que o SO não conseguiu mais reconhecer. Eu removi o disco defeituoso e enviei para reciclagem.

Agora tenho um novo disco instalado em / dev / sdd. Pesquisando na web, eu não consigo encontrar instruções para tal cenário (má escolha de termos de pesquisa?). Existem muitos exemplos de como salvar um sistema RAID quando o disco defeituoso ainda permanece acessível pelo sistema operacional. O comando btrfs replace requer um disco de origem.

Eu tentei o seguinte:

# btrfs replace start 2 /dev/sdd /mnt/brtfs-raid1-b
# btrfs replace status /mnt/brtfs-raid1-b
Never started

Nenhuma mensagem de erro, mas o status indica que nunca foi iniciado. Não consigo descobrir qual é o problema da minha tentativa.

Estou executando o Ubuntu 16.04 LTS Xenial Xerus, kernel Linux 4.4.0-57-genérico.

Atualização # 1

Ok, ao executar o comando em "modo não plano de fundo (-B)", vejo um erro que não apareceu antes:

# btrfs replace start -B 2 /dev/sdd /mnt/brtfs-raid1-b                                                                                                                     
ERROR: ioctl(DEV_REPLACE_START) failed on "/mnt/brtfs-raid1-b": Read-only file system

/mnt/brtfs-raid1-b está montado RO (somente leitura). Eu não tenho escolha; Btrfs não me permite montar o disco restante como RW (Read Write). Quando tento montar o disco RW, recebo o seguinte erro no syslog:

BTRFS: missing devices(1) exceeds the limit(0), writeable mount is not allowed

Quando no modo RO, parece que não consigo fazer nada; não pode substituir nem adicionar nem excluir um disco. Mas não há como montar o disco como RW. Que opção resta?

Não deve ser complicado quando um disco simples falha. O sistema deve continuar executando o RW e avisar sobre uma falha na unidade. Eu deveria ser capaz de inserir um novo disco e ter os dados recopiados sobre ele, enquanto os aplicativos permanecem inconscientes do problema de disco. Esse é um RAID adequado. Emendas que o Brtfs não está pronto para produção, mesmo para o RAID1.

    
por Hans Deragon 02.01.2017 / 06:25

3 respostas

3

Acontece que esta é uma limitação do btrfs a partir do início de 2017. Para obter o sistema de arquivos montado rw novamente, é necessário corrigir o kernel. Eu não tentei embora. Estou planejando me afastar do btrfs por causa disso; não se deve ter que corrigir um kernel para poder substituir um disco defeituoso.

Clique nos links a seguir para detalhes:

por 18.02.2017 / 15:44
3

Adicione a nova unidade ao sistema de arquivos com btrfs device add /dev/sdd /mountpoint , em seguida, remova a unidade ausente com btrfs dev del missing /mountpoint . A remontagem do sistema de arquivos pode ser necessária antes que btrfs dev del missing funcione.

    
por 02.01.2017 / 06:30
0

btrfs replace é realmente a coisa a ser tentada, mas há duas dicas sobre sua invocação: ela só mostrará erros quando você usar -B (caso contrário, ela sairá com o status 0, como se tudo estivesse bem, mas você verá "nunca iniciado" ao verificar o status) e os parâmetros inválidos gerarão erros não relacionados.

Por exemplo, acho que meu disco está bom, mas o RAID1 ficou fora de sincronia de alguma forma (provavelmente uma queda de energia durante a qual o host sobreviveu, mas os discos não estão com energia de backup e podem estar on-line em momentos ligeiramente diferentes). Para verificar, quando eu desligar o disco B (enquanto montado), eu posso ler os dados muito bem. Quando eu desativo o disco A (o disco B está ligado e o sistema de arquivos já está montado), então recebo erros e dados corrompidos. Então, claramente, o disco A está bom e o disco B está corrompido. Mas o disco B parece funcionar, então eu quero reutilizá-lo e apenas reconstruí-lo. Portanto, eu quero substituir /dev/diskB por /dev/diskB .

Quando usei btrfs replace start -B /dev/diskB /dev/diskB /mnt/btrfs , ele me mostrou ERROR: ioctl(DEV_REPLACE_START) failed on "/mnt/btrfs": Invalid argument, <illegal result value> . Então, há um problema com o ponto de montagem, certo? Não, quando eu mudei o primeiro /dev/diskB para /dev/diskA , ele simplesmente funcionou. O erro foi nos dispositivos, não no ponto de montagem.

Da mesma forma, vejo que o primeiro argumento ( 2 ) é meio estranho. Talvez o erro esteja errado e funcione com um dispositivo no lugar do 2 ?

btrfs replace tem dois modos de operação: um em que você usa o dispositivo quebrado como primeiro argumento (depois de start -B ou qualquer outro) e um modo (se a primeira opção estiver indisponível) onde você usa o dispositivo de trabalho copiado de. Em ambos os casos, o segundo argumento é o disco que você deseja usar para reconstruir com.

Se o sistema de arquivos é montado como somente leitura ou como leitura-gravação, não parece importar. É por isso que suspeito que está rejeitando seus argumentos e dando a você um erro errado, em vez de o erro estar correto.

    
por 08.04.2018 / 20:08