treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

基本的なrsyncエラーの二種類

rsyncはLinuxコンピュータ同士でデータを複製し合う場合には、一般的にとてもよく使われるパッケージです。
今日はこのrsyncの基本となるエラーメッセージを二つご報告します。

とっても簡単な内容です。特に話の内容にはヤマもオチもありません。

エラーのほとんどは接続不調?

結構前の話なのですが、運用しているLinuxサーバのプロセスが知らぬ間に落ちていたらしくこんなメッセージがcronから送られてきていました。

----------------------------------------------
rsync: failed to connect to %IPAddress% (%IPAddress%): No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(122) [Receiver=3.0.9]
----------------------------------------------

Errorの文字があるのでデータが同期できなかった、ってことは分かるんですが、これは何かしら?

ようするに、「failed to connect to %IPAddress% 」とあるので「%IPAddress%への接続に失敗しました」ということですね。「No route to host」とあるので接続先のIPAddressが見つかりませんでエラーになりました、ってところですね。
ようするにrsyncクライアントがrsyncdが起動しているはずのサーバに接続できなかったということが分かります。

[Receiver=3.0.9]ってのがエラーコードです。

接続できても…

一方で接続できるけどサーバとなるrsyncdから拒否されることもあります。その場合のログがこっち。
----------------------------------------------
rsync: failed to connect to %IPAddress% (%IPAddress%): Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(128) [Receiver=3.1.1]
----------------------------------------------
「failed to connect to %IPAddress% 」は同じなのですが、「Connection refused」とあるので、「接続が拒否されましたよ。」というメッセージであることが分かります。こうなると通信としては成立していて、Linux間で通信の結果、サーバとなるrsyncdが「このクライアントは接続してはいかん」と判断して、先方が切断してきた、と判断できます。
よく見ると、エラーコードが
[Receiver=3.1.1]
となっています。単純に通信不調な場合とコードが違っていますね。

今回

今回トラブルシューティングに当たって、この二種類のログを取り違えてしまったのがミスの始まりでした。あれ?何でエラーに?と思ったら、実は通信側の問題で、そもそも繋がってない状況だった、ってことで時間を食ってしまいました。
※正確にはsambaサーバでホストしている共有フォルダにつながらなかった。
で、rsyncd.confや権限設定は正しい記述なのに、なんでエラーになってるのよ?ってことで無駄に時間を食ってしまいました。

簡単rsync解説

rsyncをお使いの方はご存知なのですが、
データを提供する側のサーバ(接続される方)は「/etc/rsyncd.conf」
データを取得する(コピーを保存する側)は「コマンド(※)でコピー対象を指定」
という二種類の設定を実行することで二台のLinux間でのデータ複製を実現しています。
※)コマンドの例
rsync -av --delete --password-file=/etc/rsyncd.passwd rsync://root@IPAddress:/Dir /home/sync/Dir

rsync自体は、このコマンドを実行することで、相手となるrsyncdが動作していて/etc/rsyncd.confに定義されたサーバの場所に接続し、そのデータを指定されたパーミッションで複製を実行しちゃいます。
上記のように「rsync://root@IPAddress:/Dir」と指定していれば、rsyncd側の/etc/rsyncd.confの記述をみて、
----------------------------------------------
[dir]
path = /home/sync/dir/
hosts allow = localhost %IPAddress%
read only = false
auth users=root
secrets file=/etc/rsyncd.secrets
----------------------------------------------
となっているので、Linux間で「/home/sync/dir/」ディレクトリ同士がデータを同期するようになります。要するにコマンド例のコマンドを実行すればフォルダミラーリングをしているのと同じ動きになります。