跳转至内容

Samba

来自 ArchWiki

Samba 是 Linux 和 Unix 上标准的 Windows 互操作性程序套件。自 1992 年以来,Samba 为使用 SMB/CIFS 协议的所有客户端(如所有版本的 DOS 和 Windows、OS/2、Linux 以及许多其他)提供了安全、稳定且快速的文件和打印服务。

要通过 Samba 共享文件,请参阅 #服务器 部分;要访问其他机器上通过 Samba 共享的文件,请参阅 #客户端 部分。

服务器

安装

安装 samba 包。

Samba 在 /etc/samba/smb.conf 配置文件中进行配置,该文件在 smb.conf(5) 中有详尽的文档。

由于 samba 包不提供此文件,因此需要 启动 smb.service **之前** 创建它。

可以从 Samba git 仓库 中获取文档化的示例,如 smb.conf.default,用于设置 /etc/samba/smb.conf

本文或本章节已过时。

原因:请参阅 Talk:Samba#logging to systemd。(在 Talk:Samba 中讨论)
  • 默认配置将 log file 设置为不可写的位置,这会导致错误 - 请应用以下任一解决方案
    • 将日志文件位置更改为可写路径:log file = /var/log/samba/%m.log
    • 将日志记录更改为非文件后端解决方案:logging = syslog 配合 syslog only = yes,或使用 logging = systemd
  • 如果需要,[global] 部分中指定的 workgroup 必须与 Windows 工作组匹配(默认为 WORKGROUP)。
  • 示例配置文件将用户的主目录暴露给网络并允许写入。如果您认为这是安全风险,请考虑注释掉整个 [homes] 部分。有关详细信息,请参阅 smb.conf(5) § [homes] 部分
技巧 每次修改 smb.conf 文件时,请运行 testparm(1) 命令来检查语法错误。

启用和启动服务

要提供基本的 SMB 文件共享,请启用/启动 smb.service。有关详细信息,请参阅 smbd(8)

如果您想让您的服务器通过 NetBIOS 主机名访问,请在 smb.confnetbios name 选项中设置所需名称,并启用/启动 nmb.service。有关详细信息,请参阅 nmbd(8)

