S-JIS[2003-09-07/2008-07-04] 変更履歴

samba

ネットワーク経由でMS-WindowsからUNIXのファイルをアクセスする為のソフト。
逆にUNIX側からMS-Windowsの共有ディレクトリftpの様にアクセスすることも出来る。[2005-03-08]

Windows→UNIX UNIX→Windows

インストール

RedHat7.2(Linux)の場合、RedHatのインストール時にsambaを指定するだけ。


バージョン確認

sambaのバージョンを確認するには、smbstatusというコマンドを実行すればいいようだ。[2008-06-13]

$ smbstatus | head -2

Samba version 2.2.1a

設定

sambaの設定ファイルは「/etc/samba/smb.conf」。これを修正したら(自動的に反映される内容もあるようだけれども)、sambaを再起動するのが確実。[/2008-06-13]

smb.confのマニュアルは「man smb.conf」を実行すれば見られる。コンフィグファイルまでマニュアルがあるとは!
が、英語…。
日本Sambaユーザー会のサイトを照会させていただきましょう。


接続元指定

特定のIPアドレスからしか接続できないように設定できる。smb.confに以下のような設定を記述する。

# This option is important for security. It allows you to restrict
# connections to machines which are on your local network. The
# following example restricts access to two C class networks and
# the "loopback" interface. For more examples of the syntax see
# the smb.conf man page
   hosts allow = 192.168.0. 127.

上記の例だと、192.168.0.xxx又は127.xxx.xxx.xxxからの接続のみ受け付ける。(設定の仕方はmanで参照)
「hosts allow」の行自体をコメントアウトしてしまえば、無制限に受け付けるようになる。

ちなみに、WINSの設定は以下のようにする。

# WINS Server - Tells the NMBD components of Samba to be a WINS Client
#       Note: Samba can be either a WINS Server, or a WINS Client, but NOT both
   wins server = 192.168.xxx.yyy

ユーザーディレクトリー

UNIXのユーザー用のディレクトリにアクセスする為には、smb.confに以下のような設定を記述する。

  [test]			←Windowsに表示されるディレクトリ名
    comment = samba test	←ディレクトリの説明欄に表示される
    path = /home/test	←実際に参照されるUNIX上のディレクトリ
    guest ok = no
    writable = yes
    share modes = yes
キーワード 値の例 説明 [2004-05-16]
[ ] test Windowsに表示されるディレクトリ名
comment samba test 「ディレクトリの説明」欄に表示される文
path /home/test 実際に参照されるUNIX上のディレクトリ。
ここへアクセスするsambaユーザーは、このUNIX上のディレクトリへのアクセス権限が必要。(書き込むなら書き込み権限)[2004-12-30]
writable yes UNIX上のファイルに書き込み可能かどうか
share modes yes UNIX上のファイルの共有チェックを行うかどうか
yes:例えばあるExcelファイルを誰かが開いているとき、そのファイルを他の人が開くと「別の人が使っている」と警告が出る。
no:例えば同じExcelファイルでも、誰でも開くことが出来る。

また、sambaでアクセスする為のユーザーIDを作る必要がある。
以下のコマンドを実行(rootのみ可能)してユーザーを追加する。そのユーザー用のパスワードが聞かれるので、入力する。

# smbpasswd -a ユーザーID

ただし、UNIX上に存在しないユーザーIDは指定できない。useraddで作っておく。[2004-12-30]


誰でも自由にアクセスできる設定

ユーザー認証せず、自由にアクセスする設定をするには、smb.confに以下のように記述する。[2008-06-13]

[global]
   security = share
[name]
   comment = Comment for Windows
   path = /home/foo
   guest ok = yes
   writable = yes
   share modes = yes
   force group = group1
   force create mode = 0774
   force directory mode = 0775

この場合、アクセスする際にパスワードを聞かれることもない。
“ゲストユーザー”でログインしたことになる。
デフォルトでは、ゲストユーザーはnobodyというユーザーになる。変えたければ「guest account = ユーザー名」という設定をすればいいらしい。

UNIX上に作られるファイルは、nobodyというユーザーがオーナーになる。

