Vincular 2 arquivos existentes

3

Eu tenho dois arquivos existentes: abcd e xyz .

$ cat abcd
abcd 
$ cat xyz
xyz

Agora, quando tento fazer o softlink desses arquivos, recebo esta mensagem:

ln: cannot create xyz: File exists

Eu não quero usar

ln -sf abcd xyz
O comando

irá sobrescrever o conteúdo de xyz com o de abcd .

O que eu quero é: os dois abcd e xyz devem exibir o conteúdo original depois que eles forem desvinculados.

Ou, em outras palavras, quero apenas vincular temporariamente esses dois arquivos.

Por favor, sugira se existe alguma outra solução para isso além do link soft / hard como usar o mount, etc.

Editar: estou usando Solaris OS , que não tem entrada manual para comandos como mount --bind , mount -B , bindfs , fusermount , etc

Além disso, tentei usar: mount -o bind abcd xyz e deu a seguinte mensagem: cannot open /etc/vfstab . Eu verifiquei e descobri que /etc/vfstab estava tendo apenas Root de acesso.

    
por Raid_Master 10.06.2017 / 17:02

5 respostas

17

Não é isso que ln pretende fazer. ln cria um link físico de um arquivo existente, ou seja, duas (ou mais) entradas de diretório que apontam para o mesmo arquivo no disco. Os arquivos vinculados funcionam de forma que a edição de um afeta todos.

A funcionalidade que você deseja não é algo nativo do Unix (vincule os arquivos para que eles apareçam como um e para que possam ser desvinculados posteriormente). O Linux , no entanto, implementou algo chamado bind building, permitindo que um arquivo ou diretório fosse montado sobre outro (arquivos no topo de arquivos e diretórios no topo de diretórios).

Solução proposta: Se você quiser que um arquivo seja "temporariamente" outro, use a montagem de ligação ( mount -B file1 file2 ). Isso montará file1 na parte superior de file2 . Depois de desmontar isso mais tarde, os dois arquivos serão mostrados novamente como eles existem originalmente.

# echo A >A

# echo B >B

# mount -B A B

# cat A
A

# cat B
A

# umount B

# cat A
A

# cat B
B

Se você esperava que os arquivos "vinculados" fossem exibidos como uma concatenação de ambos, você terá que criar um terceiro arquivo e removê-lo depois.

    
por 10.06.2017 / 17:37
6

Este comando:

ln -sf abcd xyz

não sobrescreve o conteúdo de xyz com o de abcd , como você pensa. Um link simbólico não é um arquivo, portanto não contém conteúdo.

Se você quiser vincular temporariamente xyz a abcd sem perder seu conteúdo, é necessário armazenar o conteúdo de alguma forma.

  • Você pode copiar o conteúdo para um arquivo temporário. Eu acho que nenhuma ilustração para isso é necessária.
  • Você também pode usar a memória, que é armazenar o conteúdo em uma variável.
  • Você pode usar um link físico.

Agora eu vou demonstrar o último. Você tem abcd e xyz , conforme explicado na sua pergunta.

  1. Link de hardware xyz com zyx , para que o conteúdo seja mantido em zyx , permitindo manipular xyz .

    $ ln xyz zyx
    

    Neste ponto, xyz e zyx são dois links físicos do inode contendo os dados xyz , conforme descrito na sua pergunta. Você pode verificar isso com:

    $ cat zyx
    xyz
    
  2. Agora que o zyx está em vigor, você pode forçar a reconexão de xyz a abcd .

    $ ln -sf abcd xyz
    

    zyx ainda mantém os caracteres xyz . Você pode verificar isso com:

    $ cat zyx
    xyz
    

    Enquanto xyz está agora com link para abcd . Para verificar, execute isto:

    $ cat xyz
    abcd
    
  3. Quando desejar restaurar o estado inicial, revincule xyz do conteúdo original. Isto é, volte a ligá-lo ao inode original.

    $ ln -f zyx xyz
    

    Para verificar se funciona:

    $ cat xyz
    xyz
    

    E agora você pode desvincular o link adicional zyx com:

    $ rm zyx
    

    Ou mantenha-o para operações futuras. De qualquer forma, xyz ainda contém o que ele fez no começo.

    $ rm zyx
    $ cat xyz
    xyz
    
por 10.06.2017 / 17:32
2

both abcd and xyz should display their original content once they are unlinked

Então, o que você quer não é um link. Se dois arquivos estiverem vinculados, eles terão o mesmo conteúdo. Mais precisamente, duas entradas de diretório são vinculadas se elas apontarem para o mesmo arquivo. Desvincular um arquivo não deixa dois arquivos: desvincular uma entrada de diretório significa remover essa entrada de diretório (a chamada do sistema para remover um arquivo é chamada de unlink ).

Não há recurso geral para sombrear um arquivo com outro arquivo. Você pode usar o sistema de arquivos bindfs para sombrear um diretório com outro diretório. Para sombrear o diretório xyz com o diretório abcd , execute

bindfs -n -o nonempty xyz abcd

Depois disso, o conteúdo antigo de abcd fica oculto e o acesso a abcd acessa xyz . O Bindfs é um sistema de arquivos FUSE que cria um vincule a montagem . Para desfazer o sombreamento e ver o conteúdo original de abcd , desmonte o sistema de arquivos:

fusermount -u abcd

Observe que a montagem de um sistema de arquivos não altera o que está armazenado no disco. O sombreamento é limitado à sua máquina e dura apenas até a próxima reinicialização. Se você quiser que o sombreamento dure, adicione essa montagem à lista de itens a serem montados no momento da inicialização ( /etc/fstab ). Mas se você quiser que o sombreamento dure, a montagem provavelmente não é a abordagem correta: em vez disso, basta mover o arquivo e criar um link simbólico

