Diminuir o tempo para reduzir o sistema de arquivos ext4

Diminuir o tempo para reduzir o sistema de arquivos ext4

Preciso reduzir um grande volume ext4 e gostaria de fazer isso com o mínimo de tempo de inatividade possível. Com os testes que fiz até agora, parece que ele pode ser desmontado para redimensionamento por até uma semana. Existe alguma maneira de desfragmentar o sistema de arquivos on-line com antecedência, para que os resizefs não precisem mover tantos blocos?

Atualizar: Demorou algum tempo para chegar a este ponto, movi alguns TB de dados em preparação para a redução e tenho feito experiências usando as informações da resposta abaixo. Finalmente criei a seguinte linha de comando que poderia ser útil para outras pessoas em uma situação semelhante, com apenas pequenas modificações. Observe também que ele deve ser executado como root para que os comandos filefrag e e4defrag funcionem corretamente - isso não afetará a propriedade do arquivo. Ele também funciona corretamente em arquivos com vários links físicos, dos quais tenho muitos.

find -type f -print0 | xargs -0 filefrag -v | grep '\.\.[34][0-9]\{9\}.*eof' -A 1 | awk '/extents found/ {match($0, /^(.*): [0-9]+ extents found/, res); print res[1]}' | xargs -n 1 -d '\n' e4defrag

Uma explicação rápida para facilitar a modificação/uso de outras pessoas:

O primeiro comando 'find' cria a lista de arquivos com os quais trabalhar. Possivelmente redundante agora ou poderia ser feito de uma maneira melhor, mas durante o teste eu tinha outros filtros lá e deixei-os como um local útil para modificar o escopo do restante do comando.

Em seguida, passe cada arquivo por 'filefrag -v' para obter uma lista de todos os blocos físicos usados ​​por cada arquivo.

O grep procura o último bloco usado por cada arquivo (linha terminando em 'eof') e onde esse bloco é um número de 10 dígitos começando com 3 ou 4. No meu caso, meu novo tamanho do sistema de arquivos terá 2980024320 blocos de comprimento, para que faz um bom trabalho trabalhando apenas em arquivos que estão na área do disco a ser removida. Fazer com que grep também inclua a linha a seguir (o '-A 1') também inclui o nome do arquivo na saída da próxima seção. É aqui que qualquer outra pessoa que fizer isso terá que modificar o comando dependendo do tamanho do seu sistema de arquivos. Provavelmente também poderia ser feito de uma maneira muito melhor, mas agora está funcionando para mim e sou preguiçoso.

O awk extrai apenas os nomes dos arquivos de todo o lixo que o grep deixou na saída do filefrag.

E finalmente e4defrag é chamado - não me importo com a contagem real de fragmentos, mas tem o efeito colateral de mover os blocos físicos (espero que para uma parte inicial da unidade) e funciona em arquivos com vários links físicos sem nenhum esforço extra.

Se você quiser apenas saber quais arquivos serão desfragmentados sem realmente mover nenhum dado, deixe a última parte do comando desativada.

find -type f -print0 | xargs -0 filefrag -v | grep '\.\.[34][0-9]\{9\}.*eof' -A 1 | awk '/extents found/ {match($0, /^(.*): [0-9]+ extents found/, res); print res[1]}'

Responder1

Pelo que posso dizer,ext4fs suporta desfragmentação online(está listado em "concluído", mas o campo de status está vazio;o patch originalé do final de 2006) atée4defrag em e2fsprogs 1.42 ou mais recente que quando executado em Linux 2.6.28 ou mais recentepermite consultar o status de diretórios ou possivelmente sistemas de arquivos e, pelo menos, desfragmentar arquivos individuais.e2fsprogsa partir de hoje está na versão 1.42.8.

Não tenho certeza se isso ajuda você ou não, pois o que você quer fazer não parece ser muitodesfragmentaros dados comoconsolidaros dados no disco. Os dois geralmente são feitos juntos, mas são operações distintamente diferentes.

Uma maneira simples de consolidar os dados, quepoderO trabalho, supondo que você tenha uma quantidade razoável de espaço livre, é copiar cada arquivo para alguma outra lógica lógica no mesmo sistema de arquivos e, em seguida, usar mv para substituir os dados apontados pelo inode pela nova cópia. Dependeria muito de como exatamente o alocador ext4 funciona em detalhes, mas pode valer a pena tentar e deve ser bastante fácil de criar scripts. Apenas tome cuidado com os arquivos com links físicos de mais de um lugar (com um esquema como esse, pode ser mais fácil simplesmente ignorar quaisquer arquivos com contagem de links> 1 e deixar o resizefs lidar com eles).

informação relacionada