キーワード 値の例 説明
force user user1 samba経由でUNIX上にファイルが作成される際のオーナー(所有者)
ログインしたユーザーIDに関わらず、このユーザーになる。
force group group1 samba経由でUNIX上にファイルが作成される際のグループオーナー(所属グループ)
force create mode 0774 samba経由でUNIX上にファイルが作成される際の権限
force directory mode 0775 samba経由でUNIX上にディレクトリーが作成される際の権限

ユーザー認証

パスワード入力によってユーザー認証し、特定のユーザーしかアクセスできないようにするには、smb.confに以下のような設定をする。[2008-06-13]

[global]
   security = user
[test]
   comment = Comment for Windows
   path = /home/foo
   guest ok = no
   valid users = user1,user2,user3,user4,user5
   writable = yes
   share modes = yes
   dos filetimes = yes
   force group = unixgroup1
   force create mode = 0774
   force directory mode = 0775

smbpasswdによって、ユーザーを作ってパスワードを登録しておく必要がある。

キーワード 値の例 説明 更新日
valid users user1,user2 アクセスを許可するユーザーを列挙する。 2008-07-04
dos filetimes yes (UNIX上の)ファイルのオーナーが異なるユーザーでも、
ファイルの更新日時を変更できるようにする。
2008-07-04

dos filetimesをyesにしておかないと、Excelファイルの更新日時が変になる。[2008-07-04]
変とは、Excelファイルを開いて変更せずに閉じても、更新日時が開いた時の日時になってしまうこと。

Excelは、ファイルを開いた時にそのファイルの更新日時を開いた時点の日時に更新するらしい。で、保存せずに閉じると、元の日時に戻すらしい。変な動作…。
で、UNIX(の標準)では、ファイルのオーナー(所有者)以外のユーザーでは、ファイルを新しい日時に更新することは出来ても、古い日時に更新することが出来ないらしい。
なのでsambaもその標準に則り、デフォルト(dos filetimesがno)では日時を更新できないらしい。その為、ユーザーが別々にログインする仕組みだと、ファイルのオーナーとは異なるユーザーという状況が発生し、古い日時に戻せなくなる。

そこでdos filetimesをyesにすると、古い日時に更新できるようになるので、この問題が解決される。
参考: samba-jpのexcelで開くだけで更新日時が変わってしまう


ファイル名漢字変換

Windows(クライアント)とUNIX(サーバー)の間でファイル名の漢字コードの自動変換を行うには、smb.confに以下のような設定を記述する。

client code page=932	←Windows側をSJIS(MS932)にする
coding system=euc		←UNIX側をEUCにする

ただし、これはあくまでファイル名だけであり、ファイルの中身の漢字コードが変換されるわけではない。


ログの設定

sambaはログファイルを出力している。[2005-05-01]

# this tells Samba to use a separate log file for each machine
# that connects
   log file = /var/log/samba/%m.log		←ログファイル名。「%m」は、接続元のマシン名

# Put a capping on the size of the log files (in Kb).
#   max log size = 0	←ファイルサイズ無制限
   max log size = 4096	←このサイズを超えると「.old」を付けてリネームされて、新しいファイルが作られるらしい

sambaが出力しているログファイルは、ファイルのロックにも関連しているらしい。
/varがディスクFULLになってログファイルを書き込めなくなると、samba経由でファイルが消せなくなる。「他人が使用中」という扱いになる模様。
この状況は、Excelの場合、開いたブックと同じ場所に「hoge.xls~RF11cf48c.TMP」といった感じのファイルが作られるようになる。そして、このファイルが消せない(排他処理中の扱い?)。
なお、この状態でもsamba経由でファイルを作ることは出来る。

ファイルサイズの上限を指定して「.old」付きファイルにリネームされるようにすることで、このoldファイルをcron等で削除することにより ディスクFULLを回避できる。


起動・再起動

sambaが起動していないと、Windowsからアクセスできない。
sambaの起動には、以下のコマンドを実行する。

/etc/rc.d/init.d/smb start

sambaの再起動には、以下のコマンドを実行する。smb.confを変えたら、(自動的に反映される設定もあるようだけど、)再起動が必要。ただし このコマンドを実行しても、実際に反映されるまでちょっと時間がかかる。

