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

修正はこれで良いとして、いい加減、OS のマイナーアップデートでパッケージのメジャーバージョンを上げるのは止めて欲しい。

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

RHEL に求めるのは安定性であって、最新パッケージを使いたかったら自分でビルドするか rpm を拾ってくるし。特に今回、基本的なツールである rsync が動かなくなったことで、泣かされた人も(当時は)多かったのではなかろうか。今回の不具合の拙さを考えると、「安易にパッケージのメジャーバージョンを上げるからだ」と言われても仕方ない。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。