Last modified: Sun Apr 16 20:30:48 JST 2000
技術評論社『Software Design』誌1999年2月号p.139-147掲載

SolarisでWindows PC LANを構築する〜Sambaの導入

石田 翼(tbs-i@cpsy.is.tohoku.ac.jp)

sambaとは

 sambaは,Windows系のOSのファイル共有機能をUNIX上で使えるようにするソフトです.つまり,Windowsマシンのデスクトップにある「ネットワークコンピュータ」にUNIXマシンが見え,それを開くと自分のホームディレクトリやUNIXマシンにつながっているプリンタが見えて使えるというわけです.その逆のUNIX上からWindowsマシンの共有資源を使うということも可能で(注1),ほとんどのUNIX like OSに対応しています.当然我らがSolarisでも使えます.
 この他にもSolarisで動く同等の機能を持つ商品もありますが(注2),sambaは無料で手に入れられソースを自由に見れるOpen sourceを謳っています.さらにMacintosh用の同等のソフトであるCAP/netatalkとの連携もある程度考えられているので,両方を行き来して使っているユーザなどにも便利,といった利点があります.
 またドメインコントローラにもなれるので,本当であればNT serverを導入しない組めないドメインを組むことが出来,パスワードや個人設定の集中管理が可能になります(注3).さらにWINSサーヴァーになることが出来るので,名前解決のブロードキャストパケットのトラフィックを減らせます.
 この原稿では,このsambaのインストールと基本的な設定などについて解説していきます.またNT serverの機能を,sambaでどこまで置き換えられるかということにも挑戦していきます.
 では早速インストールに取りかかってみましょう.

Sambaの入手先

 Sambaの一次配付先はftp://ftp.samba.org/pub/samba/です.日本国内ではRing server project(http://www.ring.gr.jp/参照)がミラーを行っているので,Ring serverのうちもっとも近い・空いているところから入手するのが一番よいでしょう.現在の最新ヴァージョンは1.9.18p10ですので,以下この原稿ではこのヴァージョンに即して説明していきます.

インストール

 Solarisにインストールするには,ソースを持ってきてコンパイルする方法と,バイナリパッケージを持ってきてインストールする方法と二種類選択できます.

バイナリパッケージによるインストール

 バイナリパッケージはring serverの/pub/net/samba/Binary_Packages/solaris/から手に入れられます.今のところは1.9.18p10のversionのSparc用とIntel用のそれぞれ2.5.1用と2.6用が手に入れられます(注4).これらはpkgaddでインストールできる形式になっているので,gzipとtarで展開したあと

# pkgadd -d samba-1.9.18p10-Sol2.6
のようにすれば/usr/local/samba/以下にインストールされます.インストールされるディレクトリは-Rオプションで変えられますが,設定ファイルなどをそれにあわせて書き換える必要があります.

ソースからコンパイルしてインストール

 「やっぱりコンパイルがUNIXの醍醐味だね」という人はソースを手に入れて自分でコンパイルすることになります.ソースも同様にring serverの/pub/net/samba/から手に入れられます.samba-1.9.18p10.tar.gzが最新のものですので,自分のマシンに持ってきたあと例のごとくgzipとtarで展開してください.
 コンパイル時の設定は,sourceディレクトリ以下のMakefileで行います.変更箇所はリスト1に示します.
 まず先頭の方にある"BASEDIR"と"MANDIR"です.前者はsambaのプログラムや設定ファイルなどをインストールする場所で,デフォルトで/usr/local/samba/になっています.後者はmanファイルをインストールする場所で,デフォルトで/usr/local/man/になっています.インストール先が/usr/local以下ではまずいという人は,ここを変えてください(Solaris的にはやはり/opt/samba/でしょうか:-)).
 次にSolaris用の設定を有効にします.Solaris2.4以降の場合は,248行目以降,Solaris2.3以前の場合は254行目以降の部分です.適合する部分の"FLAGSM","LIBSM","AWK"の行の冒頭の"#"マークを削除し有効にしてください.ちなみに古い記事では,ここで"FLAGSM"に"-DKANJI=〜"と付け加えるということが書いてあったりますが,この設定は1.9.18以降設定ファイルで指定することになったので,現在のヴァージョンでは不要です.
 その他の設定項目は後でも設定ファイルで変えられるので,特にここで設定する必要はありません.ここまでやれば,後はmake; make installでコンパイル・インストールされます.

