Por que os hard links parecem ocupar o mesmo espaço que os originais?

10

Graças a alguns bons Q & A por aqui e esta página , agora eu entendo links. Eu vejo hard links referir o mesmo inode por um nome diferente, e cópias são diferentes "nós, com nomes diferentes. Além de soft links têm o nome do arquivo original e caminho como seu inode, portanto, se o arquivo for movido, o link quebra. / p>

Então, eu testei o que eu aprendi com algum arquivo ("saluton_mondo.cpp" abaixo), fiz um link hard e um soft e uma cópia.

jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp
-rw-rw-r-- 1 jmcf125 jmcf125 205 Aŭg 27 16:10 copy
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 hard
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 saluton_mondo.cpp
lrwxrwxrwx 1 jmcf125 jmcf125  17 Aŭg 27 16:09 soft -> saluton_mondo.cpp

Eu achei estranho que o link físico, no entanto, tem o mesmo tamanho que o original e, logicamente, a cópia. Se o link físico e o original compartilham o mesmo inode, que contém os dados e diferem apenas pelo nome do arquivo, o link físico não deve ocupar apenas o espaço de seu nome, em vez de 205 bytes? Ou é que o tamanho do arquivo original que ls -lh retorna? Mas como posso saber que espaço ocupa o nome do arquivo? Aqui , os links físicos não têm tamanho. O nome do arquivo é mantido ao lado do nome do arquivo original? Onde está o nome do arquivo de hard links armazenados?

    
por JMCF125 27.08.2013 / 17:48

2 respostas

16

Um arquivo é um inode com metadados, entre os quais uma lista de ponteiros para onde encontrar os dados.

Para poder acessar um arquivo, é necessário vinculá-lo a um diretório (pense em diretórios como diretórios telefônicos, não pastas), isto é, adicionar uma ou mais entradas a um dos diretórios. mais diretórios para associar um nome com esse arquivo.

Todos esses links, esses nomes de arquivos apontam para o mesmo arquivo. Não há um que é o original e os outros que são links. Eles são todos pontos de acesso ao mesmo arquivo (mesmo inode) na árvore de diretórios. Quando você obtiver o tamanho do arquivo ( lstat system call), você está recuperando as informações (os metadados mencionados acima) armazenados no inode, não importa qual nome de arquivo, qual link você está usando para se referir para esse arquivo.

Por contraste, links simbólicos são outro arquivo (outro inode) cujo conteúdo é um caminho para o arquivo de destino. Como qualquer outro arquivo, esses links simbólicos devem ser vinculados a um diretório (deve ter um nome) para que você possa acessá-los. Você também pode ter vários links para links simbólicos, ou em outras palavras, links simbólicos podem receber vários nomes (em um ou mais diretórios).

$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a

Acima, o número do arquivo 10486707 é um arquivo normal. Duas entradas no diretório atual (uma com nome a , uma com nome b ) vinculam a ela. Como o link count é 2, sabemos que não há outro nome desse arquivo no diretório atual ou em qualquer outro diretório. O número de arquivo 10502404 é outro arquivo, desta vez do tipo symlink ligado duas vezes ao diretório atual. Seu conteúdo (destino) é o caminho relativo "a".

Observe que, se 10502404 estivesse vinculado a outro diretório que não o atual, ele normalmente apontaria para um arquivo diferente, dependendo de como foi acessado.

$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a

2:
total 92
10608674 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar

Os arquivos não possuem nomes associados a eles, exceto nos diretórios que os vinculam. O espaço ocupado pelos seus nomes são as entradas nesses diretórios, é contabilizado no tamanho do arquivo / uso do disco dos diretórios.

Você notará que a chamada do sistema para remover um arquivo é unlink . Ou seja, você não remove arquivos, desassocia-os dos diretórios aos quais eles são referenciados. Uma vez desvinculado do último diretório que tinha uma entrada para um determinado arquivo, esse arquivo é então destruído (desde que nenhum processo o tenha) aberto).

    
por 27.08.2013 / 18:01
4

O link físico é, essencialmente, o arquivo original. Então, o tamanho que você vê é o tamanho do arquivo que está sendo vinculado. São links soft que ocupam apenas o espaço de seus nomes (meio).

No que diz respeito ao sistema de arquivos, o link físico e o original são a mesma coisa, eles apontam para o mesmo inode, então o mesmo tamanho é relatado.

    
por 27.08.2013 / 17:57