Samba
関連記事
Samba は SMB/CIFS ネットワークプロトコルの再実装であり、NFS の代わりになるものとして Linux と Windows システム間でのファイルやプリンターの共有を容易にします。Samba の設定は簡単で操作もわかりやすいと言うユーザーもいますが、新規ユーザーの多くは複雑で直感的でないメカニズムが手を余らせることになります。そのようなユーザーは以下の指示をよく読んで下さい。
目次
- 1 サーバーの設定
- 2 クライアントの設定
- 3 Tips and tricks
- 4 トラブルシューティング
- 4.1 Samba SMB/CIFS サーバーが起動できない
- 4.2 ゲストパーミッションで Samba 共有を作成しても Windows クライアントがパスワードを要求する
- 4.3 Windows 7 の接続の問題 - mount error(12): cannot allocate memory
- 4.4 Windows からパスワードで保護された共有にアクセスするときに問題が発生する
- 4.5 ダイアログボックスの表示に長い時間がかかる
- 4.6 Error: Failed to retrieve printer list: NT_STATUS_UNSUCCESSFUL
- 4.7 Sharing a folder fails
- 4.8 "Browsing" network fails with "Failed to retrieve share list from server"
- 4.9 You are not the owner of the folder
- 4.10 protocol negotiation failed: NT_STATUS_INVALID_NETWORK_RESPONSE
- 4.11 Connection to SERVER failed: (Error NT_STATUS_UNSUCCESSFUL)
- 4.12 Connection to SERVER failed: (Error NT_STATUS_CONNECTION_REFUSED)
- 5 参照
サーバーの設定
Samba を使ってファイルを共有するには、公式リポジトリから samba をインストールしてください。
Samba サーバーの設定は /etc/samba/smb.conf
で行います。デフォルトの Samba 設定ファイルを /etc/samba/smb.conf
にコピーしてください:
# cp /etc/samba/smb.conf.default /etc/samba/smb.conf
共有を作成する
/etc/samba/smb.conf
を編集して、Share Definitions セクションまでスクロールしてください。デフォルトの設定では、それぞれのユーザーのホームディレクトリに共有を自動で作成します。また、プリンターの共有もデフォルトで作成します。サンプル設定には多数のコメントが付属しています。オプションに関する詳細は man smb.conf
で見ることができます。オンライン版は こちら になります。
Windows 側では、smb.conf
を Windows ワークグループに変更してください (Windows デフォルト: WORKGROUP)。
サービスを起動する
SMB の基本的なファイル共有をするには、smbd
と nmbd
サービスを起動してください。
詳しくは smbd と nmbd のマニュアルページを見て下さい。
以下のコマンドはオブジェクトの名前を後でコマンドを実行する環境に自動で export します:
# export USERSHARES_DIR="/var/lib/samba/usershare" # export USERSHARES_GROUP="sambashare"
次のコマンドは /var/lib/samba
に usershares ディレクトリを作成します:
# mkdir -p ${USERSHARES_DIR}
次のコマンドは sambashare グループを作成します:
# groupadd ${USERSHARES_GROUP}
次のコマンドは root に作成したディレクトリの所有者とグループを変更します:
# chown root:${USERSHARES_GROUP} ${USERSHARES_DIR}
次のコマンドは usershares ディレクトリのパーミッションを変更して sambashare グループのユーザーがファイルを読み書き・実行できるようにします:
# chmod 1770 ${USERSHARES_DIR}
smb.conf
設定ファイルに以下の変数を設定します:
/etc/samba/smb.conf
... [global] usershare path = /var/lib/samba/usershare usershare max shares = 100 usershare allow guests = yes usershare owner only = yes ...
sambashare
グループにあなたのユーザーを追加してください、your_username
はあなたの linux ユーザーの名前に置き換えてください:
# usermod -a -G ${USERSHARES_GROUP} your_username
smbd
と nmbd
サービスを再起動します。
一度ログアウトして再ログインしてください。これで GUI を使って samba 共有を設定することができます。例えば、Thunar でディレクトリを右クリックしてネットワーク常に共有することが可能です。
エラー You are not the owner of the folder
が表示されるときは、システムを再起動してみてください。
ユーザーを追加する
samba ユーザーのための Linux ユーザーアカウントを作成してください。samba_user
は好きな名前に置き換えられます:
# useradd samba_user
そして同じ名前で Samba ユーザーアカウントを作成してください:
# pdbedit -a -u samba_user
samba ユーザーのパスワードを変更する
ユーザーのパスワードを変更するには、smbpasswd
を使って下さい:
# smbpasswd samba_user
クライアントの設定
Samba/SMB/CIFS サーバーからファイルにアクセスするのに必要なのは smbclient だけです。これは公式リポジトリからインストールできます。
LAN 上の他のコンピュータの共有リソースには GUI や CLI を使ってローカルでアクセス・マウントすることが可能です。ほとんどの軽量デスクトップ環境には共有リソースのアクセスを容易にする固有の方法がないため、グラフィカルな方法には制限があります。
共有アクセスは2つの部分に別れます。1つはバックのファイルシステムのメカニズムで、2つ目はユーザーが共有リソースをマウントするのを選択できるようにするインターフェイスです。環境によっては1つ目の部分はすでに初めから備わっていることがあります。
手動マウント
公式リポジトリから smbclient をインストールしてください。軽量な方法を使いたい場合で、公開共有を表示する必要がないときは /usr/bin/mount.cifs
が入っている cifs-utils だけをインストールします。
サーバーの公開されている共有を表示するには:
$ smbclient -L hostname -U%
共有のマウントポイントを作成:
# mkdir /mnt/mountpoint
mount.cifs
タイプを使って共有をマウント。下で示しているオプションが全て必要・推奨というわけではありません (ie. password
)。
# mount -t cifs //SERVER/sharename /mnt/mountpoint -o user=username,password=password,workgroup=workgroup,ip=serverip
SERVER
- Windows マシンの名前。
sharename
- 共有ディレクトリ。
mountpoint
- 共有をマウントするローカルのディレクトリ。
-o [options]
- 詳しくは
man mount.cifs
を見て下さい。
共有を /etc/fstab に追加
fstab エントリを追加する一番簡単な方法は以下の通りです:
/etc/fstab
//SERVER/sharename /mnt/mountpoint cifs username=username,password=password 0 0
ただし、誰でも読み取りできるファイルにパスワードを保存するのは推奨されません。証明書ファイルを使うほうが安全です。例えば、ファイルを作成して chmod 600 filename
を実行することで所有者のユーザーだけが読み書きできるようになりますy。ファイルには以下の情報が含まれている必要があります:
/path/to/credentials/sambacreds
username=username password=password
そして fstab での行は以下のようになります:
/etc/fstab
//SERVER/SHARENAME /mnt/mountpoint cifs credentials=/path/to/credentials/sambacreds 0 0
systemd を使っている場合 (最近のインストールではデフォルト)、x-systemd.automount
オプションを利用することができます。これはサービスの起動を数秒早くできます。また、uid
と gid
オプションを使うことで、現在のユーザーとグループをマップして作業を少し楽にできます。
/etc/fstab
//SERVER/SHARENAME /mnt/mountpoint cifs credentials=/path/to/smbcredentials,x-systemd.automount,uid=username,gid=usergroup 0 0
ユーザーマウント
/etc/fstab
//SERVER/SHARENAME /mnt/mountpoint cifs users,credentials=/path/to/smbcredentials,workgroup=workgroup,ip=serverip 0 0
これでマウントポイントがユーザーの制御下にあるディレクトリ (つまり、ユーザーのホーム) にある限りユーザーがマウントできるようになります。ユーザーのホームにないマウントポイントで Samba 共有をマウント・アンマウントできるようにするには、smbnetfs を使うか、sudo で権限をあげてください。
WINS ホスト名
smbclient パッケージには WINS を使ってホスト名を解決するドライバーが入っています。有効にするには、/etc/nsswitch.conf
の “hosts” 行に “wins” を追加してください。
自動マウント
簡単に共有リソースをブラウズする方法は複数存在します:
smbnetfs
まず、マウントしたい共有が全て見れるかどうか確認してください:
$ smbtree -U remote_user
見れない場合、/etc/samba/smb.conf
内の次の行を見つけて修正してください:
domain master = auto
そして smbd
と nmbd
サービスを再起動してください。
全てが問題なく動作するようになったら、公式リポジトリから smbnetfs をインストールしてください。
次に、次の行を /etc/fuse.conf
に追加して:
user_allow_other
fuse
カーネルモジュールをロードしてください:
# modprobe fuse
さらに /etc/smbnetfs/.smb
ディレクトリをホームディレクトリにコピーします:
$ cp -a /etc/smbnetfs/.smb ~
そして smb.conf
へのリンクを作成してください:
$ ln -sf /etc/samba/smb.conf ~/.smb/smb.conf
共有フォルダにアクセスするのにユーザー名とパスワードが必要な場合は、~/.smb/smbnetfs.auth
を編集して以下のように一つ以上エントリを含めて下さい:
~/.smb/smbnetfs.auth
auth "hostname" "username" "password"
必要な場合、smbnetfs によってマウントする特定のホストのエントリを追加することも可能です。
詳しくは ~/.smb/smbnetfs.conf
に書いてあります。
Dolphin や Nautilus ファイルマネージャを使用する場合、以下を ~/.smb/smbnetfs.conf
に追加することで "Disk full" エラーを表示しないようにすることができます。デフォルトでは smbnetfs は空き容量が0バイトだと報告します:
~/.smb/smbnetfs.conf
free_space_size 1073741824
設定が完了したら、次を実行する必要があります:
$ chmod 600 ~/.smb/smbnetfs.*
設定に問題があると、smbnetfs は 'insecure config file permissions' とエラーを吐きます。
最後に、Samba ネットワークを指定したディレクトリにマウントするために、次を実行してください:
$ smbnetfs mount_point
デーモン
Arch Linux パッケージは smbnetfs にシステム共通のオペレーションモードを追加しています。有効にするには、/etc/smbnetfs/.smb
ディレクトリで上記の修正を行う必要があります。
そして、smbnetfs
デーモンを通常通りに起動・有効化できます。システム共通のマウントポイントは /mnt/smbnet/
になります。
fusesmb
- AUR から fusesmbAUR をインストールしてください。
- マウントポイントを作成:
mkdir /mnt/fusesmb
fuse
カーネルモジュールをロード。- 共有をマウント:
fusesmb -o allow_other /mnt/fusesmb
autofs
Linux におけるカーネルベースの自動マウントの情報は Autofs を見て下さい。
ファイルマネージャの設定
GNOME Files, Nemo, Thunar, PCManFM
GNOME Files, Nemo, Thunar, PCManFM で samba 共有にアクセスするには公式リポジトリの gvfs-smb パッケージをインストールしてください。
Ctrl+l
を押してロケーションバーに smb://servername/share
と入力して共有にアクセスします。
マウントされた共有はファイルシステムで /run/user/your_UID/gvfs
や ~/.gvfs
にあるように見えます。
KDE
KDE には Samba 共有をブラウズするための機能が内蔵されています。したがってパッケージの追加は必要ありません。ただし、KDE システム設定で GUI を使うには、公式リポジトリから kdenetwork-filesharing パッケージをインストールしてください。
Dolphin でアクセスした時に "Time Out" エラーが表示される場合、smb.conf
で次の行をアンコメント・編集してください:
name resolve order = lmhosts bcast host wins
このページ を参照。
他のグラフィカル環境
有用なプログラムは多数ありますが、プログラムのパッケージを作成しなくてはなりません。Arch のパッケージビルドシステムを使ってパッケージを作れます。インストールするのに特定の環境を必要としないために簡単に持ち運ぶことができます。
- pyneighborhood は公式リポジトリから利用できます。
- Xffm の LinNeighborhood, RUmba, xffm-samba プラグインは公式リポジトリにも AUR にもありません。公式にはサポートされていない(もしくは非公式サポートすらない)ため、動作がおかしかったり全く動かなかったりします。
Tips and tricks
Samba 共有で特定のファイル拡張子をブロック
Samba にはファイルの拡張子など、特定のパターンを使ってファイルをブロックするオプションが存在します。このオプションを使うことでウイルスが繁殖するのを防いだり、特定のファイルで容量が食われるのを防ぐことができます。オプションの詳細は man smb.conf
を見て下さい。
/etc/samba/smb.conf
... [myshare] comment = Private path = /mnt/data read only = no veto files = /*.exe/*.com/*.dll/*.bat/*.vbs/*.tmp/*.mp3/*.avi/*.mp4/*.wmv/*.wma/
ネットワーク共有の探知
ローカルネットワーク上の他のシステムについて何も知らない場合、smbnetfs などの自動化ツールも使えないときは、以下の方法で Samba の共有を手動で調べることができます。
1. まず pacman を使って nmap と smbclient をインストール:
# pacman -S nmap smbclient
2. nmap
で開いているポートを確認:
# nmap -p 139 -sT 192.168.1.*
上記の例では 192.168.1.* の範囲の IP アドレスとポート 139 をスキャンします。以下のような結果が得られます:
$ nmap -sT 192.168.1.*
Starting nmap 3.78 ( http://www.insecure.org/nmap/ ) at 2005-02-15 11:45 PHT Interesting ports on 192.168.1.1: (The 1661 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 139/tcp open netbios-ssn 5000/tcp open UPnP Interesting ports on 192.168.1.5: (The 1662 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 6000/tcp open X11 Nmap run completed -- 256 IP addresses (2 hosts up) scanned in 7.255 seconds
最初の結果は他のシステムです。2番目の結果はスキャンを実行したクライアントです。
3. ポート 139 が開いているシステムが見つかったので、nmblookup
を使って NetBIOS の名前をチェック:
$ nmblookup -A 192.168.1.1
Looking up status of 192.168.1.1 PUTER <00> - B <ACTIVE> HOMENET <00> - <GROUP> B <ACTIVE> PUTER <03> - B <ACTIVE> PUTER <20> - B <ACTIVE> HOMENET <1e> - <GROUP> B <ACTIVE> USERNAME <03> - B <ACTIVE> HOMENET <1d> - B <ACTIVE> MSBROWSE <01> - <GROUP> B <ACTIVE>
<20> を見て下さい。これはホストがサービスを開いていることを示します。
4. smbclient
を使って PUTER で共有されているサービスを確認します。パスワードの入力が求められたら、エンターを押すとリストが表示されます:
$ smbclient -L \\PUTER
Sharename Type Comment --------- ---- ------- MY_MUSIC Disk SHAREDDOCS Disk PRINTER$ Disk PRINTER Printer IPC$ IPC Remote Inter Process Communication Server Comment --------- ------- PUTER Workgroup Master --------- ------- HOMENET PUTER
Windows コンピュータの遠隔操作
Samba には Windows と対話するためのツールが含まれています。リモートデスクトップで Windows コンピュータにアクセスできない場合に便利です。以下に例を示します。
コメントとシャットダウンコマンドを送信:
$ net rpc shutdown -C "comment" -I IPADDRESS -U USERNAME%PASSWORD
-C
とコメントを -f
に変えることで強制的にシャットダウンさせることができます。再起動させるには、-C
や -f
の後に -r
を追加します。
サービスを停止・起動:
$ net rpc service stop SERVICENAME -I IPADDRESS -U USERNAME%PASSWORD
利用可能な net rpc コマンドを全て確認するには:
$ net rpc
トラブルシューティング
Samba SMB/CIFS サーバーが起動できない
/var/cache/samba/
のパーミッションが正しく設定されているか確認して smbd.service
や smbd.socket
を再起動してください:
# chmod 0755 /var/cache/samba/msg
ゲストパーミッションで Samba 共有を作成しても Windows クライアントがパスワードを要求する
/etc/samba/smb.conf
の global
セクションに map to guest
を設定してください:
map to guest = Bad User
Windows 7 の接続の問題 - mount error(12): cannot allocate memory
Windows 7 には既知のバグが存在し、Linux では全く問題ない cifs 共有であっても "mount error(12): cannot allocate memory" が発生します。以下のように Windows のレジストリキーを設定することで修正できます:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\LargeSystemCache
(set to1
)HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\Size
(set to3
)
もしくは、管理者モードでコマンドプロンプトを起動して以下を実行してください:
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v "LargeSystemCache" /t REG_DWORD /d 1 /f reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v "Size" /t REG_DWORD /d 3 /f
設定を適用するには以下のどれかを実行する必要があります:
- Windows の再起動
- services.msc でサーバーサービスを再起動
- コマンドプロンプトから次を実行: 'net stop lanmanserver' と 'net start lanmanserver'。サーバーは停止後に自動的に再起動します。
オリジナルの記事 。
Windows からパスワードで保護された共有にアクセスするときに問題が発生する
パスワードで保護された共有に Windows からアクセスしようとすると問題が発生する場合、以下を /etc/samba/smb.conf
に追加してみてください [1]:
[global] # lanman fix client lanman auth = yes client ntlmv2 auth = no
ダイアログボックスの表示に長い時間がかかる
Windows XP/Windows 7 から接続しようとするとパスワードのダイアログボックスが表示されるのに30秒程度かかることがあります。サーバーの error.log
を解析すると以下が確認できます:
[2009/11/11 06:20:12, 0] printing/print_cups.c:cups_connect(103) Unable to connect to CUPS server localhost:631 - Interrupted system call
以下のように設定することで /etc/printcap
が見つからないことについてエラーを発生させないようにすることができます:
printing = bsd printcap name = /dev/null
Error: Failed to retrieve printer list: NT_STATUS_UNSUCCESSFUL
ホームユーザーで Samba をサーバーや NAS とのファイル共有のためだけに使っている場合、Samba によるプリンターの共有は必要ないと思うかもしれません。そのような場合、以下の行を /etc/samba/smb.conf
に追加することでエラーが発生しないようにできます:
load printers = No printing = bsd printcap name = /dev/null disable spoolss = Yes
Samba サービス smbd.service
を再起動してログを確認してください:
cat /var/log/samba/smbd.log
エラーが表示されなくなったはずです。
Sharing a folder fails
It means that while you are sharing a folder from Dolphin (file manager) and everything seems ok at first, after restarting Dolphin the share icon is gone from the shared folder, and also some output like this in terminal (Konsole) output:
‘net usershare’ returned error 255: net usershare: usershares are currently disabled
To fix it, enable usershare as described in #Creating usershare path.
And you are using a firewall (iptables) because you do not trust your local (school, university, hotel) local network. This may be due to the following: When the smbclient is browsing the local network it sends out a broadcast request on udp port 137. The servers on the network then reply to your client but as the source address of this reply is different from the destination address iptables saw when sending the request for the listing out, iptables will not recognize the reply as being "ESTABLISHED" or "RELATED", and hence the packet is dropped. A possible solution is to add:
iptables -t raw -A OUTPUT -p udp -m udp --dport 137 -j CT --helper netbios-ns
to your iptables setup.
You are not the owner of the folder
システムを再起動してみてください。
protocol negotiation failed: NT_STATUS_INVALID_NETWORK_RESPONSE
おそらくクライアントが共有にアクセスする権限がありません。クライアントの IP アドレスが /etc/samba/smb.conf
の hosts allow =
行に記述されているか確認してください。
Connection to SERVER failed: (Error NT_STATUS_UNSUCCESSFUL)
おそらく smbclient
に間違ったサーバー名を指定しています。サーバー名を確認するには、サーバーで hostnamectl
を実行して "Transient hostname" の行を見て下さい。
Connection to SERVER failed: (Error NT_STATUS_CONNECTION_REFUSED)
サーバーが起動していることを確認してください。共有ディレクトリが存在していること、アクセスできることを確認してください。