/etc/rc.d/init.d/smb reload 	…smb.confの再読込
/etc/rc.d/init.d/smb restart	…sambaの再起動

クライアントのテスト

sambaのクライアントが動くかどうかをUNIX上でテストする為(?)のコマンドがある。

smbclient '//ホスト名/フォルダ名' -U ユーザーID

フォルダ名は、smb.confの中で指定したもの。

smbclientは元々Windowsのディレクトリにアクセスする為のアプリらしい。[2005-03-08]
このアプリでsambaで公開したUNIXのディレクトリを参照できれば、Windowsから見られるということなんだろう。


UNIXからMS-Windowsの共有ディレクトリにアクセス

SambaClientというツール類の中にあるsmbclientを使うことで、ftpの様に対話型でUNIXからMS-Windowsの共有ディレクトリにアクセスすることが出来る。[2005-03-08]

smbclient '\\192.168.128.2\share'

↑IPアドレスが「192.168.128.2」であるWindowsマシンの、「share」という名前の共有ディレクトリにアクセスする。

↓ログインに成功すると、こんな感じ

$ smbclient '\\192.168.128.2\share'
added interface ip=UNIX機のIPアドレス bcast=192.168.128.255 nmask=255.255.255.0
session request to 192.168.128.2 failed (Called name not present)
session request to 192 failed (Called name not present)
Password:									←共有ディレクトリへアクセスする為のパスワードを入力
Domain=[WORKGROUP] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]
smb: \> help								←ヘルプ
ls             dir            du             lcd            cd
pwd            get            mget           put            mput
rename         more           mask           del            open
rm             mkdir          md             rmdir          rd
prompt         recurse        translate      lowercase      print
printmode      queue          cancel         quit           q
exit           newer          archive        tar            blocksize
tarmode        setmode        help           ?              history
smb: \> ls								←試しにlsコマンド
  .                                   D        0  Tue Mar  8 21:46:56 2005
  ..                                  D        0  Tue Mar  8 21:46:56 2005
  test                                D        0  Tue Mar  8 21:46:56 2005
  test.txt                            A        0  Tue Mar  8 21:46:24 2005

                38146 blocks of size 1048576. 19667 blocks available
!smb: \> exit								←smbclientの終了

さらに便利なことに、UNIX上のディレクトリであるかの様にWindowsのディレクトリを扱うことができる。
smbmountというアプリを使って、Windows上の共有ディレクトリをUNIXにマウントしてしまうのだ。

smbmount //192.168.128.2/share /mnt/hishidama -o username=hishidama,password=,codepage=cp932,iocharset=euc-jp,uid=user,gid=grp,fmask=775,dmask=755
オプション 説明
第1引数 接続先のMS-Windowsのサーバー名(IPアドレス)と、共有ディレクトリ名。 //192.168.128.2/share
第2引数 UNIX上のマウント先(ディレクトリ名)。 /mnt/hishidama
-o ここより後ろにオプションを書く。 -o
username MS-Windowsの共有ディレクトリへアクセスする為のユーザー名。
ドメインに入っている時は、それも指定する。(「\」が2つあるのは、1つだけだとUNIXが変な解釈をするから)
hishidama
domain\\user
password MS-Windowsの共有ディレクトリへアクセスする為のパスワード。
このオプションを書いておかないと、まずパスワードが聞かれてくる。
パスワードが設定されていない場合でも、このオプションを書いておくことでパスワードを聞かれることは無くなる。
 
