104.6 Criando e Alterando Links Hard e Soft
No Linux, tudo é tratado como um arquivo. No entanto, alguns arquivos recebem um tratamento especial devido ao local em que são armazenados, como arquivos temporários, ou à maneira como interagem com o sistema de arquivos, como links.
Arquivos temporários
Arquivos temporários são arquivos usados por programas para armazenar dados que são necessários apenas por um curto período de tempo. Podem ser dados de processos em execução, logs de travamento, arquivos de rascunho de um salvamento automático, arquivos intermediários usados durante a conversão de um arquivo, arquivos de cache e outros.
Localização de arquivos temporários
A versão 3.0 do Filesystem Hierarchy Standard (FHS) define locais padrão para arquivos temporários em sistemas Linux. Cada local tem um propósito e comportamento diferente, e é recomendado que os desenvolvedores sigam as convenções definidas pelo FHS ao gravar dados temporários no disco.
/tmp
De acordo com a FHS, os programas não devem presumir que os arquivos gravados aqui serão preservados entre as invocações de um programa. A recomendação é que este diretório seja limpo (todos os arquivos apagados) durante a inicialização do sistema, embora isso não seja obrigatório.
/var/tmp
Outro local para arquivos temporários, mas este não deve ser limpo durante a inicialização do sistema. Os arquivos armazenados aqui geralmente persistirão entre as reinicializações.
/run
Este diretório contém dados variáveis de tempo de execução usados por processos em execução, como arquivos de identificador de processo (.pid). Programas que precisam de mais de um arquivo de tempo de execução podem criar subdiretórios aqui. Este local deve ser limpo durante a inicialização do sistema. O propósito deste diretório já foi servido por
/var/run
, e em alguns sistemas/var/run
pode ser um link simbólico para/run
.
Observe que não há nada que impeça um programa de criar arquivos temporários em outro lugar no sistema, mas é uma boa prática respeitar as convenções definidas pelo FHS.
Permissões em arquivos temporários
Ter diretórios temporários para todo o sistema em um sistema multiusuário apresenta alguns desafios em relação às permissões de acesso. À primeira vista, pode-se pensar que tais diretórios seriam "graváveis para todos", ou seja, qualquer usuário poderia gravar ou excluir dados dentro deles. Mas se isso fosse verdade, como você poderia impedir um usuário de apagar ou modificar arquivos criados por outro?
A solução é uma permissão especial chamada sticky bit
, que se aplica apenas a diretórios. Quando esse bit especial é definido para um diretório, evita que os usuários removam ou renomeiem um arquivo nesse diretório, a menos que sejam proprietários do arquivo.
Os diretórios com o bit sticky definido mostram um t substituindo o x nas permissões por outros na saída de ls -l. Por exemplo, vamos verificar as permissões para os diretórios /tmp
e /var/tmp
:
$ ls -ldh /tmp/ /var/tmp/
drwxrwxrwt 23 root root 20K Apr 2 10:20 /tmp/
drwxrwxrwt 115 root root 4,0K Apr 2 10:10 /var/tmp/
Como você pode ver o x foi substituido nas permissões para os outros, ambos os diretórios têm o bit sticky definido.
Para definir o sticky bit em um diretório usando chmod no modo numérico, use a notação de quatro dígitos e 1 como o primeiro dígito. Por exemplo:
# O primeiro dífito sempre será o bit especial, se voce vêr apenas 3 dígitos, isso significa que o bit especial foi omitido.
$ chmod 1755 temp
Isso definirá o sticky bit para o diretório denominado temp e as permissões como rwxr-xr-t.
Ao usar o modo simbólico, use o parâmetro t. Portanto, +t
pode ser usado para definir o bit sticky e -t
para desativá-lo. Igual a:
$ chmod +t temp
Entendendo Links
Como já mencionado, no Linux tudo é tratado como um arquivo. Mas há um tipo especial de arquivo, chamado link, e dois tipos de links em um sistema Linux:
Links simbólicos Também chamados de soft links, eles apontam para o caminho de outro arquivo. Se você excluir o arquivo, o link aponta para (chamado de destino), o link ainda existirá, mas irá "parar de funcionar", pois agora aponta para "nada".
Links físicos Pense em um link físico como um segundo nome para o arquivo original. Eles não são duplicados, mas sim uma entrada adicional no FS (FileSystem) apontando para o mesmo local (inode) no disco, ou seja, temos 1 único arquivo com mais de uma entrada no FS, basicamente N arquivos com o mesmo Inode, veja a sessão do ls.
Um inode é uma estrutura de dados que armazena atributos para um objeto (como um arquivo ou diretório) em um sistema de arquivos. Entre esses atributos estão as permissões, propriedade e em quais blocos do disco os dados do objeto estão armazenados. Pense nisso como uma entrada em um índice, daí o nome, que vem de “nó de índice”.
Hard Links
O comando para criar um hard link no Linux é ln
(Para soft link (Link simbpolico também é ls
)). A sintaxe básica é:
$ ln TARGET LINK_NAME
O TARGET já deve existir (este é o arquivo para o qual o link irá apontar), e se o destino não estiver no diretório atual, ou se você quiser criar o link em outro lugar, você deve especificar o caminho completo para ele. Por exemplo, o comando:
$ ln target.txt /home/Linux/Documents/hardlink
Irá criar um arquivo chamado hardlink no diretório /home/linux/Documents/, vinculado ao arquivo target.txt no diretório atual.
Se você omitir o último parâmetro (LINK_NAME), um link com o mesmo nome do destino será criado no diretório atual.
Gerenciando Hard Links
Links físicos são entradas no sistema de arquivos que têm nomes diferentes, mas apontam para os mesmos dados no disco. Todos esses nomes são iguais e podem ser usados para se referir a um arquivo. Se você alterar o conteúdo de um dos nomes, o conteúdo de todos os outros nomes que apontam para aquele arquivo será alterado, pois todos esses nomes apontam para os mesmos dados. Se você excluir um dos nomes, os outros nomes ainda funcionarão (porque voce apenas excluiu uma das entradas no FS).
Isso acontece porque quando você "apaga" um arquivo, os dados não são realmente apagados do disco. O sistema simplesmente exclui a entrada na tabela do sistema de arquivos apontando para o inode correspondente aos dados no disco. Mas se você tiver uma segunda entrada apontando para o mesmo inode, ainda poderá obter os dados. Pense nisso como duas estradas convergindo no mesmo ponto. Mesmo se você bloquear ou redirecionar uma das estradas, você ainda pode chegar ao destino usando a outra.
Você pode verificar isso usando o parâmetro ls -i
.
Não é possível criarmos Hard Links para diretórios, isso porque poderia criar um loop infinito no sistema de arquivos, somente o FS pode e vai criar hard links em diretórios, veja ls.
Outra coisa, como Hard Link é baseado em Inode, ele só pode ser usado dentro do mesmo FileSystem, isso porque um FS não conhece a tabela de Inode de outro FS, se você tentar criar um Hard Link em FS diferentes, você vai ver a mensagem abaixo:
ln: failed to create hard link 'hardlinkfile' => 'XXX': Invalid cross-device link
Portanto, só é permitido a criação de Hard Link para aqruivos e dentro do mesmo FileSystem.
Movendo e removendo links rígidos
Como os links físicos são tratados como arquivos normais, eles podem ser excluídos com rm
e renomeados ou movidos pelo sistema de arquivos com mv
. E como um link físico aponta para o mesmo inode do alvo, ele pode ser movido livremente, sem medo de "quebrar" o link.
Foi dito que não podemos criar Hard Link de arquivo em FS diferentes, isso é vdd:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 128G 0 disk
|-vda1 252:1 0 1G 0 part /boot
`-vda2 252:2 0 127G 0 part
|-cl_centos8-root 253:0 0 70G 0 lvm /
`-cl_centos8-swap 253:1 0 2.1G 0 lvm [SWAP]
vdb 252:16 0 10G 0 disk
`-vdb1 252:17 0 10G 0 part /mnt
# Diretório raiz está em vda2
# Diretório /mnt está em vdb1
## Ambos são FS distintos, um não pertence ao outro, vamos tentar criar um hard link:
$ ln arquivo /mnt/hardlink_teste
ln: failed to create hard link '/mnt/hardlink_teste' => 'arquivo': Invalid cross-device link
# Lembra da mensagem que disse mais acima?
Mas existe um truque para burlar isso, criar um Hard Link no mesmo FS e move-lo para outro FS:
$ ln arquivo hardlink_teste
# Veja os inodes:
$ ls -i hardlink_teste arquivo
134290624 arquivo 134290624 hardlink_teste
# Ambos tem o mesmo Inode, ou seja, temos 2 entradas no FS para o mesmo dado.
# Mova para outro FS:
$ mv hardlink_teste /mnt/
# Veja o inode dele:
$ ls -i /mnt/hardlink_teste
13 /mnt/hardlink_teste
# hmm, está diferente, isso foi o mesmo que ter copiado o arquivo!
Soft Links (Simbólicos)
O comando usado para criar um link simbólico também é ln
, mas com o parâmetro -s
adicionado. Igual a:
$ ln -s TARGET LINK_NAME
Assim como acontece com os links físicos, você pode omitir o nome do link para criar um link com o mesmo nome do destino no diretório atual.
Gerenciando Soft Links
Links simbólicos apontam para outro caminho no sistema de arquivos. Você pode criar links simbólicos para arquivos e diretórios, mesmo em partições/FS diferentes (o que não acontece com Hard Links). É muito fácil identificar um link simbólico com a saída do comando ls
:
$ ls -lh
total 112K
-rw-r - r-- 1 linux linux 110K 7 de junho 10:13 target.txt
lrwxrwxrwx 1 linux linux 12 Jun 7 10:14 softlink -> target.txt
No exemplo acima, o primeiro caractere nas permissões para o softlink do arquivo é l
, indicando um link simbólico. Além disso, logo após o nome do arquivo, você vê o nome do destino para o qual o link aponta, o arquivo target.txt.
Observe que nas listagens de arquivos e diretórios, os próprios links virtuais sempre mostram as permissões rwx para o usuário, o grupo e outros, mas na prática as permissões de acesso para eles são as mesmas do destino.
Movendo e removendo links simbólicos
Como os links físicos, os links simbólicos podem ser removidos usando rm
e movidos ou renomeados usando mv
. No entanto, cuidado especial deve ser tomado ao criá-los, para evitar "quebrar" o link se ele for movido de seu local original.
Ao criar links simbólicos, você deve estar ciente de que, a menos que um caminho seja totalmente especificado, a localização do destino é interpretada como relativa à localização do link. Isso pode criar problemas se o link ou o arquivo para o qual ele aponta for movido.
Isso é mais fácil de entender com um exemplo. Digamos que você tenha um arquivo denominado original.txt no diretório atual e deseja criar um link simbólico para ele denominado softlink. Você pode usar:
ln -s original.txt softlink
E aparentemente tudo ficaria bem. Vamos verificar com ls:
$ ls -lh
total 112K
-r--r--r-- 1 linux linux 110K Jun 7 10:13 original.txt
lrwxrwxrwx 1 linux linux 12 Jun 7 19:23 softlink -> original.txt
Veja como o link é construído: o softlink aponta para (→) original.txt. No entanto, vamos ver o que acontece se você mover o link para o diretório anterior e tentar exibir seu conteúdo usando o comando less:
$ mv softlink ../
$ less ../softlink
../softlink: No such file or directory
Como o caminho para original.txt não foi especificado, o sistema assume que ele está no mesmo diretório do link. Quando isso não for mais verdade, o link para de funcionar.
A maneira de evitar isso é sempre especificar o caminho completo para o destino ao criar o link:
$ ln -s /home/linux/Documents/original.txt softlink
Dessa forma, não importa para onde você mova o link, ele ainda funcionará, porque ele aponta para a localização absoluta do destino. Mas você ainda pode quebrar o Link ao mover o arquivo original.txt, então tenha cuidado.