作成開始 : 平成14年頃かなぁー 最終更新日 : 平成21年02月27日(金)

SambaでWindowsとファイル共有


目次
 Sambaとは何か?
 準備
 SWATを使ってみよう
 自分のホームディレクトリに接続しよう
 共有ディレクトリを作成しよう
 プリンタを共有しよう

はじめに

この資料は、オープンソースソフトウェアである「Samba」を利用して、簡単にWindows用のファイルサーバーを構築するための方法を説明したものです。 サーバーOSはFreeBSDを使っています。クライアントOSはWindows 98、Windows 2000を利用していますが、Windows 95、Windows NT、Windows XPなどでもほぼそのまま適用可能ですので、Windows用語については適宜読みかえてください。

●Sambaって何?

Samba(サンバ)とは、LinuxやFreeBSD、SolarisやHP-UXといったWindows以外のOSをWindows用のファイルサーバー、プリントサーバーにするソフトウェアです。Sambaを使用することにより、安価にWindowsサーバーを構築することが出来ます。

Sambaを構成するのは2つのプログラムです。 1つは、ネットワーク上での名前解決を行うプログラム(nmbd)です。 もう1つは、サーバーとクライアントの間でファイルのやり取りを行うプログラム(smbd)です。 SambaはTCP/IPを使って通信を行います。そのため、Windowsクライアント側のネットワークの設定で、WindowsネットワークをTCP/IP上で行うように設定しておく必要があります。

※私の環境では/etc/inetd.confで次のように記述されています。
netbios-ssn stream tcp nowait root /usr/local/sbin/smbd smbd
netbios-ns dgram udp wait root /usr/local/sbin/nmbd nmbd

●準備

※Sambaについての詳細は「日本Sambaユーザ協会」を参照ください。

 インストールや設定の詳細については、他のサイトか「日本Sambaユーザ協会」を参考にしていただくということで、解説は省略させていただきます。

Webブラウザで管理、「SWAT」を使ってみよう

Sambaには、Webブラウザ経由で管理を行うことの出来るツール「SWAT(Samba Web Administration Tool)」が標準で用意されています。Sambaの起動/停止から各種設定の変更までの全てをWebブラウザ上で行うことが出来るので、Sambaの設定ファイルを直接編集するという面倒な作業をする必要がなくなります。

SWATを利用するには、Sambaが動いているサーバーのポート901番にWebブラウザでアクセスします。
外部からこのポートにアクセスできないように、フィルタリングしておきましょう。

http://example.com:901/

うまくいくと認証のダイアログを表示しますので root とそのパスワードを入力すると設定画面を表示します。
こんな感じです。

★もしSWATにアクセスできない時には

もしかすると、ダイアログが出てこず、SWATにアクセスできなかったかもしれません。もしその場合には、サーバーの設定を変更しなくてはいけません。サーバーマシンにrootでログインするか、telnetなどでサーバーに一般ユーザーとしてリモートログイン後にsuコマンドでスーパーユーザーとなり、まず/etc/inetd.confというファイルを編集します。ファイル中にある以下の行を探しましょう。

#swat stream tcp nowait.400 root /usr/local/sbin/swat swat

行の先頭にあるコメントアウト「#」がSWATを無効にしているので、この「#」を取り除いて保存します。変更を有効にするために、inetdを再起動するかサーバーを再起動してください。

※パスなどはご自分の環境に読替えてください。

また、tcpdによってアクセス制限がかけられている可能性があります。これを修正するには/etc/hosts.allowファイルを修正する必要があります。/etc/hosts.allowファイルに次の1行を追加してください。

swat : ALL

もし、セキュリティを強固にしたいのであれば、ALLを管理用のクライアントマシンのIPアドレスにすることにより、そのIPアドレス以外のマシンからのアクセスを受け付けないようにすることが出来ます。

swat : 192.168.2.2
(IPアドレスが192.168.2.2以外のマシンからはSWATにアクセスできません)

Sambaの基本的な設定を変更する

SWATにアクセスしたら、まずはSambaの基本的な設定を変更しましょう。 まず「全体設定 GLOBALS」アイコンをクリックします。
こんな感じです。
この画面中の「基本オプション」−「workgroup」の値を変更しましょう。この値はクライアントのWindowsマシンで設定している「ワークグループ名」と同一にします。ワークグループ名の確認はWindowsクライアントの「コントロールパネル」−「ネットワーク」で行うことが出来ます。変更したら、「設定変更」ボタンを押して設定を変更しましょう。

