7. Cygwin の更新

(2005年12月追記: この章の内容は 2004 年当時のいわば過去の歴史です。 将来似たようなことが起こったときのための参考事例としてお読みください)

前回から思いがけず時間がたってしまいました。 その間,Cygwin にも大きな変化がありました。 3月に cygwin-1.5.9 がリリースされましたが, 5月に cygwin-1.5.10 が, 9月に cygwin-1.5.11 が, そして11月 11日*1 に cygwin-1.5.12 がリリースされました。 もしも旧バージョン,とりわけ呪われた cygwin-1.5.10 を使っているならば, 今が更新するのによい季節でしょう。

7.1 苦難の夏

Cygwin ユーザにとって難儀だったのは,今年 (2004年), 初夏から晩夏まで使われた cygwin-1.5.10 に日常の操作に支障を来たす欠陥があったことです。 この版は内部実装に大きな変更があったということで, 心なしか動作が軽快になりました。 しかし,同時にディレクトリのアクセスに致命的な不具合を抱えていました。 たとえば,Desktop フォルダ に何かのソース・プログラム一式のディレクトリ・ツリーを展開し, それを他の場所のディレクトリ・ツリー全体と diff -r で比較しようとしたとき, Desktop フォルダのツリー内のディレクトリが必ずしも正しくアクセスされない, という現象がしばしば出ました。 diff -r でまとめて比較したり, cp -av でまとめてコピーしたり, といった操作が信頼してできないわけです。 安心感の欠如は操作環境としては致命的な欠陥でした。 日本語 Windows では Desktop フォルダの実体が 「デスクトップ」という全角カタカナの名前のフォルダであることが, 不具合発症の原因でした。

実はこの不具合は比較的早期に発見され,解決されていました。 残念なことは改修版が一連のスナップショットとして公開されただけで, 正式リリースは他の不具合改修もあわせて 9月の cygwin-1.5.11 まで持ち越されたことです。 cygwin-1.5.11 とそれに続く cygwin-1.5.12 には日常の操作に支障を来たすような不具合は (少なくとも今のところ知る限りでは) ありません。

7.2 スナップショット版 cygwin1.dll の導入 (参考)

そんなわけで夏の間,自分は大半のマシンを cygwin-1.5.10 リリース直前のパッケージ構成で凍結するとともに, いくつかのマシンにスナップショット版 cygwin1.dll を導入することでしのいでいました。

今現在,日常の用途でスナップショットを利用することはないと思いますが, 今後,似たようなことが起こるかもしれませんから, 参考のためスナップショットを利用する方法を説明しておきます。

  1. スナップショットは Cygwin のホームページ の左の柱にあるリンク集の中の Snapshots にあります。
  2. Snapshots ページには最近のものから日付順に, そのときそのときの開発版 cygwin 本体のソースとバイナリが変更点のまとめ (ChangeLog) とともに置かれています。 カーネルに相当する cygwin1.dll を置き換えるときは, cygwin1-20041117.dll.bz2 というような名前のファイル (ここで 20041117 は年月日を表します) をダウンロードします。
  3. ダウンロードしたファイルを展開します。
    01:~$ bunzip2 -v cygwin1-20041117.dll.bz2
      cygwin1-20041117.dll.bz2: done
    
  4. このとき,もしも FAT 上で展開したならば特に気をつけることはありませんが, NTFS 上で展開した場合はファイルのパーミッションを確認します。
    01:~$ ls -l cygwin1-20041117.dll
    
    FAT では実行パーミッションは決め打ち (といいますか実は無意味) ですが, NTFS では設定しだいで変えられます。 もしも NTFS で実行パーミッションがないと,インストールしても, Cygwin を開始するとき bash がエラーを起こして起動しません。*2   もしなければ
    01:~$ chmod a+x cygwin1-20041117.dll
    
    などとして,実行パーミッションを与えてやります。
  5. 展開した cygwin1-20041117.dll を /bin ディレクトリに移動させます。 /bin ディレクトリを open します。 それから Cygwin のコマンド・プロンプトを終了させます。
    01:~$ mv cygwin1-20041117.dll /bin
    01:~$ open /bin
    01:~$ exit
    
    もしもほかに Cygwin プログラムを動かしていれば,それもすべて終了させます。 動かしているかどうかよく分からなければ,exit する前に ps コマンドを実行するか,または /proc/ls して確かめます。
  6. さきほど open した /bin ディレクトリのウィンドウで, cygwin1.dll を適当な名前,たとえば cygwin1~old.dll に改名し, cygwin1-20041117.dll を cygwin1.dll に改名します。
  7. Cygwin のコマンド・プロンプトを起動します。 もしうまく起動しないようならば,cygwin1~old.dll と cygwin1.dll の名前を元に戻して旧バージョンを起動してから, どこか間違いがないか確かめます。
  8. /proc/version の内容を表示すると cygwin1.dll のバージョンを確認できます。
    01:~$ cat /proc/version
    
  9. うまく動いているようならば /bin/cygwin1~old.dll を削除しても OK です。

7.3 Cygwin の更新についての注意点

