hardlinks parecem ter várias centenas de bytes apenas para o próprio link (não para dados de arquivo)

5

Informações adicionais

Primeiramente, obrigado por todas as respostas.

Então eu corri os testes novamente para testar a resposta abaixo que uma entrada de diretório / pasta ocupa 4KB e isso estava distorcendo meus números, então desta vez colocando 20.000 arquivos em um único diretório e fazendo o cp -al para outro diretório. Os resultados foram muito diferentes, depois de tirar o comprimento dos nomes dos arquivos, os hardlinks funcionaram para cerca de 13 bytes por hardlink, muito melhor do que 600. Ok, então para completar o trabalho na resposta dada abaixo que isso é devido a cada entrada para um diretório / pasta ocupando 4KB fiz o teste novamente, mas desta vez criei milhares de diretórios e coloquei um arquivo em cada diretório. O resultado após a matemática (maior espaço ocupado em hd / por número de arquivos (ignorando diretórios) foi quase exatamente 4KB para cada arquivo, mostrando que um hardlink ocupa apenas alguns bytes, mas que uma entrada para um diretório / pasta real leva 4KB.

Então, eu estava pensando em implementar a estratégia de backup rsync / hardlink / snapshot e fiquei imaginando quantos dados um hardlink usou, como se tivesse que colocar uma entrada para o link extra como uma entrada de diretório, etc. parece encontrar qualquer informação sobre isso e eu acho que é dependente do sistema de arquivos. A única informação que eu pude encontrar foi a sugestão de que eles não pegaram espaço (provavelmente significando que eles não ocupam espaço para o conteúdo do arquivo), para o espaço que eles ocupam é insignificante, eles pegam apenas alguns bytes para armazenar o hardlink.

Então eu peguei alguns sistemas (um de vm e um de hardware real) e fiz o seguinte no diretório raiz como root:

mkdir link
cp -al usr link

O diretório usr tinha cerca de 54.000 arquivos. O espaço usado no hd aumentou em cerca de 34MB. Então isso funciona em torno de 600 bytes por hardlink, ou estou fazendo algo errado?

Estou usando o LVM em ambos os sistemas, formatados como ext4.

O tamanho do nome do arquivo é de aproximadamente 1,5 MB (eu obtive isso fazendo ls -R e redirecionando-o para um arquivo).

Para ser honesto, o rsync com hardlinks funciona tão bem que eu estava planejando usá-lo para backup diário em alguns dos servidores de trabalho. Também achei que seria fácil fazer backups / snapshots incrementais como esse por um período considerável de tempo. No entanto, depois de dez dias 30mb é 300mb e assim por diante. Além disso, se houver apenas algumas alterações nos dados / conteúdos reais do arquivo, digamos, algumas centenas de KB, o armazenamento de mais de 30 MB de hardlinks por dia pareceria excessivo, mas entendo o tamanho dos discos modernos. Era simplesmente que eu não tinha visto esse tamanho de hardlink mencionado em qualquer lugar que eu pensava estar fazendo algo errado. 600 bytes são normais para um hardlink em um sistema operacional Linux?

Para calcular o espaço usado, fiz um df antes e depois do cp -al .

    
por jamie 12.07.2015 / 22:36

1 resposta

5

cp -al usr link cria vários links físicos, mas também cria alguns diretórios. Diretórios não podem ser vinculados, então eles são copiados.

Cada link físico ocupa o espaço de uma entrada de diretório, que precisa armazenar pelo menos o nome do arquivo e o número do inode. Cada diretório ocupa o espaço de uma entrada de diretório, além de um inode para seus metadados. A maioria dos sistemas de arquivos, incluindo a família ext2, conta o espaço do inode separadamente. Todos os links físicos estão em diretórios criados pela operação de cópia. Portanto, o espaço que você está vendo é, na verdade, o tamanho dos diretórios em /usr .

Na maioria dos sistemas de arquivos, cada diretório ocupa pelo menos um bloco. 4kB é um tamanho de bloco típico no Linux. Assim, você pode esperar que a cópia leve 4 × (número de diretórios) em kB, além de alguma mudança para os diretórios maiores que requerem vários blocos. Assumindo blocos de 4kB, sua cópia criou cerca de 8500 blocos, o que soa como a estimativa certa para um diretório /usr contendo 54000 arquivos.

Os diretórios devem ter exatamente um diretório pai. Na verdade, eles têm hard links (ou pelo menos parecem assim, embora sistemas de arquivos modernos não usem hard links sob o capô): um para a entrada no pai, um para a entrada . e um para o .. de entrada em todos os subdiretórios. Mas você não pode fazer outros links para eles. Algumas variantes do Unix permitem que o root crie hard links para diretórios em alguns sistemas de arquivos, mas com o risco de criar loops que não podem ser removidos ou de árvores de diretórios ocultos que não podem ser acessadas.

    
por 13.07.2015 / 02:21