Por que os links físicos parecem ocupar o mesmo espaço que os originais?


14

Graças a algumas boas perguntas e respostas por aqui e nesta página , agora entendo os links. Vejo que os links físicos referem o mesmo inode por um nome diferente, e as cópias são "nós" diferentes, com nomes diferentes. Além disso, os links flexíveis têm o nome e o caminho do arquivo original como seu inode; portanto, se o arquivo for movido, o link será interrompido.

Então, testei o que aprendi com algum arquivo ("saluton_mondo.cpp" abaixo), criei um link físico, um link suave 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

Achei estranho que o link físico, no entanto, tenha o mesmo tamanho que o original e, logicamente, a cópia. Se o link físico e o original compartilharem o mesmo inode, que possui 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 esse é o tamanho do arquivo original que ls -lhretorna? Mas como saber qual espaço ocupa o nome do arquivo? Aqui diz que os links físicos não têm tamanho. O nome do arquivo é mantido ao lado do nome original? Onde está armazenado o nome do arquivo dos links físicos?

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 nos diretórios como diretórios telefônicos, não como pastas), ou seja, adicione uma ou mais entradas a um ou mais diretórios para associar um nome a esse arquivo.

Todos esses links, esses nomes de arquivos apontam para o mesmo arquivo. Não há um que seja o original e os outros que sejam links. Todos eles são pontos de acesso ao mesmo arquivo (mesmo inode) na árvore de diretórios. Quando você obtém o tamanho do arquivo (lstat chamada de sistema), está recuperando informações (os metadados mencionados acima) armazenadas no inode, não importa qual nome de arquivo, qual link você está usando para se referir a esse arquivo .

Por outro lado, os 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 precisam ser vinculados a um diretório (devem 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, os 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 do número do arquivo 10486707, há um arquivo regular. Duas entradas no diretório atual (uma com nome ae outra com nome b) são vinculadas a ele. Porque a contagem de links é 2, sabemos que não há outro nome desse arquivo no diretório atual ou em qualquer outro diretório. O número do arquivo 10502404 é outro arquivo, desta vez do tipo link simbólico vinculado duas vezes ao diretório atual. Seu conteúdo (destino) é o caminho relativo "a".

Observe que, se o 10502404 estiver vinculado a outro diretório que não o atual, normalmente ele apontará 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 têm nomes associados a eles, exceto nos diretórios que os vinculam. O espaço ocupado por seus nomes são as entradas desses 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, os desvincula dos diretórios em que são referenciados. Uma vez desvinculado do último diretório que tinha uma entrada para um determinado arquivo, esse arquivo é destruído (desde que nenhum processo o tenha) aberto).


Ahh ... agora entendo. Portanto, um arquivo chamado "oi" e sua cópia exata chamada "ajhĝjdmjefsjmksgskgjkmŝŭna" ocupam exatamente a mesma quantidade de espaço; porque seus nomes não contam para a lstatchamada do sistema que obtém seu tamanho.
JMCF125 27/08

@ JMCF125, sim, o tamanho dos nomes é a entrada nos diretórios correspondentes, é contabilizado no tamanho dos diretórios.
Stéphane Chazelas

Obrigado. Você pode incluir isso na sua resposta? Espere, eu vou esclarecer minha pergunta primeiro.
JMCF125 27/08

5

O link físico é, essencialmente, o arquivo original. Portanto, o tamanho que você vê relatado é o tamanho do arquivo ao qual está sendo vinculado. É mole links que só ocupam 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 para que o mesmo tamanho seja relatado.


Mas o nome do link físico deve ocupar espaço, correto?
JMCF125

Veja a resposta de @ stephan abaixo, ele explica melhor.
terdon

2
@ JMCF125 Sim, mas esse espaço está dentro do diretório. Se você criar arquivos suficientes, notará que o tamanho do diretório aumenta. O tamanho de um arquivo não inclui seus metadados, como seu nome.
Gilles 'SO- stop be evil'

@Gilles, obrigado, mas @Stephane já atualizou sua resposta com essas informações. Além disso, agora que penso nisso melhor, o nome /deve ser armazenado em si, como se você faz cd ..em /você ficar em /.
JMCF125
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.