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

4.SFUのインストールとユーザー環境

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


 前編では、Microsoft Windows Services for UNIX 3.0(以下SFU 3.0)日本語版の概要について述べた。簡単に振り返ると、SFU 3.0はUNIX環境とWindows環境との相互運用を円滑にすることを目的として開発されたソフトウェアで、Interixと呼ばれるUNIX互換環境を提供するサブシステムが追加されたことが、Ver.3.0の最大の特徴であった。

 後編である今回は、実際にSFU 3.0をインストールして、この新たに追加されたInterixを実際に使用する。具体的には、まずSFU 3.0のインストール方法とInterix環境の利用方法について簡単に解説する。その後、各種UNIX向けに記述されたアプリケーションの簡単な移植例として、ダウンロード・ツールとして広く利用されているGNU wgetと、Linuxの多くのディストリビューションで標準シェルとして利用されているbashの移植を行う。ここで紹介する移植例は、そのまま本格的な業務アプリケーションの移植の参考になるとは限らないが、Interixの移植性や互換性を示す1つの目安にはなるだろう。

SFU 3.0のインストール

 インストール作業自体は、ほかのマイクロソフト製品と同様に、インストール・ウィザードに従って作業するだけである。インストール・オプションとしては、「標準インストール」と「カスタム インストール」が用意されている。SFU 3.0で提供されるUNIX互換コマンドなどを使用するだけであれば「標準インストール」でよいが、このオプションではInterix用の開発キット(Interix GNU SDK)はインストールされない。このSDKには、GNUのコンパイラやCライブラリ、ヘッダ・ファイルなどが含まれており、Interix環境にプログラムを移植する際に必要になる。Interixにプログラムを移植するのであれば、「カスタム インストール」を選択して、コンポーネントの選択画面で「Interix GNU SDK」を明示的に選択する必要がある。

Interix GNU SDKの選択
Interix環境でソフトウェア開発を行うためのInterix GNU SDKは標準ではインストールされない。これを利用するには、明示的にコンポーネントのインストールを指示する必要がある。
  Interix環境へのプログラムの移植作業を行う場合は、このInterix GNU SDKをインストールする。

 ただし、インストール時に「標準インストール」を選択した場合でも、後からコンポーネントを追加することは可能である。これには、Interixを新規にインストールするときと同様にsetup.exeを実行する。このsetup.exeは、Interixがインストールされている環境で実行されると、「インストール・ウィザード」ではなく、SFU 3.0のセットアップ状態を後から変更するための「メンテナンス・ウィザード」の画面を表示する。この「メンテナンス・ウィザード」の最初の画面で「追加または削除」のオプションを選択し、必要なコンポーネントを追加すればよい。

ユーザー環境としてのSFU 3.0 ―― シェル

 インストールが完了すると、[スタート]メニューの[すべてのプログラム](Windows 2000なら[プログラム])に[Windows Services for UNIX]が追加される。

[プログラム]−[Windows Services for UNIX]メニュー
インストールが完了すると、これが[プログラム]メニューに追加される。ここからシェル(C Shell/Korn Shell)やTelnetクライアントを起動したり、SFUの設定を変更したりできる。

 これらの中で[C Shell]と[Korn Shell]は、それぞれシェル・プログラムを起動するためのもので、Interix用にコンパイルされたプログラムを実行するときは通常このシェルを通じて起動することになる。なお、シェルの操作はコマンドライン・ベースになっており、この点ではWindowsのコマンド・プロンプトと似ている(今回は詳細は説明しないが、シェルはスクリプト言語の実行環境としても利用される)。

 UNIX環境では、歴史的な経緯などから何種類かのシェルが存在しており、基本的な機能はほぼ同じながら、スクリプト制御の細かな文法や操作性、シェル環境の設定方法などに差がある。広く利用されているシェルとしては、メニューに用意されていたcsh(C Shell)、ksh(Korn Shell)のほか、bash(Bourne Again Shell)、tcsh(拡張C Shell)、zsh(Z Shell)などがあり、特にbashとtcshのユーザーが多い。ちなみにこのうちのtcshは、[Windows Services for UNIX]メニューからは直接には起動できないが、SFU 3.0でも提供されている(C ShellまたはKorn Shellを起動して、そこからtcshを起動することで利用できる)。bashはSFU 3.0では提供されないが、これについては本稿後半で移植作業を行ってみようと思う。

 シェルの詳細な解説については割愛させていただくが、基本的な使い方はWindowsのコマンド・プロンプトと同じで、単に実行したいコマンド名と、コマンドに渡す引数を指定するだけである。ただし、MS-DOSの流れをくむWindowsのコマンド・プロンプトとUNIXのシェル環境では、同じような機能でもコマンド名は全く異なるものが少なくない。例えばカレント・ディレクトリにあるファイルの一覧を表示するには、dirではなくlsというコマンドを使うといった具合である。

