製品レビュー
Microsoft Windows Services for UNIX 3.0
日本語版

6.bashの移植

泉祐介+デジタルアドバンテージ
2002/12/13


 bashは、tcshと並んでUNIX環境で広く利用されているシェルである。特にLinuxでは、多くのディストリビューションで標準シェルとして指定されていることもあり、ユーザーは非常に多いようである(Linux Squareを見ても、bashを前提とした記事が多い)。

 bashもGNUプロジェクトのプログラムであり、さまざまなところから入手できる。ここでは原稿を執筆した時点で最新となるバージョン2.05b(bash-2.05b.tar.gz)をコンパイルする。

■bashのダウンロードとアーカイブ・ファイルの展開
 bash-2.05b.tar.gzをGNUのミラー・サイトなどからダウンロードし、アーカイブ・ファイルを展開する。なお、アーカイブをダウンロードする際に、前節でコンパイルしたwgetを利用するのもよいだろう。

$ cd ~/build
$ wget ftp://ftp.t.ring.gr.jp/pub/GNU/bash/bash-2.05b.tar.gz
$ gzip -dc bash-2.05b.tar.gz | tar xvf -

■ソース・コードの修正
 wgetの場合はソース・コードを一切修正することなくコンパイルできたが、bashに関しては若干の修正が必要であった。bashのソース・コードの中にはtimezone構造体の変数を宣言している部分があるが、Interixにはこの構造体が用意されていないためである。この構造体はもともとタイム・ゾーンを表すものとして利用されていたようだが、現在では使用が廃止されたようである。

 実際に修正した内容は次の通りである。patchコマンドで修正できるように、diff形式(パッチ・ファイルの形式)にしておいた。

--- execute_cmd.c.orig Fri Oct 18 21:06:56 2002
+++ execute_cmd.c Fri Oct 18 21:07:15 2002
@@ -1027,7 +1027,6 @@
#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
   struct timeval real, user, sys;
   struct timeval before, after;
-  struct timezone dtz;
   struct rusage selfb, selfa, kidsb, kidsa; /* a = after, b = before */
#else
#  if defined (HAVE_TIMES)
@@ -1037,7 +1036,7 @@
#endif

#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
-  gettimeofday (&before, &dtz);
+  gettimeofday (&before, NULL);
   getrusage (RUSAGE_SELF, &selfb);
   getrusage (RUSAGE_CHILDREN, &kidsb);
#else
@@ -1057,7 +1056,7 @@
   rsf = usf = ssf = cpu = 0;

#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
-  gettimeofday (&after, &dtz);
+  gettimeofday (&after, NULL);
   getrusage (RUSAGE_SELF, &selfa);
   getrusage (RUSAGE_CHILDREN, &kidsa);
bash-2.05bをInterixに移植するためのパッチ
Interix環境ではtimezone構造体が用意されていない。このパッチ・ファイルでは、それを回避するための修正を加える。

 UNIXのシステム・コールの1つであるgettimeofday関数は、第2引数としてtimezone構造体へのポインタを指定するが、Interix環境ではこの引数は単純に無視されることになっている。そのため、上の修正ファイルではgettimeofday関数の第2引数をNULLにしてしまった(NULLはどの位置も指さないことを表すポインタ)。

 上で示したパッチ・ファイルを以下に用意しておいたので、これをダウンロードしていただきたい(ファイル名は「bash-2.05b-interix.patch」として保存すること)。

bash-2.05をInterix環境に移植するためのパッチ(bash-2.05b-interix.patch)

 パッチ・ファイルは、展開後に作成されるbash-2.05bディレクトリではなく、その親ディレクトリ(bash-2.05b.tar.gzを展開したディレクトリ)にダウンロードすることをお勧めする。パッチ・ファイルはオリジナルのbashのソース・コードの一部ではなく、区別されるべきものであるからだ。

 その後、bash-2.05bディレクトリに移り、次のようにしてパッチを適用する。

$ cd bash-2.05b
$ patch -p0 < ../bash-2.05b-interix.patch

■configure、make、make install
 後は、configureスクリプト、make、make installを順に実行するだけである。bash-2.05bに含まれるconfig.guessは比較的新しいものなので、wgetのようにconfigureを実行するときにホストを指定する必要はなかった。C Shellを利用している読者は、この後rehashすることを忘れずに。

$ ./configure --prefix=/usr/local
$ make
$ su
$ make install

 インストール作業が終わったら、また試しに実行してみてほしい。次の画面のようにうまく動作すれば、移植作業は完了である。