設定を変更しただけでは設定の変更はSambaには反映されません。今度は「動作状況 STATUS」アイコンをクリックしましょう。
こんな感じです。
この画面では、smbdおよびnmbdの動作状況が確認できます。もし停止中であれば「起動」ボタンを、動作中であれば「再起動」ボタンを押すと、変更後の設定を読み込んでSambaが動き始めます。 変更後のSambaの動作を確認するために、Windowsクライアントから「マイネットワーク」−「ネットワーク全体」とダブルクリックしていき、上で設定したワークグループ名のアイコンを開いて、中にSambaサーバーの名前があれば成功です。エクスプローラーの表示を「詳細表示」にしておけば、コメントに「Samba○○」と表示されているのも確認できるでしょう。この表示については「全体設定」−「基本オプション」−「server string」で変更することができます。

どうです?いいでしょう!!!

●自分のホームディレクトリに接続しよう

※ただし、この例は SWATの中の「全体設定」で「セキュリティ・オプション」が security = user に設定してある場合である。
※guestも含めてみんなでワイワイ接続するには security = share にするとよいでしょう。

Sambaの持っている便利な機能の一つとして、Sambaの動作しているサーバー上に存在するユーザーのホームディレクトリに簡単に接続できる機能があります。ここでは、既にサーバー上にユーザーtakaqが存在していることとして説明をします。

まず基本的な考え方ですが、サーバー上のユーザー名とWindowsネットワークのユーザー名(Windowsを起動した時に入力するユーザー名の事)は同一のものにしましょう。また、WindowsをSambaサーバーに接続させるには、Samba用のパスワードを設定しないといけませんが、このパスワードも、Windowsネットワークにログオンする際のパスワードと同一のものにしておけば、Sambaサーバーにアクセスする際にいちいちパスワードを入力しないで済みます。ですから、ユーザー名、SambaパスワードともにWindows起動時に入力するものと同じにしておくことを推奨します。

Windowsのユーザ名=サーバーのユーザ名
Windowsのパスワード=Sambaのパスワード

Sambaパスワードは、通常のサーバーのパスワードとは別に、/usr/local/private/smbpasswdというファイルに格納されます。つまり、サーバー上にユーザーアカウントを作成するのとは別に、Sambaパスワードを設定しないといけないということです。Sambaパスワードの設定は、スーパーユーザーでsmbpasswdコマンドを実行することによって行ないます。ユーザーtakaqのSambaパスワードの設定は以下の通 りです。

# smbpasswd -a takaq

この例で気をつけなくてはならないのが2点あります。まずユーザーtakaqが既に存在していなくてはいけません。また、-aオプションを付け忘れないこと。aはAdd(追加)の意味で、まだ存在しないSambaユーザーtakaqのSambaパスワードを、/usr/local/private/smbpasswdファイルに追加するという意味になるからです。-aオプションを付けない場合は、パスワードの修正を行うという意味となり、まだ存在しないSambaユーザーのパスワードを変更しようとするため、エラーになります。

New SMB password:
Retype new SMB password:
startsmbfilepwent_internal: unable to open file /usr/local/private/smbpasswd. Error was No such file or directory
unable to open passdb database.
startsmbfilepwent_internal: unable to open file /usr/local/private/smbpasswd. Error was No such file or directory
Added user takaq.

エラーが起きているように見えますが、これは/usr/local/private/smbpasswdファイルがまだ存在していないという単なる警告であり、smbpasswdコマンドが新たにファイルを作ってくれるので、心配する必要はありません。
内容は次のように登録されます。

# cat /usr/local/private/smbpasswd
takaq:1001:F0B5E790DA43EB06AAD3B435B51404EE:D9D83B482855C7FF49FD5A31568AB854:[UX
]:LCT-00000000:
#

さて、ここまで終わったら、WindowsクライアントからSambaサーバーのアイコンをダブルクリックしてみましょう。きちんと設定できていればサーバーに接続できるはずです。例えば、WindowsのパスワードとSambaのパスワードが違うなど、パスワードの設定がうまくいっていない場合には、警告ダイアログが表示されてしまいます。その時にはもう一度サーバー上でsmbpasswd takaq(今度は-aオプションなし)を実行し、Sambaパスワードの修正を行ってみましょう。(SWATの「全体設定」で encrypt passwords = yes とし暗号化パスワードを使いましょう)

