役に立ちそうもないTips移転版

俺得なTipsを書き連ねるだけのブログ。

CygwinでCVSしたいなぁ

したいならすればいいじゃん、というわけで
S.S.S. - Tech - CygwinでCVSサーバを立てる
こちらを参考にやってみたが、

言うこときかずにAdministratorでなく、Administratorsに所属してるだけの一般ユーザで作業

したせいか、いろいろと変な目に遭ったのでメモ。

xinetdをrestartしちゃうと……

cvspserverのラッパー作成まで済ませて、機嫌よく

$ /etc/rc.d/init.d/xinetd restart

とやってcvsにログインしようとするとはねつけられる。
なにゆえ〜、とps -efしてみると、xinetdがSYSTEMでなく作業ユーザで動いていた。(そりゃまぁそうだ) そして(Windowsの)イベントビューアを見るとsetuidがPermission deniedで失敗した、とある。
Windowsはこのへんシビアで、かなり特殊な権限を持ったユーザーでない限り、現在のプロセスを別のユーザのコンテキストに切り替える(setuidってつまりそういうこと……ですよね? )ことはできないようになっている。(詳細は「cygwin setuid」あたりで検索)この権限はデフォルトではAdministratorにすら与えられておらず、SYSTEMのみが可能になっている。
ということで、別プロセスを適切なユーザ権限で起動するという仕事をしてもらうためには、xinetdには何とかSYSTEMで動いていただかないと困るわけです。
乏しい知識でchmod +sしてみるとかやってみたが沈没。結局、xinetdを再起動したければサービス化してある(のでSYSTEMで動いている)initを再起動するのがよい、ということらしい。(本物のUN*Xだとものすごい話だ)

ぢゃあxinetdをサービスにすればいいのでわ

と思ったがそうはイカの眼(まなぐ)。Cygwin上のプログラムをサービスとして動かしたい場合cygrunsrvを使うのが定石だ(と思う)が、これでxinetdをサービスとしてインストールすると、

サービスは始まった次の瞬間停止、でもxinetdは動いている

という奇怪な事態になる。でもこれも奇怪でも何でもない話で、cygrunsrv.READMEに

There's currently one caveat, though. If the application behaves as a "normal" unix daemon and exits after forking a child, cygrunsrv will immediately stop the service (but the actual daemon keeps running in the background). This means that you cannot then STOP the daemon using cygrunsrv, but you must explicit kill it via 'kill -9 <daemon_pid>'

とある。どうやらxinetdはこれに該当するらしい(ソース読んだわけではないのではっきりしたことは言えませんごめんなさい)。sshdsquidはforkしないオプション付きで設定すればOK、ともあるがxinetdにはそれらしいオプションがない。ということで、xinetdを単独でサービス化するのは難しいぽい(cygrunsrv以外のサービス化ツールを使えば可能かもしれないが、試せてません)。

まだ何か?

その他細かい話。

  • xinetd.confは、デフォルトで「log_type = FILE /var/log/servicelog」となっているが、これはどうも他のプロセスも使っているのかPermission denied食らうことがある。別のファイル(/var/log/xinetd.logなり)にした方が無難。
  • あとXP SP2使ってたり、他のFirewall入れてる場合はちゃんとxinetdとpserver用にポートを空けておくこと。
  • $HOMEに.cvsディレクトリがないとチェックアウトできません。(そのくらい作ってけだたていがべなとおもゆ……)

追記

2006/02/23
initをサービス化してxinetdを起動させる場合の注意点もう一つ。
initサービスを再起動するだけだとxinetdまできちんと再起動してくれないぽい。initを止める前に /etc/rc.d/init.d/xinetd stop しとくこと。
あと、~/.cvsディレクトリだけじゃなく~/.cvspassファイルもないと cvs login が通らない。(パーミッションの設定がちゃんとしてないだけかとも思うが……) 空でよいので~/.cvspassはあらかじめ作っておく方が面倒ない。