Eu quero remover um diretório que possui grandes quantidades de dados. Esta é minha matriz de backup, que é um sistema de arquivos ZFS , alcance linear e pool único chamado "san". San está montado, /san
então eu quero remover em massa / san / thispc / certosFolder
$ du -h -d 1 certainFolder/
1.2T certainFolder/
Em vez de eu ter que esperar, rm -rf certainFolder/
não posso simplesmente destruir o identificador desse diretório para que ele possa ser substituído (mesmo com o mesmo nome de diretório se eu optar por recriá-lo)?
Portanto, por exemplo, por não saber muito sobre o zfs fs mgmnt internal, especificamente como ele mapeia diretórios, mas se eu encontrasse esse mapa digamos por exemplo e removesse as entradas corretas, por exemplo, o diretório não seria mais exibido e o espaço que o diretório anteriormente ocupava também precisa ser removido de algum tipo de auditoria.
Existe uma maneira fácil de fazer isso, mesmo em um ext3 fs, ou já é isso que o comando de remoção recursiva deve fazer em primeiro lugar, ou seja, vasculhar e editar periódicos?
Eu só espero fazer algo do tipo kill thisDir
para onde ele simplesmente remove algum tipo de ID, e poof o diretório não aparece mais ls -la
e os dados ainda estão lá na unidade, obviamente, mas o espaço agora será reutilizado ( sobrescrito), porque o ZFS é legal?
Quero dizer, acho o zfs realmente muito legal, como podemos fazer isso? Idealmente? esfregando as mãos juntas :-)
Meu caso de uso específico (além do meu amor pelo zfs) é o gerenciamento do meu arquivo de backup. Esse diretório de backup é enviado via freefilesync (AWESOME PROG) na caixa do Windows para um compartilhamento de arquivo smb, mas também possui um diretório de versão para onde os arquivos antigos vão. Estou excluindo diretórios de nível superior que residem no backup principal, que foram copiados para a versão - por exemplo /san/version/someStuff
, como uma limpeza bimensal de rm -rf /san/version/someStuff/*
um terminal de massa, agora tenho que abrir outro terminal; não quero fazer isso toda vez, estou cansado de inutilmente ter que monitorar rm -rf.
Quero dizer, talvez eu deva definir o comando para soltar a alça e depois imprimir em std, isso pode ser bom. Mais realisticamente , recrie o conjunto de dados em alguns segundos zfs destroy san/version; zfs create -p -o compression=on san/version
após os pensamentos da resposta do @Gilles.
zfs create dataset -p -o compression=on yourPoolName/BackupRootDir/hostNameYourPc/somesubdir
Respostas:
O rastreamento de blocos liberados é inevitável em qualquer sistema de arquivos decente e o ZFS não é exceção . No entanto, existe uma maneira simples no ZFS de excluir um diretório quase instantaneamente "adiando" a limpeza subjacente. É tecnicamente muito semelhante à sugestão de Gilles, mas é inerentemente confiável sem exigir código extra.
Se você criar um instantâneo do seu sistema de arquivos antes de remover o diretório, a remoção do diretório será muito rápida, porque nada precisará ser explorado / liberado sob ele, todos ainda referenciados pelo instantâneo. Você pode destruir o instantâneo em segundo plano para que o espaço seja recuperado gradualmente.
fonte
feature@async_destroy
também pode ajudar a acelerar isso (da perspectiva de um usuário ou administrador), se ativado; vejazpool get all $pool
. Observe que pelo menos eu procurei, se houver uma destruição pendente em andamento na importação de conjuntos , essa destruição se tornará síncrona e a importação de conjuntos não será concluída até que a destruição seja concluída. Cuidado se você precisar reiniciar!O que você está pedindo é impossível. Ou, mais precisamente, há um custo a pagar ao excluir um diretório e seus arquivos; se você não pagar no momento da exclusão, terá que pagar em outro lugar.
Você não está apenas removendo um diretório - isso seria quase instantâneo. Você está removendo um diretório e todos os arquivos dentro dele e também recursivamente removendo todos os seus subdiretórios. Remover um arquivo significa diminuir sua contagem de links e, em seguida, marcar seus recursos (os blocos usam para o conteúdo e os metadados do arquivo, e o inode se o sistema de arquivos usar uma tabela de inodes) como livre se a contagem de links atingir 0 e o arquivo não estiver aberto. Esta é uma operação que deve ser realizada para cada arquivo na árvore de diretórios, portanto, o tempo necessário é pelo menos proporcional ao número de arquivos.
Você pode atrasar o custo de marcar os recursos como gratuitos. Por exemplo, existem sistemas de arquivos coletados por lixo, nos quais você pode remover um diretório sem remover os arquivos que ele contém. Uma execução do coletor de lixo detectará os arquivos inacessíveis por meio da estrutura de diretórios e os marcará como livres. Executar
rm -f directory; garbage-collect
em um sistema de arquivos coletados de lixo faz o mesmo querm -rf
em um sistema de arquivos tradicional, com diferentes gatilhos. Existem poucos sistemas de arquivos coletados pelo lixo porque o GC é uma complexidade adicional que raramente é necessária. O tempo do GC pode chegar a qualquer momento, quando o sistema de arquivos precisa de alguns blocos livres e não encontra nenhum, portanto o desempenho de uma operação depende do histórico passado, não apenas da operação, o que geralmente é indesejável. Você precisaria executar o coletor de lixo apenas para obter a quantidade real de espaço livre.Se você deseja simular o comportamento do GC em um sistema de arquivos normal, é possível:
(Omiti muitos detalhes importantes, como verificação de erros, resiliência à perda de energia etc.) O nome do diretório se torna inexistente imediatamente; o espaço é recuperado progressivamente.
Uma abordagem diferente para evitar o pagamento do custo durante a remoção sem o GC seria pagá-lo durante a alocação. Marque a árvore de diretórios como excluída e passe pelos diretórios excluídos ao alocar blocos. Seria difícil conciliar com links físicos, mas em um sistema de arquivos sem links físicos, isso pode ser feito com o aumento de custos O (1) na alocação. No entanto, isso tornaria uma operação muito comum (criar ou ampliar um arquivo) mais cara, com o único benefício sendo uma operação relativamente rara (remover uma grande árvore de diretórios) mais barata.
Você poderia remover em massa uma árvore de diretórios se ela fosse armazenada como seu próprio conjunto de blocos. (Nota: estou usando a palavra "pool" em um significado diferente do "pool de armazenamento" do ZFS. Não sei qual é a terminologia adequada.) Isso pode ser muito rápido. Mas o que você faz com o espaço livre? Se você o redesignar para outro pool, isso terá um custo, muito menos do que excluir arquivos individualmente. Se você deixar o espaço como espaço de reserva não utilizado, não poderá recuperá-lo imediatamente. Ter um pool individual para uma árvore de diretórios significa custos adicionais para aumentar ou reduzir o tamanho desse pool (em tempo real ou explicitamente). Tornar a árvore seu próprio pool de armazenamento também aumenta o custo de mover arquivos para dentro e para fora da árvore.
fonte
zfs list
. Até lá, esperamos que outra pessoa tenha alguma entrada sobre como delte em massa no ZFS em um subdiretório de um pool. :-)Se precisar ser rápido, gerei um novo diretório temporário,
mv
o diretório abaixo dele, e excluo recursivamente o temporário:fonte
rm
comando não for concluído por algum outro motivo, o diretório fantasma ficará com a exclusão não excluída.&
simplesmente coloca o processo em segundo plano, para que você possa continuar fazendo outras coisas no mesmo shell enquanto a exclusão estiver em execução (sujeita a penalidades de desempenho relevantes).