codepage MS-Windows側の文字のエンコード。cp932はMS932(S-JIS)。 cp932
iocharset UNIX側の文字のエンコード。 euc-jp
uid UNIX側にファイルを作った場合の、ユーザー(UNIXユーザー) user
gid UNIX側にファイルを作った場合の、グループ(UNIXグループ) grp
fmask UNIX側にファイルを作った場合の、アクセス権限 775
dmask UNIX側にディレクトリを作った場合の、アクセス権限 755
  1. さっそく実行してみる(rootユーザーで行うのが無難)
    # smbmount //192.168.128.2/share /mnt/hishidama -o username=hishidama,password=,codepage=cp932,iocharset=euc-jp,uid=user,gid=grp,fmask=775,dmask=755
    Could not resolve mount point /mnt/hishidama

    /mnt/hishidamaが存在しないと駄目らしい。

    # mkdir /mnt/hishidama
  2. 再度実行してみる
    # smbmount //192.168.128.2/share /mnt/hishidama -o username=hishidama,password=,codepage=cp932,iocharset=euc-jp,uid=user,gid=grp,fmask=775,dmask=755
    9292: session request to 192.168.128.2 failed (Called name not present)
    9292: session request to 192 failed (Called name not present)

    なんか妙なエラー(failed)が出てる…。左側の数字は毎回変わるらしい。プロセスIDか何かか?
    でもディレクトリを見てみると、ちゃんと出来てる!ちょっと不思議。このfailは無視していいのかな?

    # ls /mnt/hishidama
    合計 1
    drwxr-xr-x    1 user     grp           512  3月  8 21:03 test
    -rwxrwxr-x    1 user     grp             0  3月  8 21:09 test.txt
    
  3. ちなみにアンマウントには、「smbumount」を使う。
    # smbumount /mnt/hishidama		←正常にアンマウントできると、何もメッセージは出ない(苦笑)
    # smbumount /mnt/hishidama/
    /mnt/hishidama probably not smb-filesystem	←こんなエラーが出ることもあるけど、再度マウントすることは可能
    # smbumount /mnt/hishidama
    Could not umount /mnt/hishidama: Device or resource busy	←誰かが使っているのでアンマウント不能(「cd /mnt/hishidama」でカレントにしてるとか)

単純に接続先(マシン名)が見つからないと以下のようなエラーになる。[2008-04-04]

# smbmount //SERVER_NAME/share /mnt/hishidama -o username=hoge,password=,codepage=cp932,iocharset=euc-jp,uid=user,gid=grp,fmask=775,dmask=755
22518: Connection to SERVER_NAME failed
SMB connection failed

相手がLAN内にいないマシンなのであれば、lmhostsWINSの設定をするといいかも。


ユーザー・パスワードが間違っていると、こうなる。

# smbmount //192.168.128.2/share /mnt/hishidama -o username=hoge,password=,codepage=cp932,iocharset=euc-jp,uid=user,gid=grp,fmask=775,dmask=755
9343: session request to 192.168.128.2 failed (Called name not present)
9343: session request to 192 failed (Called name not present)
9343: session setup failed: ERRDOS - ERRnoaccess (Access denied.)
SMB connection failed

※ちなみに、パスワードを設定していない共有ディレクトリをマウントする際は「password=」として、パスワード自体は書かないけどpassword文自体は入れておく。


共有ディレクトリの下にあるディレクトリ(そのディレクトリ自体は共有されていない)は、マウントすることは出来ない。ケチ 。cdで移動できるくせに

# smbmount //192.168.128.2/share/dir /mnt/hishidama -o username=domain\\hishidama,password=pass,codepage=cp932,iocharset=euc-jp,uid=user,gid=grp,fmask=775,dmask=755
9442: session request to 192.168.128.2 failed (Called name not present)
9442: session request to 192 failed (Called name not present)
9442: tree connect failed: ERRDOS - ERRnosuchshare (You specified an invalid share name)
SMB connection failed

※ちなみに、ドメインに参加している場合は「username=ドメイン\\ユーザー名」とする。


Called name not present」を無くす方法

「session request to 接続先名 failed (Called name not present)」というメッセージは無視しても構わないようだが、気になる。[2008-04-04]
このメッセージを出さなくするには、接続先の指定にIPアドレスを使うのをやめコンピューター名(NetBIOS名)を指定するようにすれば良いようだ。

NetBIOSに詳しいわけではないので、以下推測。

このメッセージは、こちらが指定した接続先のNetBIOS名(マシン名)が、接続先自身が保持している名前と合致していない場合のエラーっぽい。
smbmountでは、本来はNetBIOS名を指定するものだと思われる。
smbmount //NetBIOS名/〜
Windowsネットワーク上から、この名前で接続先のマシンを特定する。

