rsync
Symlink

rsyncの送信先パスにはシンボリックリンクを指定できないらしい

日本語情報が皆無だったので備忘録として残しておく。

やろうとしたこと

SynologyのNASにファイルをバックアップするため、以下のようなコマンドでバックアップを試みた。
※ホスト名やディレクトリ名は変更している

rsync -aHvhzcP --no-o --no-g --chmod=a+rwx,Da+rwx \
  --exclude ".*" -e "ssh -p 51764" \
  --iconv=UTF8-MAC,UTF-8 \
  ./data-dir-01976 \
  username@example.local:/var/services/video/my-movies/ -n

data-dir-01976ディレクトリを、NAS側の/var/services/video/my-movies/ディレクトリ内にバックアップするコマンド。

問題発生

だがこれを実行したところ、このようなエラーを吐いてしまった

$ rsync -aHvhzcP --no-o --no-g --chmod=a+rwx,Da+rwx \
>   --exclude ".*" -e "ssh -p 59612" \
>   --iconv=UTF8-MAC,UTF-8 \
>   ./data-dir-01976 \
>   username@example.local:/var/services/video/my-movies/ -n
username@example.local's password: 
sending incremental file list
rsync: [sender] write error: Broken pipe (32)
ERROR: module is read only
rsync error: syntax or usage error (code 1) at main.c(1131) [Receiver=3.0.9]
rsync error: error in socket IO (code 10) at io.c(820) [sender=3.1.2]

NAS側のsshやrsyncはちゃんと有効にしている。実際、以前まではrsyncでバックアップできていたのだ。

原因

タイトルで既にネタバレしてしまっているが、この問題の原因は/var/services/video/my-movies/がシンボリックリンクであることが原因である。

SynologyのNASは、データボリュームへのシンボリックリンクが/var/servicesディレクトリ以下に作成される。

username@ExampleNasServer:/var/services$ ls -l
total 0
lrwxrwxrwx  1 root root 18 Aug 30 01:58 download -> /volume1/@download
lrwxrwxrwx+ 1 root root 14 Jan 14 22:05 homes -> /volume1/homes
lrwxrwxrwx+ 1 root root 14 Aug 30 02:57 music -> /volume1/music
lrwxrwxrwx+ 1 root root 18 Jan 14 21:40 NetBackup -> /volume1/NetBackup
lrwxrwxrwx  1 root root 24 Aug 30 02:36 pgsql -> /volume1/@database/pgsql
lrwxrwxrwx+ 1 root root 14 Aug 30 02:57 photo -> /volume1/photo
lrwxrwxrwx  1 root root 13 Jan 14 22:05 tmp -> /volume1/@tmp
lrwxrwxrwx+ 1 root root 14 Aug 30 02:57 video -> /volume1/video

/volume1/videoが実際のパスだが、volume1などといういかにも環境依存しそうな文字列が含まれるため、/var/services/videoに変更していた。
それが裏目に出てしまったらしい。

解決策

解決方法は至極単純である。リンク先の実体パスに変更すればいいのだ。

rsync -aHvhzcP --no-o --no-g --chmod=a+rwx,Da+rwx \
  --exclude ".*" -e "ssh -p 51764" \
  --iconv=UTF8-MAC,UTF-8 \
  ./data-dir-01976 \
  username@example.local:/volume1/video/my-movies/ -n
差分
  rsync -aHvhzcP --no-o --no-g --chmod=a+rwx,Da+rwx \
    --exclude ".*" -e "ssh -p 51764" \
    --iconv=UTF8-MAC,UTF-8 \
    ./data-dir-01976 \
-   username@example.local:/var/services/video/my-movies/ -n
+   username@example.local:/volume1/video/my-movies/ -n

参考サイト

本当に指定できないの?

少なくとも私が調べた限り、指定できるという情報は見つけられていない。
上述した質問に対する回答が無いことからも、おそらくそんな手段は存在しないのだと思う。
が、もしあるならば、コメント欄で是非教えてほしい。