設定

 sambaの設定は,${BASEDIR}/lib/にあるsmb.confというファイルで行います.このファイルの書式は,懐かしのWindowsのiniファイルと同じ形式です.つまりリスト2のように[]によってセクションを指定し,parameter=valueというように項目を指定していきます.
 smb.confに必須であるセクションは,[global]で,ここで基本的なsambaの設定をすることになります.ユーザのホームディレクトリをネットワークに公開することに関する設定は[home],UNIX上で使えるプリンタを公開することに関する設定は[printer]で行います.このパラメータと設定する値はman smb.confで知ることが出来ます(注5).多数ありますが,同じ機能を持つものや逆の機能をもつものなど機能がダブっているものが多く,実質は見た目よりも少ないです.しかしここではそのそれぞれを説明するスペースはないので,最小限の設定ファイルの例を紹介するにとどめます.
 設定ファイルの例はsambaを展開したディレクトリ以下のexample以下にありますが,この中のsimpleディレクトリ以下のsmb.confがほぼ必要最小限の設定です.ただ多少最小限過ぎるので,幾つか追加・変更した方がいいでしょう.追加・変更内容をリスト3に示します.その幾つかを説明します.
server string
Windowsの「ネットワークコンピュータ」の表示を「詳細」にしたときに「コメント」欄に表示されるコメントを設定する項目です.この例では"%h samba %v"となってますが,%hはホスト名に,%vはversion番号にそれぞれ置き換えられます.
workgroup
sambaの参加するworkgroupの名前の設定です.自分のところのワークグループ名を設定しておきましょう.
hosts allow
アドレスによるアクセス制限です.念のためlocalhostと自分達のネットワ−クからのみアクセスできるように設定しておいた方がいいでしょう.
client code page
クライアントの言語環境を設定します.この雑誌の読者の環境では当然日本語でしょうから,それを示す932を指定します.
coding system
日本語ファイル名の漢字コードをどう扱うかの設定です.Solarisでは日本語ファイル名はEUCで扱っているようなので,eucと設定します.またcapと指定すると,Macintosh向けのファイル共有serverである,CAPやNetatalkのファイル名のコーディング法と互換性を持ちます.つまりCAPやNetatalk経由でMacintoshから日本語(2バイト文字)の名前のファイルを作成した場合,そのファイル名をsamba側からでも日本語で見れますし,またはその逆にsamba経由でWindows上で日本語名のファイルを作った場合,そのファイル名がMacintoshからちゃんと日本語で見えるわけです.ただしこれはファイル名をで16進数の羅列で表す手法なので,Solaris上からはファイル名がわからないという欠点があります.漢字コードはこれ以外にも色々指定できますが,Solarisではこの二種類のうちどちらかでしょう.
 以上の設定ファイルで,Solaris上の各ユーザーのホームディレクトリとSolarisで設定されているプリンタの共有が出来ます.ほとんどの使い方ではこれで十分でしょう.設定ファイルが用意できたら,次はいよいよ起動させます.

起動

 SambaをSolaris起動時に自動で起動させる設定を行います.これも方法は二種類あって,inetdを利用する方法とデーモンとして常駐させる方法があります.前者は不必要なときはメモリを最小限しか消費しませんが,利用するときの最初の立ち上がりが多少遅くなります.後者はその逆で,常駐するので一定メモリを常に占有しますが,立ち上がりの反応は比較的速いです.利用頻度によって選択するのがよいでしょう.

inetd経由で起動させる場合

 まず/etc/servicesにリスト4の二行を追加し,さらに/etc/inetd.confにリスト5の二行を追加してください.
smbdとnmbdのパスはそれぞれの環境に合わせ書き換えてください.そこまで出来たら

# ps -ef | grep inetd

でinetdのPIDを確認し,

# kill -HUP inetのPID

でinetdを再起動させてください.これで完了です.またこの場合,smb.confを変更すると自動で再読込してくれます.

