On Thu, 12 Jul 2001, Heber Blain Goncalves wrote:
> Sempre me intriguei com a real diferenca entre os links simbolicos e
> fixos. Hoje, por teste, comecei a criar alguns para visualizar as suas
> diferencas.
Um arquivo num filesystem compat�vel com os padr�es Unix tem um
elemento chamado de "inode". O inode � um numero inteiro e representa
a posi��o de uma estrutura de informa��o contida em �rea especial do
disco. As informa��es contidas num inode s�o:
owner
group
permiss�es
tamanho
tipo (arquivo regular, diret�rio, device, ...)
n�mero de links (quantos "usam" este inode)
data de cria��o
data de modifica��o (escrita)
data de acesso (leitura)
tabela de "datablocks" onde o conte�do do arquivo � armazenado
Um diret�rio � um inode.
O conte�do de um diret�rio (armazenado nos datablocks) cont�m uma
tabela de nomes e respectivos n�meros de inodes (s� o n�mero do inode,
o inode "mesmo" est� em outra �rea do disco).
Quando um nome+inode � armazenado num diret�rio, o "n�mero de links"
do inode � incrementado. Isso indica que o inode est� sendo usado por
pelo menos um arquivo em algum diret�rio.
"stat" � o nome da fun��o do kernel que faz acesso ao conte�do de um
inode. Um programa de mesmo nome, stat(1), recebe um nome de arquivo
e mostra as informa��es do inode deste arquivo.
"ls -i" mostra o n�mero do inode dos arquivos.
"ls -l" mostra o n�mero de links do inode logo ap�s as permiss�es.
Quando criamos um hardlink estamos criando um "nome de arquivo" em
"algum diret�rio" e associando a esse nome o mesmo inode de outro
arquivo:
ln arquivo_existente novo_link
O comando ln pega o n�mero do inode de "arquivo_existente" o usa
tamb�m para o "novo_link". As informa��es de owner/group e permiss�o
est�o no inode, e o usu�rio precisa apenas ter o direito de leitura no
diret�rio onde est� "arquivo_existente" para poder ler o n�mero do
inode deste arquivo, e ter direito de escrita no diret�rio de
"novo_link" para poder criar mais uma entrada no diret�rio.
Se o usu�rio quiser acessar o conte�do de "novo_link", o sistema vai
verificar as permiss�es do inode, e impedir a opera��o, se for
indevida.
Acessos ao conte�do de "novo_link" � id�ntico ao acesso do conte�do de
"arquivo_existente", pois afinal estamos acessando os datablocks de um
_mesmo_ inode.
Veja que mesmo o usu�rio n�o tendo acesso ao conte�do do arquivo, o
filesystem vai incrementar o "numero de links" do inode.
Quando deletamos um arquivo estamos removendo a entrada de nome+inode
num diret�rio, e decrementando o n�mero de links do inode.
Quando o n�mero de links de um inode cair para zero, e nenhuma task
estiver com o arquivo aberto, o filesystem libera o inode e os
datablocks usados.
� por essa caracter�stica que a chamada do kernel para a fun��o de
"deletar um arquivo" chama-se de fato "unlink" e n�o "delete" como
poderiamos esperar.
Curiosidade: quando criamos um diret�rio:
- o sistema reserva um inode novo para o novo diret�rio.
- criamos uma nova entrada "nome+inode" no diret�rio pai, o que
faz com que o n�mero de links do novo inode seja incrementado.
- � criado o diret�rio "." no novo diret�rio apontando para o
novo inode, o que faz com que n�mero de links do novo inode
seja incrementado.
- � criado o diret�rio ".." no novo diret�rio, sendo que o inode
desta entrada � o mesmo inode do diret�rio pai, portando o
n�mero de links do diret�rio pai � incrementado.
Resultado: o inode do novo diret�rio j� come�a com 2, e o n�mero de
links num diret�rio indica o "n�mero de subdiret�rios" que este
diret�rio possui (incluindo o . e ..).
Confirme com:
ls -ldi .
mkdir xxx
ls -ldi . xxx xxx/. xxx/..
rmdir xxx
ls -ldi .
E os "symbolic links"? Um symbolic link possui um inode pr�prio, mas
as permi��es s�o fixadas em "777". O datablock de um symbolic link
cont�m o path para o que desejamos linkar.
Quando executamos "ln -s xxx yyy":
- obtemos um novo inode
- o tipo de arquivo � "l", symbolic link
- as permiss�es s�o 777
- as demais informa��es do inode s�o particulares deste inode
- um datablock � alocado e o conte�do "xxx" � armazenado
- acrescentamos "yyy+inode" no diret�rio onde yyy vai existir,
o o inode do link simb�lico � incrementado
Se "xxx" n�o existe, isso � problema de quem for usar yyy. :)
As chamadas do filesystem de creat, open, read, e write v�o de fato
fazer acessos ao arquivo "xxx", j� unlink("y") remove o link
simb�lico. Quando for realizado o acesso nos datablocks do inode de
xxx, as permiss�es de acesso deste inode s�o verificadas.
De fato o filesystem "persegue" o conte�do de tantos links simb�licos
quantos existirem, at� chegar a um "n�o link simb�lico" ou a um link
simb�lico que aponta para um arquivo inexistente:
$ ln -s xxx yyy
$ ls -lid yyy
94791 lrwxrwxrwx 1 klein users 3 Jul 14 18:44 yyy -> xxx
$ cat yyy
cat: yyy: No such file or directory
$ date >yyy
$ ls -ldi xxx yyy
94792 -rw-r--r-- 1 klein users 29 Jul 14 18:45 xxx
94791 lrwxrwxrwx 1 klein users 3 Jul 14 18:44 yyy -> xxx
$ ln -s yyy zzz
$ ls -lid xxx yyy zzz
94792 -rw-r--r-- 1 klein users 29 Jul 14 18:45 xxx
94791 lrwxrwxrwx 1 klein users 3 Jul 14 18:44 yyy -> xxx
94793 lrwxrwxrwx 1 klein users 3 Jul 14 18:45 zzz -> yyy
$ cat zzz
Sat Jul 14 18:45:13 BRT 2001
$ rm xxx
$ cat zzz
cat: zzz: No such file or directory
$ date >zzz
$ ls -lid xxx yyy zzz
94792 -rw-r--r-- 1 klein users 29 Jul 14 18:46 xxx
94791 lrwxrwxrwx 1 klein users 3 Jul 14 18:44 yyy -> xxx
94793 lrwxrwxrwx 1 klein users 3 Jul 14 18:45 zzz -> yyy
O programa namei(1) "persegue" e mostra a cadeia de links simb�licos
da mesma maneira que o filesystem faz:
$ namei zzz
f: zzz
l zzz -> yyy
l yyy -> xxx
- xxx
--- Wagner [EMAIL PROTECTED]
Assinantes em 14/07/2001: 2259
Mensagens recebidas desde 07/01/1999: 122941
Historico e [des]cadastramento: http://linux-br.conectiva.com.br
Assuntos administrativos e problemas com a lista:
mailto:[EMAIL PROTECTED]