Cygwinのインストールで一苦労

投稿: 2009年4月30日

最近新たにPCを手に入れた。度重なる抵抗にもかかわらず、とうとうWindows Vista導入である。それで、ここのところこのPCの環境整備に時間を費やしているのだが、Cygwinのインストールで少々困ったことがあったので、メモ代わりに書いておくことにする。

Cygwinのインストールそのものは、大きな問題もなく行える。が、僕の場合、以下の二つの問題が発生した。

  1. なぜかホーム・ディレクトリが``/home/max_2''という名前になってしまった
  2. 愛用しているzshを起動して、何かコマンドを実行しようとするとエラーが出て何もできなくなってしまう

ホーム・ディレクトリ問題

この問題の原因は比較的すぐに分かった。これは、Windows設定時にまずmaxというアカウントを作ったのだが、諸事情によりこのアカウントの名前を別のものに変えて、その後新たにmaxというアカウントを作るということをしたためのようだ。最初に作ったアカウントは、名前を変えたことでアカウント名こそmaxではなくなっているが、たとえばユーザ用のドキュメントフォルダのパスは``C:\Users\max\Document''といった感じで、アカウントができた当初のままから変更されていない。したがって、新たにmaxというアカウントを作った場合、内部的には別の名前にして扱わないと旧maxと衝突が発生してしまうので、max_2という名前が使われたようだ。そしてCygwinは、この内部的に使われている名前を使っていたようだ。 (ただしwhoamiなどは実行してみなかったので、この記述は不正確かもしれない。)

ということで、この問題は旧maxのアカウントをデータごと完全に削除して、新maxを別名に変更した上で、改めてmaxを作ることで解決した。

zshが使い物にならない問題

前述の通り、zshは起動するものの、何かコマンドを実行するとエラーが発生してしまう。具体的にはこんなエラーだ。 (適当に改行を挿入してあります。)

$ ls
      3 [main] zsh 552 C:\cygwin\bin\zsh.exe: *** fatal error - unable to remap
C:\cygwin\lib\zsh\4.3.9\zsh\newuser.dll to same address as parent(0x310000) !=
0x3C0000

この後、^Cも効かないし、プロンプトは戻ってこないし、基本的に何もできなくなってしまう。

検索してみると、zshでのこの問題については見つけられなかったものの、Pythonで何か実行しようとしたら似たようなエラーが出たとか、Rubyでどうにかしようとしたら似たようなエラーが出たとか、そういった情報が見つかった。これらの情報によると、これはどうもDLL base addressなるものを調整する必要があるということらしいのだけれど、Windowsプログラミングの経験が皆無な僕にはその意味する正確なところは理解できていない。 (と思う) いずれにせよ、このDLL base addressの調整をしてくれるのがCygwinのrebaseallというコマンドだということなので、これを実行することでこの問題も解決できる。 (rebaseallは、Systemカテゴリーのrebaseというパッケージに含まれている。)

このrebaseallを実行する時の注意点は、ash以外にCygwinのプロセスが動いていてはいけないということ。 (動いていると、実行しても警告が表示されるだけで終了してしまう。) なので、「ファイル名を指定して実行」から実行するか、Windowsのコマンドラインから実行する必要がある。また、これは詳しく確認していないが、なぜか「ファイル名を指定して実行」から直接rebaseallを実行することができなかったので、まずashを実行して、そのプロンプトからrebaseallを実行した。ashなりrebaseallを実行する時は、当然フルパスで指定するか、Cygwinの/binにPATHが通っている必要がある。

ともかく、これでzshは無事に使えるようになった。zshが使えるようになった後で、いろいろなPerlのモジュールをインストールしたが、この時にも同様なエラーが出たのでrebaseallを実行したところ、問題は解決した。これまで見たことのないエラーだったのだが、どうも思いの外よく登場するエラーらしいので、rebaseallは覚えておいて損はなさそうだ。