rsync が一貫してハードリンクに失敗する

rsync が一貫してハードリンクに失敗する

をコアとして使用するバックアップ スクリプトがありますrsync -avz --link-dest=$oldbkp $source $newbkp。問題は、rsync が 内のファイルが$source変更されていないことを認識しないことが多く、$newbkpからハードリンクするのではなく、 に単純にコピーしてしまう$oldbkpことです。もう 1 つの困惑する点は、一貫性がないことです。ハードリンクが期待どおりに機能するファイルがいくつかあります。バックアップ パーティションは ntfs です。

ここでわかるように、前回のバックアップからわずか 1 時間後に、コンテンツがほとんど変更されていないにもかかわらず、2 GB の新しいデータが丸々 1 つ取得されます (これは私の自宅の PC です)。

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

いくつかの例を試してみましたstat。これは失敗したハードリンクです (sha256 はすべて同じです)。

$ 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: -

これは成功したハードリンクです (sha256 は同じです):

$ 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: -

-c基本的に、rsync を使用して長いファイルのチェックを強制する場合も同じことが起こります。

何か見落としている点はありますか?

答え1

問題は次のとおりです ( よりman rsync):

...ファイルは保存されたすべての属性において同一である必要があります(例:権限、所有権の可能性) を追加して、ファイルをリンクします。

あなたの場合、ファイルの権限は(あなたの例から)

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)

例えば

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

結果的に

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

一方、権限を元に戻した場合、

$ 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

これを動作させるには、いくつかのファイルで試すことができます ( を使用すると--size-only、同じサイズのファイルをスキップするはずです)。

行うべきことは、最後のバックアップ後に権限を変更したかどうか、または変更していない場合はバックアップ ディレクトリで権限が変更された理由を把握することです。

関連情報