Cygwin の各パッケージを更新する普通の方法は,setup.exe を利用する方法です。 ただし,いくつか注意点があります。

基本パッケージとの同時更新

更新されたパッケージがあるとき, いったん現在のパッケージがアンインストールされてから, 新パッケージがインストールされます。 いくつかのパッケージはアンインストール時に専用のシェルスクリプトを走らせます。 /etc/preremove/ にあるシェルスクリプトがそれです。

このようなシェルスクリプトを持ったパッケージを, cygwin-1.5.12 のような基本パッケージと一緒に更新すると, 基本パッケージがアンインストールされた後, 残りのパッケージのためのシェルスクリプトを実行しようとして失敗します。 そのときにはシェルが使えなくなっているからです。

現在の実装ではアンインストールはアルファベット順ですから, cygwin 本体とともに gcc-mingw シリーズのパッケージを更新する場合などがこれに該当します。 今はパッケージのリリース日をずらすという運用でカバーしているようですが, 毎日まめに更新していないと,はまることがあります。

回避策のひとつは,はまりそうなパッケージがあるとき, それをあらかじめアンインストールすることです。 なお,他から依存されているパッケージの場合, 次に setup.exe をしたとき,自動的に再インストールされます。

2005年12月24日追記: http://cygwin.com/ml/cygwin/2005-12/msg00909.html によれば, 2005年12月23日(現地時間)にリリースされた bash-3.0-13 は, 「It also improves the postinstall scripts to be more robust, so that you are less likely to get in a situation where /bin/sh does not exist」ということだそうです。 preremove についての言及がないのが気がかりですが, ひょっとしたらこの問題を解決しているかもしれません。

パッケージ固有の設定ファイル

設定ファイルは,原則として最初にインストールされたものが使われます。 パッケージを更新したとき, 昔のままの設定ファイルが不具合を起こすことがあります。 最近の例では,10 月に man パッケージが man-1.5o-1 に更新されたとき, この現象が起こりました。 更新後,man コマンド実行のたびにエラーメッセージが表示されるようになったのです。

01:~$ man man.conf
Unrecognized line in config file (ignored)
JNROFF          LANG=ja_JP.UTF-8 /usr/bin/groff -Tnippon -mandocj
Unrecognized line in config file (ignored)
KNROFF          /usr/bin/groff -Tkorean -mandoc
Unrecognized line in config file (ignored)
JNEQN           /usr/bin/eqn -Tnippon
Unrecognized line in config file (ignored)
KNEQN           /usr/bin/eqn -Tkorean
MAN.CONF(5)                                                        MAN.CONF(5)

NAME
       man.conf - configuration data for man

原因は /usr/share/misc/ にある man コマンド設定ファイル man.conf が昔のバージョンのままだったことでした。一般にパッケージのインストール時, 設定ファイルがなければ, デフォルトの設定ファイルから新しく作りますから*3

01:/usr/share/misc$ rm man.conf

として設定ファイルを削除してから, man パッケージを再インストールすればよいわけですが, この場合は下記の手順が簡単でしょう。

01:/usr/share/misc$ cp man.conf.default man.conf
01:/usr/share/misc$ chmod 644 man.conf

追記: 2004年12月12日ごろリリースされた新しい man パッケージ man-1.5o1-1 では デフォルトの設定ファイルが /usr/share/misc/man.conf.default から /etc/defaults/usr/share/misc/man.conf に変更されました。

次回予告

もう Meadow も 2.00 版がリリースされてずいぶんたってしまいました。 さしあたり内容を時代遅れにしないために, 次回は大急ぎでその設定について説明します。


脚注

*1 世界平和記念日,つまり (いろいろな意味で西洋の文化に大きな衝撃を与えたあの) 第一次世界大戦の終戦記念日にあわせてでしょうか。 東洋の伝統ではもともと奇数の月と日が重なる日はめでたいのですが (桃の節句,端午の節句,七夕,菊の節句),語呂のよい日付であることは確かです。

*2 たとえば Unix 上の Web ブラウザでファイルをダウンロードし, 他のファイルと一緒にまとめて tar アーカイブにして Windows に持っていき, NTFS 上で展開した場合,おそらく実行パーミッションが落ちています。

smb 経由でファイルをリモートの Windows マシンに転送した場合, テキスト・ファイルやアーカイブ・ファイルに実行パーミッションがついて Cygwin 上の ls -F の出力がうるさくなるきらいがあります。 Windows XP の簡易ファイル共有を使って転送すると, ファイルの所有者が Guest になります。 そんなわけで,Unix から Cygwin にファイルを転送するとき, いったん tar 等でアーカイブする方法が普通は賢いのですが, 今回のような場合は気をつける必要があります。

特に Mac OS X 上の Safari でダウンロードすると ファイルの日付がオリジナルのまま保存されるから快適だ, という人がはまりがちです (…と他人ごとのように書いていますが  >_<)

*3 /etc/postinstall/man.sh.done の内容を参照。

目次へ戻る

Copyright (c) 2004, 2005 Oki Software Co., Ltd.