ユーザー環境としてのSFU 3.0 ―― コマンドとヘルプ

 標準サポートされるコマンドは、UNIXユーザーならおなじみのls(ファイルの一覧表示)、cp(ファイルのコピー)、mv(ファイルの移動/名前変更)といった基本的なファイル操作コマンドはもちろん、grepやsed、gawkといったテキスト処理ツール、tar、gzipといったアーカイブ関連のコマンド、ping、host、nslookupといったネットワーク関連のコマンドなど、平均的なUNIXユーザーが日常的に使うコマンドはだいたい一通りそろっているといってよいだろう。

 また、前編でも述べたが、オンライン・マニュアルも用意されている。例えば、シェル上で「man ls」と入力すればlsコマンドに関する説明が表示される。説明はすべて英語のままではあるが、読みにくい日本語訳よりはこの方がよいだろう(もちろん、可能なら「読みやすい日本語」に翻訳してほしいところだが)。また、マニュアル・ページのうちコマンドやツールに関するもの(より厳密には、マニュアルのセクション1に属するもの)については、SFUのヘルプの[Interix Commands and Utilities]という項目からも参照することができる。なお、SFUのヘルプを表示するには[Windows Services for UNIX]にある[Services For UNIXのヘルプ]を選択する。

 なお、コマンドやツールの一部は、Windowsのコマンド・プロンプトなどからも利用できるように、Windowsのコンソール・アプリケーションの形式になったものが別に用意されている(例えば、C:\SFUにインストールした場合は、C:\SFU\commonにその実行ファイルが置かれている。なお、このディレクトリには、SFUをインストールしたときにPATH環境変数が設定されるので、格納先など気にせずに使用可能である)。

ユーザー環境としてのSFU 3.0 ―― ドライブ表現

 Interixでは、ディスク・ドライブの表現方法がWindowsにおける一般的な表現やSFU 2.0のMKS Toolkit(SFU 2.0のUNIX互換コマンド群)における表現などとは異なる。例えば、「C:\Windows」というフォルダをInterixの世界から参照する場合は「/dev/fs/C/Windows」になる。つまり「/dev/fs/C」がCドライブのルート・フォルダを表すというわけだ。また、見てのとおり、ディレクトリ・パスにおける区切り文字はバックスラッシュ(\)ではなく、スラッシュ(/)である。

 従来のMKS Toolkitでは、このようなドライブ表現の違いから、UNIX環境で作成されたシェル・スクリプトを移行する場合に、スクリプトを変更しなければならなかった。この点Interixのスクリプト環境は、よりUNIXとの親和性が高い。

 ただし、前述したWindowsのコンソール・アプリケーションに関しては、「C:\Windows」、あるいはMKS Toolkit流の「C:/Windows」という表現を用いる。

ユーザー環境としてのSFU 3.0 ―― デーモン

 inetdやsendmailといった、デーモン(Windowsではサービスと呼ばれる)として動作するプログラムも幾つかInterixに移植されている。inetdは、ネットワーク・ポートを監視し、ポートへの接続要求が発生すると、要求を処理するプログラム(サブ・デーモン)を設定ファイルの内容に従って起動する。このinetdの存在により、それぞれのデーモンが独自にポートを監視する必要がなくなり、必要なプログラムが必要なときにだけ実行されるようになる。なお、inetdはその機能からスーパー・インターネット・デーモンと呼ばれることもある。

 使い方もUNIXなどでデーモンを使う方法と大きく変わらない。ここでは例として、Interixでのinetdの使用法を簡単に説明しておこう。

 まず、設定を行うには、管理者(Administrator、またはAdministratorsに所属するユーザー)である必要がある。Interixにはsu(ユーザー権限を一時的に切り替えるコマンド)も用意されているので、これを利用しても構わない。次に、/etc/inetd.confを編集する(エディタとしては標準でvi、ex、edが用意されている)。例えば、telnetデーモンが起動されるようにするには、inetd.confにある次の行の先頭の#を削除する。

   #telnet stream  tcp     nowait  NULL    /usr/sbin/in.telnetd    in.telnetd -i

 編集してファイルを保存したら、あとは次のようなコマンドでデーモンを起動できる。

