Eu uso o seguinte comando para localizar e mover um grande número de arquivos em meu servidor:
find SomeDir/ -maxdepth 10 -type f -mtime +90 -exec mv {} SomeDir2/ \;
Depois de mover cerca de 700.000 arquivos, recebo este erro:
mv: cannot move ‘SomeDir/Dir1/Dir2/Dir3/file.jpg.gz’ to ‘SomeDir2/file.jpg.gz’: No space left on device
df -i
tem o seguinte resultado:
/dev/sdb1 322125824 144163358 177962466 45% /files
df -h
tem o seguinte resultado:
/dev/sdb1 4.8T 3.5T 1.1T 78% /files
Eu faço toda a operação /files
e nenhum outro diretório
O sistema de arquivos é ext4
.
ATUALIZAR
Como sugerido, corro dmesg -Hwx
e o resultado éEXT4-fs warning (device sdb1): ext4_dx_add_entry:2016: Directory index full!
Responder1
Você provavelmente está excedendo max_dir_size_kb
o conjunto (ou deixou o padrão) no momento da montagem do diretório:
max_dir_size_kb=n This limits the size of the directories so that any attempt to expand them beyond the specified limit in kilobytes will cause an ENOSPC error. This is useful in memory-constrained environments, where a very large directory can cause severe performance problems or even provoke the Out Of Memory killer. (For example, if there is only 512 MB memory available, a 176 MB directory may seriously cramp the system's style.)
( ENOSPC
traduz-se na mensagem de erro No space left on device
com perror
)
Portanto, certifique-se de que essa opção não foi especificada (ou especificada com um número muito grande) no momento da montagem.
Além disso, observações:
- muitos arquivos em uma pasta não parecem uma boa ideia. Você talvez queira um banco de dados relacional? Armazenamento de objetos?
- 4,8 TB: isso não é raro para discos rígidos modernos, mas honestamente, da próxima vez que você configurar algo nos dias de hoje, use um pool de armazenamento como o LVM. Com isso você pode ter coisas como instantâneos de sistemas ativos.
Responder2
Com as informações recém-obtidas:
Então, lendo linux/fs/ext4/namei.c line 2007 na git tag v3.10 (ou seja, seu kernel), acho que você está sem sorte e precisa ajustar seu sistema de arquivos;
tune2fs -O large_dir /dev/sdb1
deve permitir que você tenha mais dx_entries
por diretório, mas honestamente, nunca fiz isso. Como sempre, tenha backups.
Certifique-se de ter backups ou aplique-os a um novo sistema de arquivos para onde você copia esses arquivos, em vez de movê-los dentro do mesmo sistema de arquivos. Pode parecer que eu sou um fanboy do XFS (não sou, simplesmente funciona), mas acho que isso realmente não parece que um ext4 desafinado seja um ótimo sistema de arquivos para este caso de uso.