Então, estou tentando entender um pouco melhor os sinalizadores de recursos do FileSystem.
Pelo que pude descobrir, de acordo com man ext4
um único diretório em um sistema de arquivos ext4, é possível hospedar até 64.998 subdiretórios.
Normalmente, o ext4 permite que um inode não tenha mais do que 65.000 hard links. Isso se aplica a arquivos regulares, bem como a diretórios, o que significa que não pode haver mais do que 64.998 subdiretórios em um diretório (porque cada uma das entradas '.' e '..', bem como a entrada de diretório para o diretório em seu diretório pai conta como um hard link).
Ao usar o recurso FS large_dir
, esse limite deve ser eliminado:
Esse recurso aumenta o limite do número de arquivos por diretório aumentando o tamanho máximo dos diretórios e, para diretórios b-tree com hash (veja dir_index), a altura máxima da b-tree com hash usada para armazenar as entradas do diretório.
Ao usar tune2fs
, verifiquei os recursos habilitados no meu FS ext4 local:
$ sudo tune2fs -l /dev/disk/azure/scsi1/lun10-part1 | grep "Filesystem features"
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
O dir_nlink
recurso está habilitado, mas pelo que entendi na documentação, ele não deve permitir ter mais de 65.000 subdiretórios em um diretório:
Esse recurso elimina esse limite fazendo com que o ext4 use uma contagem de links de 1 para indicar que o número de links físicos para um diretório não é conhecido quando a contagem de links pode exceder o limite máximo de contagem.
O dir_index
sinalizador também está habilitado, mas não consigo ver como a estrutura de dados subjacente é relevante para os limites do subdiretório:
Use b-trees com hash para acelerar pesquisas de nomes em diretórios grandes. Esse recurso é suportado por sistemas de arquivos ext3 e ext4, e é ignorado por sistemas de arquivos ext2.
E ainda assim eu posso criar mais de 65000 subdiretórios. Ainda não descobri o limite real, pois o script que deixei rodando ainda está forte:
for i in {1..500000}
do
mkdir dir_$i
done
Há sobreposições entre os sinalizadores de recursos ext4? Enable é dir_nlink
ou dir_index
é equivalente a enable large_dir
? E caso não seja - esses sinalizadores habilitam um limite de subdiretório entre não usar e usar o large_dir
sinalizador?
Estas são as versões que estou usando:
$ uname -a
Linux test-subdirectories 6.5.0-1024-azure #25~22.04.1-Ubuntu SMP Mon Jun 17 18:38:57 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
Há algo que estou esquecendo - ou deveria verificar - para entender os limites de subdiretórios no ext4?
Pelo que posso ver, o trecho do manual que você citou –
– não tem nada a ver com
large_dir
e tudo a ver comdir_nlink
. O parágrafo citado fala especificamente sobre o número de hard links para uma única entrada (das entradas dos subdiretórios..
para o diretório pai), e não sobre o número de entradas em si.O
large_dir
recurso parece permitir diretórios com mais de 2 GB de entradas ou mais de 2 níveis de profundidade de htree (veja outro tópico sobre tamanho de entrada ; parece ser difícil calcular exatamente para sistemas de arquivos dir_index, cerca de 10 milhões de entradas para comprimentos de nome de arquivo "normais" no intervalo de 24 a 32 caracteres), mas certamente não está relacionado ao limite de 65k).Hmm, acho essa parte do texto um pouco confusa:
Embora a
.
entrada do diretório D e a entrada para D em seu diretório pai sejam consideradas links físicos, a parte relevante ignorada ali é que as..
entradas dos _subdiretórios` de D apontam para o próprio D, também sendo consideradas links físicos para D. Portanto, a contagem máxima de links limita o número de subdiretórios que um diretório pode ter.dir_nlink
ignora isso simplesmente não mantendo a contagem. A contagem é desnecessária de qualquer forma no sentido de que todos os links para o diretório podem ser encontrados lendo o conteúdo do diretório ao olhar os diretórios apontados.