$ /etc/init.d/inet start

 以上の操作をまとめると次のようになる。

$ su                    …一時的に管理者になる(ユーザーの切り替え)
Password:                 …Administratorのパスワードを入力
$ cp /etc/inetd.conf /etc/inetd.conf.20021212
                          …設定ファイルのバックアップをとる
$ vi /etc/inetd.conf      …設定ファイルの編集
$ /etc/init.d/inet start  …inetdの起動
$ exit                    …管理者モードを終了する

 このとおり、Windowsであることをほとんど意識することなく、UNIX環境と同様にしてデーモンの設定を行うことができる。

Interixの開発環境

 インストールの項でも少し触れたが、SFU 3.0にはInterixの一部としてGCC(GNU版Cコンパイラ)やmake(あらかじめ設定しておいたルールに従って、ソース・プログラムをコンパイルするためのツール)などの開発支援ツールが含まれている。これを使えば、UNIX向けに開発されたプログラムをInterix上でコンパイルすることが可能になる。米Microsoftのサイトには、英語ながら、C言語で記述されたアプリケーションをInterix環境に移植する方法に関する詳細なドキュメントが公開されている。

Porting Applications in C(C言語によるアプリケーションの移植)[英文](米Microsoftが公開している技術ドキュメント)

 Interix環境におけるアプリケーションのコンパイル手順は、一般的なUNIXの手順と同じである。具体的な手順はアプリケーションによっていくらか異なるが、最も典型的な手順を挙げれば次のようになる。

コンパイルの基本的な流れ
コンパイルの基本的な流れは、UNIXのそれと変わらない。

 UNIX仕様は、BSD系とSystem V系の2種類に大別される。前出のMicrosoftの解説ページによれば、InterixはBSD系に「より近い」とあり、システム・コール(UNIX APIとも呼ばれる)などもBSD系のそれに近いものと思われる。しかしその一方で、ターミナルを操作する部分(いわゆる端末まわり)はSystem Vのそれに近くなっている。実は、このバラバラとも思える、やや独特な実装が移植する際のネックになることもある。

 configureスクリプトが用意されている場合(つまり、上の図で示したような手順でコンパイルする場合)は、比較的容易に移植できることが多い。configureスクリプトとは、実行された環境を分析し、コンパイラやリンカに渡すオプションを適切に設定したり、必要な記号定数を適切に記述したヘッダ・ファイルを作成したりするものである。この分析作業はかなり細かく行われるため、先に述べたような変わった実装に対しても対応可能である。このおかげで、ソース・ファイル修正の必要なしにコンパイルできる場合も多く、修正が必要だとしても大がかりな修正になることはまずない。

 一方、Makefileを自分の環境に合わせて修正するような場合は、まず簡単には移植できないと考えてよいだろう。通常のソフトウェアでは(特にオープン・ソースのソフトウェアでは)、典型的なBSD系、System V系に対する設定は用意されているが、BSD系としてコンパイルすればターミナルに関連する部分が、System V系としてコンパイルすればシステム・コールの違いが、それぞれコンパイル・エラーを引き起こすことが多い。一部のOS(Solaris、Linux、FreeBSDなど)に対しては、専用の設定が用意されている場合も多いが、これらの設定はInterixにはほとんど適用できない。以下で実際の移植例について説明するが、ざっと試したところでは、コンパイル・エラーを回避するためには、BSD系とSystem V系の違いに関するかなり深い知識が必要であると感じた。UNIX上での豊富な開発経験がない場合には、このタイプの移植作業には気軽に手を出さない方がよいかもしれない(逆にいえば、UNIXを知るよいチャンスともいえるが)。

 それではさっそく、実際の移植にチャレンジしてみよう。今回はダウンロード・ツールのwgetと、シェル・プログラムのbashを題材として取り上げることにした。


 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の移植
 
更新履歴
【2003/01/15】このページの最初の段落で「…Interixと呼ばれるUNIX互換環境を提供するWin32サブシステム…」とありましたが、InterixはWin32サブシステムではなく、まったく別のサブシステムです。従って当該部分は「…Interixと呼ばれるUNIX互換環境を提供するサブシステム…」の誤りでした。お詫びして訂正させていただきます。

 製品レビュー


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

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間