ここでNetBIOS名の代わりにIPアドレスを指定した場合、NBT(NetBIOS over TCP/IP)によって、IPアドレスで接続先のマシンが特定される。
しかしNetBIOSのプロトコルとしては、接続先は名前が一致しているかどうかを確認するのだろう。
smbmountでNetBIOS名の欄に指定されているのはIPアドレスなので、接続先が保持しているNetBIOS名とは当然合致しない。
その結果、件のエラーメッセージが表示されているのだと思う。

(ちなみに、NetBIOSの規約では「Called Name」とか「Calling Name」とかいう言葉を使うようだ)


LAN内(ブロードキャストがそのまま届く範囲)では、NetBIOS名を指定すれば、その他には何も設定しなくても、その名前のマシンと通信できる。

しかしそれより外の範囲では、名前だけではマシンを特定できない。
この為に、lmhostsというファイル(Lan Manager hosts file)にIPアドレスとNetBIOS名の組み合わせを書いておく。
(lmhostsを書き換えてもsambaを再起動する必要は無い)

/etc/samba/lmhosts:

192.168.128.2 SERVER_NAME

すると、指定したNetBIOS名からIPアドレスを取得し、NBTによって接続先をちゃんと特定してくれる。
この場合はNetBIOS名も指定している為、問題のエラーメッセージは出ない。

# smbmount //SERVER_NAME/share /mnt/hishidama -o username=domain\\hishidama,password=pass,codepage=cp932,iocharset=euc-jp,uid=user,gid=grp,fmask=775,dmask=755

(逆に、IPアドレスを指定した場合にlmhostsからNetBIOS名を取得してくれれば良さそうな気がするが、そういう事はしてくれないようだ)

→IPアドレスからNetBIOS名を取得(確認)するにはnmblookupコマンドを使う。


Windows2003へのマウント

Windows2003Serverの共有ディレクトリへマウントしようとする場合に、以下のようなエラーが出た。[2005-05-17]
これは、sambaのバージョンが古くて SMB認証というものに対応していない為に起きたらしい。
(Windows2003がSMB認証を要求したが、samba側が対応してなくて返せない?)

# smbmount //192.168.128.2/backup /mnt/backup -o username=workgroup\\backup,password=backup,codepage=cp932,iocharset=euc-jp,uid=user,gid=grp,fmask=775,dmask=775
26885: session request to 192.168.128.2 failed (Called name not present)
26885: session request to 192 failed (Called name not present)
26885: tree connect failed: ERRDOS - ERRnoaccess (Access denied.)
SMB connection failed

対処方法としては、sambaのバージョンを上げるか、Windows2003側でSMB認証を無効にするか。

Windows2003のSMB認証を無効にするには、ドメインコントローラー(DC)の設定を変えてやる

  1. サーバー管理ツールを起動する。
    「スタート」メニュー→「管理ツール」→「サーバー管理」
     
  2. 左ペインのツリーから、デフォルトドメインコントローラーポリシーを選択する。
    「詳細管理」→「グループポリシーの管理」
    →「フォレスト:〜」 フォレストが無ければ、自分で作る。
    →「ドメイン」
    →「smallbusiness.local」 SmallBusinessという形式のサーバーで構築している場合。
    →「Domain Controllers」→「Default Domain Controllers Policy」
     
  3. グループポリシーオブジェクトエディタを起動する。
    右ペイン(Default Domain Controllers Policy)で「設定タブ」を選び、表示されているレポートの上で右クリック→「編集」
     
  4. 左ペインのツリーから、セキュリティオプションを選択する。
    「コンピュータの構成」→「Windowsの設定」→「セキュリティの設定」→「ローカルポリシー」→「セキュリティオプション」
     
  5. 右ペインからデジタル署名を行うセキュリティを探し、設定変更のダイアログを開く。
    「Microsoftネットワークサーバー:常に通信にデジタル署名を行う」をダブルクリック
     
  6. 設定を無効にする。
    「このポリシーの設定を定義する(D)」にチェックを入れ、「無効(S)」を選択

再度サーバー管理ツールを開き、デフォルトドメインコントローラーポリシーのレポートで 上記の設定が「無効」になっていればOK。


技術メモへ戻る
メールの送信先:ひしだま