![]() |
Using SambaRobert Eckstein, David Collier-Brown, Peter Kelly 共著第一版 1999 年 11 月 1-56592-449-5, 注文番号: 4495 416 ページ, 34.95 ドル |
7. 印刷と名前解決
この章では二つのSambaに関するトピックを扱う: プリンタをSambaサーバで利用できるように設定する方法と SambaがWindows Internet Name Service(WINS)を利用するようにしたり、Samba自身をWINS サーバにしたりする方法である。Sambaにより、クライアントマシンがSamba サーバに接続されたプリンタにドキュメントを送信できるようになる。 また Samba は UNIX 上のドキュメントをWindows マシン上のプリンタに出力する際にも活用することができる。この章では、まずWindows、UNIXの両方で、プリンタをどのように設定するかに付いて説明する。
章の残り半分では、Microsoft による NetBIOS Name Server (NBNS)の実装である、Windows Internet Name Service を紹介する。Chapter 1, Learning the Sambaで述べたように、NBNS はブロードキャストに依存せずに、NetBIOS ネットワークにおける名前解決を可能にする。その代わり、個々のマシンは、どこに WINS サーバが存在しているかを知っている必要があり、 WINS サーバに対してネットワーク上の別のマシンのIP アドレスを問い合わせることになる。
7.1 Samba への印刷ジョブの送信
Samba サーバに接続されたプリンタは「ネットワークコンピュータ」中の共有一覧の中に表示される。プリンタがクライアントマシン上で設定されており、クライアントに適切なプリンタドライバがインストールされていれば、クライアントは労せずして印刷ジョブをSamba サーバに接続されたプリンタに送信することが可能である。 図 7.1 に Samba のプリンタが Windows クライアントの「ネットワークコンピュータ」上に表示されている様子を示す。
Samba 上のプリンタを管理するには、ネットワーク上で、どのように印刷が行なわれるかに付いての基本的なところを押えておくべきである。印刷ジョブをSambaサーバ上のプリンタに送信する際は、以下の4つのステップを経て行なわれる:
印刷ジョブがSamba サーバに到着すると、印刷データは一時的にプリンタ共有の
path
オプションで指定されたディレクトリに書き込まれる。次に Samba は UNIX の印刷コマンドを実行して、データをプリンタに送信する。ジョブは認証されたユーザが行なったものとして印刷される。共有の設定によっては、ゲストユーザが印刷を行なうこともあり得る。7.1.1 印刷コマンド
ドキュメントを印刷するには Samba に対してファイルを印刷したり消去したりするのにどのようなコマンドを実行するかを指示する必要がある。Linux の場合、該当するコマンドは以下のようなものになる:
lpr -r -Pprinter
file
これにより
lpr
はドキュメントをスプール領域、通常 /var/spool にコピーし、システムの設定ファイル(/etc/printcap)中のプリンタ名を確認し、記述されている設定を読み込み、どのようにデータを処理して、どの物理デバイスに送信するかを確認する。-r
オプションを設定したため、コマンドラインで指定したファイルは、印刷後に削除されることになる。 もちろん削除されるファイルはSamba サーバ上にコピーされていたものであり、クライアント上のオリジナルのファイルは無関係である。Linux は バークレー(Berkeley) (BSD) 形式の印刷方式を利用する。しかし、印刷の方式は System V UNIX 寄りである。このため、印刷と削除が同じコマンドで指定されている:
lp -dprinter
-sfile
; rmfile
System V では /etc/printcap ファイルは /usr/spool/lp 中に隠されている別の形式の設定ファイルに置き換わっており、ファイルを印刷後に削除するというオプションはない。削除は自分で行なう必要があるため、
rm
コマンドを最後に実行するようにしている。7.1.2 印刷時の変数
Samba は4つの変数を印刷関連の設定オプションで用いるために用意している。それらは 表 7.1 中に一覧されている。
表 7.1: 印刷時の変数 変数名
定義
%s
Samba サーバ上にある印刷されるファイルのフルパス名
%f
Samba サーバ上にある印刷されるファイルの(パス名を取り除いた)ファイル名自身
%p
利用する UNIX のプリンタ
%j
印刷ジョブの番号(
lprm
,lppause
,lpresume
コマンドで利用する)7.1.3 最低限の印刷の設定
簡単で実用的な印刷共有を設定してみよう。Linux システムを利用しており、 プリンタ設定ファイル中で
lp
という名前のプリンタが設定されているとした場合、以下を smb.conf ファイルに追加することで、ネットワークからプリンタへのアクセスが可能になる:[printer1] printable = yes print command = /usr/bin/lpr -r %s printer = lp printing = BSD read only = yes guest ok = yes恐らく後で変更することになるが、現在の設定は、誰でもプリンタにデータを印刷することが可能な設定である。 ここで重要なのは
command
オプション中の%s
変数が Samba のコマンド実行時には印刷されるファイル名に変換されるということである。様々なUNIXマシンの仕様に対応するためのprint command
の変更は、通常command
オプションの右側をシステムが必要とするものに置き換えて、printing
オプションを変更するだけである。System V UNIXのコマンドも見てみよう。幾つかの相違点があるため、System V UNIXのコマンドは以下のようになる:
print command = lp -d%p -s %s; rm %s前述したように、
%p
変数はプリンタの名前に変換され、%s
変数は印刷されるファイル名に変換される。更に System V アーキテクチャを利用するために、printing
オプションが変更になる:printing = SYSV共有レベルのセキュリティを用いている場合、Samba の guest accountには特に注意すること。典型的な設定では、
nobody
はOSが印刷することを許可していない。その場合、guest
account
オプションをプリンタ共有(もしくは共有全体)に対して、印刷するアカウントを指定するために設定する必要がある。Samba の作者が推奨するのはftp
アカウントである。このアカウントは通常信頼できないアカウントとして利用する為に、予め設定が行なわれていることが多い。設定は以下のコマンドで行なう:guest account = ftp印刷時によくある別の問題として、クライアントはSambaサーバに送信した印刷ジョブの状況を要求するかも知れないことがあげられる。Samba は現在印刷中のプリンタ共有に送信されるドキュメントも拒否しない。従って、Sambaには現在クライアントから印刷中のジョブだけでなく、現在プリンタ上で印刷を待っているジョブの状況も取得できる必要がある。Sambaには、クライアントから印刷ジョブを一時停止、再開をさせる能力や印刷キューのジョブを削除させる能力も必要である。Sambaにはこれらの各機能を提供するオプションがある。予想されるように、これらの機能は実際のUNIXコマンドの機能を利用している。オプションは以下の通りである:
これらのオプションに付いての詳細は、以下で記述する。ただし、ほとんどの場合、
printing
設定オプションの値によってこれらの値を設定できるため、デフォルト値を変更する必要はないであろう。以下は、プリンタ共有に関して知っておくべき重要な事項である:
Samba がプリンタ共有を識別できるようにするため、
printable
=
yes
を([printers]
も含め)すべてのプリンタ共有に設定する必要がある。これを行なわないと、その共有に対しては印刷することが出来ず、ディスク共有として扱われる。
path
設定オプションをプリンタセクションに設定することで、プリンタに送信されたファイルはデフォルトの /tmpの代わりに、指定されたディレクトリにコピーされる。 UNIXによっては、 /tmp に割り当てられているディスク領域が比較的小さいため、多くの管理者が /var/spool や他のディレクトリを代わりに設定している。
guest
ok
=
yes
オプションをプリンタ共有に設定し、Samba を共有レベルのセキュリティに設定すると、誰でもguest
account
のユーザとしてプリンタにデータを送信できるようになる。Sambaマシンをプリンタサーバとすることで、LANの構成に非常に柔軟性がもたらされる。利用可能なプリンタを簡単に分類することで、部署のメンバーの一部の利用を制限したり、多数のプリンタを全員が利用可能にすることが可能である。また
valid
users
オプションを共有の設定に追加することで、プリンタの利用を特定少数に制限することも可能である:[deskjet] printable = yes path = /var/spool/samba/print valid users = gail sam前の章で記述したその他の共有へのアクセス制御オプションに付いても、同様にプリンタ共有に対して適用することが可能である。プリンタをSamba 経由でアクセスできるようにすることで、幾つかのサーバで提供しているプリンタサービスを負荷分散やメンテナンスのような作業にUNIX コマンドを用いることで簡単にdelegate委任させることが可能である。
7.1.4 The [printers] 共有
Chapter 4 ディスク共有 において、
[printers]
については、自動的に印刷サービスを作成する共有として簡単に紹介した。これがどのように動作するかに付いて解説しよう。[printers]
という名前の共有を設定ファイル中に作成すると、Samba は自動的にプリンタ構成ファイルを読み込み、自動的にファイル中に存在する各プリンタ毎にプリンタ共有を作成する。例えば、Samba サーバのプリンタ構成ファイルにlp
,pcl
,ps
というプリンタが設定されていた場合、Samba は3つのプリンタ名の付いた印刷共有を、各々[printers]
共有に設定されたオプションで作成する。クライアントが要求した共有が smb.conf ファイル中に作成されていなかった場合に Samba は以下の規則に従うことを思い出して欲しい:
共有名がシステムのパスワードファイルに存在するユーザ名と合致し、
[homes]
共有が存在する場合、ユーザ名の付いた新しい共有が作成され、[homes]
及び[global]
セクションで定義された値で初期化される。一方、システムのプリンタ構成ファイル中に存在するプリンタ名と合致し、
[printers]
共有が存在する場合、プリンタ名の付いた新しい共有が作成され、[printers]
セクションで定義された値で初期化される([global]
セクションの変数の内容は適用されない)。どちらにも合致しなかった場合、Samba は
default
service
共有を探す。定義されていなかった場合は、エラーが返却される。これに関して重要な点が一つある: ユーザ名と同じ名前のプリンタを作成しないように注意することである。さもないと、接続しようとしたプリンタ共有の代わりに、ディスク共有に接続することになってしまう。
以下に Linux (BSD) システムにおける
[printers]
共有のサンプルを示す。これらのオプションの幾つかは、既にデフォルトで設定されているが、実例を示す目的で、以下に記述した:[global] printing = BSD print command = /usr/bin/lpr -P%p -r %s printcap file = /etc/printcap min print space = 2000 [printers] path = /usr/spool/public printable = true guest ok = true guest account = pcguestここでは、Samba のグローバルオプションで、印刷タイプ(BSD)、データをプリンタに送信し、一時ファイルを削除する印刷コマンド、デフォルトのプリンタ構成ファイル、印刷時に必要な最低限のディスクの空き領域を2MBにすることを設定している。
その上で、各システムのプリンタ用に、
[printers]
共有を作成してある。一時的にスプールを行なうディレクトリは、path
オプションで /usr/spool/public に指定した。各共有は印刷可能(printable)に設定されている - これは[printers]
セクションであっても必要である。二つのguest
オプションは、Samba が共有レベルのセキュリティを用いていると便利であり、プリンタへのゲストアクセスを可能とし、Samba が印刷コマンドを実行する際に用いるゲストユーザを指定している。7.1.5 テスト印刷
ここでは、どのようにしてSamba サーバ上からテスト印刷を行なうかに付いて述べる。ゲストアカウントを印刷に用いた複雑なケースを考えてみよう。まず、Samba の testparm コマンドをChapter 2, Unix システムへの Samba のインストールで行なったようにして、設定ファイルにプリンタ共有を含む環境で実行する。これにより、設定ファイルに文法的なミスがあるかどうかをチェックする。以下は、前述した設定例で
path
設定オプションを設定せずにおいた場合の出力結果である:# testparm Load smb config files from /usr/local/samba/lib/smb.conf Processing configuration file "/usr/local/samba/lib/smb.conf" Processing section "[global]" Processing section "[homes]" Processing section "[data]" Processing section "[printers]" No path in service printers - using /tmp Loaded services file OK. Press enter to see a dump of your service definitions Global parameters: load printers: Yes printcap name: /etc/printcap Default service parameters: guest account: ftp min print space: 0 print command: lpr -r -P%p %s lpq command: lpq -P%p lprm command: lprm -P%p %j lppause command: lpresume command: Service parameters [printers]: path: /tmp print ok: Yes read only: true public: true次に、
testprns
printername
コマンドを実行してみる。これは単純なコマンドで、指定したプリンタが printcap ファイルで利用可能かどうかを確認する。 printcap ファイルが通常の場所にない場合、そのフルパス名を testprns コマンドの2番目の引数で指定する必要がある:# testprns lp /etc/printcap Looking for printer lp in printcap file /etc/printcap Printer name lp is valid.次に、ゲストユーザでログオンし、スプールディレクトリに行き、 testparm によってSambaが利用することを確認したのと同じコマンドを用いて、印刷が可能かどうかを確認する。前述したように、これで、デフォルトのゲストアカウントが印刷を行なうことが不可能で guest account を変更する必要があるかどうかが確認できる。
最後に
smbclient
コマンドを用いて、Samba サーバ経由で何かを印刷し、以下ようになることを確認する:
smbclient で印刷できない場合、以下のようにデバッグ情報を収集して、
command
オプションを再設定する:print command = /bin/cat %s >>/tmp/printlog; rm %sまたは:
print command = echo "printed %s on %p" >>/tmp/printlogSamba のプリンタに関するよくある問題は、コマンドをフルパス名で指定し忘れることである。単純にコマンド名で指定した場合、ゲストアカウントの PATH にコマンドのパスが含まれない為にうまく動かないことがある。別のよくある問題として、スプールディレクトリのアクセス権が適切でない場合があげられる。
他にもSamba のドキュメント(Printing.txt)にはプリンタのデバッグに関する情報が存在する。また UNIX の印刷システムに付いての詳細は AEleen Frisch が執筆した Essential Systems Administration (O'Reilly 出版) 中で記述されている。
7.1.6 Windows クライアントの設定とテスト
ここまでで Samba 側のプリンタの準備は整ったため、Windows クライアントの設定に移る。「ネットワークコンピュータ」上のSambaサーバを確認すると、各プリンタが利用可能になっている筈である。 図 7.1の例では、
lp
という名前のプリンタが表示されている。次に、Windows クライアントがプリンタを認識していることを確認する。プリンタのアイコンをダブルクリックする。まだインストールされていないプリンタを選択した場合、Windows は設定を行なうかどうかを聞いて来る。"Yes," を選択すると、プリンタの追加ウィザードが開始される。
ウィザードが最初に聞いて来ることは、DOS から印刷を行なうかどうかである。必要がないものとして、ここでは「いいえ」 を選択して「次へ」をクリックすると、製造元とモデルを選択する 図 7.2のようなウィンドウが現れる。
図 7.2: 「ネットワークコンピュータ」上のプリンタ
このダイアログボックスでは、想定し得る限りほとんどすべての製造元とモデルに関する膨大なリストが表示される。もしリスト中にプリンタがない場合で、プリンタが PostScript プリンタであることが分かっている場合は、製造元として Apple を選択し、モデルとして Apple LaserWriter を選択する。これで PostScript プリンタとしての基本的な設定が行なわれる。これは恐らくもっとも確実な方法である。既に Postscript プリンタが接続されている場合、既に存在するドライバを置き換えるか、再利用するかの問い合わせがある。新しい方で置き換えないように注意しないと、別のプリンタに不具合が発生する可能性がある。その為、正しく動作している方のプリンタドライバをそのまま用いることを推奨する。
これが終ると次に、ウィザードはプリンタ名を聞いてくる。 図 7.3に一例を示す。ここでは2台目のLaserwriterが選択されている。ここで名前をApple Laserwriter (Copy 2) から "ps on Samba server" に変更することで、印刷物がどこに出力されるかを知ることが出来るようになる。実際のところ、プリンタには好みの名前を付けることが出来る。
図 7.3: プリンタの製造元とモデル
最後に、プリンタの追加ウィザードはテストページを印刷するかどうかを聞いてくる。「はい」をクリックすると、 図 7.4のようなダイアログが現れる筈である。
図 7.4: Printing successfully completed
テスト印刷が成功しなかった場合に 図 7.4で「いいえ」のボタンを押すと、プリンタの追加ウィザードはクライアント側の設定に関する問題解決のための手順を順を追って表示する。テスト印刷が動作した場合は、リモートプリンタが File and Print メニュー経由で PC 上のすべてのアプリケーションから利用可能になったことになる。
7.1.7 プリンタドライバの自動設定
前述したセクションで、Windows 上でプリンタドライバを手作業で設定する方法に付いて記述した。しかし、システム管理者としては、ユーザがこうした作業を間違えずに行なうことを前提にすることは不可能である。幸いなことにSambaがプリンタ毎に指定したプリンタドライバを自動的にセットアップするように設定することが可能である。
Sambaでは、クライアントが最初に接続した時にプリンタドライバを自動的にセットアップするためのオプションとして、
printer
driver
,printer
driver
file
,printer
driver
location
の3つが提供されている。このセクションでは、上で説明したプリンタの追加ウィザードをユーザが利用する際にプリンタの製造元ダイアログボックスをスキップさせるには、これらのオプションをどのように使っていくかについて説明する。これについての詳細は Samba配布パッケージ中のドキュメントに含まれている PRINTER_DRIVER.TXTファイルを参照のこと。
設定には大きく4つの段階がある:
各段階について、細かく解説していこう。
7.1.7.1 Windows クライアントへのドライバのインストール
この段階では、Windows 95/98を利用する。適切なプリンタのドライバをロードできるマシンであれば、どのクライアントを利用してもよい。実際のところ、プリンタがマシンに接続されている必要すらない。ここで注意すべきことは、適切なドライバファイルをWindowsディレクトリにインストールすることである。まず「マイコンピュータ」の「プリンタ」に行き、 図 7.5のように「プリンタの追加」アイコンをダブルクリックする。
図 7.5: 「プリンタ」ウインドウ
そのまま進んでいくと、プリンタの追加ウィザードがプリンタの製造元とモデルを問い合わせるダイアログボックスが現れる。もしMS-DOS から印刷するかどうかを尋ねられたら、「いいえ」を選択する。Windows は適切なドライバをCD-ROMからロードし、テストページを印刷するかどうかを聞いてくるので、再度「いいえ」を選択して、プリンタの追加ウィザードのダイアログボックスを閉じる。
7.1.7.2 プリンタ定義ファイルの作成
/usr/local/samba/bin ディレクトリ中の make_ printerdef スクリプトによって、プリンタ定義ファイルを作成することができる。このスクリプトを利用するためには、Windows クライアントから以下の4つのファイルをコピーしておく必要がある:[1]
[1] 古い Windows 95 クライアントでは、最初の2つのファイルしかない場合がある。
C:\WINDOWS\INF\MSPRINT.INF C:\WINDOWS\INF\MSPRINT2.INF C:\WINDOWS\INF\MSPRINT3.INF C:\WINDOWS\INF\MSPRINT4.INF これら4つのファイルを入手したら、適切なプリンタドライバと.INF ファイルを利用して、プリンタ定義ファイルを作成することが可能になる。プリンタドライバ名が A-K から始まっている場合は、 MSPRINT.INF ファイルか MSPRINT3.INF ファイルのどちらかを用いる。L-Z からはじまる場合は、 MSPRINT2.INF ファイルか MSPRINT4.INF ファイルになる。ドライバがどのファイルに含まれているかを検索するには、 grepを用いるとよいかも知れない。以下の例では、プリンタは MSPRINT3.INF ファイルにあるときに、HP DeskJet 560C printer 用のプリンタ定義ファイルを作成した場合である:
$grep "HP DeskJet 560C Printer" MSPRINT.INF MSPRINT3.INF MSPRINT3.INF: "HP DeskJet 560C Printer"=DESKJETC.DRV,HP_DeskJet_ ... $make_printerdef MSPRINT3.INF "HP DeskJet 560C Printer" >printers.def FOUND:DESKJETC.DRV End of section found CopyFiles: DESKJETC,COLOR_DESKJETC Datasection: (null) Datafile: DESKJETC.DRV Driverfile: DESKJETC.DRV Helpfile: HPVDJC.HLP LanguageMonitor: (null) Copy the following files to your printer$ share location: DESKJETC.DRV HPVCM.HPM HPVIOL.DLL HPVMON.DLL HPVRES.DLL HPCOLOR.DLL HPVUI.DLL HPVDJCC.HLP color\HPDESK.ICMスクリプトがコピーするように指示していることに注意すること。これらのファイルは次の段階で必要になる。
7.1.7.3 PRINTER$ 共有の作成
このステップは比較的簡単である。Samba サーバ上の空のディレクトリを指す
[PRINTER$]
という共有を smb.conf 中に作成する。次に、 make_ printerdef スクリプトで要求されたファイルを[PRINTER$]
共有のpath
設定オプションで指定された位置にコピーする。以下、設定ファイル中の記述例を示す:[PRINTER$] path = /usr/local/samba/print read only = yes browsable = no guest ok = yesmake_ printerdef スクリプトが必要とするファイルは、通常 C:\WINDOWS\SYSTEM ディレクトリに存在する, なおファイルがどこにあるかを見付けるためには、以下のようにコマンドを実行するとよい:
cd C:\WINDOWS dirfilename
/s今回の例では、各ファイルは、Samba サーバ上の /usr/local/samba/print ディレクトリにコピーされる必要がある。更に共有上に作成した printers.def ファイルも同様にコピーする。ここまで終れば準備はほとんど完了したといってよいだろう。
7.1.7.4 Samba 設定ファイルの変更
最後に、Samba に設定ファイルを修正して、以下の3つのオプションを追加する:
printer
driver
file
は printers.def ファイルを指定するグローバルオプションであり、[global]
セクション中に設定する。その他のオプションに付いては、ドライバの自動設定を行ないたいプリンタ共有に設定を行なう必要がある。printer
driver
の値は Windows システムのプリンタ追加ウィザードが表示したものと合致している必要がある。printer
driver
location
の値は、UNIX のパス名ではなく、PRINTER$ 共有のパス名(monyo 訳注: UNC 名)になる。最終的に以下のような設定が行なわれる:[global] printer driver file = /usr/local/samba/print/printers.def [hpdeskjet] path = /var/spool/samba/printers printable = yes printer driver = HP DeskJet 560C Printer printer driver location = \\%L\PRINTER$これでテストする準備が整った。ここで最初の段階で「マイコンピュータ」の「プリンタ」ウインドウでプリンタのリストから選択して"設定"したWindows 側のプリンタを削除する。Sambaが不要なファイルを削除するかどうかを聞いてきたら、削除する。これらのファイルは既にSamba サーバ上に存在するため、いずれにしてもすぐに置き換えられることになる。
7.1.7.5 設定のテスト
Samba のデーモンを再起動して、「ネットワークコンピュータ」からマシン名の下にある
[hpdeskjet]
共有を見付ける。見付けたらアイコンをクリックすることでプリンタの設定が開始され、 図 7.6のようなダイアログが表示される。これは先程プリンタを設定するときのものとは異なっており、ダイアログは"既にインストールしてある" - 言い替えればSamba によって提供されているドライバを受け入れるかどうかだけを聞いている。現在のドライバを利用することにし、「次へ」ボタンを押す。この場合、プリンタ名の指定とテストページの印刷とを行なうことが可能である。うまく動作すれば、設定は完了している筈である。この手順を各Windowsクライアントで繰り返し行なえばよい。
図 7.6: プリンタドライバの自動設定
© 1999, O'Reilly & Associates, Inc.