そして、「共有設定」で自分のホームディレクトリ(例えば /home/takaq) を共有設定します。この時、guest ok = no、hosts allow = 自クライアント・・・などとしてセキュリティを設定しましょう。

Sambaサーバーを表示しているウィンドウの中に、takaqというフォルダが表示されているはずです。これが、Sambaサーバー上にあるユーザーtakaqのホームディレクトリです。UNIX上では、大体が/home/takaqとなります。このフォルダは基本的に他のユーザーからは見られないので、ユーザーの個人的な作業に利用できます。

●共有ディレクトリを作成しよう

次に、何人かのユーザーで共同利用のできる共有ディレクトリを作成しましょう。今回の例では、同じサーバーで動作しているWebサーバー「Apache」のHTMLファイルを簡単にWindowsから変更できるように、Apache用のディレクトリ(標準では「/home/httpd/html」)をSambaの共有ディレクトリにしたいと思います。そのための手順は次の通 りです。

  サーバー上でグループを作成する。
  共有したいディレクトリを作成したグループの所有にする。
  そのグループがそのディレクトリを読み書きできるようにする。
  Sambaでそのディレクトリを共有フォルダに設定する。

サーバー上でグループを作成する。
グループの作成はgroupaddコマンドを使います。ここでは、webというグループを作成しています。

# addgroup web

共有したいディレクトリを作成したグループの所有にする。
ディレクトリのグループ所有権を変更するにはchownコマンドを使います。ここでは、/home/httpdおよび/home/httpd/htmlディレクトリのグループ所有権をwebに変更しています。

# chown .web /home/httpd /home/httpd/html

作成したグループがそのディレクトリを読み書きできるようにする。
ディレクトリの読み書き権限を変更するにはchmodコマンドを使います。ここでは、/home/httpdおよび/home/httpd/htmlディレクトリの読み書き権限を読み書き可能に変更しています。

# chmod g+rw /home/httpd /home/httpd/html

SWATで共有フォルダを作成する。
この作業はSWATで行います。
WebブラウザでSWATにアクセスし、「共有設定 SHARES」アイコンをクリックします。表示されたフォームのテキストボックスに共有名を入力します。この共有名が「Sambaサーバーに接続した際に表示されるフォルダ名」となります。共有名には日本語も使うことが出来ます(Samba日本語版のみ)。
「新規共有作成」ボタンを押すと、画面が切り替わり、今作成した共有ディレクトリの詳細を設定できる画面 となります。ここで設定するべき項目がいくつかありますので、見ていきましょう。

「基本オプション」−「path」
作成した共有ディレクトリが、Sambaサーバー上でのどのディレクトリを指すのかを指定します。今回の例では「/home/httpd/html」となります。

「セキュリティオプション」−「writeable」
この共有ディレクトリが書き込み可能かどうかを設定します。当然「Yes」に設定します。

こんな感じです。

変更を行ったら「設定変更」ボタンを押します。新しい設定はSambaを再起動することなく反映されます。
うまく出来たかどうか、WindowsクライアントからSambaサーバーのアイコンをダブルクリックして確認してみましょう。新しいフォルダが追加されていたら成功です。そのフォルダに何かファイルをコピーしてみましょう。もしうまくコピーが出来ない場合には、Sambaサーバー側でディレクトリの書き込み権限の確認を、またSWATで「セキュリティオプション」−「writeable」の設定を確認してみてください。また、すでに存在するファイルが読取専用の場合もあります。

●プリンタを共有しよう

Sambaを使えば、サーバーマシンに接続されたプリンタを、Windowsクライアントからネットワーク経由で利用することが出来ます。

手順は以下の通りです。

  プリンタの接続
  サーバーの設定
  Sambaの再起動
  Windowsクライアントでの設定

プリンタの接続
まずはプリンタをサーバーに接続しましょう。最近のプリンタはUSBでの接続のみのものが多くなっていますが、UNIXでUSBを利用可能にするのは大変なので、プリンタ購入時にはパラレル接続が可能なプリンタを選ぶことをお勧めします。

サーバーでの設定
サーバー上で lp (line printer)という、非常に基本的なプリンタインターフェースが使用可能にしさえすれば、Sambaでプリンタ共有ができるようになります。

まずは、プリンタをサーバーに接続します。
そして、スーパーユーザーでログインし lptest > /dev/lpt0 としてプリンタにテスト文字が出力されれば lp が使えます。
私のとこでは PC-9821Ne ではOKでしたが、 PC-9801NS/A、PC-9821Nr13 では Device busy になって使えませんでした。
色々と調べましたが解決策は見つかりませんでした。


