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?