デーモンとして常駐させる場合

 sambaを展開したディレクトリ以下のexamples/svr4-startup/samba.serverというファイルを使います.これはデフォルトではsambaが/opt/sambaにインストールされていることになっているので,まずそこを修正します.修正すべき行をリスト6に示します.このパスを自分がインストールしたパスに書き換えてください.また-sオプションで設定ファイルの位置を指定しているので,設定ファイルを標準の場所(${BASEDIR}/lib/smb.conf)以外に置いている場合は自分の環境に合わせ書き換えてください.また-lでログファイルの位置を指定していますが,これは設定ファイルで指定できるのでここで設定する必要はありません.カットしましょう.またうっかり"-D"を消したりしないようにしてください.これはこの場合必須です.ちなみにバイナリパッケージを用いた場合は,同等のファイルがS87sambaという名前で付属してきますので,それをそのまま使えます.
 以上の修正ができましたら,このファイルを/etc/rc3.d/以下にS87sambaというファイル名でコピーします.ついでに/etc/rc[012].d/以下にK02sambaという名前でリンクをはっておきましょう.その後rootで

# /etc/rc3.d/S87samba start

とするとsambaが起動し常駐します.以降はSolarisのboot時に自動で起動されます.またrun levelを2以下にすると自動的に停止されます.この場合,smb.confを変更しても再読込はしてくれないようなので,変更した場合はHUPコードを送って再起動させてください.

確認

 ここまで出来たらば動作確認してみましょう.確認にはまず${BASEDIR}/bin/smbclientを使います.

% smbclient -L localhost

と入力するとパスワードを聞かれるので,入力すると図1のような出力が見られます.最初のブロックはsambaを載せたUNIX上で公開されている共有資源です.先に示したsmb.confを使っているならば,IPC$とホームディレクトリと全てのプリンタが表示されるはずです.
 このような出力が得られたなら,Windowsの「ネットワークコンピュータ」からsambaを載せたSolarisマシンが普通のWindowsマシンのように見え,共有資源も問題なく使えるはずです(注6).
 ただしWindows95OSR2以降・Windows98・WindowsNT4SP3・WindowsNT5.0からは,標準の

暗号化パスワードの問題

 状態ではネットワ−クコンピュータから見えないはずです.直接共有資源をUNCで指定して使おうとしても,「そのアカウントは、このワークステーションからのログインを許可されていません」というエラーが出ます.
 これらのOSは,デフォルトでは暗号化されていないパスワードによる認証を受け入れません.一方sambaはデフォルトではパスワードの暗号化に対応していないのです.したがってこれらのOSでsambaにアクセスしようとするとはねられるわけです.
 解決法は二つあり,上記のOSで暗号化されないパスワードを受け付けてくれるようにするか,sambaが暗号化パスワードに対応するようにするかです.前者は該当する全てのクライアントの設定を変更する必要があり,クライアントの数が多いと面倒です.一方後者ではsambaマシンの設定を変更するだけで済みますが,パスワードが二重になる(後述)のでパスワードの管理が面倒になります.

(1)OSを非暗号化パスワード(プレインパスワード)に対応させる

 Sambaを展開したディレクトリのdocs/以下にWin95_PlainPassword.regとNT4_PlainPassword.regというファイルがあります.前者はWindows 95/98を,後者はWindows NT 4.0SP3を,それぞれプレインパスワードに対応させるためのレジストリの変更を記述したファイルです.これを目的のマシンに転送しダブルクリックすれば,自動的に必要なレジストリが書き変わります.その後再起動すればsambaマシンにアクセスできるようになっているはずです.

(2)sambaを暗号化パスワードに対応させる

 sambaを暗号化させると,基本的にsamba用のパスワードとUNIX上のパスワードを二重に別々に管理することになります.つまりWindowsマシンからファイル共有をする場合のパスワードと,telnetなどでloginするときのパスワードとが別々のものになるのです.
 まずはsamba用のパスワードファイルをおくディレクトリを作成します(以下の作業はすべてroot権限で行ってください).これは${BASEDIR}/private/というディレクトリにするのが標準的です.たとえばデフォルト通り/usr/local/samba以下にsambaをインストールした場合は/usr/local/samba/privateというディレクトリを作ります.さらにそのパーミッションを0500にします.

