Samba

提供: ArchWiki
ナビゲーションに移動 検索に移動
この記事あるいはセクションは翻訳の途中です。
ノート: 翻訳が古くなっています。 (議論: トーク:Samba#)

関連記事

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

目次

サーバーの設定

Samba を使ってファイルを共有するには、samba パッケージをインストールしてください。

smb.conf

Samba サーバーの設定は /etc/samba/smb.conf で行います。ファイルが存在しないと smbd は起動に失敗します。

こちら にあるデフォルトの Samba 設定ファイルを /etc/samba/smb.conf にコピーしてください:

# wget "https://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/smb.conf.default;hb=HEAD" -O /etc/samba/smb.conf
ヒント: デフォルト設定ではログファイルが書き込みできない場所に設定されているため、エラーが発生します。次のように変更すると良いでしょう: log file = /var/log/samba/%m.log

利用可能なオプションは smb.conf(5) の man ページを参照してください。また、testparm(1) コマンドを実行することで samba 設定ファイルが正しいかどうか確認できます。

共有を作成する

/etc/samba/smb.conf を編集して、Share Definitions セクションまでスクロールしてください。デフォルトの設定では、それぞれのユーザーのホームディレクトリに共有を自動で作成します。ただし、users ワイルドカードを追加しないとユーザーはログインすることができません:

/etc/samba/smb.conf
...
[homes]
   comment = Home Directories
   browseable = no
   writable = yes
   valid users = %S

smb.confworkgroup は使用する Windows のワークグループと同じ値に設定してください (デフォルト: WORKGROUP)。

サービスを起動する

ノート: samba 4.8.0-1 からユニットの名前が smbd.service, nmbd.service, winbindd.service から smb.service, nmb.service, winbind.service に変更になっています。

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

ユーザー定義共有を作成する

ノート: これはオプション機能です。必要なければこのセクションをスキップしてください。

"Usershares" は root 以外のユーザーで共有の定義を追加、変更、および削除できるようにする機能です。

次のコマンドは /var/lib/samba に usershares ディレクトリを作成します:

# mkdir -p /var/lib/samba/usershares

次のコマンドは sambashare グループを作成します:

# groupadd -r sambashare

次のコマンドは root に作成したディレクトリの所有者とグループを変更します:

# chown root:sambashare /var/lib/samba/usershares

次のコマンドは usershares ディレクトリのパーミッションを変更して sambashare グループのユーザーがファイルを読み書き・実行できるようにします:

# chmod 1770 /var/lib/samba/usershares

smb.conf 設定ファイルに以下の変数を設定します:

/etc/samba/smb.conf
...
[global]
  usershare path = /var/lib/samba/usershares
  usershare max shares = 100
  usershare allow guests = yes
  usershare owner only = yes
  ...

sambashare グループにあなたのユーザーを追加してください、your_username はあなたの linux ユーザーの名前に置き換えてください:

# gpasswd sambashare -a your_username

smb.servicenmb.service サービスを再起動します。

一度ログアウトして再ログインしてください。これで GUI を使って samba 共有を設定することができます。例えば、Thunar でディレクトリを右クリックしてネットワーク上に共有することが可能です。エラー You are not the owner of the folder が表示されるときは、システムを再起動してみてください。

ノート: Thunar で上記の操作をするためには、thunar-shares-pluginAUR パッケージをインストールする必要があります。また、他のユーザーにも共有する場合は、上記設定を usershare owner only = no に変更し、共有するディレクトリにはアクセス権限を付与してください。

ユーザーを追加する

Samba は Linux ユーザーアカウントを必要とします。既存のユーザーアカウントを使用することもできますし、新しくユーザーを作成することもできます。

ユーザー名は Linux 環境と共有しますが、パスワードは Linux のユーザーアカウントと Samba で異なります。samba_user は Samba ユーザーアカウントに置き換えてください:

# pdbedit -a -u samba_user

サーバーロール によっては、Samba ユーザーアカウントの既存のファイルのパーミッションと属性を変更する必要があります。

新規ユーザーだけが Samba のファイルサーバー共有にリモートからアクセスできるようにしたい場合、他のログインオプションを制限します:

  • シェルを無効化 - usermod --shell /usr/bin/nologin --lock username
  • SSH ログインを無効化 - /etc/ssh/sshd_conf を編集して AllowUsers オプションを変更。

システムの堅牢化についてはセキュリティを見てください。

ユーザーを一覧する

Samba のユーザーは pdbedit(8) コマンドで確認できます:

# pdbedit -L -v

samba ユーザーのパスワードを変更する

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

ユーザーのパスワードを変更するには、smbpasswd を使って下さい:

# smbpasswd samba_user

必要なポート

ファイアウォールを使う場合は、必要なポートを開くことを忘れないでください (通常は、137-139 + 445)。必要なポートのリストは次を参照: Samba port usage

サンプル設定

設定オプションの詳しい説明は smb.conf(5) を見て下さい。オンライン版は こちら になります。

/etc/samba/smb.conf
[global]
  deadtime = 60 ; This is useful to stop a server's resources being exhausted by a large number of inactive connections
  disable netbios = yes ; Disable netbios announcing
  dns proxy = no ; nmbd spawns a second copy of itself to do the DNS name lookup requests on 'yes'
  hosts allow = 192.168.1. 127. 10. ; This parameter is a comma, space, or tab delimited set of hosts which are permitted to access a service
  invalid users = root ; This is a list of users that should not be allowed to login to this service
  security = user ; Use as standalone file server
  map to guest = Bad User ; Means user logins with an invalid password are rejected, or allow guest login and mapped into the guest account
  max connections = 100 ; Number of simultaneous connections to a service to be limited
  workgroup = WORKGROUP ; Workgroup the server will appear to be in when queried by clients

  ; Uncomment the following lines to disable printer support
  ;load printers = no
  ;printing = bsd
  ;printcap name = /dev/null
  ;disable spoolss = yes

  ; Default permissions for all shares  
  inherit owner = yes ; Take the ownership of the parent directory when creating files/folders
  create mask = 0664 ; Create file mask
  directory mask = 0775 ; Create director mask
  force create mode = 0664 ; Force create file mask
  force directory mode = 0775 ; Force create directory mask

; Private Share
[private] ; translate into: \\server\private
  comment = My Private Share ; Seen next to a share when a client queries the server
  path = /path/to/data ; Directory to which the user of the service is to be given access
  read only = no ; An inverted synonym to writeable.
  valid users = user1 user2 @group1 @group2; restrict a service to a particular set of users and/or groups

; Public Share
;[public]
; comment = My Public Share
; path = /path/to/public
; read only = yes
; guest ok = yes; No password required to connect to the service

設定の変更を適用するために smbnmb サービスを再起動してください。

高度な設定

スループットを向上させる

警告: この設定によりデータの破損や接続の問題が発生する場合があり、TCP/IP スタックが機能不全を起こす可能性があることに注意してください。

ほとんどのユーザにとってデフォルトの設定で十分なはずです。しかし、'ソケットオプション'を正しく設定することでパフォーマンスが向上する可能性がありますが、設定を間違うと同じくらいパフォーマンスが低下してしまう可能性があります。大きな変更を加える前に効果をテストしてください。

以下のオプションを適用する前に smb.conf(5) man ページを読んでください。

以下の設定は /etc/samba/smb.conf[global] セクションに追加する必要があります。

deadtime を設定することで、大量の非アクティブな接続によってサーバのリソースが浪費されることを防ぐことができます:

deadtime = 30

sendfile を使うことで、システムの CPU をより効率的に使用することができ、Samba をより高速化できます:

use sendfile = yes

min receivefile size を設定することで、ネットワークソケットのバッファからファイルシステムのバッファキャッシュへのゼロコピーの直接書き込みが可能になります。パフォーマンスが向上する場合がありますが、ユーザによるテストが推奨されます:

min receivefile size = 16384

受信側と送信側のバッファサイズを増やし、ソケット最適化フラグを使用することで、スループットが向上するかもしれません。フラグは一部のネットワークで問題を引き起こす場合があるので、それぞれのフラグをテストすることが推奨されます:

socket options = IPTOS_LOWDELAY TCP_NODELAY IPTOS_THROUGHPUT SO_RCVBUF=131072 SO_SNDBUF=131072
ノート: 一部のオプションは機能させるためにネットワークインターフェイスの調整が必要です。Sysctl#ネットワーク を参照してください。

クライアントの設定

FTP ライクなコマンドラインインターフェイスを使うには smbclient をインストールします。よく使うコマンドは smbclient(1) を見てください。

公開されている共有の確認などをする必要がない場合、/usr/bin/mount.cifs が含まれている cifs-utils だけをインストールしてください。

デスクトップ環境によっては、GUI で設定することができます。ファイルマネージャを使用する方法はファイルマネージャの設定を見てください。

ノート:
  • smbclient/etc/samba/smb.conf ファイルを必要とします。touch で空のファイルを作成するか、あるいはデフォルトの smb.conf からコピーしてください。
  • cifs-utilssmbclient をインストールしたら、cifs カーネルモジュールをロードするか再起動が必要です。

公開されている共有の確認

以下のコマンドでパブリックな共有を確認できます:

$ smbclient -L hostname -U%

もしくは、smbtree を実行して共有のツリー図を表示します。コンピュータが多数接続されているネットワークでは推奨しませんが、共有名が正しいかどうか確認するのに役立ちます:

$ smbtree -N

-N (-no-pass) はパスワードを要求しないオプションです。

NetBIOS/WINS ホストネーム

ホストネームを解決するには winbind起動有効化する必要があります。

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

手動マウント

共有のマウントポイントを作成:

# mkdir /mnt/mountpoint

mount.cifs タイプを使って共有をマウントします。下で示しているオプションが全て必要・推奨というわけではありません:

# mount -t cifs //SERVER/sharename /mnt/mountpoint -o username=username,password=password,uid=username,gid=group,workgroup=workgroup,ip=serverip,iocharset=utf8

マウントポイントがユーザーの制御下にあるディレクトリ (例: ユーザーのホームディレクトリ) の場合、users マウントオプションを追加することでユーザーにマウントを許可できます。

ノート: オプションは users です (複数形)。他のファイルシステムでは通常 user オプションを使用します。
警告: uidgid マウントオプションを使用して I/O エラーが発生する場合、ファイルのパーミッションと属性を設定・確認することを推奨します。

SERVER

サーバーの名前。

sharename

共有ディレクトリ。

mountpoint

共有をマウントするローカルのディレクトリ。

-o [options]

詳しくは mount.cifs(8) を見て下さい。
ノート:
  • 最後に / を使うのは止めて下さい。//SERVER/sharename/ は動作しません。
  • マウントが不安定で、途切れたりフリーズする場合、vers= オプションを使って他の SMB プロトコルバージョンを有効にしてみてください。例えば、Windows Vista のマウントには vers=2.0 を使ってみて下さい。
  • シャットダウン時に cifs でマウントしたネットワーク共有のタイムアウトが発生する場合、WPA supplicant#ネットワーク共有 (cifs) をマウントしたときにシャットダウン時に起こる問題を参照。

共有パスワードの保存

誰でも読み取れるファイルにパスワードを保存することは推奨しません。credentials ファイルを作成するのが安全です:

/path/to/credentials/share
username=myuser
password=mypass

マウントコマンドの username=myuser,password=mypasscredentials=/path/to/credentials/share に置き換えてください。

credential ファイルは root からしか読込・書込できないように設定するべきです:

# chmod 600 /path/to/credentials/share

自動マウント

ノート: 起動時に正しくマウントするには systemd-networkd-wait-online.service (systemd-networkd を使用している場合) や NetworkManager-wait-online.service (NetworkManager を使用している場合) を有効化する必要があります。

マウントエントリ

以下は認証が必要な cifs マウントエントリの例です:

/etc/fstab
//SERVER/sharename /mnt/mountpoint cifs username=myuser,password=mypass 0 0
ノート: 共有名に含まれている空白は \040 に置き換えてください (8進数の ASCII コード)。例えば、コマンドラインで //SERVER/share name だったら /etc/fstab では //SERVER/share\040name となります。

サービスの起動を高速化するために、x-systemd.automount オプションをエントリに追加してください:

/etc/fstab
//SERVER/SHARENAME /mnt/mountpoint cifs credentials=/path/to/smbcredentials/share,x-systemd.automount 0 0

systemd ユニット

/etc/systemd/system に新しい .mount ファイルを作成してください。例: mnt-myshare.mount

ノート: ファイル名はマウントポイントにあわせてください。例えば共有フォルダを /mnt/myshare にマウントする場合はユニット名は mnt-myshare.mount となります。違うユニット名だと systemd[1]: mnt-myshare.mount: Where= setting does not match unit name. Refusing. というエラーが発生します。
  • Requires= は使用しているネットワーク設定に置き換えてください。
  • What= は共有パスに置き換えてください。
  • Where= は共有をマウントするパスに置き換えてください。
  • Options= は共有のマウントオプションです。
/etc/systemd/system/mnt-myshare.mount
[Unit]
Description=Mount Share at boot
Requires=systemd-networkd.service
After=network-online.target
Wants=network-online.target

[Mount]
What=//server/share
Where=/mnt/myshare
Options=credentials=/etc/samba/creds/myshare,iocharset=utf8,rw,x-systemd.automount
Type=cifs
TimeoutSec=30

[Install]
WantedBy=multi-user.target

mnt-myshare.mount を使用するにはユニットを起動します。有効化すると起動時に共有がマウントされます。

ノート: (IP アドレスの代わりに) サーバーのホストネームを使って共有したい場合、systemd-resolved.serviceAfterWants に追加してください。起動時にマウントエラーが発生しなくなります。

smbnetfs

ノート: smbnetfs は Samba のサーバー設定を必要とします。設定方法は上を見てください。

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

$ smbtree -U remote_user

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

domain master = auto

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

全てが問題なく動作するようになったら、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 に書いてあります。

DolphinNautilus ファイルマネージャを使用する場合、以下を ~/.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/ になります。

autofs

Linux におけるカーネルベースの自動マウントの情報は Autofs を見て下さい。

ファイルマネージャの設定

GNOME Files, Nemo, Caja, Thunar, PCManFM

GNOME Files, Nemo, Caja, 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 のパッケージビルドシステムを使ってパッケージを作れます。インストールするのに特定の環境を必要としないために簡単に持ち運ぶことができます。

  • pyneighborhoodAUR は公式リポジトリから利用できます。
  • Xffm の LinNeighborhood, RUmba, xffm-samba プラグインは公式リポジトリにも AUR にもありません。公式にはサポートされていない(もしくは非公式サポートすらない)ため、動作がおかしかったり全く動かなかったりします。

ヒントとテクニック

セキュリティを高めるために SMB1 プロトコルを無効化

SMB1 プロトコルのセキュリティは問題があるため、大抵のクライアントは SMB2 以上をサポートしています。SMB1 プロトコルによるサーバーへの接続を拒否することでセキュリティを向上できます:

/etc/samba/smb.conf
[global]
server min protocol = SMB2

パフォーマンスを改善する

/etc/samba/smb.conf
[global]
        server multi channel support = yes
        socket options = IPTOS_THROUGHPUT SO_KEEPALIVE
        deadtime = 30
        use sendfile = Yes
        write cache size = 262144
        min receivefile size = 16384
        aio read size = 16384
        aio write size = 16384
        nt pipe support = no
警告: nt pipe support = no を設定すると Windows の機能が破壊されることがあるので注意してください。

プリンター共有を無効化

プリンターを共有したくない場合、以下の設定を使ってください:

/etc/samba/smb.conf
[global]
        load printers = no

使用する Samba のバージョンによっては、printcap name = /dev/nulldisable spools = yes オプションによってさらにリソースを節約できます。

Samba 共有で特定のファイル拡張子をブロック

ノート: このパラメータを設定すると、全てのファイルとディスプレイをスキャンしてチェックしなくてはならなくなるため、Samba のパフォーマンスに影響が出ます。

Samba にはファイルの拡張子など、特定のパターンを使ってファイルをブロックするオプションが存在します。このオプションを使うことでウイルスが繁殖するのを防いだり、特定のファイルで容量が食われるのを防ぐことができます。オプションの詳細は smb.conf(5) を見て下さい。

/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 パッケージをインストール。

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(1) を使って 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

ユーザー名やパスワードが不要なファイル共有

/etc/samba/smb.conf を編集して以下の行を追加してください:

map to guest = Bad User

上記の行は以下の行の後ろに追加します:

security = user

共有データを特定のインターフェイスに制限するため以下の行を:

;   interfaces = 192.168.12.2/24 192.168.13.2/2

以下のように置き換えてください:

interfaces = lo eth0
bind interfaces only = true

任意で共有にアクセスするアカウントを編集します。以下の行を編集してください:

;   guest account = nobody

例:

   guest account = pcguest

それから以下のようにユーザーを作成します:

# useradd -c "Guest User" -d /dev/null -s /bin/false pcguest

pcguest ユーザーのパスワードは "" (空) に設定してください。

最後に共有ディレクトリを作成 (書き込みを許可したい場合は writable = yes としてください):

[Public Share]
path = /path/to/public/share
available = yes
browsable = yes
public = yes
writable = no
ノート: ゲストが /path, /path/to, /path/to/public にアクセスできることを確認してください [1]

CUPS を無効にして Samba をビルド

Samba Wiki より:

Samba には CUPS のサポートが組み込まれています。コンパイル時に CUPS のヘッダーファイルやライブラリが存在した場合、自動的に CUPS が有効になります。

CUPS を無効化するには PKGBUILD を修正する必要があります。dependsmakedepends から libcups を消して cups や印刷に関する行を無くしてください。4.1.9-1 の PKGBUILD の場合、169・170・236行目が該当します:

mkdir -p ${pkgdir}/usr/lib/cups/backend
ln -sf /usr/bin/smbspool ${pkgdir}/usr/lib/cups/backend/smb
install -d -m1777 ${pkgdir}/var/spool/samba

トラブルシューティング

Samba SMB/CIFS サーバーが起動できない

/var/cache/samba/ のパーミッションが正しく設定されているか確認して smb.service を再起動してください:

# chmod 0755 /var/cache/samba/msg

AppArmor におけるパーミッションの問題

共有パスをホームディレクトリ以外に設定した場合、/etc/apparmor.d/local/usr.sbin.smbd でホワイトリストに指定してください。例:

/etc/apparmor.d/local/usr.sbin.smbd
/data/** lrwk,

ファイルを上書きできない、パーミッションエラー

以下の方法を試してみてください:

  • /etc/fstabエントリnodfs マウントオプションを追加。
  • サーバーの /etc/samba/smb.conf[global] セクションに msdfs root = no を追加。

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

オリジナルの記事

Windows 10 1709 以上で接続に問題が発生する - "Windows cannot access" 0x80004005

Windows 10 バージョン 1709 を使っている一部のマシンで発生するエラーです。このエラーは SMB1 が無効になっていることとは関係がなく、Microsoft によってセキュアでないゲストログインが一部で無効化されたことが原因です。

解決するには、グループポリシーエディタ (gpedit.msc) を開いて Computer configuration\administrative templates\network\Lanman Workstation > Enable insecure guest logons を有効にしてください。もしくは、レジストリの以下の値を変更してください:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters]
"AllowInsecureGuestAuth"=dword:1

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 サービス smb.service再起動してログを確認してください:

# cat /var/log/samba/smbd.log

エラーが表示されなくなったはずです。

フォルダの共有ができなくなる

Dolphin (ファイルマネージャ) でフォルダを共有したときに、最初は問題なく共有できたのに、Dolphin を再起動すると共有フォルダの共有アイコンが消えてしまい、ターミナル (Konsole) に以下のような出力がされることがあります:

‘net usershare’ returned error 255: net usershare: usershares are currently disabled

この問題を修正するには、#ユーザー定義共有を作成するに書かれているように usershare を有効にしてください。

"Failed to retrieve share list from server" というエラーでネットワークを閲覧できない

(学校や大学、ホテルなどの) ローカルネットワークが信頼できないためにファイアウォール (iptables) を使っている場合、次のような理由が考えられます: smbclient がローカルネットワークを閲覧するとき udp ポート 137 でブロードキャストリクエストが送信されます。ネットワーク上のサーバーはクライアントに返答しますが、返答の送信元アドレスが送信先アドレスと食い違うため、iptables は返答を "ESTABLISHED" や "RELATED" と認識できず、パケットをドロップします。iptables の設定に以下を追加することで解決できます:

iptables -t raw -A OUTPUT -p udp -m udp --dport 137 -j CT --helper netbios-ns

ネットワークを閲覧すると空のフォルダが表示される

Samba を正しく設定しても、gvfs ベースのファイルマネージャ (Nautilus, PCManFM など) を使用して Windows 共有のネットワークを見ても空のフォルダしか表示されません。Samba 4.7 でデフォルトプロトコルが変更されたためにファイルブラウザで問題が発生するようになっています。一時的な解決策として smb.conf 設定ファイルに以下のパラメータを追加してください:

/etc/samba/smb.conf
...
[global]
  client max protocol = NT1
  ...

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)

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

Protocol negotiation failed: NT_STATUS_CONNECTION_RESET

おそらく SMB1 プロトコルが使えないようにサーバーが設定されています。/etc/samba/smb.confclient max protocol = SMB2 オプションを追加してください。もしくは smbclient に引数として -m SMB2 を指定してください。

正しいはずなのにパスワードエラーが発生する (error 1326)

Samba 4.5 ではデフォルトで NTLMv1 認証が無効になっています。クライアントに最新のバージョンをインストールしてサポートされていないクライアントのアクセスは拒否することが推奨されています。

それでも NTLMv2 をサポートしていない古いクライアント (例: Windows XP) を使う必要がある場合、NTLMv1 を有効化することができます (セキュリティの観点から非推奨の設定です):

/etc/samba/smb.conf
[global]
   lanman auth = yes
   ntlm auth = yes

NTLMv1 を有効にしたことで NTLMv2 クライアントが認証できなくなった場合、クライアントに以下のファイルを作成してください:

/home/user/.smb/smb.conf
[global]
   sec = ntlmv2
   client ntlmv2 auth = yes

上記の設定は mount.cifs でマウントされた samba の共有にも影響します。Samba 4.5 にアップグレードしてマウントできなくなった場合、mount コマンドに sec=ntlmssp オプションを追加してください。例:

# mount.cifs //server/share /mnt/point -o sec=ntlmssp,...

詳しくは mount.cifs(8) を見てください。3.8 未満のカーネルでは sec=ntlm がデフォルトでしたが、3.8 から sec=ntlmssp に変更されています。

Windows の予約文字のマッピング

カーネル 3.18 から cifs モジュールはデフォルトで "mapposix" オプションを使用します [2]。unix 拡張を使って Samba のデフォルト設定で共有をマウントした場合、Windows の7個の予約文字 : \ * < > ? | が含まれているファイルやディレクトリにアクセスできなくなります。以下の方法で解決することができます:

  • cifs の nomapposix マウントオプションを使用する:
# mount.cifs //server/share /mnt/point -o nomapposix
  • fruit を使って mapposix ("SFM", Services for Mac) 文字を適切な文字にマッピングするように Samba を設定:
/etc/samba/smb.conf
[global]
   vfs objects = catia fruit
   fruit:encoding = native
  • catia を使って禁則文字を手動でマッピング:
/etc/samba/smb.conf
[global]
   vfs objects = catia
   catia:mappings = 0x22:0xf022, 0x2a:0xf02a, 0x2f:0xf02f, 0x3a:0xf03a, 0x3c:0xf03c, 0x3e:0xf03e, 0x3f:0xf03f, 0x5c:0xf05c, 0x7c:0xf07c, 0x20:0xf020

catia や fruit を使用する方法には出力不可文字でファイルがフィルタリングされるという欠点があります。

Mount error: Host is down

Synology NAS サーバーの共有フォルダをマウントしようとしたときに発生するエラーです。vers=1.0 マウントオプションを使うことで解決します。

参照