Recentemente me perguntaram isso durante uma entrevista de emprego. Fui sincero e disse que sabia como um link simbólico se comporta e como criar um, mas não entendo o uso de um link físico e como ele difere de um simbólico.
Recentemente me perguntaram isso durante uma entrevista de emprego. Fui sincero e disse que sabia como um link simbólico se comporta e como criar um, mas não entendo o uso de um link físico e como ele difere de um simbólico.
Respostas:
Sob o sistema de arquivos, os arquivos são representados por inodes. (Ou são vários inodes? Não tenho certeza.)
Um arquivo no sistema de arquivos é basicamente um link para um inode.
Um link físico, então, apenas cria outro arquivo com um link para o mesmo inode subjacente.
Quando você exclui um arquivo, ele remove um link para o inode subjacente. O inode é excluído apenas (ou excluído / sobregravável) quando todos os links para o inode foram excluídos.
Um link simbólico é um link para outro nome no sistema de arquivos.
Depois que um link físico é feito, o link é para o inode. Excluir, renomear ou mover o arquivo original não afetará o link físico, pois ele é vinculado ao inode subjacente. Quaisquer alterações nos dados no inode são refletidas em todos os arquivos que se referem a esse inode.
Nota: Links físicos são válidos apenas no mesmo sistema de arquivos. Links simbólicos podem abranger sistemas de arquivos, pois são simplesmente o nome de outro arquivo.
Alguma boa intuição que possa ajudar, usando qualquer console Linux (ish).
Crie dois arquivos:
$ touch foo; touch bar
Insira alguns dados neles:
$ echo "Cat" > foo
$ echo "Dog" > bar
(Na verdade, eu poderia ter usado o eco em primeiro lugar, pois ele cria os arquivos se eles não existirem ... mas não importa.)
E como esperado:
$cat foo; cat bar
Cat
Dog
Vamos criar links físicos e virtuais:
$ ln foo foo-hard
$ ln -s bar bar-soft
Vamos ver o que aconteceu:
$ ls -l
foo
foo-hard
bar
bar-soft -> bar
Alterar o nome de foo não importa:
$ mv foo foo-new
$ cat foo-hard
Cat
pontos difíceis para o inode, o conteúdo do arquivo - isso não foi alterado.
$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft
cat: bar-soft: No such file or directory
Não foi possível encontrar o conteúdo do arquivo porque o link virtual aponta para o nome que foi alterado e não para o conteúdo.
Da mesma forma, se foo
for excluído, foo-hard
ainda mantém o conteúdo; se bar
for excluído, bar-soft
é apenas um link para um arquivo inexistente.
touch blah1; touch blah2
pode ser reduzido paratouch blah1 blah2
Como diz o ditado, uma imagem vale mais que mil palavras. Aqui está como eu o visualizo:
Aqui está como chegamos a essa imagem:
Crie um nome myfile.txt
no sistema de arquivos que aponte para um novo inode (que contém os metadados para o arquivo e aponte para os blocos de dados que contêm seu conteúdo, ou seja, o texto "Olá, Mundo!":
$ echo 'Hello, World!' > myfile.txt
Crie um link físico my-hard-link
para o arquivomyfile.txt
, o que significa "crie um arquivo que aponte para o mesmo inode que myfile.txt
aponta para":
$ ln myfile.txt my-hard-link
Crie um link my-soft-link
para o arquivo myfile.txt
, o que significa "criar um arquivo que aponte para o arquivo myfile.txt
":
$ ln -s myfile.txt my-soft-link
Veja o que agora acontecerá se myfile.txt
for excluído (ou movido): my-hard-link
ainda aponta para o mesmo conteúdo e, portanto, não é afetado, enquanto my-soft-link
agora aponta para nada. Outras respostas discutem os prós / contras de cada um.
myfile.txt
). Para o link macio, de referência não é o inode (que contém os dados), mas sim de referência é o caminho do sistema de arquivo para myfile.txt
(por exemplo /home/Documents/myfile.txt
)
Links físicos são úteis quando o arquivo original está sendo movido. Por exemplo, movendo um arquivo de / bin para / usr / bin ou para / usr / local / bin. Qualquer link simbólico para o arquivo em / bin seria quebrado por isso, mas um link físico, sendo um link direto para o inode do arquivo, não se importaria.
Os links físicos podem ocupar menos espaço em disco, pois ocupam apenas uma entrada de diretório, enquanto um link simbólico precisa de seu próprio inode para armazenar o nome para o qual aponta.
Os links físicos também levam menos tempo para serem resolvidos - os links simbólicos podem apontar para outros links simbólicos que estão em diretórios com links simbólicos. E alguns deles podem estar no NFS ou em outros sistemas de arquivos de alta latência e, portanto, podem resultar na resolução do tráfego da rede. Os links físicos, estando sempre no mesmo sistema de arquivos, são sempre resolvidos em uma única pesquisa e nunca envolvem latência de rede (se for um link físico em um sistema de arquivos NFS, o servidor NFS fará a resolução e ficará invisível para o sistema do cliente). Às vezes isso é importante. Não é para mim, mas posso imaginar sistemas de alto desempenho onde isso possa ser importante.
Também acho que coisas como mmap (2) e até open (2) usam a mesma funcionalidade dos hardlinks para manter o inode de um arquivo ativo, de modo que, mesmo que o arquivo seja desvinculado (2), o inode permanece para permitir o acesso contínuo ao processo, e somente quando o processo é fechado, o arquivo desaparece. Isso permite que arquivos temporários muito mais seguros (se você conseguir que o aberto e o desvincular ocorram atomicamente, que pode haver uma API POSIX para a qual eu não estou me lembrando, então você realmente tem um arquivo temporário seguro) onde você pode ler / gravar seus dados sem que ninguém possa acessá-los. Bem, isso era verdade antes / proc deu a todos a capacidade de olhar para os descritores de arquivos, mas isso é outra história.
Por falar nisso, a recuperação de um arquivo aberto no processo A, mas desvinculado do sistema de arquivos, gira em torno do uso de hardlinks para recriar os links do inode, para que o arquivo não desapareça quando o processo que o abre o fecha ou desaparece.
Soft Link :
suave ou simbólico é mais um atalho para o arquivo original .... se você excluir o original, o atalho falhará e se você excluir apenas o atalho, nada acontecerá com o original.
Sintaxe do link dinâmico :ln -s Pathof_Target_file link
Resultado : link -> ./Target_file
Prova: readlink link
também na ls -l link
saída, você verá a primeira letra lrwxrwxrwx
como l, que é uma indicação de que o arquivo é um link direto.
Excluindo o link: unlink link
Nota: Se desejar, o seu softlink poderá funcionar mesmo depois de movê-lo para outro lugar do diretório atual. Certifique-se de fornecer o caminho absoluto e não o relativo, ao criar um link flexível. ie (começando em / root / user / Target_file e não ./Target_file)
Hard Link:
O link físico é mais uma cópia espelhada ou vários caminhos para o mesmo arquivo. Faça algo no arquivo1 e ele aparecerá no arquivo 2. A exclusão de um ainda mantém o outro ok.
O inode (ou arquivo) é excluído apenas quando todos os links (físicos) ou todos os caminhos para o inode (mesmo arquivo) foram excluídos.
Depois que um link físico é criado, o link possui o inode do arquivo original. A exclusão da renomeação ou a movimentação do arquivo original não afetará o link físico, pois ele é vinculado ao inode subjacente. Quaisquer alterações nos dados no inode são refletidas em todos os arquivos que se referem a esse inode.
Sintaxe do Hard Link :ln Target_file link
Resultado: Um arquivo com link de nome será criado com o mesmo número de inode que o Targetfile.
Prova: ls -i link Target_file
(verifique seus inodes)
Excluindo o link: rm -f link
(exclua o link como um arquivo normal)
Nota : Links simbólicos podem abranger sistemas de arquivos, pois são simplesmente o nome de outro arquivo. Considerando que os links físicos são válidos apenas no mesmo sistema de arquivos.
Links simbólicos têm alguns recursos que estão faltando links físicos:
você sabe imediatamente onde um link simbólico aponta para os links físicos, é necessário explorar todo o sistema de arquivos para encontrar arquivos que compartilham o mesmo inode.
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
links físicos não podem apontar para diretórios.
Os links físicos têm duas limitações:
Uma maneira simples de ver a diferença entre um link físico e um link simbólico é através de um exemplo simples. Um link direto para um arquivo apontará para o local em que o arquivo está armazenado ou o inode desse arquivo. Um link simbólico apontará para o próprio arquivo real.
Portanto, se tivermos um arquivo chamado "a" e criarmos um link físico "b" e um link simbólico "c", todos eles se referem ao arquivo "a":
echo "111" > a
ln a b
ln -s a c
A saída de "a", "b" e "c" será:
cat a --> 111
cat b --> 111
cat c --> 111
Agora vamos remover o arquivo "a" e ver o que acontece com a saída de "a", "b" e "c":
rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory
Então o que aconteceu?
Como o arquivo "c" aponta para o próprio arquivo "a", se o arquivo "a" for excluído, o arquivo "c" não terá nada para apontar; na verdade, ele também será excluído.
No entanto, o arquivo "b" aponta para o local de armazenamento ou o inode do arquivo "a". Portanto, se o arquivo "a" for excluído, ele não apontará mais para o inode, mas como o arquivo "b" o fará, o inode continuará armazenando qualquer conteúdo pertencente a "a" até que não haja mais links físicos para ele.
Links simbólicos vinculados a um nome de caminho. Isso pode estar em qualquer lugar na árvore de arquivos do sistema e nem precisa existir quando o link é criado. O caminho de destino pode ser relativo ou absoluto.
Links físicos são ponteiros adicionais para um inode, o que significa que eles podem existir apenas no mesmo volume que o destino. Links físicos adicionais para um arquivo são indistinguíveis do nome "original" usado para fazer referência a um arquivo.
Eu indicaria a Wikipedia:
Alguns pontos:
Links físicos são muito úteis ao fazer backups incrementais. Veja rsnapshot , por exemplo. A idéia é copiar usando links físicos:
O novo backup não ocupará espaço extra além das alterações que você fez, pois todos os backups incrementais apontarão para o mesmo conjunto de inodes para arquivos que não foram alterados.
Acrescento à pergunta de Nick: quando os links físicos são úteis ou necessários? O único aplicativo que me vem à cabeça, no qual links simbólicos não funcionariam, é fornecer uma cópia de um arquivo do sistema em um ambiente chroot.
Um link simbólico é um objeto do sistema de arquivos que aponta para outro objeto do sistema de arquivos. O objeto que está sendo apontado é chamado de destino.
Links simbólicos são transparentes para os usuários; os links aparecem como arquivos ou diretórios normais e podem ser tratados pelo usuário ou aplicativo exatamente da mesma maneira.
Links simbólicos são projetados para ajudar na migração e compatibilidade de aplicativos com sistemas operacionais UNIX. A Microsoft implementou seus links simbólicos para funcionar como os links UNIX.
Links simbólicos podem ser links absolutos ou relativos. Links absolutos são links que especificam cada parte do nome do caminho; links relativos são determinados em relação a onde os especificadores de link relativo estão em um caminho especificado
Um exemplo de link simbólico absoluto
X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"
Um exemplo de links simbólicos relativos
X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"
Um link físico é a representação do sistema de arquivos de um arquivo pelo qual mais de um caminho faz referência a um único arquivo no mesmo volume .
Para criar um link físico no Windows, navegue até o local em que o link deve ser criado e insira este comando:
mklink /H Link_name target_path
Observe que você pode excluir links físicos de qualquer ordem, independentemente da ordem em que foram criados. Além disso, links físicos não podem ser criados quando
O NTFS suporta outro tipo de link chamado junção. O MSDN define da seguinte maneira:
Uma junção (também chamada de link virtual) difere de um link físico, pois os objetos de armazenamento aos quais faz referência são diretórios separados, e uma junção pode vincular diretórios localizados em diferentes volumes locais no mesmo computador . Caso contrário, as junções operam de forma idêntica aos links físicos.
As partes em negrito na seção de link físico e seção de junção mostram a diferença básica entre as duas.
Comando para criar uma junção no Windows, navegue até onde o link deve ser criado e digite:
mklink /J link_name target_path
Além disso:
Simplesmente, Hard link: basta adicionar um novo nome a um arquivo, ou seja, um arquivo pode ter muitos nomes ao mesmo tempo, todos os nomes são iguais, ninguém prefere, Hard link não significa copiar todo o conteúdo de arquivo e criar novo arquivo não é isso, basta criar um nome alternativo a ser conhecido.
Link simbólico (link simbólico): é um ponteiro de arquivo para outro arquivo, se o link simbólico apontar para um arquivo existente que será excluído posteriormente, o link simbólico continuará apontando para o mesmo nome de arquivo, mesmo que o nome não nomeie mais nenhum arquivo.
O que você considera um "arquivo" comum é na verdade duas coisas distintas: os dados de um arquivo e uma entrada de diretório. Ao criar um link físico para um arquivo, você realmente cria uma segunda entrada de diretório que se refere aos mesmos dados. As duas entradas de diretório têm exatamente a mesma funcionalidade; cada um pode ser usado para abrir o arquivo e lê-lo. Então você realmente não tem "um arquivo mais um link físico", você tem "dados de arquivo com duas entradas de diretório". O que você pensa como excluir um arquivo na verdade exclui uma entrada de diretório e, quando a última entrada de diretório para os dados é excluída, os próprios dados também são excluídos. Para arquivos comuns que possuem apenas uma entrada de diretório, a exclusão da entrada de diretório excluirá os dados como sempre. (Enquanto um arquivo é aberto, o sistema operacional cria um link temporário para o arquivo,
Como exemplo, crie um arquivo A.txt, um link físico B.txt e exclua A.txt. Quando você criou o A.txt, alguns dados foram criados e uma entrada de diretório A.txt. Quando você criou o link físico, outra entrada de diretório B.txt foi criada, apontando exatamente os mesmos dados. Quando você exclui A.txt, ainda possui todos os dados e uma única entrada de diretório B.txt, exatamente como se você tivesse criado um arquivo B.txt em primeiro lugar.
Um link simples é apenas um arquivo (quase) comum, exceto pelo fato de não conter dados, mas o caminho de outra entrada de diretório. Se você excluir o arquivo ao qual o link virtual se refere, o link virtual conterá um caminho que não aponta mais para uma entrada de diretório; está quebrado. Se você excluir o link virtual, é como excluir qualquer outro arquivo, o arquivo para o qual ele aponta não é afetado.
Uma entrada de diretório é um link para uma estrutura:
struct dentry{
ino_t ino;
char name[256];
}
o ino é o número de inode, o nome é o nome do arquivo, a estrutura do inode pode ser como:
struct inode{
link_t nlink;
...
}
por exemplo, você cria um arquivo / 1, a entrada do diretório pode ser como:
struct dentry{
ino_t ino; /* such as 15 */
char name[256]; /* "1" */
}
a estrutura do inode pode ser como:
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 1 */
...
}
então você cria um link físico (pode ser / 100), a entrada do diretório pode ser como:
struct dentry{
ino_t ino; /* 15 */
char name[256]; /* 100 */
}
a estrutura do inode pode ser como:
struct inode{ /* inode numebr 15 */
link_t nlink; /* nlink = 2 */
...
}
então você cria um link simbólico (pode ser / 200) para o arquivo 1, a entrada do diretório pode ser como:
struct dentry{
ino_t ino; /* such as 16 */
char name[256]; /* "200" */
}
a estrutura do inode pode ser como:
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 2 */
...
}
struct inode{ /* inode number 16 */
link_t nlink; /* nlink = 1 */
...
} /* the data of inode 16 maybe /1 or 1 */
Adicionando a todas as respostas acima, a diferença em encontrar o arquivo de hardlink e softlink pode ser entendida como abaixo:
Eu tenho um arquivo f6
no meu diretório atual, bem como um diretório chamadot2
.
Arquivo nomeado f1
e ./t2/f2
são links simbólicos paraf6
.
Arquivo nomeado f7
e ./t2/f8
são links físicos def6
.
Para encontrar links suaves e físicos, podemos usar:
$ find -L . -samefile f6
> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8
Para encontrar apenas o hardlink, podemos usar:
$ find . -xdev -samefile f6
> ./f6
> ./f7
> ./t2/f8
Como os hardlinks podem ser criados no mesmo sistema de arquivos, podemos pesquisar todos os hardlinks sem a -L
opção usada (com-xdev
opção) no mesmo sistema de arquivos / ponto de montagem. Ele salva a pesquisa desnecessária em diferentes pontos de montagem.
Portanto, pesquisar no hardlink é um pouco mais rápido do que pesquisar nos softlinks (retifique se estou errado ou não estou claro).
Links simbólicos atribuem outro nome a um arquivo, de maneira semelhante aos links físicos. Mas um arquivo pode ser excluído mesmo se houver links simbólicos restantes.
Meus dois centavos no uso:
Links flexíveis podem ser usados para encurtar nomes de caminhos longos, ou seja:
ln -s /long/folder/name/on/long/path/file.txt /short/file.txt
As alterações feitas /short/file.txt
serão aplicadas no arquivo original.
Os links físicos podem ser usados para mover arquivos grandes:
$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin
ln /myapp/dev/application.bin /myapp/prd/application.bin
A cópia instantânea para uma pasta diferente e o arquivo original (ativado /myapp/dev
) podem ser movidos ou excluídos, sem tocar no arquivo./myapp/prd
Acabei de encontrar uma maneira fácil de entender os links físicos em um cenário comum, a instalação de software.
Um dia, baixei um software para a pasta Downloads
para instalação. Depois disso sudo make install
, alguns executáveis foram cp
editados na pasta bin local. Aqui, cp
cria um link físico . Fiquei feliz com o software, mas logo percebi que Downloads
não é um bom lugar a longo prazo. Então mv
editei a pasta do software para o source
diretório. Bem, ainda posso executar o software como antes, sem me preocupar com nada relacionado ao link de destino, como no Windows. Isso significa que o hard link encontra o inode diretamente e outros arquivos.
Nesta resposta, quando digo um arquivo, quero dizer o local na memória
Todos os dados salvos são armazenados na memória usando uma estrutura de dados chamada inodes. Cada inode possui um número de inod. O número do inode é usado para acessar o inode. Todos os links físicos para um arquivo podem ter nomes diferentes, mas compartilhar o mesmo número de inode. Como todos os links físicos têm o mesmo número de código (que acessam o mesmo código), todos apontam para a mesma memória física.
Um link simbólico é um tipo especial de arquivo. Como também é um arquivo, ele terá um nome de arquivo e um número de inode. Como dito acima, o número do inode acessa um inode que aponta para dados. Agora, o que torna um link simbólico especial é que os inodenumbers nos links simbólicos acessam os inodes que apontam para "um caminho" para outro arquivo. Mais especificamente, o número do inode no link simbólico acede aos inodes que apontam para outro link físico.
quando estamos movendo, copiando e excluindo um arquivo na GUI, estamos jogando com os hardlinks do arquivo e não com a memória física. quando excluímos um arquivo, estamos excluindo o hardlink do arquivo. não estamos eliminando a memória física.Se todos os hardlinks do arquivo forem excluídos, não será possível acessar os dados armazenados, embora ainda possam estar presentes na memória