# chmod 0500 /usr/local/samba/private

 次にSolarisのパスワードファイルからsamba用のパスワードファイルを作ります.そのためにsambaにはmksmbpasswd.shというスクリプトがついてきます.これはsambaを展開したディレクトリのsource以下にあるので,それを以下のように実行してください.

# cat /etc/passwd | mksmbpasswd.sh >/usr/local/samba/private/smbpasswd

さらにこのsmbpasswdファイルのパーミッションを0600にします.

# chmod 0600 /usr/local/samba/private/smbpasswd

最後にsmb.confの[global]セクションに

encrypt passwords = yes
を付け加えてください.
 次は${BASEDIR}/bin/smbpasswdというプログラムを使って,samba用のパスワードを設定します.基本的にこのsmbpasswdで変更されるのはsamba用のパスワードで,UNIXにloginするためのパスワードは変更されません.つまりsmbpasswdでパスワードを変更した場合,Windowsマシンからファイル共有のパスワードはその新しいパスワードですが,telnetなどでloginするときには相変わらず古いパスワードのままということになります.
 これら二つのパスワードをsmbpasswdで両方を同時に変更するような設定も出来ますが,なぜか私の環境(Solaris2.5.1 on SS20)では動かなかったので,ここでは説明できません.設定方法はsmb.confのmanの"passwd program","passwd chat","unix password sync"のパラメータの説明と,samba付属のENCRYPTION.txtを参照にしてください(日本語訳もhttp://samba.bento.ad.jp/pub/docs/ENCRYPTION.txtにあります).(付記(1999年6月29日):原因らしきモノが判明しました.)

ドメインコントローラ

 先に書いたとおり,sambaはドメインコントローラになることが出来ます.本当であればNT serverを購入しないとドメインを構成できないのですが,sambaでほぼ代替出来るのです.ただし先に書いたとおり,Windows NTをドメインのメンバーにすることは出来ません.よってWindows NTを含めてドメインを作りたいのであれば,今のところNT serverを購入する以外に手はありません.

暗号化パスワードへの対応

 ドメインコントローラになるには暗号化パスワードに対応していなければならないので(対応していなくても出来ますが,ドキュメントによると不都合が出る可能性があるようです),まず上記の説明をもとに暗号化パスワードに対応させます.

smb.confの設定

 それができたらsmb.confをリスト7に示すように修正します.[global]セクションに設定を追加し,さらに新しく[netlogon]セクションを作ります.

ログオンスクリプトの設定

 次にlogon scriptをおく場所を用意します.logon scriptは95/98マシンがドメインにログオンしたときに自動的に実行されるバッチファイルです.リスト4の設定では/usr/local/samba/netlogonというディレクトリに置くことになっているので,まずこのディレクトリを作成します.さらにその下にあるstartup.batというバッチファイルがログオン時に95/98上で実行されるので,そのファイルを用意します.ここで注意しなければならないのは,Solrais上でこのバッチファイルを作成・修正する場合,エディタによっては改行コードがLFのみになってしまい,改行コードがCR/LFであるWindowsマシン上ではうまく実行できなくなってしまいます.Mule/Xemacsなど改行コードを変更できるエディタを使用するか,Windowsマシン上で作成・修正するなどしてください.
 ちなみにここで示した設定では,ユーザーはログオンスクリプトを修正・書き込みが出来ないようにしています.しかし"write list"で指定したユーザーやグループは修正・書き込みができるので,ログオンスクリプトを修正するユーザーやグループをここにリストアップしておくといいでしょう.
 またこの例では全てのユーザーで同じログオンスクリプトを使うようにしていますが,一人一人に異なるログオンスクリプトを割り当てるという運用も可能です.その場合はsmb.confのlogon scriptの項目をリスト7に説明があるように変更します.ここで%Uという部分がそれぞれのユーザー名に自動的に置き換えられるので,/usr/local/samba/netlogonディレクトリ以下に「ユーザー名.bat」というファイル名で全ユーザー分のログオンスクリプトを用意してください.

WINSサーヴァー

 最初に述べたWINSサーヴァー機能ですが,samba側で特に設定しなくてもデフォルトで使えるようになってます.Windows95/98/NTのWINSサーヴァーの設定でsambaを動かしているSolarisマシンのIPアドレスを指定してください.ただしWindows NT serverのWINSサーヴァーのpush/pullの機能は実装されていないので,他のWINSサーヴァーとのWINSデータの同期などは出来ません.
 逆にsambaのWINSサーヴァー機能を使わずに別のWINSサーヴァーを参照させるようにしたいという場合は,smb.confの[global]セクションに以下の内容を付け加え,WINSサーヴァーのアドレスを指定してください.

wins support = no
wins server = WINSサーヴァーのアドレスを指定

WINSとDNSの連携

 Windows NT serverに付属のMS社のDNSサーヴァーは,WINSで得られたホスト名−IPアドレスの対応をDNSに登録することが出来ます.Samba自体はSolaris上で動くDNSサーヴァーとのこういった連携機能は当然持っていません.しかしsambaが保持しているWINSのデータは,${BASEDIR}/var/locks/wins.datというファイルににテキストで格納されているので,それをもとにDNSの設定ファイルを生成すればMS-DNSのようなWINS-DNS連携機能が可能です(注7).
 wins.datをDNSの正引き・逆引きファイルに変換する,へたくそな(笑)Perl5スクリプトの例をリスト8に挙げます.このスクリプトの冒頭部分を環境に合わせ書き換えてください.Perl5用ですが,特有の機能は使っていないので,29行目と38行目の"¥@"と"@"に書き換えればPerl4でも動くでしょう.これにwins.datを読み込ませれば,その内容が設定したファイルにbindの設定ファイルの形式で書き出されます.それをnamedに再読込させればWINSデータベースの内容がDNSで参照できるというわけです.ここで挙げたスクリプトではシリアル番号は固定なので,セカンダリにゾーンを転送するといったことは出来ません.が,MS-DNSでもWINSと連携するとセカンダリにゾーン転送できないようなので(http://www.ocn.ad.jp/setup/dns/a-win.html#q2-3参照),これで同等です:-p.どうしてもセカンダリにゾーン転送したい場合は,スクリプトを改造して,更新の度にシリアル番号を1づつ増やすようにすればいいでしょう.RFC1982によるとシリアル番号の最大値は約43億なので,相当頻繁に更新しても桁あふれはなさそうです.ただしこの方法は当方で長時間の動作確認を行ったわけではないので,at your own riskで使用してください.

Windows NT Serverとの比較・sambaの今後

 以上でsambaをWindows NT serverと置き換えるべく説明をしてきましたが,今のところsambaで実現できないNT serverの機能がどうしてもあります.文中でも幾つか触れてきましたが,改めて列挙しますと

  1. WINSサーヴァーのpush/pullが出来ない.
  2. 他のドメインとの信頼関係が組めない.
  3. NTをドメインに参加させられない.
といったものです(DHCPやMacintosh向けのファイルサーヴァー機能など,samba以外のアプリケーションで実現される機能は除いています).これらの機能を使う必要がないのであれば,sambaで十分NT serverの代わりをこなせることになります.
 最後に,sambaのこれらの機能への対応への予定・(私の)予想を述べてこの原稿を終わりにしましょう.
 これまでは1の機能と2の機能を組み合わせて,一つの組織内の複数のドメインの連携を取っていたわけです.しかし今後のMicrosoftの方針としては,これまでのドメインのシステムに代えてActive Directory Serviceを導入するようですし,WINSもDNSで置換する方向のようです.したがって今後これらの機能の必要性は減少していくでしょうから,おそらくこれらの機能がsambaに追加されることはないでしょう.ちなみにsambaのActive Directory Serviceへの対応は,ヴァージョン2.1で予定されています.
 3の機能は新versionの2.0で取り入れる予定でしたが,現在βテスト中の2.0.0への実装は見送られる模様です.開発自体は続けられていますので,近いうちに実装されることでしょう(と言ってもどの程度近いうちかはわかりませんが).
All right reserved Copyright
(C) ISHIDA Tsubasa <tbs-i@mtg.biglobe.ne.jp>