次に、lpを使用可能にするには、/etc/printcapというファイルを編集します。 (インストール時に標準であります)
コメントでサンプル記述がありますが、今回は以下の部分を使って(#リマークはずし)みました。

lp|local line printer:\
       :sh:\
       :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs

作成する上でいくつかの注意点があるので、1つずつ見ていきましょう。

1行目
この行はプリンタ名を設定しています。「printer」がSambaで表示されるプリンタ名になりますので、好きな名前を付けてください。

2行目
印刷したい書類の前(ページヘッダ)によく分からない文字と Job○○と書かれた紙が合計2枚出るのを抑止

3行目

lp=/dev/lpt0                → プリンタのデバイス名
sd=/var/spool/output/lpd        → プリントアウトする文書データが一時的に保存(spool)されるディレクトリ
                          ここは chmod 777 /var/spool/output/lpd でスプーラへの書込み権限を与えましょう。
lf=/var/log/lpd-errs            → エラーログのファイル

★印刷時に無駄な印刷がされてしまう場合
ディストリビューションによっては、印刷したい書類の後ろに白紙が1枚出てきてしまうかもしれません。これらを出さないようにするには、/etc/printcapに以下の1行を追加してください。

        :sf:\

sfというのがフォームフィード(改ページ)を抑制するための命令です。

そしたら、lpd でプリンタ・データモンを起動し test.txt などで適当なファイルを作成 lpr test.txt でプリンタへの出力を確認しましょう。
これでOKなら /etc/rc.conf に lpd_enable="YES" を追加しサーバーを再起動しましょう。

Sambaの設定と再起動
SWATにログインし「プリンタ設定」で新規に共有するプリンタの設定を登録しましょう。
設定後はSWATからSambaを再起動し、もう1度Sambaサーバーに接続してみましょう。共有フォルダ以外に、新たにネットワークプリンタのアイコンが表示されているはずです。

Windowsクライアントの設定
最後にWindowsクライアントの設定です。 まずは、使用したいプリンタの機種にあったプリンタドライバをインストールしましょう。 最近のプリンタドライバは、いわゆるドライバディスクの形式ではなく、インストールプログラムを使用するものも出てきています。インストールプログラムを使用する形式の場合には、プリンタ付属のマニュアルの通 りインストールを行いましょう。ドライバディスクの場合には、ネットワークプリンタの設定を行う際に使うので、先に用意しておきましょう。

そしてネットワークプリンタに接続します。一番簡単なのは、先ほど確認したSambaサーバー内にあるプリンタのアイコンをダブルクリックする方法です。すると「プリンタの追加ウィザード」が起動します。もし既にドライバがインストール済みであれば、ドライバの選択で表示されるリストに入っているはずですので、それを選択しましょう。ドライバディスクがある場合には、この際にディスクを使用して必要なドライバをインストールしましょう。ウィザードが終了すれば、Windowsの「プリンタ」フォルダに、設定した新しいプリンタのアイコンが作成されているはずです。アイコンを選択し、右クリックでプロパティを開いてテスト印字をしてみましょう。きちんと設定されていれば、プリンタの印字テストが印刷されるでしょう。 無事に印刷されたら成功です。あとは印刷を行いたいアプリケーションの印刷時に、設定したネットワークプリンタを印刷先に指定すれば、アプリケーションからの印刷も可能になります。

大分省略した形で記述してしまいました。postscript対応プリンタ向けの設定など詳細については、検索エンジンで "FreeBSD samba プリンタ" などと入力するとヒットしますので参考にしてください。


[2009/02/27 Fri 追記]

久しぶりに samba でプリンタ共有を設定してみました。事の発端は 2月23日(月)と24日(火)の夜に居間のブレーカが落ちてしまいました。
原因は分かりません。家は以前、長屋タイプの2棟続きのところで10年以上前に買い取りリホームしたものです。その時に電源系統を変更しないでいたものだから・・・そこで少しでも電気量を低くしようと思い年賀状を印刷するために居間に置いていたプリントサーバー(LANA KP-501)とプリンタ(EPSON PM-670C)を元の場所に戻そうとしたのです。
せっかくなので、プリントサーバーを止めて、いつも稼動している Webサーバー(Compaq Armda 1592DMT) に samba3 がインストールしてあるからそこにプリンタ共有を設定して「ネットワークプリンタ」として使おうとしました。
この時にかなりハマったので以下に記録を残しておきます。

環境は次のとおりです。

OS : FreeBSD 4.5 RELEASE (古いーー)
Samba : samba 3.0.31 (ソースからコンパイル /usr/local/samba3にインストール)
ファイル共有は既に実施済
OS側の設定
○プリンタのテスト・・・・プリンタを接続し電源をONにしておきます。

・ll /dev/lp* で lpt0 があるか確認しました。・・・・ありました。
・lptest > /dev/lpt0 で使用可能か調べました。・・・・最初 Device busy  になりましたが、何度かやったらテストパターンが印刷されました。

○/etc/printcapの編集
viで次のように編集しました。・・・・というより lpセクションのコメントを外し「|PM670C|」と「:sf:\」を足しただけです。

lp|PM670C| local line printer:\
       :sh:\
       :sf:\
       :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs

・行頭までは TAB です。
・行末の \ は「まだ続きがあるよー」の意味です。

そして、/var/spool/output/lpd のパーミッションを chmod で 777 にしました。
○lpd デーモンによるプリンタ出力の確認
・lpd と入力し ps aux | grep lpd でプロセス起動を確認しました。
・vi で /tmp に test.txt というファイルを作成し lpr /tmp/test.txt で内容がプリンタに印刷されることを確認しました。 
○OS起動時にlpd デーモンが起動するように設定
・viで /etc/rc.conf に lpd_enable= "YES" としOSをリブートしました。。
・ps aux | grep lpd でプロセス起動を確認しました。 
Sambaの設定
○smb.conf の内容
四苦八苦( samba2 ではこんなに苦労しなかったのにー)しましたが、Windowsからプリンタ共有が見えた設定を以下に記載します。

[printers]
comment = Samba Printer
path = /var/spool/output/lpd
guest ok = Yes
printable = Yes
browseable = Yes
available = Yes

[PM670C]
comment = local line printer
path = /var/spool/output/lpd
read onry = No
guest ok = yes
printable = Yes
printer name = PM670C
use client driver = Yes

smb.conf の説明は http://www.samba.gr.jp/project/translation/3.0/htmldocs/smb.conf.5.html を見てほしい。
○実施手順
最初から上のように viで smb.conf を書いて samba を再起動すればよかったのですが、なかなかそこまでのスキルは無いので vi と swat を併用しました。なんだか、swat で設定すると不思議な動きになったものだから・・・・

ファイルの共有を設定した段階で、私の smb.conf には [printers]セクションがありませんでした。
そこで、swat にログインして「プリンタ共有」のところで「printers」という共有名を作成しました。
そしたら、「プリンタ共有」のコメントにある「名前の先頭に [*] がついたプリンタは Printcap Name から・・・・」のとおり、プリンタ選択のタブに「[*]PM670C」というのが見えてきました。

せっかくなので「PM670C」を選択し「設定反映」して「ステータス」のところで「smbd再起動」「nmbd再起動」をしました。
そして、WindowsPCのネットワークコンピュータで該当のコンピータ名をクリックしても共有プリンタは見えません。
ただ、「プリンタとFAX」のプリンタ追加ウイザードを起動しプリンタ検索すると、該当のコンピュータをすぐマークします。ですが、プリンタ欄は空です。何となく、共有プリンタの設定はされているが見えてこないのではと思いました。

そこで、調べまくりました。

そしたら、smb.conf の妥当性をチェックする testparm というものがあることを見つけました。
find したら /usr/local/samba3/bin にありました。さっそく実行したらなんと [printers]と[PM670C]にエラーがありました。
それによると、「pathが無いよー」「availableがnoなのでサービスに対する接続は失敗するよぉー」みたいでした。
なので、vi で /usr/local/samba3/lib/smb.conf を開き path に printcap に書いたスプールディレクトリ /var/spool/output/lpd を記述、available = no の記述を available = Yes にして swat から 「smbd再起動」「nmbd再起動」をしたらやっと共有プリンタが見えてきました。
この available は、ディフォルト yes のはずなのに swat からやると yes にできないのです。これでずいぶんハマリました。
それと、共有プリンタを Windows のプリンタにセットアップしたら「アクセス拒否されました」になってしまいました。
これは、use client driver = Yes がなかったからです。
vi で smb.conf に記述追加したら Windows側には即反映されました。
まとめとしては、一旦 swat で [printers]セクションを作成し、vi で /usr/local/samba3/lib/smb.conf を調整とtestparm 実行を繰り返すといいと思います。

【戻る】

サイトトップへ