AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 768504
Accepted
Rahul Sharma
Rahul Sharma
Asked: 2024-02-03 15:00:41 +0800 CST2024-02-03 15:00:41 +0800 CST 2024-02-03 15:00:41 +0800 CST

Por que o link físico não corrompe se removermos o arquivo original? [duplicado]

  • 772
Esta pergunta já tem respostas aqui :
O que acontece quando você exclui um link físico? (3 respostas)
Fechado há 5 horas .
Esta questão foi migrada do Server Fault porque pode ser respondida no Unix e Linux Stack Exchange. Migrado há 9 horas .

Por que o link físico não corrompe se removermos o arquivo original? Se eu remover o arquivo original, o softlink ficará corrompido, mas o hard link não, então por que não corrompe

linux
  • 3 3 respostas
  • 51 Views

3 respostas

  • Voted
  1. Jörg W Mittag
    2024-02-04T01:07:15+08:002024-02-04T01:07:15+08:00

    Você parece não entender o que é um hardlink e um arquivo no Unix.

    A base de um sistema de arquivos Unix são os arquivos . Um arquivo é um bytestream anônimo não estruturado. Um arquivo não tem nome . Ele possui apenas um número de série do arquivo , basicamente um identificador exclusivo (para aquele sistema de arquivos). (O número de série do arquivo às vezes é chamado de inode )

    Existem vários tipos diferentes de arquivos especiais padronizados pelo POSIX :

    • arquivos especiais do dispositivo (que são divididos em)
      • arquivos especiais de dispositivos de caracteres
      • bloquear arquivos especiais
    • Arquivos especiais FIFO (pipes nomeados)
    • arquivos especiais de soquete
    • arquivos especiais de diretório
    • arquivos especiais de links simbólicos

    Os sistemas operacionais podem adicionar seus próprios tipos de arquivos especiais, por exemplo, o Solaris possui portas .

    Arquivos de dispositivos são usados ​​para fornecer uma interface para interação com dispositivos, por exemplo, tradicionalmente /dev/sdapara interagir com o primeiro disco rígido. Os arquivos especiais FIFO funcionam como shell pipes, mas como possuem um nome, os dois processos de leitura e gravação podem ser iniciados em momentos diferentes e em contextos de segurança diferentes. Os soquetes permitem comunicação entre processos semelhante a um soquete de rede, mas apenas na máquina local.

    Agora chegamos aos dois tipos de arquivos especiais que são relevantes para sua pergunta: diretórios e links simbólicos.

    Na verdade, um arquivo especial de diretório funciona de maneira muito semelhante a um diretório da vida real. Por exemplo, pense em uma lista telefônica: ela lista os nomes das pessoas junto com seus números de telefone. Isso é exatamente o que um diretório faz em um sistema de arquivos Unix: ele lista os nomes dos arquivos e seus números de série.

    Esse emparelhamento de nome e número de série do arquivo é o que chamamos de hardlink (ou apenas link ) .

    Quando você "exclui um arquivo" no Unix usando o rmutilitário , na verdade não está "excluindo o arquivo". Você está removendo a entrada desse nome do diretório , ou seja, está removendo o hardlink , não o arquivo. Isso é chamado de desvinculação e, na verdade, a função da biblioteca POSIX usada por rmé chamada unlink.

    Então, quando você faz algo como

    touch foo
    

    Você não criou um arquivo chamado foo. Você criou um arquivo sem nome, mas com algum número de série de arquivo específico e adicionou uma entrada de diretório ao diretório atual que vincula o nome fooao número de série do arquivo que você acabou de criar.

    Agora, quando você usa o lnutilitário para criar um segundo hardlink:

    ln foo bar
    

    você criou uma segunda entrada de diretório no diretório atual que vincula o nome barao mesmo número de série do arquivo ao qual fooestá vinculado.

    É importante perceber que nenhum desses dois links é especial. Eles são exatamente os mesmos.

    Se você desvincular agora foo:

    rm foo
    

    Tudo o que você fez foi remover a entrada do diretório que vincula o nome fooao número de série do arquivo. Você não removeu o arquivo. Portanto, você ainda pode acessar o arquivo usando o nome, barjá que esta entrada de diretório não foi alterada.

    Na verdade, você não pode excluir arquivos no Unix. Você só pode remover links. O próprio sistema de arquivos removerá o arquivo quando ele não tiver mais links apontando para ele e não estiver mais aberto.

    Um link simbólico , entretanto, é um arquivo especial que contém um caminho . Ou seja, quando você faz

    ln -s /path/to/quux baz
    

    Você está literalmente escrevendo a string /path/to/quuxno arquivo. Mais precisamente, você está criando um arquivo especial de link simbólico com o conteúdo /path/to/quux e está criando uma entrada de diretório no diretório atual que vincula o nome bazao número de série do arquivo que você acabou de criar.

    Na verdade, não importa se é /path/to/quuxresolvido para um número de série de arquivo ou não. Na verdade, existem programas que usam isso para algumas configurações inteligentes. Por exemplo, os servidores web fnord e gatling usam links simbólicos para representar redirecionamentos HTTP, então quando você faz isso:

    ln -s https://www.google.com/ /var/www/search.html
    

    Em seguida, navegar para http://mydomain/search.htmlirá redirecioná-lo para https://www.google.com/.

    Então, resumindo:

    Por que o hardlink não corrompe se removermos o arquivo original?

    Porque você não removeu o arquivo original. Você removeu apenas um dos vários links. O arquivo não está mais acessível usando esse nome específico, mas ainda existe e pode ser acessado usando outros nomes.

    se eu remover o arquivo original, o sorflink ficará corrompido

    Novamente, você não está removendo o arquivo original. Você está removendo o nome . Mas o link simbólico aponta para o nome e não para o arquivo. Portanto, o link simbólico agora aponta para um nome que não pode mais ser resolvido para um arquivo.


    Sidenote: Você deve ter notado algo interessante: os diretórios fornecem um mapeamento de nomes para arquivos. Mas os diretórios também são arquivos. Portanto, os diretórios também fornecem automaticamente um mapeamento de nomes para diretórios.

    Em outras palavras: diretórios podem ser aninhados arbitrariamente no Unix!

    Isso pode não parecer muito interessante hoje em dia, já que todo sistema de arquivos amplamente utilizado permite hierarquias aninhadas que são arbitrariamente profundas. Mas não foi esse o caso quando o Unix foi criado há quase 60 anos. Vários sistemas de arquivos na época não tinham diretórios ou tinham um nível fixo de aninhamento (por exemplo, 2 níveis).

    Tornar os diretórios arquivos especiais fornece um sistema de arquivos hierárquico gratuitamente, sem a necessidade de adicionar nenhuma construção especial. Este é um design muito elegante.

    • 13
  2. Best Answer
    Danila Vershinin
    2024-02-03T15:32:59+08:002024-02-03T15:32:59+08:00

    Isso ocorre porque os hardlinks são essencialmente referências ao mesmo arquivo e não existe um arquivo "original" em termos de hardlinks. Eles apontam para a mesma estrutura de dados no disco (o inode que contém próximo a todos os metadados do arquivo).

    Enquanto os softlinks apontam para o nome do arquivo e não para a estrutura de dados que descreve o arquivo.

    • 10
  3. shodanshok
    2024-02-03T22:28:14+08:002024-02-03T22:28:14+08:00

    No Linux, o que identifica exclusivamente um arquivo em todo o sistema de arquivos é o inodenúmero. Isso nada mais é do que um ID numérico, garantido como único em todo o sistema de arquivos (nota: inodespode ser reciclado, mas não há dois arquivos "ativos" que possam ter o mesmo inodeno mesmo sistema de arquivos).

    Um nome de arquivo nada mais é do que uma "etiqueta de conveniência" anexada a ele inodedentro de um diretório específico. Fazer hardlink de um arquivo nada mais é do que adicionar outro nome conveniente, dentro do mesmo diretório ou de um diretório diferente (no primeiro caso, o novo hardlink deve ter um nome diferente).

    Você pode ver o inodenúmero via ls -i. Por exemplo:

    # ls -alni
    total 4
     68329917 drwxr-xr-x.  2 1000 1000   37 Feb  3 15:25 .
    101396179 drwx------. 25 1000 1000 4096 Feb  3 15:24 ..
     68329918 -rw-r--r--.  2 1000 1000    0 Feb  3 15:25 test.txt
     68329918 -rw-r--r--.  2 1000 1000    0 Feb  3 15:25 zzz.txt
    

    Observe como zzz.txte test.txt, tendo o mesmo inodenúmero, são realmente o mesmo arquivo - referenciado por dois nomes diferentes. A remoção de apenas um desses dois nomes não remove (desvincula) realmente o nome inodedo sistema de arquivos, deixando o outro inalterado.

    Um soft link é uma coisa completamente diferente - não é um link real para o original inode, mas sim um pequeno arquivo especial (com seu próprio diferente inode) apontando para o caminho/nome do arquivo original . A remoção do arquivo original deixa um ponteiro quebrado ("corrompido") para trás.

    • 4

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve