Samba QandA

Author 奥山健一
Last Modified 2001/06/17 00:30:02 (Sun)

QandA について

[ 管理番号: 000000000004 ]
Q. QandA って何ですか?
A.

Questions and Answers の略です。 良く聞かれる質問や、予想される質問に対してその答を用意してあります。

誰かに質問したりする前に、なるべくここを確認するようにしましょう。 ここに載っているような質問をすると、怒られることがありますよ(^^;)。

[ 管理番号: 000000000005 ]
Q. QandA の入手先

この QandA はどうやったら手に入りますか?

A.
<URL: http://fjskyousosama.holy.jp/Documents/Samba-QandA.j.html > に最新のものが置いてあります。
[ 管理番号: 000000000006 ]
Q. FAQ と QandA の違いは?

FAQ というものを良く聞きますが、QandA との違いは?

A. QandA は想定問答集だと思えばいいです

FAQ は Freqently Asked Questions の略です。 ML などで、繰り返し現れる質問に対する答を集めたもので、 このため繰り返し現れない質問、 まだ聞かれたことのない質問は FAQ には収集されないことがあります。

QandA はどちらかというと、想定問答集に近いです。

FAQ のように繰り返される質問に対する答はもちろん、 まだ誰も行ったことのない質問であっても、 知識として保存しておいた方が良いと判断された場合は、 QandA はそれを取り込みます。

もっとも、FAQ も最近は QandA と何処が違うのか判らないぐらい 予測される質問を予め準備しておくことがありますので、 そんなに厳密に考えない方が良いでしょう。

[ 管理番号: 000000000021 ]
Q. QandA に新しい項目を追加するには?

ある問題で突っ掛かってしまいました。 結局解決したのですが、 他にも同じ問題で引っ掛かる人がいるかも知れません。 QandA にしたいと思ったのですが、 どのようにすれば新規に登録してもらえますか?

A. 以下のルールに従ってください。

まず QandA を良く読んでください。 もうすでに誰かが問題を解決していませんか? 大丈夫ですね? ここでチェックしなかったせいで無駄骨を折っても誰も 喜びも悲しみもしませんよ?

QandA は GPL に従っています。 あなたの提出した QandA は自動的に GPL に従うことになります。 それで構いませんか?構いませんね?


では、次に <URL: http://fjskyousosama.holy.jp/Documents/Samba-QandA.tar.gz > を獲得してください。 ここには、QandA を作成するためのツールが一セット含まれています。 この tarball を展開すると

     ./Samba-QandA
        +--> newfile/
        +--> .index
        +--> RCS/
        |     +--> qa.merge,v
        |     +--> template,v
        :     :
        +--> bin/
        :     :
        +--> temp/
        :     :
  

のようにディレクトリが展開されるはずです。


./Samba-QandA ディレクトリに移動して、 次のように実行してください。

   % ./bin/newfile.perl
   Your new file exist as name ./newfile/000000000021.qa
  

ファイル名は時々によって異なるでしょうが、 ./newfile の下に xxxxxx.qa のようなファイル名ファイルが1つできました。 このファイルをベースにQandA を書いていきます。

新しくつくられたファイルは次のような形をしているはずです。

# Samba QandA, Copyright (C) 2001 K. Okuyama
#
# This document is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# 日本語の場合、文字コードは EUC に統一してください。

<Q>
 <QTITLE:>
 <QBODY>
 </QBODY>
</Q>

<ANS>
 <ATITLE:>
 <ABODY>
 </ABODY>
</ANS>
  

まず Copyright を書き換えて、 適切な日付と著者名に変更してください。


適切な Question Title と Question Body を考えてください。

Question Title はごく短いタイトルで、 質問を表すものです。 これは1行に収まる程度の文章に限定してください。

Question Body は質問を詳しく説明した文章です。 とは言っても、あまりにも長いと質問が判らなくなりますので、 加減は必要です。

Question Title を決めたら、 <QTITLE: > の間に書いてください。

ただし、Question Title に改行を含んでは行けません。 < から > までが全て1行に収まらなくてはいけません。 これはスクリプトを手抜きしたためです。 が、所詮この手の物は作った者勝ち。諦めていただきましょう。

一方 Question Body は、 <QBODY> </QBODY> の間に書きます。 この中の記述ルールは通常の HTML の BODY 部に従います。 ただし、いくつかルールを守る必要があります。

まず、Question Body は HTML 4.01 Transition に従ってください。 たとえば、<P></P> とペアで使い、段落を表すものであって、 決して改行を意味するものではありません。 これらの「意味」を厳密に守ってください。

Java Script などのスクリプト言語による記述は禁止します。 理由の 98% は QandA のパーサーが対応していないから、 ですが、残り 2% は様々な Webブラウザに対応したり、 ページを機械に読んでもらって理解している人達のためです。

行頭が # で始まる行はコメント行です。 最終的な QandA には反映されません。 これとは別に HTML のコメント <!----> がありますが、優先順位は # の方にあります。ですので、

# This is comment for QandA.
<!-- This is not comment for QandA, but is comment for HTML
# Will this comment end work? -->
If it did, this line will be visible.
&# --> This line will always be visible.
  

というソースは

This line will always be visible.
  

としかなりません。

ソースコードの1行には、 HTML の命令タグか、文章か、 QandA 用のコマンドか、 どれか1つしか書かないでください。 これも処理スクリプトの都合です。ですので、

   <QBODY> This is example QBODY.
   </QBODY>
  

のような書き方はしないでください。 たとえブラウザで見たときにどんなに間抜けな空行が追加されていても、 です。 今のスクリプトが仮に、偶然にもあなたの書いた書き方を処理できても、 後で何らかの改造を施された後も処理できる保証がありません。 一方で、間抜けな空行は基本的にはブラウザが間抜けだからであって、 今後改善される可能性が残っています。

さて、QBODY の中では、次のような特殊命令が使えます。

[管理番号: xxxxx]

他の QandA を参照する際に使います。 一度登録された QandA の管理番号は基本的に変化しません。 このコマンドを使うと、 b と d で囲まれた範囲が指定した管理番号へのリンカー にもなります。

1つ注意すべきなのは、管理番号 00001 と 管理番号 0000001 は 異なる、という点です。 管理番号は実際には「番号として」ではなく「文字列として」 処理されます。

<URL: >

1行コマンドです。 <URL: > の間に URL を指定すると、 そこがそのままアンカーとしても参照されるようになります。 同じことを2度書く必要がないのは便利です。

<SCRIPT>,</SCRIPT>,

スクリプトを書くときは、このコマンドで囲んでください。 今の所 <PRE> </PRE> に置換される、以上の意味はありません。


Question Title と Question Body を考えたように、 答に対しても Answer Title と Answer Body を考えてください。

Answer Title は、答を一言で答えられた場合に書いてください。 時と場合によっては、無理な場合もありますので、 これは必ずしも必要ではありません。

Answer Body は答の本文です。 具体的であればあるほど、詳細であればあるほど良いはずですが、 だからといって不必要な事まで書く必要はありません。

<ATITLE> の所に、Answer Title を書いてください。 記述ルールは <QTITLE> と同じです。 もし、Answer Title が無い場合も、 <ATITLE> は消さないでください。

<ABODY> </ABODY> の間に Answer Body を記述してください。 記述ルールは、 <QBODY> と同じです。


場合によっては、どの様に見えるか試したい場合があるでしょう。 この場合は、この新しいファイルを

    ./Samba-QandA/source/QAs/
  

の下にコピーしてください。その上で、

    ./Samba-QandA/source/qa.merge
  

ファイルの <QABODY> </QABODY> で囲まれた中に

<QABody>
include ./QAs/000000000004.qa
include ./QAs/000000000021.qa
</QABody>
  

のように適当に追加して下さい。 その後、

   % make clean
   % make
  

とやると、

   ./Samba-QandA/result/Samba-QandA.html
  

というファイルができていると思います。 これを適当なブラウザーなどで見れば、 結果を参照することができます。


満足なできばえの QandA が完成したら、 Subject に [QandA] という文字を書いて、 <URL: mailto:okuyamak@dd.iij4u.or.jp > までメールで送ってください。

ただし、いくつか注意事項があります。

私の気分が載らないと、載らない。
この QandA は「私が好きなものをのせる」というすさまじい 優先順位がついています。自分で書いておいて何ですが、 誰か適当な人にとっとと引き継いでもらいたいものです。
管理番号は改めて振り直します。
これはある意味当然の話で、作り始めたときに 35番でも、 作り終わったときには別の人が 35 番を取っている可能性があります。
文面はかなり書き変わる危険性があります。
文面も「気分」で決めていますので、当然この危険性があります。
時には査読があり得ます。
なんか怪しい内容や逆に大事そうだが情報が足りていない場合、 書き直してもらうことがあります。 当然、採用に掛る時間は不明です。
暇なときにしか更新されません。
私がかなり暇になったときにしか、Samba-QandA は更新しません。
受取りのメールはあったりなかったり。
これも「気分」です。諦めましょう。

こんな劣悪な条件で良いならば、 もしかするとあなたの QandA は採用されるかも知れません。

[ 管理番号: 000000000022 ]
Q. この QandA システムを流用してもいいですか?
この QandA システムを別の QandA を作るために使ってもいいですか?
A. どうぞ

この QandA システム全体が GPL ですので、 その条件下であれば自由に使ってください。

ただし、使い方に関するドキュメントはありません。 自力でスクリプトと Makefile を読んで、理解してください。

   ./Samba-QandA/source/qa.merge
  

というファイルに基本的な制御用の情報が、

   ./Samba-QandA/source/QAs/
  

の下に、各 QandA のソースを置けば良いようにつくったはずですが…。

なお、使えないシステムだと判っても、私は知りません :p

Client の設定などに関する話

Windows Client の種類・設定の違いなどの話。

[ 管理番号: 000000000003 ]
Q. Samba と相性の良い Windows OS

Windows OS の種類によってパフォーマンスは違うのか?

A. 違います。それもかなり大幅に。

一番端的に判るのは Windows NT と Windows 2000 の違いでしょう。 netbench 7.0 を使ってパフォーマンス測定を行った場合、 全く同一の PC 上で動く Windows 2000 は、Windows NT の、 おおよそ 1.5 倍の速度で通信できることが観測できます。

実は NT が発行する SMB message の3つに1つは SMB nttrans: IOCTL という種類のものです。 このリクエストに対して Samba は not supported を返します。 しかし、何度 not supported を返しても NT は 3つに1つは このリクエストを発行し続けます。 しかし Windows 2000 はこの命令を発行しません。 これ以外にもいくつもの命令が NT では効率悪く発行されており、 2000 ではそれに対する改善がなされています。

また、TCP/IP packet の再送状況を見ていても、 明らかに NT の方が 2000 に比べて再送が高頻度に発生します。

これらの要因が重なって 1.5 倍もの速度差を引き起こすのです。

今の所これら以外についての正解は持ち合わせていません。 従って、私が推奨できるのは、
「2000 でも NT でもいい場合は 2000 にしろ」
という事だけです。 95/98/98SE/ME の間にどの様な関係があるのか、 私には判らないし、 2000 や NT と比べてどれが効率が良いか、も判りません。

[ 管理番号: 000000000007 ]
Q. Samba と相性の良い PC は?

PC を購入する場合、Samba と通信する上で考慮した方が良い点は?

A.

最近の PC は マザーボードに Ethernet Card などいろいろなものが 標準装備されていたりしますので、その辺も含めて答えると、 考慮するべき点は山のようにあります。


とりあえず、PC の CPU パワーはたくさんあればあるほど良いでしょう。

Samba は Windows からのリクエストを受けて動きます。 しかも、人間が行う1つの動作に対して複数のリクエストを順番に発行して、 その処理を行います。 この時、 Windows はあるリクエストを Samba サーバーに投げたら、 その結果が得られるまで次のリクエストを絶対投げません。

このため、Samba は十分に速く返答しているのだが、 その返事をすばやく処理できないために処理全体がもたもたする、 という現象が起るとトータルのパフォーマンスが低下してしまいます。 これを回避するには PC の CPU パワーはたくさんあった方が良いわけです。

さらに言うならば、 CPU の処理能力が低いと、 そもそも NIC カードを限界能力まで引き出してやることさえできません。 これでは処理速度が上がるわけがありません。 このような観点からも CPU の能力ははたっぷりあった方が良いのです。


メモリをけちるべきではありません。 128Mbyte ぐらいはどどん、と載せてあげましょう。

Windows ではメモリの総量が 64Mbyte 以下の場合、 Excel や Word などの Microsoft 製オフィススィート と呼ばれるソフトを使うと メモリが足りなくなることがよくあります。 このため、これが発生すると disk 上に仮想空間を用意して、 ここにメモリのイメージを一部書き出しながら動作する、 ページスワップという処理を開始します。

いかに昨今の HDD が速くなったとは言っても、 所詮メモリの敵ではありません。 軽く1万倍以上の速度差がある以上、 ページスワップが起動したら実行速度は著しく落ちます。

実は、Internet などのネットワーク通信は、 通信するべきデータを格納しておく送受信バッファーが必要なので、 通信しない場合に比べてメモリを要求します。 Samba へのアクセスを要求したアプリケーションが Swap Out されていると 受信したデータをすばやく処理できないため、 格納用のバッファーはますます多く必要になり、 ますますメモリを圧迫します。

残念ながら、Windows はこのような状態に陥った場合の メモリの利用方法が unix に比べて格段に劣っています。 Windows の場合、特定の利用目的用にメモリを割り振ってしまったら、 他の用途に融通し合う、という事ができない構造になっているのです。 ですので例えば
「disk cache 用のメモリがまだたっぷり余っている」
という場合でも、 そのメモリを利用することなく Application 用のメモリを SwapOut してしまう、 という現象を起します。

Word だけ、Excel だけ、というのであれば、 128Mbyte もあればこのような状態はほぼ確実になくせるでしょう。 最初の 64Mbyte は Internet Explorer に、 次の 64Mbyte を Word にという概算です。

ただし、Word 文書の中に Excel の表を OLE の形で取り込む、 などと言うことを始めると、Word と Excel が同時に動き出しますので、 128Mbyte では足りません。 こういう使い方をする場合は 256Mbyte ぐらいは欲しいでしょう。


NIC カードも安物を買うべきではありません。 また、通信速度も 100Mbps 未満のものにするべきではありません。

とりあえず Ethernet で通信するもの、と仮定します。 Token Ring の場合などはそんな人自身が少ない上に、 あまり選択肢もありませんので悩みようがないからです。 [脚注 1]

まず、最初に重要になるのは、 Ethernet Card、あるいは Mother board にのっている Ethernet Chip 上に 存在する send buffer 並びに recv buffer のサイズです。

Ethernet Packet は、 最大で全長 1518byte (正確には 1518オクテット、と呼ぶ)になります。 逆に言えば、最大 1518byte までは連続して飛んでくる可能性があるわけです。 もし、recv buffer のサイズが 1518 byte 未満の場合、 受信の真っ最中に Ethernet Chip は CPU に向かって
「データを吸い出してくれ」
とお願いしなくてはいけません。 これが所定時間以内に始まらないと buffer が足りなくなり、 受信したビットを捨てるしかなくなってしまい、 その Packet は通信に失敗したことになってしまいます。 が、はっきり言ってこんな Critical なタイミングでのアクセスを 成功させるのはかなり難しく、結果、 Packet をロストする確率は非常に高くなるでしょう。 [脚注 2]

次に、ISA バス接続のカードや PCMCIA のカードでも 16bit bus モードで つないでいるような古いカードは使うべきではありません。 CardBus のような 132MByte/sec(1056Mbps) で通信できるものを使うか、 PCI バス対応のネットワークカードを使うべきです。

古いカードは bus 幅が狭く、そのためカードへのデータ転送や、 カードからのデータの吸出しに時間がかかります。 古い PCMCIA の場合、 最大転送能力は 20Mbyte/sec(160Mbps) しか出ません。 これではタイミングが悪いと 100Mbps で飛んできたデータをきちんと 吸い出すことはできなくなる恐れがあります。

例えばアプリケーションからのリクエストで、 何らかの packet を送信しようと PC Card にデータを送信している最中に 外部からデータがやってきて、しかも Ethernet Chip 上の バッファーが小さかった場合、ほぼ確実にその受信したデータは 失われてしまうでしょう。

Ethernet Card の中には send buffer/recv buffer とも 通常の TCP/IP の受信ウィンドウサイズである 8kbyte を 遥かに上回るバッファーを用意しているものがあります。 これを使うと、Winsock のバグなども回避できるので、 buffer サイズは大きい方が良いでしょう。 あるいは、自発的に DMA ができるものも良いでしょう。

全二重通信対応のカードの方が通信効率は良くなりますから、 全二重通信対応カードにするべきです。

通信できるビットレートは最大のものを選ぶべきです。 10Mbps でも 100Mbps でも構わない場合は、100Mbps を選ぶべきでしょう。 もし、光ファイバーなどで 1Gbps を使うことも可能な場合は、 1Gbps を選択すると、もっと良いでしょう。 通信速度の絶対値が速い、 という条件が通信にとって不利になることはまずもってありません。

ただし、通信速度が速くなればなるほど、 到着したデータをすばやく処理し、 新しくリクエストをすばやく生成する必要が出てきます。 このために必要な CPU パワーとメモリはこれまた相応に必要になります。 [脚注 3]

実はこれらの条件をすべてチェックする必要はありません。 安い・昔のカードほどこれらの条件を満たしておらず、 最近の・高機能なカードほどこれらの条件を満たしている、 という性質がこれらの商品ラインアップにあるからです。

ですので、 CardBus あるいは PCI で使う、 10/100 Mbps の両方に対応していて、 全二重対応の、 なるべく新しい NIC を利用していれば良い、と言うことになります。

当然ですが、この NIC を使えない/使いこなせない PC は 効率の悪い PC という事でもあります。 そのような PC でパフォーマンスを求めても、 努力に対して成果は上がりません。


[脚注 1]
だいたい、そんなことで悩むのは IBM の社員ぐらいだろう(^^;)
[脚注 2]
注意して欲しいのは、この様な現象が起っても別にそのカードは機能不全ではない、と言うことです。デザインが悪いのは事実ですが、つないでいる計算機側が適切にデバイスに応対してくれるなら十分な性能は出るわけですから。ある通信メディアで通信できることと、そのメディアの能力をフルに近く引き出すのは大きく違うことで、メーカーはフルに近く引き出すことなんか保証していないんですよ。
[脚注 3]
「金持ち全部持ってる」「貧乏人何も持ってない」の2状態しかない、ということ。「中ぐらい」という半端な状態は投資対効果もあまり良くなく、お金の無駄でしかありません。これは計算機の関与するほとんどありとあらゆるものについて言える事実です。

Server

Server マシン、機種などに関する話

[ 管理番号: 000000000008 ]
Q. Samba を利用する上でお勧めの Server の条件は?
A.

これは Client 以上に条件が沢山あります。 とりあえず、unix あるいはそのクローン OS でなくては動かない、 という事は判った上での話をすることにします。

[ 管理番号: 000000000009 ]
Q. 組み込みマシン用 OS で Samba は動きますか?

VxWare や Phoenix OS など、 組み込み OS の一部には unix 互換なインターフェースを歌うものがあります。 これらの上で Samba は動きますか?

A. 本家の方で試した人がいたようですが無理でした

unix clone ではあっても、 ちゃんとプロセス毎に異なるメモリ空間を持っていない、 一部の組み込みマシン用 OS は諦めましょう。

一部の unix clone を歌う組み込みマシン用 OS は、 プロセス毎のメモリ空間を正しく掌握していません。 あるプロセスが消費したメモリを解放するのは、 そのプロセス自身の仕事になっています。

残念ながら、Samba はそのような OS 上で正常に動き続けられるほど、 お行儀の良いプログラムではありません。 あるクライアントの相手をしていたプロセスが終了する際、 メモリを完全に自分で解放してから終了する、 などという殊勝な作りにはなっていません。

また、まだまだメモリーリークなどのバグが残っていると予測されます。

結果、しばらく(と言ってもどれぐらいかは状況依存ですが)使うと メモリ不足で暴走を始める、などの現象が予測されます。

これは「仮想空間を持っている」だけでは駄目なので、 それらの OS に 仮想空間対応モジュール を追加したら OK、と言うほど簡単に解決する問題でもありません。

[ 管理番号: 000000000010 ]
Q. Server CPU の条件は?
A. CPU パワーが十分あるマシンを選びましょう。

まず最初に断っておきます。 この問題は正確には OS とあまりにもタイトな関連性があるので、 実は厳密に言うとケースバイケースな例外が一杯あります。 そこで、ここでは OS とは Linux や FreeBSD などの、 有名で Free な OS に限定することにします。

ここでいう CPU パワーとは SMP などで稼げるパワーとは若干違います。 SMP であればもちろん良いのですが、 並列度が望むほど得られるとは予測しないことです。 それよりもむしろ、単一プロセッサーの演算速度を上げてください。

Samba という Server プログラムは、 それ自身は文字列変換を行う時ぐらいしか CPU パワーを消費しません。 しかし、network を監視し、directory 状態を毎回参照し、 file data を読み書きする、というその動作の性質上、 大量の system call を発行します。 実はこの system call の大量発行が CPU パワーを大量に消費するのです。

例えば、 netbench などの benchmark test を使って、 パフォーマンスを計測するとします。 当然パフォーマンスは Client の台数にしたがって徐々に延びていくのですが、 あるポイントでそれ以上延びなくなります。 この上限に達した直後の CPU Usage を vmstat で見ると、

User System Idle
33 % 66 % 0 %

のような数値になります [脚注 1] 。 Samba はかくも CPU を大量に要求するソフトなんです。

SMP にすることによる効果は OS に依存して決定します。 しかし、あまり期待はできません。

Samba は Client が増える度に smbd というプロセスを Client 用に 1つづつ増やしながら対応していきます。 SMP にすることで、この smbd プロセスを同時に処理できる数は 一気に CPU の台数分増えます。

しかし、すでに示したように、 CPU usage の 2/3 は kernel の中で消費されています。 そして、kernel の中の処理は、「全体で1つの作業」という 整合性を保たなくてはいけないため、 数多くの semaphore によるシリアライゼーション [脚注 2] が組み込まれています。 DiskIO/FileIO もその典型例ですし、NIC Control もその典型です。

もし、Disk IO や File IO, NIC Control のように外部デバイスが遅くて 間に合わない、という状態であるならば CPU usage は 100% にはなりません。 これは uni processor の段階でもそうのはずです。

従って、CPU 自身が何らかの計算を行わなくてはいけない所で、 kernel がガンガン動かなくてはいけなくて、 なおかつシリアライズされた場所、 がボトルネックになった瞬間から SMP はその効果を失います。 つまり、ある一定時間以内にシリアライズされた計算の総計が、 シリアライズされていない部分の時間の総計を上回った瞬間から、 それ以上の CPU の追加は無意味になるのです。

より細かいグラニュアリティを持った制御や、 SMP を熟慮してどのデバイスをもどの CPU も制御できる、 という性質を持った OS を利用すると、 この限界ポイントはかなりの高負荷をかけないと現れないでしょうが、 Linux や FreeBSD のように基本的には UniProcessor 用 OS の場合、 やはりものには限度というものがあり、 そうなると CPU の台数を増やすよりも 単体の絶対能力を向上させる方が有利になるでしょう。


[脚注 1]
数値は概ね Linux 2.4.0 + 800MHz P-III での実測値と同じぐらいです。
[脚注 2]
ようするに「一度に1つしか処理できない」「誰かが処理していると、そこに踏み込んではいけない」状態にすること
[ 管理番号: 000000000011 ]
Q. Server に載せるメモリの量は?
A. メモリは…適当に与えましょう

unix の場合、Windows などと違って、メモリの用途はダイナミックに 変更されています。 沢山 disk IO がある場合は、メモリの多くは file cache に使われるでしょうし、 プロセスが大量にメモリを要求すれば、 file cache は減ってプロセス空間が増えます。 従って、OS が認識できる限り、 メモリをいくら与えても無駄になると言うことはありません。

Samba はそれ自体はさほどメモリを消費しません。 しかし、Samba は、 大量にディレクトリ検索や inode 検索を要求します。 ファイルシステムの構成が Windows と unix では異なるため、 Windows が一発で獲得できる情報を unix 上で獲得するには、 system call を何度も発行しなくてはいけないからです。

file system cache 用にメモリが大量にあると動作効率は向上します。 この場合、メモリの量は、基本的に Windows と共有している disk の 容量に比例して大きくする必要がある、と言えます。

注意が必要なのは Samba Server マシンを NFS Server としても 利用している場合です。 NFS Server は Samba Server とは逆に、 メモリを大量に消費するという特徴があります。 このため、単一のマシンに Samba と NFS の両方の Server を兼用させる場合、 CPU パワーもメモリもたっぷりと与えるか、 あるいは Client の数を相当に制限して公開している disk space を減らすか、 どちらかをしないとパフォーマンスは覿面落ちていく結果になります。

[ 管理番号: 000000000012 ]
Q. Samba Server に適した OS は?
A. 実はこれが一番大事

前にも述べましたが、 netbench を使って uni processor 時における CPU usage を vmstat で見ると、

User System Idle
33 % 66 % 0 %

のような数値になります。 が、 Linux 2.4.0 において、 これをもっと Client の台数の少ない状態から計測していくと

user が消費する CPU usage は Client の台数に比例して延びるのに対し、
kernel が消費する CPU usage はほぼ Client の台数の二乗に比例して延びる

というそら恐ろしいことが判ります。

仮に、 Client の台数を n とします。 user が消費する(つまり Samba server process 自体が消費する)演算能力は O(n) で増えていきます。 smbd というデーモンプロセスは基本的に Client 1台に対して、 1つづつ増えていくので、これは自然な現象です。 一方 kernel が消費する(つまり Samba server が動いているために kernel が消費する)演算能力は O(n2) で増えていきます。 結果、必要となる総演算量は

O(n2) + O(n) = O(n2+n)

となります。 この内 kernel が消費する演算能力の比率は、

O(n2) / (O(n2) + O(n)) = O( n2 / ( O(n2) + n ) )
= O( 1 / ( 1 + ( 1 / n ))

となります。 この式は、CPU usage が 100% になるまで有効であり、 CPU が強力であればあるほど、n の上限値は大きくなります。 そして、 n が大きくなればなるほど ( 1/n ) は 0 に近づき、 結果、kernel が消費する CPU の演算量が全演算量に占める割合は 100% に近づいていきます。

さらに、この式にはもう一つ楽しい事実が含まれています。

全体の CPU usage は

O(n2) + O(n) = O(n2)

となります。ということは、CPU のパフォーマンスを2倍に増やしても、 n はその平方根、おおよそ 1.4倍にしかなりません。 サーバー能力要求量がインフレーションを起す、ということです。

この概算は、kernel の演算消費量が samba server process 自身の 演算消費量の成長率よりも速く上昇する限り、 必ず似たり寄ったりの結果をもたらします。

ということは、kernel がこの性質を持っている場合は、 Server が非常に非力な CPU で動いているならば、 smbd/nmbd などのデーモンプロセスの効率はパフォーマンスに 影響を与える事、 逆に CPU のパフォーマンスが高い場合は 優れた OS の選定こそがパフォーマンスに高い影響を与える事が 判ります。

実際に Server を用意し、 各 OS をインストールしては、netbench などで1台づつ client を 増やしながら vmstat を使って、 CPU usage の負荷をかけている最中の CPU usage の変化を計測することで、 各 OS がどのような動特性を持っているのか計測することができます [脚注 1] 。 逆に言えば、それ以外に 適切な OS を選ぶ方法はありません。


[脚注 1]
Client の台数をとびとびにすると、間の値が正確に判らないのでどんな曲線でも当てはめられるようになってしまう。従って手を抜かずに1台づつ増やすことをお勧めする。
[ 管理番号: 000000000013 ]
Q. Uni Processor で動作効率が良ければ SMP でも同じ OS で良い?

uni processor で動作効率の良い OS がありました。 SMP にしても同じように動作効率は良いでしょうか?

A. やってみなけりゃ判らない

Uni processor で動作効率の良かった OS と言っても、 効率が良かった理由は様々あり得ます。

  • uni processor は「自分とのインターロック」をとる必要がない ように作ることができる。 RealTime 性を要求しなければしないほど、 この傾向は強まる。 「インターロック」はグローバルなリソースである「実メモリ」 への直接のアクセスを必要とするので、 結構遅い処理にならざるを得ないので、 これが無くなると結構早くなる。
  • disk や ethernet card がそもそもすばらしく賢くて、 CPU はそこへ仕事を投げつけているだけ。 割り込みの頻度もごく稀にしか発生しない。
  • 実は小人さんが入っていて、一生懸命どうすると早くできるか考えている。

これらの最適化の中には当然、 SMP にすると効率が落ちてしまう戦略もあり得るでしょう。 あるいは SMP にしても効率は変わらないかも知れません。


また、SMP にして、CPU を2つにすると効率が上がるが、 3つにしても2つの時と同じである可能性もあり得ます。

unix の場合 user process 自体はほぼ確実に、 複数の CPU によって並列に動作することができます。 しかし、user process が system call を行ったり、 周辺デバイスが割り込みを生じさせたりして kernel モードに入っている間には、 リソースの排他的利用などを実装するために排他制御が必要になり、 そこで『処理のシリアライズ』という現象が起ります。

『処理のシリアライズ』というのはようするに、 あるリソースを使わないと先に進めないプログラムが リソースの利用権を求めて行列を作って待ってしまう、 という現象です。 この行列に並んでいない process は他の CPU によって先に進むことが できますが、この行列に並んでしまうと結局そこの部分だけは、 たった一つの CPU で処理しているのと同じことになってしまいます。

もし、この『処理のシリアライズ』の部分が全体に占める割合が ごく小さなものであれば問題にはなりません。 問題は例えば…uni processor の場合でも全体の 60% が この『シリアライズ』された部分だった場合です。

SMP で CPU を2つに分割すると、 この『シリアライズ』の部分よりも前は、 従来の2倍の速度で処理されるようになるので、 待ち行列に並ぶものの発生速度は従来の2倍になります。 が、『シリアライズ』された部分は CPU が相変わらず1つしか動けず、 しかも速度は変わっていないので、早くなっていません。 仮に『シリアライズ』された部分は必ず CPU 1 番が処理していたとすると、 CPU 1 番が uni processor だった頃の 60% の部分を、 CPU 2 番が uni processor だった頃の 40% の部分を処理することになります。 見てくれはおおよそ2倍の処理能力を持ったように見えます。

しかし、CPU を 3台に増やしても、 2台だったときに CPU 2 番が処理していた部分を CPU 2 と 3 で分担するだけで、 CPU 1 が処理していた『シリアライズ』された部分は相変わらず複数分担 できません [脚注 1] 。

結果、2台の時は、処理時間は1台の時の 60% にまで減ったのに、 CPU を 3 台にしても、1台の時の 60% のまま…という現象が 発生してしまいます。

あるいは、シリアライズ部が 40% を占めていた場合は、 CPU 3台までは効果があるが、4台目では効果がでない、 という事になるでしょう。


この問題はマイクロカーネルのジャンルでは結構研究が進んでいますが、 マイクロカーネルには「CPU が1台の時は相対的に遅い」 「CPU が2台の時はマイクロカーネルじゃなくても同じぐらい早く見える」 という難点があるので、 低レベルスペックマシン上の OS に採用しづらく、 結果、 スケーラビリティーの見えないまま、 不採用になることが多く、 結果、なかなか良いマイクロカーネルOSが見当たらない、 という状態に陥っています。

というわけで、 今の所、 『n台の CPU でそこそこ良い結果が得られた』 からと言って、 『n+1台の CPU でも良い結果が得られる』 保証はありません。


[脚注 1]
というか、複数分担できないから『シリアライズ』するのであって…

LAN

Hub などに関する話

Install

Install における Tips

[ 管理番号: 000000000023 ]
Q. Samba インストール方法の種類

Samba をインストールする方法にはどのようなものがあるの?

A. 大まかに言って3通りあります

Samba は次の3通りのインストール方法が選べます。

  • Binary Package を使う
  • Source Package を使う
  • CVS で Source コードを持ってきて、ビルドする

「Binary Package を使う」方法は、 Binary Package がある OS を使っていることが前提になります。

例えば、RedHat Linux やその系統の場合、 RPM というバイナリパッケージがあります。 また、FreeBSD の場合は「packages」というバイナリパッケージがああります。 他にも、メーカー製の OS の場合も、 それぞれバイナリパッケージがあるでしょう。

これらの何かを使う場合は、基本的にできることは限られています。 必要なバイナリパッケージを探しだし、 それぞれのやり方に合わせてインストールする。 それだけです。

このやり方には次のような利点・欠点があります。

利点
簡単

Binary Package をインストールしさえすれば、 機種依存な問題はほぼ解決されているでしょう。 間違いなく敷居は低くなっています。

ただし、これは『誰にでもできる』という意味ではない。

Binary Package がやってくれるのは、 実行用のバイナリファイルをつくり、 必要な設定ファイルなどをその OS に固有の置場所に置いてくれる、 それだけです。 この事実は失念しやすく、 思わず「誰でもできる」事と勘違いしてしまいます。

大抵の場合 uninstall もできる

大抵の Binary Package は、 自分が何処に何を置いたのかを覚えていてくれます。 インストールのために必要な依存関係をも含めて監視してくれて、 適切に uninstall してくれる場合がほとんどです。

Source Code からインストールする場合、 この機能はほとんど期待できません。

余分なディスクを消費しない

小リソースなデバイスにインストールする場合、 余分な(Source Code などの実行に直接関係のない) リソースを消費しない Binary Package でないと インストールすらままならないことはあり得ます。

また、コンパイラーなどをインストールする必要がない、 という意味でもメリットがあります。

これは単にディスク容量だけでなく、 セキュリティーの観点から見ても重要な場合があります。 不必要なコンパイラーが存在していると、 それを使って Cracking Tool をローカル環境でビルドする やからが出てくるかも知れないからです。 Cracker にほんの少しでも多くの自由を与えるのは、 得策ではありません。

早い

Source Code からインストールする場合、 コンパイラーなどが Source Code をコンパイルする必要があります。

Binary Package では Package にすでに保存されているファイルを 所定の場所にコピーするだけですので、 依存関係のチェックに掛る時間と ファイルコピーに必要な時間ぐらいしかかかりません。

欠点
Binary Package が存在しない世界では使えない。

説明も何もないだろう。そりゃそういうものだ。

Binary Package を作った人の意図した場所にしかインストールされない

Binary Package がファイルを設定してくれる場所は、 あくまでも Package を作り上げた人が考えた場所だ。 それが自然なのはその Package を作った人だけかも知れない。

当然、それが自分の欲しいインストール形態と異なる場合、 Binary Package は使えないことになる。

Source Code はついてこない

インストールしたパッケージが望み通りの挙動をしてくれるとは限らない。 大抵のソフトにはバグがあり、Samba と言えども例外ではない。 というよりも Samba は Windows という「文書で規定されていない」 事柄の多い作品をエミュレートする必要があるため、 今でも数多くの問題が発見されている。

この場合、Source Code なしで問題を特定したり、 解消するのは難しいが、Binary Package は大抵の場合、 ソースコードをインストールしてくれない。

必要な Package はないかもしれない

Binary Package は Source code が完成した後、 誰かが Binary Package を作って始めて使えるようになります。 逆に言えば Source code が完成するまえに Binary Package が完成することはあり得ませんし、 Source code が完成してすぐ Binary Package が完成するとは限りません。

従って、Source Code レベルで新しいバージョンが 提供されたからと言って、 Binary Package も同じタイミングで提供されるとは限らないのです。 この「遅れ」は、Security という観点からは致命的な場合があり得ます。


Source code package とは、 たとえば、RPM における srpm や FreeBSD の ports のように、 Source code をその環境に合わせて fix、 ビルドを行い、 最終的に Binary Package を作成、 場合によってはそのまま Binary Package のインストールへと進む、 パッケージを利用する方法です。

Binary Package を作成するために必要な手順は決まっていることが多く、 また Binary Package を自動的に作成できると人手が省けることが多いので、 多くの Binary Package は対応する Source code Package を持っています。

利点
Binary Package の次ぐらいに簡単

Binary Package を自動的に生成し、 それをさらにインストールするのが一般的なので、 Binary Package の場合に比べて手間が圧倒的に増える、 と言う事はない。

ただし、Binary Package を作成するための作業が Binary Package と異なる場合があるので、 Binary Package をインストールできれば Source code Package も インストールできる、という意味ではない。

uninstall 可能である場合が多い

install 作業自体は Binary Package と同じなので、 Binary Package に uninstall 機能がある場合は、 Source code Package にもあることが多い。

自分の環境に適合したバイナリを作成できる

例えば一般的な i386.rpm は i386 以降の全ての intel CPU で 動作するようにコンパイルされています。

これは逆の言い方をすれば、Pentium4 を持っていても、 Pentium4 用にチューンされたコードではなく、 i386 用のコードを実行していると言う事で、 Pentium4 を最も効率よく使ってはいない、と言う事になります。

Source code Package はソースコードをコンパイルする所から 制御できるので、 より効率の良いバイナリパッケージを作ることが可能だ、 と言う事になります。

複数の環境用のパッケージを作ることができる

大抵の場合、CPU などが異なっていても、 同じ OS (RHL とか solaris とか)であれば、 同じ Source code Package からバイナリパッケージを生成できるものです。

ここで、自分が使っている環境の一部が、 バイナリパッケージによるインストールしか受け付けない場合でも、 別のマシンにクロス開発用環境があれば、 そこでバイナリパッケージを作成することができます。 その際に自分のマシン用にチューンしたバイナリパッケージも 当然作成が可能です。

もちろん、そのためには Source code Package の制御方法を より詳しく知らなくてはいけませんが、 この結果得られるメリットには、 手間をかける価値のあるものです。

他の人のビルドの知識が使えるかも知れない

Binary Package と違って、 他の人が作った Source code Package を入手できれば そこには、その人がその Source code をその人の環境に 適合させるために使った全ての技術が集約されています。

これらの知識は単に Source code からインストールしただけでは 得られないし、もちろん、バイナリパッケージからは絶対に 得られない知識です。

欠点
Source code Package の無い世界では使えない

ものによっては、Binary Package の作成方法を 公開していない OS もあります。 このような世界では Source code Package が存在せず、 当然、結果として Source code Package は使えないことになります。

Source code Package をビルドするための知識が必要

Source code Package は Binary Package を作る環境でもあるので、 当然、Binary Package が自動的に行ってくれることを 全て指示しなくては行けません。

時によっては Source code からそのままインストールするよりも 手間がかかる場合があります。 uninstall など、通常の Source code が持っていない機能も 追加する必要があるからです。

時間が掛る、リソースが多く必要

Source code からバイナリを作り上げ、 それをインストールするのですから Binary Package に比べてインストールに時間が掛ります。

当然 Source code を展開し、コンパイルするための CPU、ディスクスペース、メモリなどが要求されます。 ここには Source code から直接ビルドするのに必要な 全リソース + Source code Package を実行するための (わずかとは言え) CPU, メモリ、ディスクスペースなどが 必要です。 三つの方法の中では最もリソースが必要となります。

これらを提供できるシステムがないと、 Source code Package を使うことはできません。

Source code を直接いじる場合に比べて柔軟性が少ない

Source code Package はあくまでも「Package」です。 信頼できる Package を作成するには、 正しい(誰かが Cracking をしていない) Source code を 入手する方法も提供しなくてはいけません。

これは逆に言えば Source code Package には、 自分が相手にしている Source code はたった1種類しかない と言う事になります。 それ以外の Package は正しく新しい Package なのか、 誰かが Cracking を仕掛けたソースコードなのか、 識別できないからです。

通常の Source code であれば、 正しい Source code を入手できた事さえ確認できれば、 後は自分でどんなに変更しても全く障害は発生しません。

Package の場合は「正しい Source code の獲得」と、 「それに対する変更」を全て「Package」の形で実装する必要があるので、 場当たり的な行動に出るわけには行きません。

これは細かい修正を繰り返す場合には極めて煩わしいもので、 特に他人の Source code Package をベースに この作業を行うのは悪夢になります。 一度 Source code Package を完全に停止させ、 自分の Patch を作成しなくては行けないからです。

最新の Source code 用の Source code Package はないかもしれない

Source code Package があると、 Binary Package が作れます。 ということは、Binary Package ができる本の少し前に Source code Package はできあがる、と言う事です。

当然、Source code が新しくなった直後には、 Source code package がありませんので、 これができあがるのを待つか、 自分で作る必要が出るでしょう。

このタイム・ラグは Binary Package と同様の 問題を引き起こす可能性があります。


「CVS で Source コードを持ってきて、ビルドする」 という方法は最も古典的な方法です。

unix の free software では、 昔から Source code は xxx.tar.gz という名前のファイルにまとめた 形で提供されてきました。 あぁ、もちろん、圧縮方法は .gz ではなく .Z だった時代もありますし、 圧縮されていなかった時代もありますが。 とにかく、最も古典的なソフトウェアのインストール方法は、 ソースコードを獲得して、そこに書かれたインストール手法に従い ビルドする、というものでした。

この方法はこの最も古典的な方法を、ストレートに継承した方法です。 唯一違うのは、ソースコードを獲得する方法が tar.gz ファイルを ダウンロードするのではなく、CVS を利用する方法になっている点です。

従来通りの tar.gz ファイルを獲得する、 という方法ももちろん使えなくはありませんが、 ほとんど推奨はできません。

Samba に限らず大抵のソフトウェアは、 バージョンアップに際して小さな変更が施されることがほとんどです。 根幹的なプログラムの構造から作り直される可能性はほとんどなく、 それゆえにソースコード上の変更も小さいことが多いものです。

従来通りの tar.gz ファイルを獲得する方法の場合、 バージョンアップの度に全ソースファイルを毎回獲得する必要があります。 これは最初の1回はともかく、 2度目以降に多大なネットワーク負荷が掛ってしまいます。

CVS はリビジョン管理システムです。 Samba も CVS で管理されており、 cvs の pserver 接続を用いて任意のバージョンを獲得することが できるようになっています。 これを使えば、2度目以降は1度目との差分情報だけを、 CVS システムが自動的に判断して送ってくるようになりますので、 バージョンアップの際の通信コストが圧倒的に少なくてすむようになります。

この CVS を使った方法の利点・欠点は次の通りです。

利点
任意のバージョンの Source が手にはいる

CVS 管理されている範疇の、 どのバージョンのソースコードでも自由に入手可能です。 当然最新のソースコードを入手することも可能です。

Binary Package として提供されていないものでも 入手可能ですので、 パッケージを使う場合と異なりタイム・ラグがなく、 Security 上の問題も発生しません。

状況によっては、tar.gz ファイルにまとめられていない、 ごく緊急に作られたパッチなども入手できるでしょう。

トータルの通信量が少なくてすむ

CVS は server 上にある各ファイルのバージョンを、 手元のそれと比較して、要求されたリビジョンタグがついている ものと異なる場合にのみファイル転送を行います。

従って、tar.gz の場合のように全てを毎回ダウンロードする必要がなく、 通信量的に効率的です。

ビルドのために必要な知識は、 通常のソフトウェア開発と変わらない

ソースコードからのビルドは、 結局、通常のソフトウェア開発におけるバイナリビルド となんら変わりません。 SRPM の場合と違って、これ以上の知識を必要としません。

任意の変更を自由に施せる

ソースコードがあり、ビルド方法は自由なので、 ソースコードを直接変更するのはもちろん、 バイナリの置場所なども自由に変更できます。

欠点
uninstall など package を使っていればサポートされる 機能が一切ない。

CVS を単純に使った場合、 提供されるのはソースコードが提供している機能そのままです。 そして大抵の場合、Source code が提供する Makefile などには、 install 機能はあっても uninstall 機能はありません。

ディスクスペースなどをかなり消費する

CVS の最大の欠点は、ソースコードが不要になっても ソースコードを簡単には消せない、と言う事です。 そのソースコードは次のバージョンを獲得する際に 必要になるからです。 さらに、CVS を利用すると小さなファイルを沢山作るので、 inode などもかなり消費します。

ビルドのためには CPU も消費しますし、 メモリも必要です。

[ 管理番号: 000000000024 ]
Q. お勧めの Install 方法は?
A. あなたのレベルと、管理するマシンの量依存

最もお勧めの Install 方法は、

  1. CVS でソースコードを獲得して、
  2. ソースコードから binary package を作成し、
  3. binary package を使って必要なだけマシンにインストールする

というもの。

もちろん、あなたの環境が悪くて CVS でソースコードを獲得できない場合は ソースコードを tar-ball [脚注 1] で獲得するしかなかろうが、 これは極力「環境をどうにかする」事をお勧めする。

あなたの管理するマシンが1台しかない場合、 binary package を作成せずに直接 install したくなるかもしれないが、 これは極力避けた方が良い。 標準的にサポートされている Makefile は確かに install はできるが、 uninstall ができない。

一方、あなたのレベルが低くて、 ソースコードから binary package を作成できない場合、 binary package を持ってきて、 これをインストールするしかない。 最初はこれしかないが、 可能な限り早く、自分のレベルを向上させることをお勧めする。


[脚注 1]
.tar.gz ファイルの事
[ 管理番号: 000000000025 ]
Q. CVS を使って Source code を獲得するには?

CVS を使うのが良いのは判った。 CVS を使って Source code を獲得する方法を教えてください。

A. 次の手順に従う

CVS を使って Source code を獲得するには、 次の手順にしたがって作業を進めてください。

次の条件を満しているものとします。 これらの条件を満すためにどの様にすれば良いのか、 は環境依存です。 環境依存な部分に関しては、 残念ながら一般的指針はありません。

  • cvs がインストールされていること
  • cvs が実行パスに含まれていること
  • cvs で Internet へ接続できること
  • Samba source code をダウンロードし、 さらにそこでビルド等を行えるだけのディスク容量 [脚注 1]
  • そのディスク容量を使えるユーザーパーミッション

さて、この上で、次の手順を踏んでください。

  1. ソースコードを持ってくるディレクトリを作成する。

    cvs でソースコードを持ってくるためのディレクトリを作成します。

    厳密にはこれは必要ない場合が多いのですが、 何かトラブルが起った際に、 そのディレクトリごと全部消せば他に影響が出ない状態にするのは、 エラー回避という観点から重要です。

    ここでは、/usr/local/src の下に samba というディレクトリを 作ることにします。

    % mkdir /usr/local/src/samba
          

    さらに、/usr/local/src/samba へ移動して、 /usr/local/src/samba をカレントディレクトリにします。

    % cd    /usr/local/src/samba
          
  2. cvs でサーバーに login する。

    cvs は cvs pserver へのアクセスに「login」という作業を 必要とします。

    % cvs -d :pserver:cvs@cvs.samba.gr.jp:/project/cvs login
          

    password を聞かれると思いますので、cvs と答えてください。

  3. checkout を行う。

    いよいよソースコードを獲得します。

    % cvs -d :pserver:cvs@cvs.samba.gr.jp:/project/cvs co samba-ja
          

    この作業をスタートすると、結構時間がかかります。

    もし、電話回線などで通信している場合は、 数時間掛ることを覚悟した方がいいでしょう。 また、途中で回線が切れてしまった場合は、 ディレクトリを消して1からやり直すことをお勧めします。 cvs はこの様な異常状態に対してあまり robust ではありません。

ここまで手順通りに行ってきた場合、 /usr/local/src/samba/samba-ja というディレクトリが作成され、 その下に samba の最新のソースコードが展開されています。


[脚注 1]
PentiumIII + Linux の場合30Mbyte
[ 管理番号: 000000000026 ]
Q. 取りあえずソースコードから普通にビルドするには?

CVS でソースコードを獲得しました。 binary package がない OS です。 どうやって Samba をインストールすればいいのでしょう?

A. 次のステップにしたがってください。

取りあえず [管理番号: 000000000025] に合わせて、 /usr/local/src/samba/samba-ja に CVS で獲得したソースツリーが存在するとします。


まず /usr/local/src/samba/samba-ja/source に 移動します。

% cd /usr/local/src/samba/samba-ja/source
  

次に configure スクリプトを実行して、 あなたの環境に適合した Makefile を作ります。 というか作れないかどうか、調べます。 でも、その前にまずこれを実行してみてください。

% ./configure --help
  

configure は必ず「./configure」と指定してください。 もし、何らかの理由で「configure」とするだけで /usr/local/src/samba/samba-ja/source/configure が実行できてしまう場合は、 [管理番号: 000000000027] を参照してください。

この configure の結果はバージョンによって異なりますが、 例えば次のような結果になるはずです。

Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print `checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local/samba]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
--enable and --with options recognized:
  --enable-maintainer-mode enable some make rules for maintainers
  --with-smbwrapper     Include SMB wrapper support
  --without-smbwrapper  Don't include SMB wrapper support (default)
  --with-afs     Include AFS support
  --without-afs  Don't include AFS support (default)
  --with-dfs     Include DFS support
  --without-dfs  Don't include DFS support (default)
  --with-krb4=base-dir     Include Kerberos IV support
  --without-krb4          Don't include Kerberos IV support (default)
  --with-krb5=base-dir     Include Kerberos 5 support
  --without-krb5          Don't include Kerberos 5 support (default)
  --with-automount     Include AUTOMOUNT support
  --without-automount  Don't include AUTOMOUNT support (default)
  --with-smbmount     Include SMBMOUNT (Linux only) support
  --without-smbmount  Don't include SMBMOUNT support (default)
  --with-pam     Include PAM password database support
  --without-pam  Don't include PAM password database support (default)
  --with-ldap     Include LDAP support
  --without-ldap  Don't include LDAP support (default)
  --with-nisplus     Include NISPLUS password database support
  --without-nisplus  Don't include NISPLUS password database support (default)
  --with-nisplus-home     Include NISPLUS_HOME support
  --without-nisplus-home  Don't include NISPLUS_HOME support (default)
  --with-ssl     Include SSL support
  --without-ssl  Don't include SSL support (default)
  --with-sslinc=DIR Where the SSL includes are (defaults to /usr/local/ssl)
  --with-syslog     Include experimental SYSLOG support
  --without-syslog  Don't include SYSLOG support (default)
  --with-profile     Include profile support
  --without-profile  Don't include profile support (default)
  --with-netatalk     Include experimental Netatalk support
  --without-netatalk  Don't include experimental Netatalk support (default)
  --with-quotas     Include experimental disk-quota support
  --without-quotas  Don't include experimental disk-quota support (default)
  --with-utmp     Include experimental utmp accounting
  --without-utmp  Don't include experimental utmp accounting (default)
  --with-privatedir=DIR     Where to put smbpasswd (/usr/local/samba/private)
  --with-lockdir=DIR     Where to put lock files (/usr/local/samba/var/locks)
  --with-swatdir=DIR     Where to put SWAT files (/usr/local/samba/swat)
  --with-sambabook=DIR  Where to put Using Samba book (/usr/local/samba/swat/using_samba) (default)
  --without-sambabook   Don't install Using Samba book
  --with-i18n-swat     Use i18n'ed SWAT
  --without-i18n-swat Don't use i18n'ed SWAT (default)
  --with-swat-def-lang=LANG  default SWAT language for old web browsers (empty)
  --disable-nls           do not use Native Language Support
  

ここで最も重要なのは
--enable and --with options recognized:
行以降の設定です。 自分にとって重要な設定はどれなのか、 よーーーーく考えて、configure につけるオプションを決定してください。 なお、英語が判らない、という苦情は受け付けません (^^;) この程度も理解できないなら、Samba を導入してはいけません。

configure のオプションが決まったら、 root になり、 その通りにスクリプトを実行します。

% su root
  

Samba の configure スクリプトには、 root でないと正しくテストできない内容が含まれています。 [脚注 1]

configure を実行した結果、 エラーが発生しなかったことを確認してください。 もしエラーが発生した場合、 その内容を注意深く確認してください。

エラーの内容によっては、 単に configure に追加するオプションを変更するだけで 回避できるものもあるでしょう。 あるいは Samba の機能を制限しなくてはいけなくなるかもしれませんが、 それはそれで諦めるか、 何らかの方法でそのオプションが使えるようにするしかないでしょう。

エラーの内容によっては、 何をどうしても回避できない場合もあり得ます。 この場合、OS やマシンを変えるしかない可能性があります。 諦めてください。

configure の実行に成功したとしましょう。 次に実行するべきは make です。 まだ root 権限のままのはずです。 このままビルドしましょう。

  

make の段階で失敗する可能性が、まだあります。

コンパイラーが適切ではないかも知れません。 ANSI-C 対応ではないコンパイラーの場合、 Samba のコードをコンパイルできないかもしれません。

ライブラリがあまりにも古すぎて、 あるいはシステムコールの引数が違っていて、 コンパイルが通らないかも知れません。

configure での適合性テストが不完全なのかもしれない。

まぁ、可能性はいっぱいありますが、 問題が発見されたら1つづつ対処して下さい、 としか言えません。

最近の OS であれば問題が発生することは滅多にないはずですが、 最近の OS であれば大抵の場合、 binary kit を作る方法もあるので、 この場合、成否は結構微妙だったりします…。

取りあえず、make にも成功したとしましょう。 最後に行うべきは install です。

  

/usr/local/samba というディレクトリが作られ、 この下に /usr/local/samba/bin, /usr/local/samba/var, /usr/local/samba/lib, /usr/local/samba/private などのディレクトリが作成されます。

/usr/local/samba/bin の下には実行ファイルが、 /usr/local/samba/lib の下には smb.conf などのファイルが、 /usr/local/samba/var の下には log ファイルが、 /usr/local/samba/private の下には smbpasswd のような セキュリティーファイルが それぞれ格納されています。 あるいは格納することになります。


Samba のバイナリをインストールする作業そのものはこれで終りですが、 このままでは Samba を daemon として自動起動する所までは、 いっていません。

しかし、ここでいきなり Samba daemon を起動しようとしないでください。 その前に smb.conf を設定し、 手で smbd/nmbd を起動して設定が正しいことを確認してください。 これが確認できない状態で Samba を自動起動できるようにしてはいけません。


[脚注 1]
これ自体が Security 上危険である可能性はあります。

smb.conf の設定

smb.conf 設定に関する Tips 並びに、 smb.conf 設定までに考慮すべき事

[ 管理番号: 000000000002 ]
Q. coding system の推奨値

coding system はどの様な値にすると良いのでしょうか?

A.

まず、どの coding system を選んでも、 Windows 側からはほぼ同じように見えます。 従って、これを決める要因は Unix 側の環境に依存することになります。 絶対的なルールはありませんが、一般的な規則は次の通りです。

EUC, EUC3
EUC で書き込みます。
Samba をインストールする Unix システムが EUC で日本語に対応した ファイルシステムを持っている場合使うと便利。 大抵の場合この様なシステムでは ls などは EUC 対応である。 Unix の大抵のファイルシステムは EUC を利用してファイル名を 作成しても問題を生じることはないので、 個人利用にお勧めです。
ただし、Shift JIS との完全な互換性がないため、 一部の機種依存文字などが表現できない可能性があります。
SJIS
Shift JIS で書き込みます。
Unix 側で Shift JIS を使いたい場合、指定します。 例えば Unix システムが Shift JIS をサポートしている場合、 あるいは Unix システムが FAT フォーマットの floppy disk を サポートしていて、さらにそこへの Shift JIS 書き込みを サポートしている場合、利用すると便利です。
今の所、 Samba は Windows Client とは Shift JIS でファイル名の やり取りをしているので、 EUC などと異なり使えない文字なども生じません。
ただし、Unix システムが Shift JIS に対応していて、 さらに ls などのコマンドも Shift JIS に対応していることは 稀です。 そのため Unix 上でファイルを操作する場合、 最も苦労する危険性があります。 逆に、これがサポートされている場合は、 最も快適な環境になるでしょう。
CAP
Macintosh 用のファイルサーバーソフトである CAP と互換性のある 方法でファイル名を書き込みます。 Unix 上でのファイル名は ASCII 文字列に展開された形になります。
CAP や Netatalk と連携する場合は、CAP を選ぶ必要があります。
ただし、ファイル名が長くなる性質を持っているので、 ファイルシステムの制限ギリギリの長さのファイル名の場合、 SJIS や EUC では書き込めるような長さのファイル名でも、 書き込めなくなる場合があります。
HEX
文字コードを ASCII コードに変換する独自の方式で ファイル名を書き込みます。 おおざっぱに言うと、ファイル名はおおよそ 3倍のバイト数を必要と することになりますが、この制約の範囲では、 最も Unix システムに対する制約が少ない方式です。
ただし、Unix 上でファイル名を調べようと ls などを実行しても、 そのままでは全く判らない、という欠点があります。
UTF8
UTF-8 でファイル名を書き込みます。
ファイルシステムが UTF-8 でのファイル名記述を保証している場合、 最もストレスなく利用できるようになるでしょう。
最大の弱点は、このようなシステムがまだない (少なくとも筆者は知らない) という点だろう。

ただし、企業などのインフラとして Samba を利用する場合は、 次のように考えた方が良い、という意見が私自身にはあります。

UTF-8, SJIS, EUC は使うな
企業インフラの一環であるネットワークファイルシステムとして Samba を利用する場合、 Samba Server 上のデータは基本的に Samba Server の寿命よりも長い、 と考えるべきです。 この場合、現在利用している Server OS を将来も使い続ける 保証はありません。 また、現在使っている OS の後継 OS がサポートする 文字コードが変わってしまう可能性もあります。
何らかのシステムクラッシュによって過去に取った backup image からシステムを復旧する必要もでるかもしれませので、この問題は 移行の際にだけ気をつければ良い問題ではありません。 文字コードが OS にサポートされていない場合、 backup image が読めない、 それも問題のファイル名以降がすべて読めなくなる、 などの問題につながる恐れがあるからです。
Samba が前提としている OS である Unix やそのクローンの場合、 OS の変化に強い影響を受けない文字コードは ASCII だけです。 従って、CAP あるいは HEX だけを用いるべきでしょう。
Macintosh との連携が不要ならば CAP を使うな
CAP は CAP 並びに Netatalk に合わせたエンコーディングを行います。 これはつまり、このエンコーディングは基本的に MacOS に合わせてある、 という事を意味します。
Shift JIS には、過去のしがらみから、 機種依存文字問題 という問題があり、 NEC PC-98xx シリーズと IBM-PC、そして Macintosh の3種類は それぞれ異なる文字コードに機種依存文字を持っています。 このため、CAP では一部の機種依存文字に対応できない、 あるいは対応しても Macintosh 側で読み込めない、 という問題が発生します。
Macintosh との連携を必要とする場合は、 CAP を使い Macintosh/Windows の双方で機種依存文字を使わない、 という方策以外手はありません。 が、もし、Macintosh との連携を必要としないならば、 HEX を使うのが最も簡単にこの問題から逃げる方法です。

この条件に従うならば、 HEX が推奨値と言うことになります。 ただし、HEX を利用する場合、 Unix 上でのファイル操作は最も煩雑になりますので、 覚悟 は必要です。

[ 管理番号: 000000000017 ]
Q. deadtime って何?

man smb.conf とやると deadtime という値がありました。 これは何ですか?

A. 0 か 1 に設定するべき変数

百分は一見にしかず。 実験をしてみましょう。

まず、イタズラをしても良い Samba server と Windows Client を 1台づつ用意します。 以下の説明では ./configure で普通にビルドした場合の ディレクトリ構成で説明しますので、 自分の環境に合わせて適宜読み替えてくださいね。

まず、/usr/local/samba/var の下にある log ファイルを全て消します。

smbd, nmbd をそれぞれ適切に起動してください。 この段階で /usr/local/samba/var のしたには smb.log, nmb.log の2つのファイルがあるはずです。

Windows マシンで、この Samba の公開しているディレクトリを ドライブにマウントしてみてください。 /usr/local/samba/var には <client名>.log というファイルが 新しくでき、

$ ps -ef | grep mbd

の結果も新しく smbd が1つ増えているはずです。

さて、ここで、 smbd, nmbd を完全に殺してください。 基本的には親 smbd, nmbd に kill -TERM で済むはずです。 Windows マシンは特にエラーを出していませんよね?

で、再度 smbd, nmbd を起動してみてください。 特に Windows からのコネクションが発生していないことは

$ ps -ef | grep mbd

の結果から判るはずです。

ここで、Windows からマウントしたドライブを開いてみてください。 一度 Server とのコネクションが切れていたにも関わらず、 何もなかったかのように平然とコネクションが復活することが 判るはずです。


実は、SMB によるコネクションは、 ファイルが1つもロックされていない場合、 コネクションが切れても問題は発生しません。 分かりやすく言えば、 ファイルもディレクトリも開いてなければ Server が落ちても平気なんです。 なくなったコネクションは Client が必要になったときに それを復帰しようとして、失敗したら始めてエラーになります。 逆に言えば、復帰しようとしたときまでに Server が再起動していれば、 Windows からは何も問題がなかったように見える、と言う事。

deadtime という変数は、 この「コネクションを切る」という動作を意図的に起すための変数です。

deadtime は 0 あるいは自然数を受け付けます。 0 の場合、Samba はコネクションを切ろうとはしません。

自然数(つまり1以上の整数)の場合、 指定した minute だけコネクションが発生しなかった場合、 Samba はコネクションを切断し、 smbd は終了します。


smbd と Client がコネクションを維持する場合、 相互確認のため、 つまり互いにシステムがダウンしていないことを確認し合うために、 おおよそ 20秒に一度の割合で keepalive という ack を投げ合います。 このパケットは、ネットワークが混雑している場合、 ネットワークにとっても擾乱要因となりますし、 サーバーにとっては(結局これも IP packet ですので) 演算負荷となります。

また、smbd が沢山動いていると言う状態は、 それだけで kernel のスケジュールを必要とするプロセスが増大する という事ですし、 有効な TCP port が増えているためにそれらの面倒を見るためにも、 CPU 負荷、memory 負荷が共に増えることを意味します。 高負荷時にこれは Server にとって辛い状況です。

この様な場合には、 事実上使われていないコネクションは落しておいた方が良いわけです。


コネクションを維持しなかった場合の問題点は、 コネクションの復元にかかるオーバーへッドです。 たとえば deadtime を 1分に設定したのはいいが、 61秒ごとにファイルを書き込みに来られたら、 コネクションを切り、smbd を終了し、 その直後にコネクションを復元するために smbd を分身し直すためにかかる オーバーへッドがただの負担としてかかってしまいます。 この負荷は deadtime が 0 の場合は発生しません。 しかし、普通はアプリケーションは起動時と終了時、 あと十数分に一度の割合でファイルを書き換えるのが一般的です。

また、コネクションが切れてしまうと、 復元にかかる時間分、アプリケーションなどの動作がもたもたした 感じをうけます。 これがユーザビリティーに影響を与える可能性もあります。 これはアプリケーションの動作に強く依存するので、 実際に使ってみないと判りません。

ただ、コネクションはどうせ切るのであるならば、 可及的速やかにコネクションを切った方が有利です。 従って、deadtime は 0 にしないならば、 1 にするのが最も良いことになります。


deadtime を 1 に設定しても、役に立たない場合もあります。 ファイルやディレクトリが開かれたままのアプリケーションを使う場合です。 もっとも極端な例が Explorer です。 Explorer はフォルダの中身を参照していると、 アイコンを参照するため、等の理由でファイルやディレクトリを バカバカと開きまくります。 問題は参照後ちゃんと閉じていないことがある、という点です。

従って、この場合は、Explorer をなるべく使わないようにする などの対策が必要になります。


もし、Server 負荷が低いのであれば、 あるいはネットワーク負荷が低いのであれば、 無理をして deadtime を 1 にする必要はありません。 コネクションを切らなくても負担でないならば、 コネクションを切らない方がユーザビリティーは向上します。

その他 Samba 運営上の問題

Samba を運営する上での、その他の問題

[ 管理番号: 000000000019 ]
Q. ディレクトリに対するシンボリックリンクの削除

ディレクトリに対するシンボリックリンクを消そうとすると、 リンク先のディレクトリにあるファイルまで一緒に消えてしまいます。 どうにかなりませんか?

A. なりません。それはそんなことをしたあなたが悪いのです

まず、この問題がなぜ発生するのかから考えましょう。

Windows の大抵のツールは、 ディレクトリ削除を実行する際に、 まずディレクトリの下にある全てのファイル(とディレクトリ)の 削除を実行します。 で、ディレクトリが空になってから、ディレクトリそのものを削除します。

ディレクトリがシンボリックリンクの場合、 シンボリックリンク出さされた先のディレクトリを、 Client からの命令に従って削除します。 その後、ディレクトリを削除しろ、という命令が飛んでくるのですが、 ここで始めて対象がシンボリックリンクであることを確認し、 シンボリックリンクの削除を実行します。


ここまでの段階だけを見ると、Samba が悪いように見えます。

Windows がシンボリックリンクを知らないから悪いのであって、 それをちゃんと対処しない Samba が悪い、 と考えられるからです。

この考えは適切ではありません。


まずは unix のディレクトリに対するリンクの特徴から見ていきましょう。

ディレクトリに対するリンクには ハードリンクとシンボリックリンクの両方があります。 POSIX 準拠の場合、 ディレクトリに対するハードリンクは root だけが実行できるのですが、 それでもハードリンクとシンボリックリンクの両方が可能です。

この「ディレクトリに対するリンク」という発想は、 実は unix が最初に採用したファイルシステム Interface の 弱点が色濃く継承されています。

そもそも、古典的なファイルシステムには、 ディレクトリを作成するための API は存在しませんでした。 mknod で directory 属性付きの inode と block イメージとしてのディレクトリを作成し、 link 命令で '.' と '..' エントリを追加する、 というのがディレクトリの作り方だったのです。

この作り方をする限り、 1つのディレクトリに対して複数のリンクを張ることを 防止する方法はありません。

しかし一方で、 当時は unix はカーネルのソースコードを読んで使うもの、 というユーザーしかいなかったので、 この構造だからと言って 不用意にディレクトリの中のファイルを全て消してしまう、 というようなトラブルを起すような利用者はいませんでした。

問題はむしろ、 mknod と link という2つのコマンドが必要だったため、 ディレクトリ作成に atomicity がない、 という点にありました。 2つ以上のプログラムが同時にディレクトリを作成しようとしている場合、 ディレクトリイメージまでは作成できるのに link ができない、 という状態が発生してしまうのが問題だったのです。

この問題を解決するために、 SVR3 で mkdir と rmdir システムコールが作られ、 これを期にディレクトリを mknod で作製する方法は禁止されました。 当然、これに伴い unlink でディレクトリを削除するべきではない、 ともされました。 ディレクトリは rmdir で削除するべきだと。

しかし、ディレクトリに対するリンクは、 特にハードディスクの容量が少なかった昔は、便利なものでした。 unix はそもそもが制御ファイルがテキストファイルで肥大化し易く、 さらにソースコードが必ず存在していた、 という事実がこれに追い討ちをかけました。 include ファイルの多くはカーネルのソースコードのファイルと一致しており、 このためカーネルのディレクトリを丸々コピーするよりも ディレクトリを丸ごとリンクしてファイルを共有した方が便利だったのです。

そして、この様なディレクトリ共有は、 ディレクトリそのものが read only な場合は全く問題を起しません。

このため、ディレクトリに対するリンク機構は存続することになりました。 その後、root だけに許されるように制限が強化されましたが、 それでもディレクトリに対するリンクを張ることは可能なままです。

当然、unlink も可能ですが、不適切な操作により、 ディレクトリ並びにその下にファイルが存在する状態のまま ディレクトリに対する reference counter が 0 になってしまった場合、 基本的に、ファイルシステムは破綻を来たします。 この場合、破綻を解消するかどうか、また「どう解消するのか」は、 全てシステム依存になっています。


一方で、シンボリックリンクはハードリンクよりもさらに問題がやっかいです。

シンボリックリンクは基本的に、「つけ替え」作業しか行いません。 あるシンボル名は別の「シンボル名」に対する alias に過ぎません。 シンボル名が何を指しているのか、 あるいはそこに実体があるのかどうか、 は一切問題になりません。

当然、シンボリックリンクが指している先が、 ファイルになったり、ディレクトリになったりと、 その時々に応じて変化しても問題とはなりません。

シンボリックリンクは、 それがシンボリックリンクであることを検出する方法を提供し、 それに対してどうアプローチするのか、 という点を完全にアプリケーションに委ねてしまっています。


ここまでを要約すると、こうなります。

unix においては、 ディレクトリに対するリンクは、 ハードリンクであれソフトリンクであれ、 利用者が適切に利用することを前提とし、 システム(OS やファイルシステム)のレベルでは なんらの危機防御機構を持ち合わせていないのです。

従って、ディレクトリに対するリンクは、 全て「利用者側の責任に置いて」作成され、 利用されなくてはいけません。


実はこの事実、Application プログラムが

必ず責任を取るようにコーディングできるわけではない

と言う重要な事実をも指摘しています。

そもそも、ここで必ず責任を取るようにコーディングできるのならば、 OS レベルでもそのように実装することも可能です。 そのように実装することはできない、 でも機能を切ることもできない、 だからユーザー側に責任を押し付けているのです。

そもそも、「1つの実体を2つの名前が指す」という状態の、 『意味』を考えてみましょう。 実は、答は少なくとも2つ、存在することが判ります。

1つ目は、2つの名前がおなじ実体を指しているのは、 あくまでも一つの実体を2つの名前で参照したいから、 という場合です。 この場合、 どちらの名前で参照している場合でも、 変更(削除は変更の一種)は一度に効果を持たなくてはいけません。 どちらかの名前で実体を削除する場合は、 その実体を指している全ての「リンク」を削除するのが 正しい有り様になります。

2つ目は、2つの名前は実は異なる実体を指したいのだが、 同じ内容であることが判っているので、 同じ内容の間は同じものを指し示そう、 というものです。 これは copy on modify モデルと言って、 昨今の unix ではプロセスを fork で増やす場合、 メモリ空間に対してこのモデルが使われます。 この場合、どちらかの名前で何らかの変更を要求した場合、 まず変更側がコピーされ、 それに対する変更が施されます。

この2つのどちらの意味で実装するのであっても、 「1つの実体を2つの名前が参照している」 状態は正しい状態を意味します。 しかし、逆に言えばアプリケーションはこの2つのどちらの意味なのかを 決定しなくてはいけません。 あるいは、両方を実装してユーザーに決定させる必要があります。

特に1つ目の場合はやっかいで、「1つの実体を消去する」事と、 「実体へのリンクを消去する」事は全く異なることになります。 unix には unlink() システムコールしかありませんから、 この作業は atomicity を欠いています。 あるファイルに対して「実体を削除するべく」全てのハードリンクを 消そうとしているアプリケーションと、 そのファイルに対するレプリカを作るべくどんどんリンクを作成し続ける アプリケーションが同時に動いたら、 これはレース状態になってしまうでしょう。 下手をすれば、永久に止まりません。

ましてや、あるアプリケーション、あるユーザーが、 どちらの意味でディレクトリ構造に対するリンクを実装したとしても、 別のユーザー、別のアプリケーションが、 もう一方の意味で実装することを止めることはできませんし、 2つのアプリケーションが異なる意味で ディレクトリに対するリンクを使い出したら、 当然矛盾が発生します。

具体例を上げてみましょう。 vi と emacs という、unix 上の 2 大エディターは、 今の所シンボリックリンクはちゃんとトレースして、 実体を変更するようになっていますが、 ハードリンクに対しては vi は実体に対する変更を、 emacs は copy on modify を意味します。 このように異なるアプリケーションは、 異なる結果をもたらすのです。


unix のディレクトリに対するリンク機構は、 最初から、 このように利用者の理解を要求します。 逆に言えば、これらの事実を理解せずに ディレクトリに対してリンクを張っても、 望み通りの結果が得られず被害を被るだけであり、 その状態が「当然」なのです。

従って、任意のユーザーに公開するディレクトリに対して 何らかの形で多重リンクを張るべきではありません。

唯一の例外は、ディレクトリ並びにその中身が全て read only の場合です。 この場合、変更・削除が生じる可能性はなくなり、 結果として矛盾が発生する可能性は0になります。


以上が unix のディレクトリに対するリンクの特徴です。

一方 Windows の方はと言うと、 これは比較的簡単です。 1つの実体に対して2つの名前を割り振る方法はありません。

いや、これは厳密には正しい表現ではありませんでした。 MS-DOS 2.11 の頃、MS-DOS にはディレクトリエントリーの ファイル開始 FAT 番号を任意の番号にすり替えるインターフェースがありました。 これを利用すればディレクトリであろうがファイルであろうが、 任意のものに対する多重リンクに相当する構造を作ることは 可能でした。

ただしこの場合は、 この多重リンク対象のファイルやディレクトリを変更・削除することは 許されません。 他のインターフェースは多重リンクの存在を知らないまま ファイルシステムを操作するので、 FAT 管理情報などが全て矛盾してしまうからです。

多重リンクを作れても、それが read only ではあまり実用性はありません。 単にファイルシステムが混乱する元が増えるだけです。 おそらくはそのためでしょう。 MS-DOS 3 以降、このインターフェースは削除され、 今もこれに相当するインターフェースは用意されていません。


Windows には「ショートカット」という特別なファイルが あるかのように見えるかも知れませんが、 ショートカットは特別なファイルではありません。 ショートカットは Explorer が特別扱いする .lnk 拡張子を持ったファイルで、 その中身は Explorer がそのファイルをクリックした場合に 実行するべき内容が記述されているだけの、 通常ファイルです。

これが「通常ファイル」である最大の意味は、 「Windows という OS はこのファイルを特別扱いしない」 という事です。 普通のアプリケーションから見て、 このファイルは普通のファイルでしかなく、 別にそこに書かれているリンクを手繰ってくれるわけでも何でもありません。

実際、ショートカットの中に書かれているのは、 『そのファイルをクリックされたらどの様に挙動するべきか』 という挙動です。 これは一種のバッチファイルであり、 unix でいうシンボリックリンクなどとは全く意味が違います。

従って、ショートカットファイルをシンボリックリンクの代わりに 利用したり、Samba 側でシンボリックリンクをショートカットに マップしたりするのは、全くのナンセンスです。 ましてや、ハードリンクに対する対策を考慮していない、 という点からも、このような発想は論外でしかありません。


結局の所、Samba は unix のディレクトリ管理システムに従うしかありません。 一方で、Samba は Client からのリクエストを1つづつ 忠実に実行することしかできません。

Client が掌握できない概念は Samba でも提供することはできませんから、 あるものが多重リンクである、 と言う事実を Windows に伝えることはできませんし、 その一方で Windows が「消せ」と言ってきたファイルやディレクトリは、 その実体が何であれ、消そうとする以外手はないのです。

従って、

Samba に公開するディレクトリを 多重リンクで作成してはいけない

という事実をキチンと守らなくてはいけない、 このルールに従うのは unix 側でリンクを張る人の義務である、 と言う事になります。

この要求は決して理不尽なものではありません。

Windows 側から Samba を経由して、ハードリンクであれ、 シンボリックリンクであれ、多重リンクを作ることはできません。 従って、Samba 経由で参照できるディレクトリ上に多重リンクが存在する場合、 その作者は unix 上でこの多重リンクを作成したことになります。 ということはこの作者は unix ファイルシステムの弱点を承知で リンクを張った、と言う事であり、 その結果当然、守るべきルールを守っている、 事が要求されるからです。

[ 管理番号: 000000000020 ]
Q. シンボリックリンク2

じゃぁディレクトリに対するシンボリックリンクは作るべきではないんですね?

A.

まず、「シンボリックリンク」を特別視するのをやめるべきです。

そもそもが、この問題は unix のファイルシステムが抱える 多重リンクに対するインターフェースの不備と不完全さに 原因があります。 多重リンク状態を作成することはできるが、 セマンティカル(意味論的)に一意的な意味が与えられていないのが、 根本的な問題点なのですから。

一意な意味が与えられていないインターフェースを、 そのような概念を知らない OS が叩けば、 埃が出ても当然です。


これらの意味が破綻しなくなる場合はたった1通りしかありません。 リンク先の実体が read-only で作られている場合です。

ここでいう「リンク先の実体」とは、 ファイルの場合は単にファイルの実体だけですが、 ディレクトリの場合はそのディレクトリ下にある全てのディレクトリと ファイルを指します。

なぜ read-only なら問題がないのかというと、 多重リンク構造を作った段階で矛盾がないならば、 それを変更、削除できなければ矛盾は生じないからです。


実際にはこれでは困る場合もあります。 ディレクトリ上のファイルのいくつかは変更したい、 という要望は当然あり得るからです。

この場合は、「ディレクトリ」を多重リンクするのではなく、 ディレクトリ構造自体はコピーし、 ファイルに対してだけリンクを張る、 という手があります。

X11 の膨大なソースコードと、それに対する変更研究は、
『オリジナルコードの read-only 状態での確実な保存』
という要求と、
『自分が興味感心があるファイルに対する自由な変更』
という矛盾した要求を生み、結果 lndir というツールが作られるに至りました。 このツールはオリジナルディレクトリを再帰的に検索し、 ディレクトリツリーは完全に再現した上で、 ファイルだけはオリジナルに対するシンボリックリンクを作成します。

こうやってできた「レプリカディレクトリ」上の任意のファイルに対し、 ファイルのコピーを作成し、オリジナルを削除してから、 コピーをオリジナルの名前に rename する、 という作業を施すと、そのファイルだけがレプリカディレクトリ上 オリジナルのファイルになります。 このファイルをいくら変更してもオリジナルのツリーに 影響を与えることはありません。

この場合、copy on modify モデルが実装できたことになります。


Samba で、copy on modify モデルでファイルを提供する場合も同様です。

オリジナルのファイルを read-only 属性にした上で 適当なディレクトリに置き、 それに対するレプリカディレクトリを作成してこれを公開します。

ディレクトリを削除しようとした場合は、 シンボリックリンクとレプリカディレクトリが削除されるだけなので オリジナルファイルに対して影響を与えることはありません。

ディレクトリ上のファイルを変更しようとした場合は、 ファイルをコピーし、rename することを教えれば、 あるいは、Windows 上のエディターは大半がそのように動くので 何もせずにそのまま放置しておいても、 シンボリックリンクは削除され、 新しくその場に作られたファイルは「そのディレクトリオリジナルの」 ファイルになります。

1つ注意すべきなのは、このモデルの場合、 オリジナルのファイルが存在するディレクトリを、 ここで提供しているモデルの実体を理解していない人には、 絶対見せてはいけない、と言う事です。 この「実体」を削除されてしまったら、 全てのシンボリックリンクが無効になってしまうからです。


Samba で、copy on modify モデルでレプリカディレクトリを提供する場合、 ファイルへのリンクをハードリンクにしてはいけません。

ハードリンクはオリジナルファイルのデータを 全く防御なく直接アクセスさせます。 chmod などのシステムコールは確実に実体の access permission を 変更してしまいます。 すると、Modify (オリジナルのファイルを開いて、そのまま write 命令でデータを一部上書きすること) 作業を オリジナルファイルに実行できるようになってしまいます。

これでは copy on modify としては動作しません。


一方、『単一実体』モデルを実装することは、 Samba 上では不可能です。 先ほどのハードリンクの例はまさに「単一実体」の挙動そのものに 聞こえるのですが(そして、確かにこれに関してはその通りなのですが)、 別の挙動に問題があるのです。

unix は『単一実体』モデルを実装できていません。 このため、ファイルの削除の段階で「ハードリンクを1つ削除する」ことは できても、「ハードリンクを全て削除して実体を消去させる」事は できません。

Windows Client には「多重リンク」の概念はないので、 Windows Client は多重リンクを意識したコマンドを発行しません。 Windows Application にとっては、 あるファイルを開いて write コマンドで変更するのと、 別のファイルをつくって必要なイメージを作った後で、 ファイル名を rename するのは等価、 あるいは critical section が短くなる分後者の方が優れている と見なすでしょう。

このような世界では、rename の瞬間に ハードリンクを全て張り直してオリジナルの状態に復元する 必要がありますが、 rename の少し前には古いファイルを消去しなくてはいけません。 ということは rename が実行されたときにはリンク情報は 完全に消失している、と言う事ですから復元は不可能です。

少し前の状態を覚えておけば…という方法は実用的ではありません。 別のアプリケーションが「旧来通りの復元を不可能にする」ファイルを 作ったら復元は不可能であり、 この場合「可能な限り復元する」事でさえ適切ではありません。


基本的に Samba で公開しているディレクトリやファイルに 多重リンクを使うのはやめるべきです。 どうしてもという場合は、read-only なファイルに対してのみ、 行いましょう。

Samba と直接関係しないその他の話

Samba と直接関係はしないが、 知っておくと Samba を管理・運営等する上で役に立つ話。

[ 管理番号: 000000000001 ]
Q. man, HTML, TeX ファイルをテキストにするには?

man や HTML, TeX ファイルから plain text を作るにはどうすれば良いでしょうか?

A.

man の結果を plain text に変換するには col を使うのが簡単です。 man ls の結果を plain text に変換する場合は

    man ls | col -b > ls.txt
   
とします。

man そのものの結果ではなく、 man フォーマットで記述されているファイルを plain text に変換する場合は、

    cat ls.1 | /usr/bin/troff -msafer -man -Tascii | grotty -b -u
   
で変換できます。

一方 HTML を plain text に変換するには、 lynx や w3m( <URL: http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/ > ) のような HTML brouser の機能を使うのが簡便です。

    lynx -dump sample.html > sample.txt
   
    w3m -dump sample.html > sample.txt
   

TeX ファイル、正確には TeX や LaTeX, AMS-TeX などの TeX の仲間のファイルは、 一旦 dvi ファイルに変換する必要があります。 変換方法は TeX ファイルが正確には何なのかに依存するので 割愛します。

dvi ファイルに変換したら、あとは <URL: http://www.math.s.chiba-u.ac.jp/~matsu/files/dvi2tty-5.1-ra3.src.rpm > から得た dvi2tty を用いて

    dvi2tty sample.dvi > sample.txt
   
で plain text に変換できます。

[ 管理番号: 000000000014 ]
Q. PC や Server の時刻を一致させるには?

PC と Samba Server の時刻が一致していないため、 ファイルをコピーすると未来から来たファイルができたり、 ファイルの作成時刻が逆転したりします。 どうすればいいのでしょう?

A. Network Time Protocol 対応ソフトを使おう

インターネット経由の時刻合わせには、 NTP を使うと良いでしょう。

とりあえず、ちょっと雑誌等を調べただけで、

高エネルギー物理学研究所 gps.kek.jp(130.87.42.34)
東北大学 ntp1.tohoku.ac.jp(130.34.11.117)
東北大学 ntp2.tohoku.ac.jp(130.34.48.32)
東京大学 eric.nc.u-tokyo.ac.jp(130.69.251.23)
東京理科大学 sutntp.sut.ac.jp(133.31.180.6)
広島大学 ns.hiroshima-u.ac.jp(133.41.4.2)
福岡大学 clock.nc.fukuoka-u.ac.jp(133.100.9.2)
豊橋技術科学大学 ntp.tut.ac.jp(133.15.64.8)

などの NTP サーバーが発見できます。

これらを直接使っても良いですし、 これらとは別のソースから時刻を取ってきても良いのですが、 とりあえず何らかの形でまず正しい時刻をどこかのサーバーマシンに 設定します。 で、このマシンをローカルな NTP Server として利用します。

その上で、桜時計 <URL: http://www.venus.dti.ne.jp/~uno/ > や TClock <URL: http://homepage1.nifty.com/kazubon/ > などを使って Windows マシンの時刻を合わせます。

ローカルな NTP Server に unix を使う場合は、 ntp <URL: http://www.eecis.udel.edu/~ntp/ > を使うと良いでしょう。 一方ローカルな時刻サーバーに Windows を使う場合は、 上記の桜時計を使う、と言うのが手です。

FreeBSD などいくつかの OS では、 OS 標準で NTP Server/Client の xntpd/ntpdate が組み込まれています。 これを利用すると簡単で良いでしょう。

ちなみに SNTP は NTP の時刻合わせ機能を単純化したものだそうです。

[ 管理番号: 000000000015 ]
Q. TCP 再送状況を獲得するには?

smb.conf の最適化の所にはやたらと TCP の再送状況を調べろとありますが、 具体的にどうやればいいんですか?

A. netstat -s を使え
   netstat -s -p tcp
  

命令を使うのが一般的です。 ただし、もし netstat が -s を FreeBSD や Linux と同じ意味で 使っているならば、ですが。

TCP は流量制御のために、ターンアラウンドタイムや、 転送総量、再送量などを port ごとに全て管理しています。 ですので、再送状況に関する情報も kernel の中のどこかに必ずあります。

FreeBSD や Linux の場合は、 netstat コマンドを -s オプションつきで実行すると、 netstat の出力状況ががらりと変わって これらの情報が獲得できるようになります。

netstat の出力は次のような感じになります。 これは VineLinux 2.1 の場合の、私のマシンに関しての出力です。


$ netstat -s
Ip:
    350 total packets received
    0 forwarded
    0 incoming packets discarded
    348 incoming packets delivered
    263 requests sent out
Icmp:
    0 ICMP messages received
    0 input ICMP message failed.
    ICMP input histogram:
    0 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
Tcp:
    6 active connections openings
    0 passive connection openings
    0 failed connection attempts
    0 connection resets received
    4 connections established
    251 segments received
    251 segments send out
    0 segments retransmited
    0 bad segments received.
    2 resets sent
Udp:
    12 packets received
    0 packets to unknown port received.
    0 packet receive errors
    12 packets sent

$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 localhost.localdo:32774 localhost.localdom:wnn6 ESTABLISHED 
tcp        0      0 localhost.localdo:32770 localhost.localdom:5680 ESTABLISHED 
tcp        0      0 localhost.localdom:wnn6 localhost.localdo:32774 ESTABLISHED 
tcp        0      0 localhost.localdom:5680 localhost.localdo:32770 ESTABLISHED 
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  13     [ ]         DGRAM                    1179   /dev/log
unix  3      [ ]         STREAM     CONNECTED     9922   /tmp/.X11-unix/X0
unix  5      [ ]         STREAM     CONNECTED     9921   
unix  3      [ ]         STREAM     CONNECTED     8569   /tmp/.esd/socket
unix  3      [ ]         STREAM     CONNECTED     8568   
(中略)
unix  2      [ ]         DGRAM                    3960   
unix  2      [ ]         DGRAM                    2859   
unix  2      [ ]         DGRAM                    2856   
unix  3      [ ]         STREAM     CONNECTED     2645   
unix  3      [ ]         STREAM     CONNECTED     2644   
(後略)

$ netstat -g
IPv6/IPv4 Group Memberships
Interface       RefCnt Group
--------------- ------ ---------------------
lo              1      224.0.0.1
eth0            1      224.0.0.1

$ netstat -i
Kernel Interface table
Iface   MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0   1500   0       92      0      0      0        0      0      0      0 BRU
lo    16192   0      363      0      0      0      363      0      0      0 LRU

$ netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.0.0        *               255.255.255.0   U        40 0          0 eth0
127.0.0.0       *               255.0.0.0       U        40 0          0 lo
  

なお、少なくとも Vine-Linux 2.1 についてくる netstat(8) の マニュアルには -s オプションに関する説明がありません。 どうも、net-tools 1.54, netstat 1.38(1999-04-20)に関しては man netstat との間に齟齬があるようです。 マニュアル自体の日付としては一致しているので、 おそらくこれはパッケージ自体の齟齬でしょう。

   netstat --help
  

のようにして、直接 netstat の help を見た方が良いでしょう。

追記情報
Windows 98, 98SE, NT, 2000 にも netstat.exe という 同様のことをしてくれるプログラムが標準で存在します。 C:\Windows あるいは C:\WinNT の下を探してください。
[ 管理番号: 000000000016 ]
Q. Samba の新版などを簡便に入手するには?

目的とするファイルの URL がはっきり判っているときに、 Netscape や ftp を使わずに目的のファイルを獲得するには どうすればいいでしょうか?

A. wget があります。

FreeBSD の場合は fetch というプログラムが標準でついてきますが、 Linux などの場合はこれに相当するプログラムとしては、 <URL: http://www.gnu.org/software/wget/wget.html > の wget があります。 このプログラムはほぼ全てのディストリビューションで入手可能です。 GNU ソフトウェアですので、 おそらく大抵の unix 環境で実行可能でしょう。

例えば、本 QandA の最新版を獲得する場合は、

% wget http://fjskyousosama.holy.jp/Documents/Samba-QandA.euc.txt
% wget http://fjskyousosama.holy.jp/Documents/Samba-QandA.j.html
  

のように実行することで、 テキスト版や html 版をカレントディレクトリに持ってくることができます。


巨大なファイルを獲得する場合、 ftp を使っても相応に時間がかかります。

この場合、 ftp を使うと欲しいファイルを獲得した後もコネクションが維持されてしまい、 ファイルサーバーになってくれているマシンに負荷となってしまいます。 だからといって、ダウンロードに4時間もかかる場合にずっとマシンの前に 座っている、と言うのも苦痛です。

wget は指定された URL からファイルを獲得すると 自動的にコネクションを切ってくれます。 このため、wget に欲しいファイルの URL を列挙して与えておき、 自分は離席する (例えば、家のマシンにダウンロードを指定しておいて、 自分は会社に出社するとか) などを行うことができます。

FreeBSD では、 ports において必要なファイルがない場合は fetch を使って 必要な URL からファイルを持ってくることができるようになっています。 wget を使えば、これと同じような構造を作り上げることができるでしょう。

[ 管理番号: 000000000018 ]
Q. トラフィック・データを収集するには?

ネットワークの状況を監視するのが重要なのは判るのですが、 どうやればいいの?

A. MRTG を使うらしい

<URL: http://ee-staff.ethz.ch/~oetiker/webtools/mrtg/ > にある The Multi Router Traffic Grapher というツールを使うと、 トラフィックデータを収集、視覚化できるそうです。

Simple Network Management Protocol(SNMP) を用いて、 同一セグメントに接続された ルータやサーバの負荷状況を報告させる仕組みだそうだ。 負荷状況はグラフ化され、 さらに HTML でブラウズできるようにしてくれるそうだ。

perl と C で記述されたフィルター群で、 補助ライブラリも結構使うらしいが、 便利そうだ。

すべて推定なのは、私自身は使っていないから。 これは全て 日経Linux 2001-3月号のうけうり。

[ 管理番号: 000000000027 ]
Q. PATH 環境変数に . を追加してはいけないわけは?

カレントディレクトリにあるプログラムを ./ をつけずに 実行できるようにするために、 PATH 環境変数に . を追加しています。 そしたら
「やめろ!馬鹿もの!Crack されたいのか!!」
と一喝されました。そんなに悪いことなんでしょうか?

A. 極悪非道です

まず、その一喝してくれた方を今後は「師匠」と呼ぶことをお勧めします。


Cracker があなたのマシンを攻撃する場合、 root だけでなく、 一般ユーザーの誰かとしてのアクセス権限が獲得できないかトライします。 仮に、 Cracker がこの攻撃に成功したとしましょう。 Cracker は当然、次に root になれないか画策することでしょう。 この場合、Cracker が取る手段の一つに次のようなものがあります。

まず、Cracker はあなたが root のときに、 PATH にカレントディレクトリを含めている可能性を考慮します。 そして、root に限らず、大抵のユーザーが使うであろうコマンド、 並びにその打ち間違いのバリエーションを考えて、 それらのコマンドを実行しようとした場合に、 可能ならばシステムのデフォルトプログラムよりも前に Cracker の作ったプログラムが実行される可能性に「賭ける」のです。

もちろん、そのようなファイルがどこにでも作れるわけではありませんが、 unix の場合、/tmp というディレクトリには誰でもファイルが作れるので、 ここに、ls (や、その打ち間違い sl ), dir などのコマンドファイルを 実行権限付きで置いておきます。

root は、案外 /tmp の状態を調べる必要があるので、 /tmp において ls コマンドを実行することはかなりの確率で、あります。

たとえば PATH の先頭に . が登録してあると、 /bin/ls ではなく /tmp/ls が実行される可能性があります。 また、PATH の最後に . が登録してあると /bin/ls が実行される 確率は高いのですが、 打ち間違いがある場合 /tmp/sl が実行される可能性は非常に高くなります。

Cracker が置いた実行ファイルを実行した場合、 そのプログラムが次の手順を取ると、 Cracker は root の権限を得ることができるようになります。

  1. Cracker が設置した /tmp/ls や /tmp/sl などのファイルを削除し、 自分の足跡を消す
  2. 分身する。親プロセスは今度は /bin/ls を実行して、 なにもなかったかのように実行を続け、終了する。
  3. 子プロセスは、Cracker との通信を確保して、 Cracker から与えられたコマンドの通りに行動する。

この場合、子プロセスは root 権限を持ち、なおかつ Cracker の 言う通りに挙動するので、Cracker が利用するための新たなユーザーの登録、 kernel に対するパッチ(これは、 単に kernel レベルで Cracker の言う通りに挙動するだけでなく、 自分以外の者が侵入できないようにするための防壁の強化も含まれる) の適用など、好き勝手ができるようになります。

こうなってしまうと、 もはやそのマシンは reboot しても Cracker の言いなりになってしまいます。

この様な状態を回避するには、 カレントディレクトリのような状況に応じて変わってしまうディレクトリや、 /tmp のような誰でも書き込みができるディレクトリを PATH から外す 必要があります。 確実に安全なツールだけを使って、 カレントディレクトリに対する安全を確認し、意識的に指定しない限り、 カレントディレクトリ上のプログラムを実行できないようにする必要があります。

なお、BSD 4.3 の頃はデフォルトで PATH の先頭に . が含まれていました。 この頃は Cracker などという「不埒な」連中のことを考えなくて済むぐらい、 平和だったのです。


これで判ったでしょう。 こんな危険な状態では「いちいちのんびりと理由を説明している間にも」 攻略されてしまう可能性があります。 このような危険な状態に対して兎に角叱責してくれる人は、 まさに「師匠」そのものなのですよ。

叱られたくなかったらまず、 それだけの主張をするにふさわしい実力をつけましょう。