ネットワーク経由で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から見られるということなんだろう。
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 |
# 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
# 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
# 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内にいないマシンなのであれば、lmhostsやWINSの設定をするといいかも。
ユーザー・パスワードが間違っていると、こうなる。
# 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=ドメイン\\ユーザー名」とする。
「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コマンドを使う。
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)の設定を変えてやる。
再度サーバー管理ツールを開き、デフォルトドメインコントローラーポリシーのレポートで 上記の設定が「無効」になっていればOK。