Samba

提供: ArchWiki
2015年12月11日 (金) 16:43時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎トラブルシューティング: 英語版に追記されている項目を追加)
ナビゲーションに移動 検索に移動

関連記事

SambaSMB/CIFS ネットワークプロトコルの再実装であり、NFS の代わりになるものとして Linux と Windows システム間でのファイルやプリンターの共有を容易にします。Samba の設定は簡単で操作もわかりやすいと言うユーザーもいますが、新規ユーザーの多くは複雑で直感的でないメカニズムが手を余らせることになります。そのようなユーザーは以下の指示をよく読んで下さい。

目次

サーバーの設定

Samba を使ってファイルを共有するには、公式リポジトリから sambaインストールしてください。

Samba サーバーの設定は /etc/samba/smb.conf で行います。デフォルトの Samba 設定ファイルを /etc/samba/smb.conf にコピーしてください:

# cp /etc/samba/smb.conf.default /etc/samba/smb.conf
ヒント: testparm を実行することで samba 設定ファイルが正しいかどうか確認できます。
警告: マシンに Localhost という名前を付けないで下さい、Windows では 127.0.0.1 として解決されていまいます。

共有を作成する

/etc/samba/smb.conf を編集して、Share Definitions セクションまでスクロールしてください。デフォルトの設定では、それぞれのユーザーのホームディレクトリに共有を自動で作成します。また、プリンターの共有もデフォルトで作成します。サンプル設定には多数のコメントが付属しています。オプションに関する詳細は man smb.conf で見ることができます。オンライン版は こちら になります。

Windows 側では、smb.conf を Windows ワークグループに変更してください (Windows デフォルト: WORKGROUP)。

サービスを起動する

SMB の基本的なファイル共有をするには、smbdnmbd サービスを起動してください。 詳しくは smbdnmbd のマニュアルページを見て下さい。

ヒント: Samba ソケットを有効にすると最初の接続時にデーモンが起動します:
# systemctl disable smbd.service
# systemctl enable smbd.socket

user share path を作成する

以下のコマンドはオブジェクトの名前を後でコマンドを実行する環境に自動で 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

smbdnmbd サービスを再起動します。

一度ログアウトして再ログインしてください。これで 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 ユーザーのパスワードを変更する

ノート: バージョン 3.4.0 から、smbpasswd はデフォルトで使用されなくなっています。既存の smbpasswd データベースは新しいフォーマットに変換することが可能です。

ユーザーのパスワードを変更するには、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 を見て下さい。
ノート:
  • 最後に / を使うのは止めて下さい。//SERVER/sharename/ は動作しません。
  • マウントが不安定で、途切れたりフリーズする場合、vers= オプションを使って他の SMB プロトコルバージョンを有効にしてみてください。例えば、Windows Vista のマウントには vers=2.0 を使ってみて下さい。

共有を /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 オプションを利用することができます。これはサービスの起動を数秒早くできます。また、uidgid オプションを使うことで、現在のユーザーとグループをマップして作業を少し楽にできます。

警告: uidgid オプションを使うとネットワークデバイスからデータを取得するプログラムで入出力エラーが起こる可能性があります。
/etc/fstab
//SERVER/SHARENAME /mnt/mountpoint cifs credentials=/path/to/smbcredentials,x-systemd.automount,uid=username,gid=usergroup 0 0
ノート: sharename の中の空白は \040 (八進数で空白の ASCII コード) に置き換える必要があります。例えば、/etc/fstab でコマンドラインの //SERVER/share name//SERVER/share\040name にしてください。

ユーザーマウント

/etc/fstab
//SERVER/SHARENAME /mnt/mountpoint cifs users,credentials=/path/to/smbcredentials,workgroup=workgroup,ip=serverip 0 0
ノート: The option is users (plural). For other filesystem types handled by mount, this option is usually user; sans the "s".

これでマウントポイントがユーザーの制御下にあるディレクトリ (つまり、ユーザーのホーム) にある限りユーザーがマウントできるようになります。ユーザーのホームにないマウントポイントで Samba 共有をマウント・アンマウントできるようにするには、smbnetfs を使うか、sudo で権限をあげてください。

WINS ホスト名

smbclient パッケージには WINS を使ってホスト名を解決するドライバーが入っています。有効にするには、/etc/nsswitch.conf の “hosts” 行に “wins” を追加してください。

自動マウント

簡単に共有リソースをブラウズする方法は複数存在します:

smbnetfs

ノート: smbnetfs needs an intact Samba server setup. See above on how to do that.

まず、マウントしたい共有が全て見れるかどうか確認してください:

$ smbtree -U remote_user

見れない場合、/etc/samba/smb.conf 内の次の行を見つけて修正してください:

domain master = auto

そして smbdnmbd サービスを再起動してください。

全てが問題なく動作するようになったら、公式リポジトリから 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

ノート: Because smbclient 3.2.X is malfunctioning with fusesmb, revert to using older versions if necessary. See the relevant forum topic for details.
  1. AUR から fusesmbAUR をインストールしてください。
  2. マウントポイントを作成: mkdir /mnt/fusesmb
  3. fuse カーネルモジュールをロード。
  4. 共有をマウント:
    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 のパフォーマンスに影響が出ます。

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 を使って nmapsmbclient をインストール:

# 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.servicesmbd.socket を再起動してください:

# chmod 0755 /var/cache/samba/msg

ゲストパーミッションで Samba 共有を作成しても Windows クライアントがパスワードを要求する

/etc/samba/smb.confglobal セクションに 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 to 1)
  • HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\Size (set to 3)

もしくは、管理者モードでコマンドプロンプトを起動して以下を実行してください:

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'。サーバーは停止後に自動的に再起動します。
ノート: Google で検索すると "IRPStackSize" のサイズを変更することを推奨するような記事が見つかりますが、これは Windows 7 の問題を修正するということについては間違っています。試さないで下さい。

オリジナルの記事

Windows からパスワードで保護された共有にアクセスするときに問題が発生する

ノート: 追加する必要があるのはローカルの smb.conf です。サーバーの smb.conf ではありません。

パスワードで保護された共有に 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.

"Browsing" network fails with "Failed to retrieve share list from server"

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.confhosts allow = 行に記述されているか確認してください。

Connection to SERVER failed: (Error NT_STATUS_UNSUCCESSFUL)

おそらく smbclient に間違ったサーバー名を指定しています。サーバー名を確認するには、サーバーで hostnamectl を実行して "Transient hostname" の行を見て下さい。

Connection to SERVER failed: (Error NT_STATUS_CONNECTION_REFUSED)

サーバーが起動していることを確認してください。共有ディレクトリが存在していること、アクセスできることを確認してください。

参照