Depois de brincar com o fsck
, encontrei alguns remédios:
Evitando o erro "Falha na alocação de memória"
fsck
parece ter um grande problema com o vazamento de memória. Se ele for executado em um sistema de arquivos com alguns problemas (reais ou imaginários), ele irá "consertá-los" um a um (veja o dump de tela na pergunta original). Ao fazê-lo, consome mais e mais memória (talvez mantendo um log de alterações?). Praticamente sem limites. Mas, fsck
pode ser cancelado a qualquer momento (Ctrl-C) e reiniciado. Nesse caso, ele continuará de onde parou, mas o uso da memória é redefinido para quase nada (por um tempo).
Com isso em mente, as três coisas que precisam ser feitas são:
- Use Linux de 64 bits (parece fazer diferença em como
fsck
pode usar a memória disponível) - Adicione uma partição de swap ridiculamente grande (usei 256 GB,
fsck
é executado por aproximadamente 12 horas com ela) - Freqüentemente abortar e reiniciar o fsck (com que frequência depende do tamanho da partição virtual)
OBSERVAÇÃO: Não tenho idéia se o cancelamento e a reinicialização do fsck
trazem outros perigos (provavelmente), mas parece funcionar para mim.
Lidando com o dano resultante, se ocorrer o erro "Alocação de memória falhada" (IMPORTANTE!)
fsck
lida com o erro Memory allocation failed
da pior maneira possível: Eu destruo dados perfeitamente bons. Eu não tenho certeza do porquê, mas meu palpite é que ele faz algumas gravações finais de dados no disco das coisas que ele guardava na memória, que (devido ao erro) foram corrompidas.
No meu caso, o problema mais visível era que quando eu reiniciava fsck
após o erro, algumas vezes ele reportava um super-bloco corrompido. O problema é: Eu não tenho idéia de como ele corrompeu o super-bloco, especialmente nos casos em que ele não o reportou como corrompido. Talvez, se reiniciado após o erro, ele use metadados de unidade incorretos encontrados no super-bloco corrompido para fazer todas as verificações adicionais e acabar corrigindo "problemas" que não estão realmente lá, destruindo bons dados no processo. / p>
Portanto, se fsck
ever morrer com o erro Memory allocation failed
, ele precisará ser reiniciado usando o parâmetro -b
para usar um supercluster de backup que (esperançosamente) não foi corrompido pelo erro. A localização dos super-blocos de backup pode ser encontrada usando mke2fs -n /dev/...
.
Como não sei o que acontece se fsck
morre com o supercluster de backup selecionado, normalmente eu apenas aborto fsdk
imediatamente quando chega em Pass 1: Checking inodes, blocks, and sizes
e reinicio novamente sem -b
, no qual ponto começa sem reclamar sobre um super-bloco ruim. Ou seja parece que a primeira coisa que o fsck -b
faz é restaurar o superbloco principal.
Agora o que todos esperavam:
Como montar um sistema de arquivos sem permitir que o fsck seja executado até a conclusão
Isto, eu encontrei por acidente: Acontece que depois de executar fsck -b
e abortar assim que ele imprime o Pass 1: Checking inodes, blocks, and sizes
(antes de quaisquer erros serem encontrados) o sistema de arquivos é deixado em um estado montável (Yay Eu obtive praticamente todos os meus dados de volta!).
(Nota: pode haver outra maneira de usar mount -o force
, mas não foi necessário no meu caso.)
Como evitar todos esses problemas em primeiro lugar
Parece haver duas maneiras:
- Use o ext3, mas mantenha um backup perfeitamente atualizado. Em seguida, execute frequentemente
fsck
com o parâmetro-N
. Se ele mostra qualquer problemas, exclua todo o fs e restaure tudo do backup. Uma vez que, neste cenário, alguém estaria confiando muito no backup, sugiro manter um backup do backup. Além disso, use uma ferramenta de cópia que de alguma forma garanta que a restauração não crie erros aleatórios no processo (um MTBF de um trilhão de r / w-ops é pequeno quando se lida com TB de dados). Certifique-se de planejar o tempo de inatividade resultante também, já que uma restauração multi-TB provavelmente leva um tempo ... -
Minha recomendação: NÃO use o ext3! O design do fs e as ferramentas associadas (aqui
fsck
) não são robustos o suficiente para uso real na produção (ainda?). A maneira comofsck
lida com o erro de memória e o fato de que o erro ocorre em primeiro lugar não é aceitável em minha mente. Eu vou tentar o xfs a partir de agora, mas ainda não tenho experiência suficiente para dizer se está melhor.