bashの実行画面
bashを実行するには単に「bash」とだけ入力すればよい。すると、bashのプロンプトが表示されるので、ほかのシェルと同じように適当にコマンドを実行するとよいだろう。なお、シェルの上で別のシェルを実行した場合は、そのシェルを「exit」で終了するともとのシェルに戻る。
 

コラム:InterixのX Window System対応

 
Interix SDKには、X Window Systemのライブラリも含まれており、Xのインターフェイスを使用するアプリケーションをコンパイルすることもできる。ただし、実際にXアプリケーションを動作させるには、Xサーバを別途用意する必要がある。また、SFU 3.0に含まれるライブラリのバージョンは一世代前のX11R5であり、現在広く使用されているX11R6ではないので注意が必要だ。例えば、kterm(X環境で広く一般的に利用されている日本語対応のターミナル・プログラム)の最新版kterm-6.2.0はX11R6環境を前提としており、Interixの標準の状態ではコンパイル不可能である。

 Interix SDKにはxmkmf(X make Makefileの略)も含まれている。xmkmfはそのコンピュータのX環境の設定に合わせてMakefileを作成するツールで、autoconf(configureスクリプトを作成するためのツール)が開発される以前から存在している。Xに対応したアプリケーションの中には、このxmkmfを利用してコンパイルするものもある。ただし、xmkmfを利用してコンパイルするアプリケーションの移植は、Makefileを直接設定する場合と同様、Interix独特の実装がネックとなって難しい。例えば、前出のktermの旧バージョンであるkterm-5.2.0のコンパイルも試みたが、やはりちょっと試した程度ではコンパイルできなかった。

 configureスクリプトがあるものであればコンパイルできるものもある。詳しくは述べないが、例えば、vim(viエディタのクローン)のGUI版であるgvimは、若干の修正を加えるだけでコンパイルに成功し、実際にXサーバ上での動作も確認できた。

まとめ

 以上、後編ではSFU 3.0の新機能であるInterixを実際に使ってみた。全体的な印象としては、UNIX環境をできるだけ忠実に再現しようと努めており、十分にその目標を達成していると感じた。Interixのシェルを起動すれば、もうそこはUNIXの世界である。というのは少しいい過ぎかもしれないが、印象としては間違っていない。

 UNIXのアプリケーション・インターフェイスに関しても、基本的にはきちんと実装されているようである。実際、wgetではソケット(ネットワーク用)に関するもの、bashではプロセスやシグナルに関するものを中心にさまざまなシステム・コールが使用されているが、これらのプログラムもコンパイルできて問題なく動作した。

 ただし、今回行った簡単なテストをもって、Interixの互換性全体を語るのは間違いである。企業ユーザーにとっては、UNIXシステム向けに開発したカスタム・アプリケーションがどの程度の工数でInterixに移行できるかが気になるところだろうが、実際のところはプログラムの作り次第だろう。しかし特殊な処理は行わず、標準的なUNIXシステム・コールと標準ライブラリからなるプログラムなら、比較的容易に移行できる可能性が高いといえる。また、前編でも少し触れたように、ApacheやOpenSSHなどのアプリケーションも少しずつInterix環境に移植されているが、まだ実際に移植されたアプリケーションの数は多いとはいえない。これらの外部アプリケーションを応用するプログラムの移植では注意が必要である。

 X サーバ(とEmacs)が標準で利用できないことは、(クライアント用途として使われる)UNIX/Linuxの代用として見たときには大きな減点要因になってしまうかもしれない(いずれも内部アーキテクチャ的な問題により、そのまま移植することはできない)。

 とはいえ、マイクロソフトが.NET戦略で目指す分散アプリケーション環境がどのような形でやってくるにしても、システムのすべてがマイクロソフト製品一色で染まることはあり得ない。現実には、さまざまなシステムがネットワーク環境で協調することになるはずだ。そのような将来に向けた一歩として、SFU 3.0は、Windows環境とUNIX環境の相互運用を達成する現実的なソリューションを提供する製品として活躍できるだろう。End of Article

 

 INDEX
  [製品レビュー] 
  Microsoft Windows Services for UNIX 3.0 日本語版
    1.SFUとは何か?
    2.SFU 2.0から3.0へのバージョンアップでの変更点
    3.Interixプロセスと、Win32プロセスのシームレスなプロセス間通信も可能
    4.SFUのインストールとユーザー環境
    5.wgetの移植
  6.bashの移植
 
 製品レビュー


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間