mv abcd abcd.orig
ln -s xyz abcd

e para voltar, remova o link simbólico e mova de volta o arquivo original

rm abcd
mv abcd.orig abcd
    
por 11.06.2017 / 01:28
2

No Linux, como uma alternativa para vincular a montagem, você também pode usar a montagem de sobreposição para vincular um arquivo a outro temporariamente. A vantagem de uma sobreposição é que você pode alterar a sobreposição sem precisar de privilégios de root, ao contrário de bind mount, que exigirá privilégios de root para sombrear e desfazer a sombra dos arquivos.

Demonstração:

Crie uma partição de teste com alguns arquivos de teste (observe que você precisa do root para criar um ponto de montagem que não esteja listado em / etc / fstab, mas não precisará do root para nenhuma das outras etapas):

$ mkdir one two work mpnt
$ sudo mount -t overlay none -olowerdir=one,upperdir=two,workdir=work mpnt
$ echo "hello world" > one/abcd
$ echo "another" > one/xyz

Criamos os arquivos de teste na pasta one acima, esses arquivos também são visíveis no ponto de montagem mpnt .

$ ls -lh mpnt
total 8.0K
-rw-r--r-- 1 lieryan lieryan 12 Jun 11 03:33 abcd
-rw-r--r-- 1 lieryan lieryan  8 Jun 11 03:33 xyz

Vamos modificar os arquivos no mpnt:

$ ln -sf abcd mpnt/xyz 

Modificamos o mpnt / xyz acima para ser um link simbólico, mas o overlayfs redireciona todas as gravações para o mpnt para o upperdir, então o link simbólico que criamos é gravado em two , podemos ver o link simbólico na pasta two também como mpnt :

$ ls -lh two
total 0
lrwxrwxrwx 1 lieryan lieryan 4 Jun 11 03:34 xyz -> abcd
$ ls -lh mpnt
total 4.0K
-rw-r--r-- 1 lieryan lieryan 12 Jun 11 03:33 abcd
lrwxrwxrwx 1 lieryan lieryan  4 Jun 11 03:34 xyz -> abcd

O link simbólico funciona como esperado quando usado em mpnt :

$ cat mpnt/xyz
hello world

Se excluirmos algo do mpnt, o overlayfs também redirecionará a gravação para o upperdir:

$ rm mpnt/xyz

Nesse caso, no entanto, o overlayfs cria um arquivo de dispositivo de caractere especial (observe o atributo c), chamado de arquivo whiteout. Quando o overlayfs vê esse tipo de arquivo no upperdir, o overlayfs finge que o arquivo não existe em mpnt :

$ ls -lh mpnt 
total 4.0K
-rw-r--r-- 1 lieryan lieryan 12 Jun 11 03:33 abcd
$ ls -lh two
total 4.0K
c--------- 1 lieryan lieryan 12 Jun 11 03:33 xyz

Podemos remover o arquivo de caractere especial do upperdir para restaurar xyz de lowerdir:

$ rm two/xyz  # delete the "whiteout" file
rm: remove write-protected character special file 'two/xyz'? y

Agora, xyz é visível novamente no mpnt e tem o mesmo conteúdo de arquivo que um / xyz.

$ ls -lh mpnt 
total 8.0K
-rw-r--r-- 1 lieryan lieryan 12 Jun 11 03:33 abcd
-rw-r--r-- 1 lieryan lieryan  8 Jun 11 03:33 xyz
$ cat mpnt/xyz
another
    
por 10.06.2017 / 19:23
1

Tanto quanto eu entendo você, você deseja vincular dois arquivos, mas você não quer perder os dados em ambos os arquivos. Você marcou sua postagem com o Solaris, então suponho que você use esse sistema operacional. Portanto, referir-se a funcionalidades de outros sistemas operacionais não parece ser útil. Esta resposta assume que você está usando um ou mais conjuntos de dados zfs para os dados.

Você poderia simplesmente fazer um instantâneo zfs do seu sistema de arquivos onde você quer colocar o link ao invés do arquivo, fazer o ln -sf abcd xyz, fazer o que você quiser com ele e depois retroceder

root@solaris:/rpool# zfs create rpool/filesystem1
root@solaris:/rpool# mkfile 1k /rpool/filesystem1/file1
root@solaris:/rpool# mkfile 1k /rpool/filesystem1/file2
root@solaris:/rpool# ls -l /rpool/filesystem1
total 2
-rw-------   1 root     root        1024 Jun  8 20:33 file1 .  
-rw-------   1 root     root        1024 Jun  8 20:33 file2
root@solaris:/rpool# zfs snapshot rpool/filesystem1@withtwofiles
root@solaris:/rpool# rm /rpool/filesystem1/file2
root@solaris:/rpool# ln -s /rpool/filesystem1/file1 /rpool/filesystem1/file1
root@solaris:/rpool# ls -l /rpool/filesystem1
total 4
-rw-------   1 root     root        1024 Jun  8 20:33 file1
lrwxrwxrwx   1 root     root          24 Jun  8 20:33 file2 -> /rpool/filesystem1/file1
root@solaris:/rpool# zfs rollback rpool/filesystem1@withtwofiles
root@solaris:/rpool# ls -l /rpool/filesystem1
total 6
-rw-------   1 root     root        1024 Jun  8 20:33 file1
-rw-------   1 root     root        1024 Jun  8 20:33 file2
root@solaris:/rpool# 

Em vez de desvincular, basta reverter o sistema de arquivos com o link

    
por 11.06.2017 / 08:26