web-dev-qa-db-ja.com

rsyncを使用して既存の宛先シンボリックリンクを保持する

rsync(1) を使用して、ローカルのdebianリポジトリを最新の状態に保ちます。最近、保存に使用しているディスクの空き容量が少なくなってきたため、シンボリックリンクを使用して、一部のディレクトリを同じようなサイズの別のディスクに移動できるようにしました。

残念ながら、rsyncはシンボリックリンクを削除し、ほぼ完全なディスクを再充填しているようです。いくつか検索したところ、rsyncの--keep-dirlinksオプションが見つかりました。これは、私の問題を修正するためにカスタマイズされたようです。

それだけではありません。ターゲットのシンボリックリンクはまだ削除されています。
これが私のrsyncコマンドです:

rsync --recursive --keep-dirlinks --links --hard-links --times --verbose \
 --delete --delete-excluded $EXCLUDE $SOURCE_EXCLUDE \
 $RSYNC_Host::$RSYNC_DIR/pool/ $TO/pool/

EXCLUDEは、--exclude binary-alpha/ --exclude disks-alpha ...に沿って、私が関心を持たない多数のアーキテクチャを排除するために拡張されています。 rsyncが起動する前のプールディレクトリは次のようになっています。

lrwxrwxrwx  1 root root   23 2014-09-22 13:58 contrib -> /u2/debian/pool/contrib
drwxrwxr-x 62 root root 4096 2012-04-09 03:02 main
lrwxrwxrwx  1 root root   24 2014-09-22 13:58 non-free -> /u2/debian/pool/non-free

Rsyncが起動すると、次のようになります。

receiving incremental file list
deleting non-free
deleting contrib
./
contrib/
contrib/a/

など、シンボリックリンクはファイルでいっぱいのディレクトリに置き換えられます。

他のrsyncオプションの一部が--keep-dirlinksを妨害していますか?どれを組み合わせることはできませんか?それとも私の問題を引き起こしているオプションの順序ですか?

9
unkilbeeg

--deleteおよび--delete-excludedオプションは、シンボリックリンクがソース上にないことに気づき、それを削除するため、計画に干渉します。

これは、rsyncsource/ target表記(ソースの後に続くスラッシュ)でディレクトリ全体をコピーするように指示した場合にのみ発生します。代わりにsource/* targetを使用すると、シェルはコピーするファイルとディレクトリのリストを展開しますが、これは行われません(ただし、最初に--dry-runで試してください)。

ただし、この壊れやすいセットアップの代わりに、LVMの助けを借りて2つのディスクを組み合わせて、この種のトリックを必要としない1つの大きなボリュームを形成することをお勧めします。

7
Sven