

**実行環境:**  
CentOS 7.3

rsyncで増分のみをバックアップし世代管理をしたいと思っています。

下記のようにバックアップをしようと計画しています。

[code]

    Base(バックアップ対象全量)
    |
    L01 (変更のあったファイルのみバックアップ)
    L02 (変更のあったファイルのみバックアップ)
    ・
    ・
    ・
    L07 (変更のあったファイルのみバックアップ)
    
[/code]

例えば全量のbaseディレクトリ（保存先ディレクトリ）にはバックアップ内容が以下

hoge01.txt  
hoge02.txt  
hoge03.txt  
01にはhoge04.txtの存在する(01にはbaseは存在しない構成)  
02にはhoge0.txt5の存在する(02には01及びbaseは存在しない構成)

### 発生している問題

`rsync -av --link-dest` で試していますが、

[code]

    hoge01.txt
    hoge02.txt
    hoge03.txt
    hoge04.txt
    hoge0.txt5
    
[/code]

となってしまう意図した挙動になりません。

要するに世代管理をしたいので、上記のようにバックアップされるとディスクの容量がたりなくなってしまいます。

rsyncで増分のみをバックアップすることは可能なにでしょうか？

もし可能であれば、オプションを教えて頂けないでしょうか  
また、rsyncでバックアップ実現できないのであれば、代替手段はありますでしょうか？

ご教示お願いいたします。


CC BY-SA 4.0
2021-06-11T07:32:37.853
77480
2021-06-14T14:24:11.503
2021-06-11T07:43:27.140
3060
46812
question
centos rsync
rsyncで増分のみでバックアップをしたい


"rsync 増分" で web 検索すると、例えば以下のページがヒットします。

[rsyncだけで実現する！ファイルのバックアップ手法6選 【コマンド例編】](https://hackers-high.com/linux/rsync-
backup-part2/#i-10)

> ### 増分バックアップ（世代管理あり）
>
> `–link-dest` が常に1つ前のバックアップを指すようにスクリプトを組んでやると、世代管理ありの増分バックアップを実装できます。
[code]

>     #! /bin/bash
>  
>     BASEDIR="/test/dst" #バックアップ先の親ディレクトリ
>     LATESTBKUP=$(ls $BASEDIR | grep backup- | tail -n 1) #直近のバックアップのディレクトリ名
>  
>     rsync -avh --link-dest="$BASEDIR/$LATESTBKUP" /test/src/
> "/test/dst/backup-$(date +%Y%m%d-%H%M%S)"
>  
[/code]


CC BY-SA 4.0
2021-06-11T07:52:40.110
77481
2021-06-11T07:52:40.110
3060
77480
answer


一言でいうと、rsync --dest-linkが意図通り動作しているのであれば、専有するディスク容量は節約できているということになると思います。  
そして後述するコマンドを用いてディスク節約がされていることが確認出来るはずです。

rsyncの--dest-linkオプションを使用すると、対象ファイルが直前のバックアップと同一である場合、その2つのファイルは「ハードリンク」されます。  
(厳密に言うと、ハードリンクするためにはにタイムスタンプやパーミッション等も同一でなければなりませんが、このrsync --dest-
link状況下ではあまり問題にならないとは思います)

「ハードリンク」された2つのファイルは別々のファイルのように見えて、実際にはそれぞれのファイルエントリの指す先はディスク上の単一の実体を指すようなファイルシステム上の構造になっています。  
同一の実体を指しているかどうかはlsに-iオプションを指定することで表示されるiノード番号が同一であることで確認することが出来ます。

質問の例で言う「hoge01.txt」はハードリンクされているはずなので、

[code]

    $ ls -li 01/hoge.txt 02/hoge.txt
    42467349 -rw-rw-r-- 6 hidezzz hidezzz 671  6月 12 00:14 01/hoge.txt
    42467349 -rw-rw-r-- 6 hidezzz hidezzz 671  6月 12 00:14 02/hoge.txt
    
[/code]

とすると同一のiノード番号(ここでは42467349)が表示されるはずです

その他のざっくりとした見分け方としては  
2つのディレクトリを一括でduした場合に、ハードリンクされている分だけどちらか片方の専有ディスク容量が小さく表示されるはずです。

[code]

    $ du -d 0 -h 01 02
    14M     01
    404K    02
    
[/code]

ディレクトリごとに別々でduすると、上の場合とは大きさが異なって表示されるはずです。

[code]

    $ du -d 0 -h 01
    14M     01
    $ du -d 0 -h 02
    14M     02
    
[/code]

# コメントを受けて追記(2021/6/14)

> -dest-linkオプションはハードリンクで生成されるので、リモートでは使えないでしょうか？  
>  ローカルで差分をバックアップしていく運用ではなく、バックアップサーバ に集約したいと考えています。

ローカル側のファイルをリモート側に持ってきてから、リモート側のマシン上で--dest-
linkを使って世代バックアップを作ると考えれば良いのではないでしょうか？

リモートマシンからローカルマシンの方向へssh接続が出来る環境ならば  
**リモートマシン上で**

[code]

    $ rsync -avH ローカルマシン:/home/data/ /home/localmachine/data/ --dest-link=... 
    
[/code]

などのようにするのが手っ取り早いと思います。自分の場合この方法は実際に使っています。

ローカルマシンからしかssh接続が許可されていない、またはローカルマシンからのコマンド実行で済ませたいということであれば、2回に分けて

[code]

    $ rsync -avH /home/data/ リモートマシン:/home/localmachinetmp/data/
    $ ssh リモートマシン "rsync -avH /home/localmachinetmp/data/ /home/localmachine/data --dest-link=..."
    
[/code]

のような感じになるような気がします。2番目のrsyncはcronとかで定期的に実行するようにしても良いのかもしれません。  
この場合、/home/localmachinetmpが余計に必要になるのでその分ディスク消費はしてしまいます。


CC BY-SA 4.0
2021-06-11T15:37:03.977
77494
2021-06-14T14:24:11.503
2021-06-14T14:24:11.503
30745
30745
77480
answer