'cp -al' snapshot cujos hard links são direcionados para um novo arquivo quando editado

11

Estou tentando tirar instantâneos de uma pasta enorme regularmente.

Eu li aqui: link
que cp -al tira um instantâneo de uma pasta simplesmente copiando os links físicos.

Tudo isso é ótimo, mas o problema é que, nesse instantâneo, se eu alterar um arquivo, ele será alterado em todos os instantâneos. O que eu gostaria, em vez disso, é fazer com que o sistema crie um novo arquivo na mudança e vinculá-lo a isso. Dessa forma, cada instantâneo não se tornaria inválido em uma edição do primeiro arquivo.

Como posso conseguir isso?

p.s. Eu tentei rsync -a --delete --link-dest=../backup.1 source_directory/ backup.0/ , mas tem o mesmo problema.

    
por Hermann Ingjaldsson 29.03.2013 / 18:29

4 respostas

7

É assim que os hardlinks funcionam. Mas existem maneiras de contornar isso:

Algumas opções vêm à mente:

  • Use um sistema de arquivos com suporte para arquivos de cópia na gravação, como btrfs . Claro, se você usasse o btrfs, usaria apenas seus snapshots nativos ... Se o seu sistema de arquivos suportar, você pode usar cp --reflink=always . Infelizmente, o ext4 não suporta isso.
  • Apenas compartilhe hardlinks em seus instantâneos, não com o original. Ou seja, a primeira vez que você vê uma determinada versão de um arquivo, copie-a para o instantâneo. Mas da próxima vez, vincule-o ao instantâneo anterior. (Não tenho certeza de qual programa eu usei para fazer isso - há uma década - mas a pesquisa mostra o dirvish, obnam, storebackup e rsnapshot)
  • Dependendo de como seus arquivos estão sendo alterados, você pode garantir que uma gravação temp / renomear seja usada para alterá-los, o que interromperá o hardlink - para que a versão no instantâneo permaneça intacta. Isso é menos seguro, pois os bugs podem corromper seu instantâneo.
  • Tire instantâneos do LVM de todo o sistema de arquivos.

Claro, existe outra opção - use um sistema de backup adequado. A maioria deles consegue apenas fazer o backup de arquivos alterados.

    
por 29.03.2013 / 20:24
4

O que você está procurando é uma forma de copy-on-write , onde vários arquivos que possuem o mesmo conteúdo usam o mesmo espaço no disco até que um deles seja modificado. Os hard links apenas implementam copy-on-write se o aplicativo que faz a escrita excluir o arquivo e criar um novo arquivo com o mesmo nome (o que normalmente é feito criando um novo arquivo com um nome diferente e, em seguida, movendo-o para o lugar). O aplicativo que você está usando, evidentemente, não está fazendo isso: está sobrescrevendo o arquivo existente.

Alguns aplicativos podem ser configurados para usar a estratégia de substituição. Alguns aplicativos usam a estratégia de substituição por padrão, mas usam a estratégia de substituição quando veem um arquivo com vários links físicos, precisamente para não violar os links físicos. Sua técnica de instantâneo atual funcionará se você puder configurar seu aplicativo para substituir em vez de sobrescrever.

O Fl-cow modifica os programas para usar sistematicamente a estratégia de substituição em arquivos com vários links físicos.

Como alternativa, você pode armazenar seus arquivos em um sistema de arquivos que executa cópia na gravação ou desduplicação, ou possui um recurso de instantâneo e não se preocupa com hard links: Btrfs ou Zfs . Dependendo do esquema de particionamento, o uso de instantâneos do LVM pode ser uma opção.

Minha recomendação é usar uma ferramenta de instantâneo adequada. Fazer backups confiáveis é surpreendentemente difícil. Você provavelmente quer rsnapshot .

    
por 30.03.2013 / 00:56
2

O seguinte é um script ruby que eu escrevi que envolve o "cp -al" e o rsync em um script legal que pode ser executado manualmente ou via cron. O destino pode ser local ou remoto (via ssh):

Timemachine do gueto

A resposta básica à sua pergunta, conforme mencionado em um comentário anterior, precisa ser mantida separada dos links físicos. Ex, assuma um backup diário do seu diretório pessoal:

Fonte:

  • / home / flakrat

Destino:

  • / data / backup / daily
    • / segunda-feira
    • / terça-feira
    • / quarta-feira
    • / quinta-feira
    • ...

Os hard links são criados executando "cp -al" contra o backup de ontem. Diga que é terça-feira de manhã quando você o executa:

cd /data/backup/daily

rm -rf tuesday

cp -al monday tuesday

rsync -a --delete /home/flakrat /data/backup/daily/tuesday/

Espero que isso ajude, Mike

    
por 15.08.2013 / 19:55
0

rdiff-backup parece fazer o que você quer, confira.

Usando o rsync, primeiro você deve fazer um backup completo sem usar hard links. O próximo backup pode apontar para o backup anterior e link físico para ele. Dessa forma, seus backups não são vinculados a seus arquivos de trabalho (aqueles que você está modificando). Exemplo. Se o meu backup anterior fosse assim, backup de pasta.01, meu script de backup primeiro incrementaria as pastas renomeando-as em uma para que o backup.01 se tornasse o backup.02. Em seguida, o script cria uma nova pasta vazia chamada backup.01. Em seguida, ele rscync o novo backup na nova pasta e o link físico para backup.02, de forma que apenas novos arquivos ocupem espaço no backup. O comando rsync seria algo parecido com isto: rsync -rlt sourcepath backuppath / backup.01 - link-dest = backuppath / backup.02

Então, você pode ver que toda a vinculação está ocorrendo no caminho de backup. Dessa forma, você não precisa se preocupar com a cópia na gravação ao modificar arquivos no caminho de origem.

    
por 28.05.2015 / 15:00