bash forçar a cópia sobre o mesmo arquivo

7

Nosso sysadmin criou um sistema de backup que cria instantâneos do disco rígido.

Quando tento restaurar uma versão mais antiga do instantâneo:

cp /path/to/snapshots/foo.bar /path/to/folder/foo.bar

Eu recebo um erro:

cp: '/path/to/snapshots/foo.bar' and  '/path/to/folder/foo.bar' are the same file. 

Eu posso deletar o arquivo e copiá-lo, mas eu queria saber se existe uma maneira de fazer isso com o cp.

Eu sei que os arquivos não estão vinculados porque:

  1. Eu posso alterar o conteúdo da fonte e os instantâneos são mantidos inalterados (testados)
  2. eu posso excluir a fonte e os instantâneos estão lá para restaurar (testado)
  3. Os arquivos são armazenados no cluster de computação da universidade. Se algo assim fosse verdade, alguém já teria sido demitido (ou pelo menos gritado).

No entanto, o número inode dos arquivos é o mesmo

O cluster é implementado sobre o red hat linux e não sei o que é o sistema de arquivos

resultado df:

Filesystem           1K-blocks      Used Available Use% Mounted on
<ipadress>:/vol/hpc/storage
                      67633152  67633152         0 100% /storage
<ipadress>:/vol/hpc/storage
                     2186805248 982498048 1204307200  45% /storage

resultado do stat:

  File: '/path/to/snapshots/foo.bar'
  Size: 404         Blocks: 8          IO Block: 4096   regular file
Device: 17h/23d Inode: 19750461    Links: 1
Access: (0644/-rw-r--r--)  Uid: (<num1>/  yotama9)   Gid: ( <num2>/ <groupname>)
Access: 2012-01-22 00:03:27.246852000 +0200
Modify: 2012-01-19 23:10:32.746397000 +0200
Change: 2012-01-19 23:10:32.746397000 +0200
  File: '/path/to/folder/foo.bar'
  Size: 404         Blocks: 8          IO Block: 4096   regular file
Device: 17h/23d Inode: 26335134    Links: 1
Access: (0644/-rw-r--r--)  Uid: (<num1>/  yotama9)   Gid: ( <num2>/ <groupname>)
Access: 2012-01-24 16:03:48.732453000 +0200
Modify: 2012-01-24 16:03:30.728900000 +0200
Change: 2012-01-24 16:03:30.728900000 +0200
    
por Yotam 24.01.2012 / 14:59

1 resposta

4

Normalmente, as implementações do sistema de arquivos devem garantir aos programas aplicativos que a qualquer momento em uma determinada máquina, cada arquivo pode ser identificado exclusivamente pela combinação de seu ID de dispositivo (o campo st_dev no stat structure ) e seu inode (o campo st_ino ). O ID do dispositivo indica em qual sistema de arquivos montado o arquivo está e o inode caracteriza um arquivo dentro de um determinado sistema de arquivos. cp considera dois arquivos idênticos se tiverem o mesmo ID de dispositivo e o mesmo inode.

É possível ter mais de um par (ID de dispositivo, inode) para um arquivo, se ele for acessado por meio de diferentes meios, por exemplo, uma montagem NFS para localhost (tais cenários tendem a ser exóticos).

Não deve ser possível que arquivos diferentes tenham os mesmos pares (ID do dispositivo, inode). No entanto, isso depende da implementação do sistema de arquivos. Se você puder alterar o conteúdo da fonte sem alterar o snapshot, esperaria que o snapshot exibisse um ID de dispositivo diferente da fonte, mas é possível que algumas implementações não façam isso.

Observe que, além de alterar o arquivo, seus testes não provam nada. A exclusão de um link físico não exclui os outros nomes do arquivo. Copiar arquivos apenas sob demanda é comum para os instantâneos, portanto, não seria anormal se o arquivo no instantâneo fosse exatamente o mesmo que o arquivo fora do instantâneo, desde que o conteúdo do arquivo permaneça idêntico. O número do inode normalmente permanecerá o mesmo.

Quando você alterar o arquivo, verifique se está gravando no mesmo arquivo e não removendo um arquivo e imediatamente após criar outro arquivo com o mesmo nome.

Se você tiver dois arquivos diferentes (o instantâneo e a origem) com o mesmo ID de dispositivo e o mesmo inode, mas conteúdos diferentes, a maioria dos aplicativos acreditará que são os mesmos. Você terá que encontrar uma maneira de testar a igualdade de arquivos que depende da tecnologia de snapshots, ou então verificar o conteúdo de ambos os lados ou remover sistematicamente o alvo.

    
por 24.01.2012 / 20:11