注意 nmb.service 不是必需的。但是,它对于通过主机名(例如 smb://hostname/)访问 Samba 服务器(对于某些主机)是必需的。如果您的网络仅由运行 Windows 10 或更高版本的计算机组成,请考虑另外安装一个 WSD 守护进程,以便您的服务器出现在“网络”视图中。

使服务器可发现

安装 avahi 包,然后启用/启动 avahi-daemon.service,以便 Samba 服务器可以通过 Zeroconf 被发现。这对大多数非 Windows 文件管理器(macOS Finder、Linux 和 BSD 上的各种 GUI 文件管理器等)都应该有效。

如果 avahi-daemon.service 未运行,服务器仍然可以访问,只是不可发现,即它不会出现在文件管理器中,但您仍然可以通过 IP 或域名直接连接到服务器。

而不是安装 avahi 包,systemd-resolved 提供了类似的 Zeroconf 功能。确保其 mDNS 支持已启用

/etc/systemd/resolved.conf
[Resolve]
# ...
MulticastDNS=yes

然后创建一个文件来定义网络服务。请参阅 systemd.dnssd(5)

/etc/systemd/dnssd/smb.dnssd
[Service]
Name=%H
Type=_smb._tcp
Port=445
TxtText=

作为 root 运行 systemctl reload systemd-resolved 来应用更改。

使用 systemd 实现可以解决 Avahi 中导致主机名不稳定的 bug(Avahi#主机名更改并附加递增数字)。

Windows Explorer 依赖于 WS-Discovery 协议;请参阅 #Windows 1709 及更高版本在网络视图中无法发现 Samba 服务器

配置防火墙

如果您正在使用 防火墙,请不要忘记打开所需的端口(通常是 137-139 + 445)。完整的列表请参阅 Samba 端口使用

UFW 规则

UFW 的 SMB/CIFS 应用配置文件默认包含在 UFW 的默认安装中,名为 ufw-fileserver

通过以 root 身份运行 ufw allow CIFS 来允许 Samba。

如果您删除了配置文件,请创建/编辑 /etc/ufw/applications.d/samba 并添加以下内容

[Samba]
title=LanManager-like file and printer server for Unix
description=The Samba software suite is a collection of programs that implements the SMB/CIFS protocol for unix systems, allowing you to serve files and printers to Windows, NT, OS/2 and DOS clients. This protocol is sometimes also referred to as the LanManager or NetBIOS protocol.
ports=137,138/udp|139,445/tcp

然后通过以 root 身份运行 ufw app update Samba 将配置文件加载到 UFW 中。

然后最后,通过以 root 身份运行 ufw allow Samba 来允许 Samba。

firewalld 服务

要配置 firewalld 以在 **home** 区域中允许 Samba,请运行

# firewall-cmd --permanent --add-service={samba,samba-client,samba-dc} --zone=home

列出的三个服务是

--permanent 确保在 firewalld.service 重启后更改仍然生效。

基本配置

用户管理

以下部分描述了创建 Samba 用户的本地(tdbsam)数据库。对于用户认证和其他目的,Samba 还可以绑定到 Active Directory 域,本身也可以作为 Active Directory 域控制器,或者与 LDAP 服务器一起使用。

添加用户

Samba 需要一个 Linux 用户账户 - 您可以使用现有用户账户或创建一个新账户

注意 用户/用户组 nobody 应该已存在于系统中,它用作默认的 guest account,并且可能用于包含 guest ok = yes 的共享,从而避免在该共享上需要用户登录。

尽管用户名与 Linux 系统共享,但 Samba 使用的密码与 Linux 用户账户的密码是分开的。将 samba_user 替换为您选择的 Samba 用户账户

# smbpasswd -a samba_user

根据服务器角色,可能需要更改 Samba 用户账户的现有文件权限和属性

如果您希望新用户只能通过 Samba 远程访问文件服务器共享,您可以限制其他登录选项:

  • 禁用 shell - usermod --shell /usr/bin/nologin --lock samba_user
  • 禁用 SSH 登录 - 编辑 /etc/ssh/sshd_config,更改 AllowUsers 选项

另请参阅 安全 以加强您的系统。

列出用户

可以使用 pdbedit(8) 命令列出 Samba 用户

# pdbedit -L -v
更改用户密码

要更改用户密码,请使用 smbpasswd

# smbpasswd samba_user

创建匿名共享

1. 创建一个 Linux 用户,匿名 Samba 用户将被映射到该用户。

# useradd guest -s /bin/nologin
注意 用户名可以是任何有效的 Linux 用户名,不仅仅是 "guest"。此用户不需要是 Samba 用户。

2. 在 /etc/samba/smb.conf 中添加以下内容

/etc/samba/smb.conf
...
[global]
security = user
map to guest = bad user
guest account = guest

[guest_share]
    comment = guest share
    path = /tmp/
    public = yes
    only guest = yes
    writable = yes
    printable = no

匿名用户现在将被映射到 Linux 用户 guest,并能够访问 guest_share.path 中定义的任何目录,该目录在上面的示例中配置为 /tmp/

注意 共享名称不必包含 "guest"。它可以是任何有效的 Samba 共享名称。

确保 Linux 用户 guestguest_share.path 中的文件具有适当的访问权限。

另外,请确保共享已根据 smb.conf.default 的“共享定义”部分进行了正确定义。

高级配置

警告 启用 follow symlinks 选项可能会带来安全风险。
/etc/samba/smb.conf
...
[global]
   follow symlinks = yes
   wide links = yes
   unix extensions = no

然后,重启 smb.service

注意 在使用 AppArmor 时,如果符号链接指向用户主目录或 用户共享目录之外的目录,则需要修改 AppArmor 配置文件权限

启用 macOS 客户端的服务器端复制

服务器端复制消除了在服务器上复制文件时在服务器和客户端之间传输数据的需求。默认情况下已启用此功能,但它不适用于 macOS 客户端。如果您有 macOS 客户端,则需要在 smb.conf 中添加以下配置,然后重启 smb.service

/etc/samba/smb.conf
...
[global]
   fruit:copyfile = yes

启用用户共享

注意 这是一个可选功能。如果您不需要,请跳过此部分。

用户共享是一项功能,它使用户(非 root 用户)能够添加、修改和删除自己的共享定义。请参阅 smb.conf(5) § 用户共享

  1. 创建用户共享目录
    # mkdir /var/lib/samba/usershares
  2. 创建用户组
    # groupadd -r sambashare
  3. 将目录的所有者更改为 root,将组更改为 sambASHare
    # chown root:sambashare /var/lib/samba/usershares
  4. 更改 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 替换为您的用户名

# gpasswd sambashare -a your_username

重启 smb.servicenmb.service 服务。

注销并重新登录。

如果您想共享主目录中的路径,则必须使其对 others 组可访问。

本文或本章节的准确性存在争议。

原因:这个要求正确吗?不清楚说的是哪个路径:是关于 smb.conf 中的 'usershare path' 选项还是实际共享的文件夹路径?(在 Talk:Samba#permissions 中讨论)

在 GUI 中,您可以使用 ThunarDolphin - 右键单击任何目录并将其共享到网络。

在 CLI 中,使用以下命令之一,替换斜体的 sharenameuser 等...

# net usershare add sharename abspath [comment] [user:{R|D|F}] [guest_ok={y|n}]
# net usershare delete sharename
# net usershare list wildcard-sharename
# net usershare info wildcard-sharename

设置和强制权限

权限可以应用于服务器和共享

/etc/samba/smb.conf
[global]
  ;inherit owner = unix only ; Inherit ownership of the parent directory for new files and directories
  ;inherit permissions = yes ; Inherit permissions of the parent directory for new files and directories
  create mask = 0664
  directory mask = 2755
  force create mode = 0644
  force directory mode = 2755
  ...

[media]
  comment = Media share accessible by greg and pcusers
  path = /path/to/media
  valid users = greg @pcusers
  force group = +pcusers
  public = no
  writable = yes
  create mask = 0664
  directory mask = 2775
  force create mode = 0664
  force directory mode = 2775

[public]
  comment = Public share where archie has write access
  path = /path/to/public
  public = yes
  read only = yes
  write list = archie
  printable = no

[guests]
  comment = Allow all users to read/write
  path = /path/to/guests
  public = yes
  only guest = yes
  writable = yes
  printable = no

请参阅 smb.conf(5) 以全面了解可能的权限标志和设置。

限制协议以提高安全性

警告 默认情况下,4.11 之前的 Samba 版本允许使用过时且不安全的 SMB1 协议进行连接。在使用这些 Samba 版本之一时,强烈建议设置 server min protocol = SMB2_02 以保护您免受勒索软件攻击。在 Samba 4.11 及更高版本中,SMB2 是默认的最低协议,因此无需进行更改。

server min protocolserver max protocol 追加/etc/samba/smb.conf 中,以强制使用最低和最高协议。

/etc/samba/smb.conf
[global]
  server min protocol = SMB2_10
  ; server max protocol = SMB3

有关支持的协议的概述,请参阅 smb.conf(5)。为了与旧版客户端和/或服务器兼容,您可能需要将 client min protocolserver min protocol 设置为较旧的协议,但请注意,这会使您容易受到攻击。

技巧 当客户端应仅使用最新的 SMB3 协议连接时(例如,在运行 Windows 10 及更高版本的客户端上),请使用 server min protocol = SMB3

使用 mount.cifs客户端可能需要指定正确的 vers=*,例如

# mount -t cifs //SERVER/sharename /mnt/mountpoint -o username=username,password=password,iocharset=utf8,vers=3.1.1

有关更多信息,请参阅 mount.cifs(8)

使用原生 SMB 传输加密

SMB 版本 3.0 或更高版本提供原生 SMB 传输加密。支持此类加密的客户端包括 Windows 8 及更高版本、Windows Server 2012 及更高版本,以及 Samba 4.1 及更高版本的 smbclient。

要默认使用原生 SMB 传输加密,请全局和/或按共享设置 server smb encrypt 参数。可能的值为 offenabled(默认值)、desiredrequired

/etc/samba/smb.conf
[global]
  server smb encrypt = desired

要配置客户端加密,请使用 client smb encrypt 选项。

有关更多信息,请参阅 smb.conf(5),特别是 SMB1 的影响SMB2 的影响 段落。

技巧挂载共享时,请指定 seal 挂载选项以强制使用加密。

禁用打印机共享

默认情况下,Samba 会共享使用 CUPS 配置的打印机。

如果您不希望共享打印机,请使用以下设置

/etc/samba/smb.conf
[global]
  load printers = no
  printing = bsd
  printcap name = /dev/null
  disable spoolss = yes
  show add printer wizard = no

阻止 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/

提高吞吐量

警告 注意这可能会导致损坏/连接问题,并可能使您的 TCP/IP 堆栈瘫痪。

默认设置对于大多数用户来说应该足够了。但是,正确设置 'socket options' 可以提高性能,但设置错误也会同样降低性能。在进行任何重大更改之前,请测试效果。

在应用以下任何选项之前,请阅读 smb.conf(5) 手册页。

以下设置应追加/etc/samba/smb.conf[global] 部分。

设置死锁时间有助于防止服务器资源因大量不活跃连接而耗尽。

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#Networking

启用旧版客户端/设备的访问

最新版本的 Samba 不再提供仍被某些旧版设备(IP 摄像头等)使用的旧身份验证方法和协议。这些设备通常需要 Samba 服务器允许 NTMLv1 身份验证和 NT1 版本的协议,也称为 CIFS。要使这些设备与最新的 Samba 配合使用,您需要在 [global] 部分添加这两个配置参数。

server min protocol = NT1
ntlm auth = yes

匿名/访客访问共享只需要第一个参数。如果旧设备将使用用户名和密码访问,您还需要添加第二行。

启用 Spotlight 搜索

Spotlight 允许支持的客户端(例如 MacOS Finder)快速搜索共享文件。

安装并启动/启用 OpenSearch。安装 fs2es-indexerAUR,在 /etc/fs2es-indexer/config.yml 中配置您要索引的目录,并启动/启用 fs2es-indexer.service 以进行定期索引。

按照 Samba wiki 中的说明编辑 smb.conf 以按共享启用 Spotlight,然后重启 smb.service 以应用更改。

客户端

安装 smbclient 以获得类似 ftp 的命令行界面。有关常用命令,请参阅 smbclient(1)

对于轻量级替代方案(不支持列出公共共享等),请安装 cifs-utils,它提供 /usr/bin/mount.cifs

根据桌面环境,可能提供 GUI 方法。有关在文件管理器中使用的方法,请参阅 #文件管理器配置

列出公共共享

以下命令列出服务器上的公共共享

$ smbclient -L hostname -U%

或者,运行 $ smbtree -N 将显示所有共享的树状图。它使用广播查询,因此不建议在计算机数量众多的网络上使用,但当您拥有正确的共享名时,它有助于诊断。-N-no-pass)选项会抑制密码提示。

注意 smbtree 使用 SMB1 和 NetBIOS,这意味着它们必须在服务器上启用,并且您需要在客户端的 smb.conf 中设置 client min protocol = NT1。否则,smbtree 将显示空输出。

NetBIOS/WINS 主机名

Samba 客户端默认自动处理 NetBIOS 主机名(行为由 smb.conf 中的 name resolve order 选项控制)。其他程序(包括 mount.cifs)通常使用 名称服务切换,该服务默认不处理 NetBIOS。

The smbclient 包提供了一个 libnss 驱动程序来解析 NetBIOS 主机名。要使用它,请与 samba 包(它提供了 winbindd 守护进程)一起安装启动/启用 winbind.service,并在 nsswitch.conf(5)hosts 行中添加 wins

/etc/nsswitch.conf
...
hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns wins
...
注意 由于 winbind.service 中当前存在一个错误,您可能需要按照此 bug 报告中描述的修改单元文件。

现在,在主机解析期间(例如,在使用 mount.cifs 或仅使用 ping netbios-name 时),winbindd 将通过使用 NetBIOS 名称服务(NBNS,也称为 WINS)协议发送查询来解析主机名。

默认情况下,它会向您的本地网络发送广播查询。如果您有 WINS 服务器,可以将 wins server = wins-server-ip 添加到 smb.conf 中,然后重启 winbind.service,之后 winbindd 和其他 Samba 客户端将向指定 IP 发送单播查询。

如果您想解析您的本地主机名(在 smb.confnetbios name 选项中指定),请启动/启用 nmb.service,它将处理传入的查询。

您可以使用 nmblookup 测试 WINS 解析。默认情况下,它会向您的本地网络发送广播查询,而忽略 wins server 选项。

请注意,WINS 解析需要来自端口 137 的入站流量。

禁用 NetBIOS/WINS 支持

当不使用 NetBIOS/WINS 主机名解析时,可能首选禁用此协议。

/etc/samba/smb.conf
[global]
  disable netbios = yes
  dns proxy = no

最后,禁用/停止 winbind.service

手动挂载

使用 mount.cifs 将共享挂载为 type。下面列出的所有选项并非必需或可取的。

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

uidgid 选项对应于本地(例如,客户端)用户/用户组,以便对给定路径具有读/写访问权限。

  • 如果使用的 uidgid 与服务器的用户不匹配,forceuidforcegid 选项可能有所帮助。但是请注意,在 forceuidforcegid 生效时分配给文件的权限可能无法反映实际(服务器)权限。有关更多信息,请参阅 mount.cifs(8) § 文件和目录所有权及权限 中的 文件和目录所有权及权限 部分。
  • 要挂载一个没有身份验证的 Windows 共享,请使用 "username=*"

本文或本章节的准确性存在争议。

原因: 尽管有建议,但没有实质性证据表明存在声称的 I/O 错误风险。该警告是在 2013 年“未经评论或引用”添加的,并在 2018 年被提出异议但未得到辩护。目前尚不清楚它是否属实。(在 Talk:Samba#Unfounded warning regarding I/O errors and manual mounting? 中讨论)
警告uid 和/或 gid 作为挂载选项使用可能会导致 I/O 错误,建议设置/检查正确的 文件权限和属性
  • SERVER — 服务器名称。
  • sharename — 共享目录。
  • mountpoint — 共享将被挂载的本地目录。
  • [-o options] — 有关更多信息,请参阅 mount.cifs(8)
  • 避免使用末尾的 ///SERVER/sharename/ 将不起作用。
  • 如果您的挂载不稳定、卡顿或冻结,请尝试使用 vers= 选项启用不同的 SMB 协议版本。例如,对于 Windows Vista 挂载,请使用 vers=2.0
  • 如果在关机时挂载的网络共享出现超时,请参阅 wpa_supplicant#与挂载的网络共享 (cifs) 和关机的问题

存储共享密码

不建议将密码存储在可被任何人读取的文件中。更安全的方法是使用凭据文件,例如在 /etc/samba/credentials 中。

/etc/samba/credentials/share
username=myuser
password=mypass

对于挂载命令,请将 username=myuser,password=mypass 替换为 credentials=/etc/samba/credentials/share

凭据文件应仅对 root 可读/写。

# chown root:root /etc/samba/credentials
# chmod 700 /etc/samba/credentials
# chmod 600 /etc/samba/credentials/share

自动挂载

注意 您可能需要启用 systemd-networkd-wait-online.serviceNetworkManager-wait-online.service(取决于您的设置)才能在启动时正确启用。

使用 NetworkManager 和 GIO/gvfs

NetworkManager 可以配置为在网络状态更改时运行一个脚本。此脚本使用 gio 命令,以便像您的文件管理器一样自动挂载 Samba 共享,如下文下方所述。该脚本还通过监听 pre-downvpn-pre-down 事件,在相关网络连接被禁用之前安全地卸载 Samba 共享。创建脚本后,请将其设为可执行

/etc/NetworkManager/dispatcher.d/30-samba.sh
#!/bin/sh

# Find the connection UUID with "nmcli con show" in terminal.
# All NetworkManager connection types are supported: wireless, VPN, wired...
WANTED_CON_UUID="CHANGE-ME-NOW-9c7eff15-010a-4b1c-a786-9b4efa218ba9"

# The user the share will be mounted under
USER="yourusername"
# The path that appears in your file manager when you manually mount the share you want
SMB_URL="smb://servername/share"

# Get runtime user directory. If it does not exist, do nothing and just exit
XDG_RUNTIME_DIR=$(loginctl show-user --property=RuntimePath --value "$USER") || exit 0

if [ "$CONNECTION_UUID" = "$WANTED_CON_UUID" ]; then
    
    # Script parameter $1: network interface name, not used
    # Script parameter $2: dispatched event
    
    case "$2" in
        "up"|"vpn-up")
            su $USER -c "DBUS_SESSION_BUS_ADDRESS=unix:path=$XDG_RUNTIME_DIR/bus gio mount $SMB_URL"
            ;;
        "pre-down"|"vpn-pre-down")
            su $USER -c "DBUS_SESSION_BUS_ADDRESS=unix:path=$XDG_RUNTIME_DIR/bus gio mount -uf $SMB_URL"
            ;;
    esac
fi

/etc/NetworkManager/dispatcher.d/pre-down 中创建一个符号链接以捕获 pre-down 事件。

# ln -s /etc/NetworkManager/dispatcher.d/30-samba.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30-samba.sh
注意 由于此脚本使用用户总线,因此只有在用户具有活动会话时才有效。这意味着,如果连接在您登录之前建立,则在启动后共享不会自动挂载。

作为挂载条目

这是一个简单的 cifs 挂载条目示例,它需要身份验证。

/etc/fstab
//SERVER/sharename /mnt/mountpoint cifs _netdev,nofail,username=myuser,password=mypass 0 0
  • 有关身份验证凭据的更安全方法,请参阅下面的示例。
  • 共享名称中的空格应替换为 \040(空格的八进制 ASCII 代码)。例如,命令行中的 //SERVER/share name/etc/fstab 中应为 //SERVER/share\040name
  • 要允许用户挂载,只要挂载点位于用户可控制的目录中(即用户的家目录),请附加 users 挂载选项。该选项是 users(复数)。对于 mount 处理的其他文件系统类型,此选项通常是 user;不带“s”。
提示 如果您希望在访问时才挂载它们,请使用 x-systemd.automount。有关详细信息,请参阅 Fstab#远程文件系统

作为 systemd 单元

/etc/systemd/system 中创建一个新的 .mount 文件,例如 mnt-myshare.mount。有关详细信息,请参阅 systemd.mount(5)

注意 确保文件名与您要使用的挂载点匹配。例如,只有当您打算将共享挂载到 /mnt/myshare 下时,才能使用单元名称 mnt-myshare.mount。否则,可能会出现以下错误:systemd[1]: mnt-myshare.mount: Where= 设置与单元名称不匹配。拒绝。

What= 共享的路径。

Where= 共享的挂载路径。

Options= 共享挂载选项。

  • 网络挂载单元会自动获得对 remote-fs-pre.targetnetwork.targetnetwork-online.targetAfter 依赖关系,并获得对 remote-fs.targetBefore 依赖关系,除非设置了 nofail 挂载选项。对于后者,还会添加一个 Wants 单元。
  • noauto 附加Options,以防止在启动时自动挂载(除非被其他单元拉入)。
  • 如果您想使用您要共享的服务器的主机名(而不是 IP 地址),请将 nss-lookup.target 添加到 After。这可能会避免启动时出现挂载错误,而这些错误在测试单元时不会出现。
/etc/systemd/system/mnt-myshare.mount
[Unit]
Description=Mount Share at boot

[Mount]
What=//server/share
Where=/mnt/myshare
Options=_netdev,credentials=/etc/samba/credentials/myshare,iocharset=utf8,rw
Type=cifs
TimeoutSec=30

[Install]
WantedBy=multi-user.target
提示
  • 如果系统无法访问,请将 ForceUnmount=true 附加[Mount],允许(强制)卸载共享。
  • 如果您的共享具有只读访问权限的组,请将 uid=usernamegid=group 附加Options=,以指定允许写入共享的用户/组。

要使用 mnt-myshare.mount,请启动该单元并启用它以便在系统启动时运行。

automount

要自动挂载共享(在访问时,类似于 autofs),可以使用以下 automount 单元。

/etc/systemd/system/mnt-myshare.automount
[Unit]
Description=Automount myshare

[Automount]
Where=/mnt/myshare

[Install]
WantedBy=multi-user.target

禁用/停止 mnt-myshare.mount 单元,并启用/启动 mnt-myshare.automount,以便在访问挂载路径时自动挂载共享。

提示 附加 TimeoutIdleSec 以启用自动卸载。有关详细信息,请参阅 systemd.automount(5)

smbnetfs

注意 smbnetfs 需要一个完整的 Samba 服务器设置。请参阅上方有关如何执行此操作的内容。

首先,检查您是否可以看到所有您感兴趣的要挂载的共享。

$ smbtree -U remote_user

如果这不起作用,请在 /etc/samba/smb.conf 中找到并相应地修改以下行。

domain master = auto

现在重启 smb.servicenmb.service

如果一切正常,请安装 smbnetfs

然后,将以下行添加到 /etc/fuse.conf

user_allow_other

现在将 /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

如果您使用的是 DolphinGNOME Files,您可能希望将以下内容添加到 ~/.smb/smbnetfs.conf 中,以避免“磁盘已满”错误,因为 smbnetfs 默认会报告 0 字节的可用空间。

~/.smb/smbnetfs.conf
free_space_size 1073741824

完成配置后,您需要运行

$ chmod 600 ~/.smb/smbnetfs.*

否则,smbnetfs 会抱怨“不安全的配置文件权限”。

最后,要将您的 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 应用程序(如 Dolphin)内置了浏览 Samba 共享的功能。使用路径 smb://servername/share 来浏览文件。如果您想从非 KDE 应用程序访问文件,可以安装 kio-fuse

要使用 KDE 系统设置中的 GUI,您需要安装 kdenetwork-filesharing 包。

其他图形环境

有一些有用的程序,但它们可能需要创建包。这可以通过 Arch 包构建系统完成。这些其他程序的优点是它们不需要安装特定的环境来支持它们,因此它们带来的负担较少。

  • pyneighborhoodAUR
  • LinNeighborhood、RUmba、Xffm 的 Xffm-samba 插件在官方存储库或 AUR 中都不可用。由于它们没有得到官方(甚至非官方)支持,它们可能已过时,并且可能根本不起作用。

技巧与提示

发现网络共享

如果不知道本地网络上的其他系统,并且无法使用 smbnetfs 等自动化工具,您可以手动探测 Samba 共享。

首先,安装 nmapsmbclient 包。

使用 nmap 扫描您的本地网络,以查找 TCP 端口 445(SMB 协议使用的端口)打开的系统。请注意,您可能需要使用 -Pn 或设置自定义的 ping 扫描类型(例如 -PS445),因为 Windows 系统通常有防火墙。

$ nmap -p 445 "192.168.1.*"
Starting Nmap 7.92 ( https://nmap.org ) at 2022-03-13 12:00 UTC
Nmap scan report for 192.168.1.1
Host is up (0.0011s latency).

PORT    STATE  SERVICE
445/tcp open  microsoft-ds

Nmap scan report for 192.168.1.2
Host is up (0.00011s latency).

PORT    STATE SERVICE
445/tcp open  microsoft-ds

Nmap done: 256 IP addresses (2 hosts up) scanned in 2.45 seconds

第一个结果是另一个系统;第二个恰好是执行此扫描的客户端。

现在您可以直接连接到它们的 IP 地址,但如果您想使用 NetBIOS 主机名,可以使用 nmblookup(1) 来检查 NetBIOS 名称。请注意,如果服务器上禁用了 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>,它显示了具有开放服务的宿主。

使用 smbclient(1) 列出这些系统上共享的服务。如果可用,您可以使用 NetBIOS 主机名(此示例中为 PUTER)而不是 IP。如果提示输入密码,按 Enter 键仍然应该会显示列表。

$ smbclient -L \\192.168.1.1
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 来调用强制关机。要重启,只需添加 -r,后跟 -C 或 -f。

停止和启动服务

$ net rpc service stop SERVICENAME -I IPADDRESS -U USERNAME%PASSWORD

要查看所有可能的 net rpc 命令。

$ net rpc

故障排除

无法启动 Samba SMB/CIFS 服务器

可能的解决方案

  • 使用 testparm(1) 检查 smb.conf 是否存在语法错误。
  • 设置 /var/cache/samba/ 的正确权限,然后重启 smb.service
# chmod 0755 /var/cache/samba/msg

SELinux 上的权限问题

SELinux 默认不允许 Samba 访问用户主目录。要解决此问题,请运行

# setsebool -P samba_enable_home_dirs 1

类似地,samba_export_all_rosamba_export_all_rw 使 Samba 能够读取或“读写”所有文件。

AppArmor 上的权限问题

如果您使用位于主目录或用户共享目录之外的共享路径,请在 /etc/apparmor.d/local/usr.sbin.smbd 中将其列入白名单。例如:

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

编辑后,重新加载 AppArmor 配置文件。

# apparmor_parser -r /etc/apparmor.d/usr.sbin.smbd

挂载时未指定方言

客户端使用的 SMB/CIFS 版本不受服务器支持。

有关更多信息,请参阅 #为提高安全性限制协议

无法覆盖文件,权限错误

本文或本章节的准确性存在争议。

原因: 用户应设置/检查服务器/客户端权限,而不是使用不正确的/可能不安全的标志。(在 Talk:Samba 中讨论)

可能的解决方案

  • nodfs 挂载选项附加/etc/fstab 条目
  • msdfs root = no 添加到服务器的 /etc/samba/smb.conf[global] 部分。

即使 Samba 共享已创建为访客权限,Windows 客户端仍会要求输入密码

/etc/samba/smb.confglobal 部分设置 map to guest

map to guest = Bad Password

如果您仍在使用 Samba < 4.10.10,请使用 Bad User 而不是 Bad Password

Windows 10 1709 及以上版本连接问题 - “Windows 无法访问” 0x80004005

此错误影响了一些运行 Windows 10 版本 1709 及更高版本的计算机。它与该版本禁用 SMB1 无关,而是因为 Microsoft 对此版本中的访客不安全登录进行了禁用,但并非对所有人都如此。

要解决此问题,请打开组策略编辑器(gpedit.msc)。导航到 计算机配置\管理模板\网络\Lanman 工作站 > 启用不安全的访客登录 并启用它。或者,在注册表中更改以下值。

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

错误:无法检索打印机列表:NT_STATUS_UNSUCCESSFUL

如果您是家庭用户,并且仅将 Samba 用于服务器或 NAS 的文件共享,您可能不关心通过它共享打印机。如果是这样,您可以通过将以下行添加到 /etc/samba/smb.conf 来防止此错误发生。

/etc/samba/smb.conf
[global]
  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

要解决此问题,请按照#启用用户共享中的描述启用用户共享。

“浏览”网络失败,出现“无法从服务器检索共享列表”

并且您正在使用防火墙(iptables),因为您不信任您的本地(学校、大学、酒店)网络。这可能是由于以下原因:当 smbclient 浏览本地网络时,它会在 UDP 端口 137 上发送广播请求。然后网络上的服务器会回复您的客户端,但由于此回复的源地址与发送列表请求时 iptables 看到的源地址不同,iptables 将无法将回复识别为“ESTABLISHED”或“RELATED”,因此数据包将被丢弃。可能的解决方案是添加

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

到您的 iptables 设置中。

对于Uncomplicated Firewall,您需要在 /etc/default/ufw 中此行的末尾添加 nf_conntrack_netbios_ns

IPT_MODULES="nf_conntrack_ftp nf_nat_ftp nf_conntrack_irc nf_nat_irc"

然后以 root 身份运行以下命令。

echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper
ufw allow CIFS
ufw reload

为了使此更改在重启后仍然有效,请将以下行添加到 /etc/ufw/sysctl.conf 的末尾。

net.netfilter.nf_conntrack_helper=1

协议协商失败:NT_STATUS_INVALID_NETWORK_RESPONSE

客户端可能没有访问共享的权限。确保客户端的 IP 地址在 /etc/samba/smb.confhosts allow = 行中。

另一个问题可能是客户端使用了无效的协议版本。要检查这一点,请尝试使用 smbclient 连接,其中您可以手动指定最大协议版本。

$ smbclient -U <user name> -L //<server name> -m <protocol version: e. g. SMB2> -W <domain name>

如果命令成功,请创建一个配置文件。

~/.smb/smb.conf
[global]
  workgroup = <domain name>
  client max protocol = SMB2

连接到 SERVER 失败:(错误 NT_STATUS_UNSUCCESSFUL)

您很可能向 smbclient 传递了错误的服务器名称。要找出服务器名称,请在服务器上运行 hostnamectl 并查看“Transient hostname”行。

连接到 SERVER 失败:(错误 NT_STATUS_CONNECTION_REFUSED)

确保服务器已启动。共享目录应存在且可访问。

协议协商失败:NT_STATUS_CONNECTION_RESET

服务器可能配置为不接受 SMB1 协议。在 /etc/samba/smb.conf 中添加选项 client max protocol = SMB2。或者,仅将参数 -m SMB2 传递给 smbclient

提供了正确的凭据时出现密码错误(错误 1326)

Samba 4.5 默认禁用 NTLMv1 身份验证。建议安装客户端上可用的最新升级,并拒绝不受支持的客户端的访问。

如果您仍然需要支持没有 NTLMv2 支持的非常旧的客户端(例如 Windows XP),则可以强制启用 NTLMv1,尽管出于安全原因,不推荐这样做。

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

如果 NTLMv2 客户端在启用 NTLMv1 后无法进行身份验证,请在客户端上创建以下文件。

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

此更改也影响使用 mount.cifs 挂载的 samba 共享。如果您在升级到 Samba 4.5 后挂载失败,请将 sec=ntlmssp 选项添加到您的挂载命令中,例如:

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

请参阅 mount.cifs(8) 手册页:ntlmssp - 使用封装在 Raw NTLMSSP 消息中的 NTLMv2 密码哈希。主线内核版本(v3.8 之前)的默认值是 sec=ntlm。在 v3.8 中,默认值已更改为 sec=ntlmssp

映射保留的 Windows 字符

从内核 3.18 开始,cifs 模块默认使用 “mapposix”选项。使用 unix 扩展和默认 Samba 配置挂载共享时,包含七个保留 Windows 字符 : \ * < > ? 的文件和目录会被列出但无法访问。

可能的解决方案是

  • 对 cifs 使用未记录的 nomapposix 挂载选项。
# mount.cifs //server/share /mnt/point -o nomapposix
  • 配置 Samba 使用 fruitmapposix(SFM,Services for Mac)样式的字符重新映射为正确的本机字符。
/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)的缺点是会过滤掉包含不可打印字符的文件。

图形环境中共享的文件夹对访客不可用

本节假定

  1. 用户共享已按照上一节的说明配置。
  2. 已从 GUI 创建了一个非 root 用户共享文件夹。
  3. 在创建过程中已为共享文件夹设置了访客访问权限。
  4. 自上次修改 /etc/samba/smb.conf 文件以来,Samba 服务至少已重启一次。

仅为便于说明,在以下子节中假定

  • 共享文件夹位于用户主目录路径(/home/yourUser/Shared)内。
  • 共享文件夹名称为 MySharedFiles
  • 访客访问权限为只读。
  • Windows 用户将在无需登录提示的情况下访问共享文件夹内容。

验证 Samba 配置是否正确

从终端运行以下命令以测试配置文件是否正确。

$ testparm

验证共享文件夹创建是否正确

从终端运行以下命令。

$ cd /var/lib/samba/usershares
$ ls

如果一切正常,您会注意到一个名为 mysharedfiles 的文件。

使用以下命令读取文件内容。

$ cat mysharedfiles

终端输出应显示类似以下内容。

/var/lib/samba/usershares/mysharedfiles
path=/home/yourUser/Shared
comment=
usershare_acl=S-1-1-0:r
guest_ok=y
sharename=MySharedFiles

验证访客文件夹访问权限

从终端运行以下命令。如果提示输入密码,只需按 Enter 键。

$ smbclient -L localhost

如果一切正常,将在 Sharename 列下显示 MySharedFiles。

运行以下命令以访客(匿名登录)身份访问共享文件夹。

$ smbclient -N ///MySharedFiles

如果一切正常,将显示 samba 提示符。

smb: \>

从 samba 提示符验证访客是否可以列出目录内容。

smb: \> ls

如果显示 NTFS_STATUS_ACCESS_DENIED 错误,问题很可能出在 Unix 目录权限上。确保您的 samba 用户对文件夹及其所有父文件夹都有访问权限。您可以通过 sudo 切换到该用户并尝试列出挂载目录及其所有父目录来测试此问题。

挂载错误:主机已关闭

挂载 Synology NAS 服务器的共享时可能会看到此错误。使用 vers=1.0 挂载选项可以解决此问题。

注意 SMB 版本 1 已知存在安全漏洞,并被用于成功的勒索软件攻击。

软件导致连接中止

使用 gvfs-smb 的文件管理器在写入共享/服务器文件时可能会显示 Software caused connection abort(软件导致连接中止)错误。这可能是由于服务器运行 SMB/CIFS 版本 1,许多路由器使用该版本共享 USB 驱动器(例如,Belkin 路由器)。要写入这些共享,请使用 vers=1.0 选项指定 CIFS 版本。例如:

/etc/fstab
//SERVER/sharename /mnt/mountpoint cifs _netdev,guest,file_mode=0777,dir_mode=0777,vers=1.0 0 0

在将 Samba 更新到版本 4.11 后,该版本默认禁用 SMB1,并且访问任何 Samba 共享时也可能发生此情况。您可以通过添加以下内容来重新启用它。

/etc/samba/smb.conf
[global]
client min protocol = CORE

连接问题(由于身份验证错误)

请确保在 Samba 客户端配置文件中,您的用户名之前没有任何空格,如下所示。

~/.samba
username= user
password=pass

正确的格式是:

~/.samba
username=user
password=pass

Windows 1709 或更高版本在网络视图中发现不了 samba 服务器

在 Windows 10 版本 1511 中,SMBv1 的支持(因此也包括 NetBIOS 设备发现)默认被禁用。根据实际版本,较新版本的 Windows(从 1709 版“Fall Creators Update”开始)不再允许安装 SMBv1 客户端。这导致运行 Samba 的主机不会出现在 Explorer 的“网络(邻里)”视图中。虽然没有连接问题,Samba 仍然可以正常运行,但用户可能希望他们的 Samba 主机能被 Windows 自动列出。wsdd 实现了一个 Web 服务发现主机守护进程。这使(Samba)主机(如您的本地 NAS 设备)能够被 Web 服务发现客户端(如 Windows)找到。默认设置应适用于大多数安装,您只需要启动并启用 wsdd.service

在大多数情况下,默认配置(作为组“WORKGROUP”中的机器主机名广播自身)应该就足够了。如果您需要,可以通过在 /etc/conf.d/wsdd 中添加其他参数来更改 wsdd 的配置选项(有关详细信息,请参阅 wsdd 的手册页)。

wsdd2AUR 功能相同,但用 C 语言而非 Python 编写。默认情况下,它会在 smb.conf 中查找 netbios nameworkgroup 的值。

GNOME Files 未在网络视图中显示 Windows 机器(1709 版或更高版本)的共享文件夹

请参阅 GNOME/Files#Windows 机器(1709 版或更高版本)的共享文件夹未在网络视图中显示

从 iOS/iPadOS 14.5 开始,iOS/iPadOS Files 无法将文件复制到 Arch Linux 上的 Samba 共享

从 iOS/iPadOS 14.5 开始,尝试从运行 iOS/iPadOS 的设备使用“文件”应用传输到 Arch Linux 上的 samba 共享将导致以下错误。

The operation couldn't be completed
Operation canceled

要解决此问题,请在 smb.conf 的全局部分添加以下内容,然后重启 smb.service。注释是可选的。

## addition for iOS/iPadOS 14.5+ Files transfer-to server
vfs object = fruit streams_xattr

请参阅 https://apple.stackexchange.com/q/424681 Apple.Stackexchange.com - 通过 Files 应用保存到 Samba 共享时出现“操作无法完成”/“操作已取消”错误消息。

某些客户端连接缓慢,但没有其他性能问题

某些 SMB 客户端,例如 Android 版的 Solid Explorer,如果无法解析 NetBIOS 名称,连接 Samba 的时间会大大延长。如果出现这种情况,启用 nmb.service 将大大加快初始连接速度。由于这是客户端软件中的一个 bug,请将此类情况报告给冲突软件的作者。

CUPS 管理的打印机未列出

当 Samba 配置为使用 CUPS 进行打印时。

/etc/samba/smb.conf
[global]
   printing = cups
   printcap name = cups

并出现以下症状。

  • smbclient -N -L <localhost> 列出了所有打印机。
  • smbclient -N <localhost>/Your_Printer_Name 可能返回 tree connect failed: NT_STATUS_BAD_NETWORK_NAME。
  • /usr/libexec/samba/samba-bgqd 未运行。
  • /var/log/samba/smbd.<hostname> 可能包含以下条目。最新的 samba 版本可能不再使用此文件。
[2024/08/07 14:24:18.938740,  0] ../../source3/printing/printer_list.c:58(get_printer_list_db)
  get_printer_list_db: Failed to open printer_list.tdb

一种解决方法是手动启动 /usr/libexec/samba/samba-bgqd(不带参数)。考虑创建一个 systemd 服务来保持该二进制文件运行,直到 bug 被修复。

参考:Redhat Bug [1]

密钥搜索失败:密钥已过期

如果在使用 cifscreds add HOST 时收到此消息,请尝试

cifscreds add -u USER -d HOST

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.