質問: **実行環境:** CentOS 7.3 rsyncで増分のみをバックアップし世代管理をしたいと思っています。 下記のようにバックアップをしようと計画しています。 ``` Base(バックアップ対象全量) | L01 (変更のあったファイルのみバックアップ) L02 (変更のあったファイルのみバックアップ) ・ ・ ・ L07 (変更のあったファイルのみバックアップ) ``` 例えば全量のbaseディレクトリ(保存先ディレクトリ)にはバックアップ内容が以下 hoge01.txt hoge02.txt hoge03.txt 01にはhoge04.txtの存在する(01にはbaseは存在しない構成) 02にはhoge0.txt5の存在する(02には01及びbaseは存在しない構成) ### 発生している問題 `rsync -av --link-dest` で試していますが、 ``` hoge01.txt hoge02.txt hoge03.txt hoge04.txt hoge0.txt5 ``` となってしまう意図した挙動になりません。 要するに世代管理をしたいので、上記のようにバックアップされるとディスクの容量がたりなくなってしまいます。 rsyncで増分のみをバックアップすることは可能なにでしょうか? もし可能であれば、オプションを教えて頂けないでしょうか また、rsyncでバックアップ実現できないのであれば、代替手段はありますでしょうか? ご教示お願いいたします。
回答: 一言でいうと、rsync --dest-linkが意図通り動作しているのであれば、専有するディスク容量は節約できているということになると思います。 そして後述するコマンドを用いてディスク節約がされていることが確認出来るはずです。 rsyncの--dest-linkオプションを使用すると、対象ファイルが直前のバックアップと同一である場合、その2つのファイルは「ハードリンク」されます。 (厳密に言うと、ハードリンクするためにはにタイムスタンプやパーミッション等も同一でなければなりませんが、このrsync --dest-link状況下ではあまり問題にならないとは思います) 「ハードリンク」された2つのファイルは別々のファイルのように見えて、実際にはそれぞれのファイルエントリの指す先はディスク上の単一の実体を指すようなファイルシステム上の構造になっています。 同一の実体を指しているかどうかはlsに-iオプションを指定することで表示されるiノード番号が同一であることで確認することが出来ます。 質問の例で言う「hoge01.txt」はハードリンクされているはずなので、 ``` $ 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 ``` とすると同一のiノード番号(ここでは42467349)が表示されるはずです その他のざっくりとした見分け方としては 2つのディレクトリを一括でduした場合に、ハードリンクされている分だけどちらか片方の専有ディスク容量が小さく表示されるはずです。 ``` $ du -d 0 -h 01 02 14M 01 404K 02 ``` ディレクトリごとに別々でduすると、上の場合とは大きさが異なって表示されるはずです。 ``` $ du -d 0 -h 01 14M 01 $ du -d 0 -h 02 14M 02 ``` コメントを受けて追記(2021/6/14) ===================== > > -dest-linkオプションはハードリンクで生成されるので、リモートでは使えないでしょうか? > > ローカルで差分をバックアップしていく運用ではなく、バックアップサーバ に集約したいと考えています。 > > > ローカル側のファイルをリモート側に持ってきてから、リモート側のマシン上で--dest-linkを使って世代バックアップを作ると考えれば良いのではないでしょうか? リモートマシンからローカルマシンの方向へssh接続が出来る環境ならば **リモートマシン上で** ``` $ rsync -avH ローカルマシン:/home/data/ /home/localmachine/data/ --dest-link=... ``` などのようにするのが手っ取り早いと思います。自分の場合この方法は実際に使っています。 ローカルマシンからしかssh接続が許可されていない、またはローカルマシンからのコマンド実行で済ませたいということであれば、2回に分けて ``` $ rsync -avH /home/data/ リモートマシン:/home/localmachinetmp/data/ $ ssh リモートマシン "rsync -avH /home/localmachinetmp/data/ /home/localmachine/data --dest-link=..." ``` のような感じになるような気がします。2番目のrsyncはcronとかで定期的に実行するようにしても良いのかもしれません。 この場合、/home/localmachinetmpが余計に必要になるのでその分ディスク消費はしてしまいます。