2013-07-02

RHEL5.7: rsync doesn't work


久しぶりにハマった件について。

[rhel57]# rsync -az --delete --inplace --timeout=10 \
                -e 'ssh -i /path/to/key' \
                remote-host:/path/to/sync/ /path/to/sync
usage: ssh [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-i identity_file] [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-w tunnel:tunnel] [user@]hostname [command]
rsync: writefd_unbuffered failed to write 4 bytes to socket [receiver]: Broken pipe (32)
rsync error: unexplained error (code 255) at io.c(1525) [receiver=3.0.6]

いつも通り rsync を動かしたら、何か ssh のヘルプ出てきた。何これ、訳分かんない。

これにハマった理由は、

  • 見た目が如何にも ssh の引数不備に見えた。
  • 実際にエラーが発生したスクリプトも ssh を使っていた。
  • とはいえ、この間は確かに RHEL5.9 で動いていたのを確認済み。

これらに惑わされて原因の特定に手間取ってしまった。結局、「RHEL5.7 でのみ発生する rsync の不具合」というオチだった。


原因は分かったので、後は自作インストーラー側での対処。勿論、rsync をアップデートして貰えば解決する問題だが、「RHEL5.7 だったら rsync をアップデートしてね」とお願いするくらいなら、最初からインストーラー側で対処すべき。やることが「明確」ならば、自動化するのがセオリーだ。(逆に、「臨機応変」が要求されることは人間がやるべき)

バグ持ち rsync のバージョンは分かっているので、RHEL バージョンよりも rsync バージョンで判断するのがベター、ということで次のような感じ。

if [ 3.0.6-4.el5 = "`rpm -q --qf '%{VERSION}-%{RELEASE}' rsync`" ] ; then
    rpm -Uvh rsync-3.0.6-4.el5_7.1.x86_64.rpm
fi

そもそも、いい加減、途中でパッケージのメジャーバージョンを上げるのは止めて欲しい。(RHEL6.3 rsyslog の時もそうだった)

[rhel56]# rpm -q rsync
rsync-2.6.8-3.1

[rhel57]# rpm -q rsync
rsync-3.0.6-4.el5

RHEL にそんなことを求めてはいないし、最新パッケージが使いたかったら自分でビルドして使うし。

特に今回は基本的な部分が動かなくなることもあって、泣かされた人も(当時は)多かったと思う。今回の不具合の拙さを考えると、安易にパッケージのメジャーバージョンを上げるからだ、と言われても仕方が無い。