rsync falha inconsistentemente no hardlink

4

Eu tenho um script de backup que usa rsync -avz --link-dest=$oldbkp $source $newbkp em seu núcleo. O problema é que muitas vezes o rsync não reconhece que um arquivo em $source não foi alterado e, portanto, copia-o para $newbkp em vez de vinculá-lo a $oldbkp . Outra coisa desconcertante é que é inconsistente - existem alguns arquivos em que o hardlinking funciona como esperado. A partição de backup é ntfs.

Como você pode ver aqui, um backup de apenas uma hora depois do anterior leva 2 GB de novos dados quando o conteúdo praticamente não muda (este é o meu PC em casa).

$ du -hsc 20170424-1559 20170424-1724
2.6G    20170424-1559
2.1G    20170424-1724
4.6G    total

Eu tentei stat ing alguns exemplos. Este é um hardlink falho (sha256 é o mesmo para todos):

$ stat 20170424-1559/Documents/depeche 
  File: 20170424-1559/Documents/depeche
  Size: 21400           Blocks: 48         IO Block: 4096   regular file
Device: 811h/2065d      Inode: 140380      Links: 1
Access: (0777/-rwxrwxrwx)  Uid: ( 1000/   marek)   Gid: ( 1000/   marek)
Access: 2017-04-24 17:14:00.271104500 +0200
Modify: 2016-08-01 16:30:38.000000000 +0200
Change: 2017-04-24 15:59:44.407252700 +0200
 Birth: -

$ stat 20170424-1724/Documents/depeche 
  File: 20170424-1724/Documents/depeche
  Size: 21400           Blocks: 48         IO Block: 4096   regular file
Device: 811h/2065d      Inode: 361117      Links: 1
Access: (0777/-rwxrwxrwx)  Uid: ( 1000/   marek)   Gid: ( 1000/   marek)
Access: 2017-04-24 17:24:55.732080500 +0200
Modify: 2016-08-01 16:30:38.000000000 +0200
Change: 2017-04-24 17:24:55.736274500 +0200
 Birth: -

$ stat ~/Documents/depeche
  File: /home/marek/Documents/depeche
  Size: 21400           Blocks: 48         IO Block: 4096   regular file
Device: 2ah/42d Inode: 4397        Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   marek)   Gid: ( 1000/   marek)
Access: 2017-03-07 09:51:07.681090473 +0100
Modify: 2016-08-01 16:30:38.000000000 +0200
Change: 2016-11-06 19:58:14.053859011 +0100
 Birth: -

Este é um hardlink de sucesso (o sha256 é o mesmo):

$ stat 20170424-1559/Documents/ios7bkplist.txt 
  File: 20170424-1559/Documents/ios7bkplist.txt
  Size: 1983            Blocks: 8          IO Block: 4096   regular file
Device: 811h/2065d      Inode: 344437      Links: 4
Access: (0777/-rwxrwxrwx)  Uid: ( 1000/   marek)   Gid: ( 1000/   marek)
Access: 2017-04-24 15:59:44.574850700 +0200
Modify: 2016-04-04 22:03:55.000000000 +0200
Change: 2017-04-24 17:24:56.022250400 +0200
 Birth: -

$ stat 20170424-1724/Documents/ios7bkplist.txt 
  File: 20170424-1724/Documents/ios7bkplist.txt
  Size: 1983            Blocks: 8          IO Block: 4096   regular file
Device: 811h/2065d      Inode: 344437      Links: 4
Access: (0777/-rwxrwxrwx)  Uid: ( 1000/   marek)   Gid: ( 1000/   marek)
Access: 2017-04-24 15:59:44.574850700 +0200
Modify: 2016-04-04 22:03:55.000000000 +0200
Change: 2017-04-24 17:24:56.022250400 +0200
 Birth: -

$ stat ~/Documents/ios7bkplist.txt            
  File: /home/marek/Documents/ios7bkplist.txt
  Size: 1983            Blocks: 8          IO Block: 4096   regular file
Device: 2ah/42d Inode: 4413        Links: 1
Access: (0777/-rwxrwxrwx)  Uid: ( 1000/   marek)   Gid: ( 1000/   marek)
Access: 2017-02-28 20:03:32.858085513 +0100
Modify: 2016-04-04 22:03:55.000000000 +0200
Change: 2016-11-06 19:58:14.550522987 +0100
 Birth: -

Basicamente, a mesma coisa acontece quando eu uso o -c com o rsync para forçar a verificação de arquivos longos.

Existe algo que eu esteja negligenciando?

    
por JonnyRobbie 24.04.2017 / 18:18

1 resposta

3

O problema é o seguinte (de man rsync ):

... The files must be identical in all preserved attributes (e.g. permissions, possibly ownership) in order for the files to be linked together.

No seu caso, as permissões dos arquivos são (de seus exemplos)

Access: (0644/-rw-r--r--) # hardlink failed (original)
Access: (0777/-rwxrwxrwx) # hardlink failed (backup)

Access: (0777/-rwxrwxrwx) # hardlink created (original)
Access: (0777/-rwxrwxrwx) # hardlink created (backup)

Por exemplo

$ chmod 777 A/file
$ rsync -az A/ B/
$ chmod 644 A/file
$ rsync -az --link-dest=$PWD/B/ A/ C/

resulta em

$ du -hsc A B C
965M    A
965M    B
965M    C
2.9G    total

enquanto, redefinir as permissões para o original, resulta em

$ chmod 777 A/file
$ rsync -az --link-dest=$PWD/B/ A/ D/
$ du -hsc A B D
965M    A
965M    B
4.0K    D
1.9G    total

Você pode tentar com algum arquivo para fazê-lo funcionar (acho que com --size-only , que deve pular arquivos de tamanho igual).

O que você deve fazer é tentar descobrir se você alterou as permissões após o último backup ou, em caso negativo, por que as permissões foram alteradas no diretório de backup.

    
por 24.04.2017 / 20:22