日本語情報が皆無だったので備忘録として残しておく。
やろうとしたこと
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
参考サイト
rsync preserve symlink as destination - Stack Overflow
シンボリックリンクで指定した宛先パスに送りたいが、リンクが上書きされて新しいディレクトリにされてしまうという質問。2017-08-10の質問だが、今のところ回答が1件もない。(2018年1月14日時点)symbolic link - rsync doesn't resolve target symlink to directory - Ask Ubuntu
rsyncがターゲットパスのシンボリックリンクを解決しないという質問。2016-01-21の質問だが、こちらも回答が1件もない。(2018年1月14日時点)
本当に指定できないの?
少なくとも私が調べた限り、指定できるという情報は見つけられていない。
上述した質問に対する回答が無いことからも、おそらくそんな手段は存在しないのだと思う。
が、もしあるならば、コメント欄で是非教えてほしい。