Samba
Samba 是用于 Linux 和 Unix 的标准 Windows 互操作性程序套件。自 1992 年以来,Samba 为所有使用 SMB/CIFS 协议的客户端(例如所有版本的 DOS 和 Windows、OS/2、Linux 和许多其他系统)提供了安全、稳定和快速的文件和打印服务。
要通过 Samba 共享文件,请参阅 #服务器 章节;要访问其他机器上通过 Samba 共享的文件,请参阅 #客户端 章节。
服务器
安装
Samba 在 /etc/samba/smb.conf
配置文件中配置,该文件在 smb.conf(5) 中有详细文档。
由于 samba 软件包未提供此文件,因此需要在启动 smb.service
之前 创建它。
可以使用 Samba git 仓库 中 smb.conf.default
的已记录示例来设置 /etc/samba/smb.conf
。
- 默认配置将
log file
设置为不可写的位置,这将导致错误 - 应用以下解决方法之一- 将日志文件位置更改为可写路径:
log file = /var/log/samba/%m.log
- 将日志记录更改为非文件后端解决方案:
logging = syslog
和syslog only = yes
,或使用logging = systemd
- 将日志文件位置更改为可写路径:
- 如果需要;
[global]
部分中指定的workgroup
必须与 Windows 工作组(默认WORKGROUP
)匹配。 - 示例配置文件将用户的home目录暴露给网络,并具有写入权限。如果您认为这存在安全风险,请考虑注释掉整个
[homes]
部分。有关详细信息,请参阅 smb.conf(5) § [homes] 部分。
smb.conf
文件时,请运行 testparm(1) 命令以检查语法错误。启用并启动服务
要通过 SMB 提供基本文件共享,启用/启动 smb.service
。有关详细信息,请参阅 smbd(8)。
如果您想使服务器可以通过 NetBIOS 主机名访问,请在 smb.conf
的 netbios 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 或域名直接连接到服务器。
Windows 资源管理器依赖于 WS-Discovery 协议;请参阅#Windows 1709 或更高版本在网络视图中未发现 samba 服务器。
配置防火墙
如果您正在使用防火墙,请不要忘记打开所需的端口(通常为 137-139 + 445)。有关完整列表,请参阅 Samba 端口使用。
UFW 规则
默认情况下,UFW 的默认安装在 ufw-fileserver
中包含 SMB/CIFS 的 Ufw 应用程序配置文件。
以 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
然后将配置文件加载到 UFW 中,以 root 身份运行 ufw app update Samba
。
最后,以 root 身份运行 ufw allow Samba
以允许 Samba。
firewalld 服务
要配置 firewalld 以允许 home 区域中的 Samba,请运行
# firewall-cmd --permanent --add-service={samba,samba-client,samba-dc} --zone=home
列出的三个服务是
samba
:用于与他人共享文件。samba-client
:用于浏览网络上其他机器上的共享。samba-dc
:用于 Samba/Active Directory 域控制器。
--permanent
确保在 firewalld.service
重启后更改仍然保留。
基本配置
用户管理
以下部分描述了创建 Samba 用户的本地 (tdbsam) 数据库。对于用户身份验证和其他目的,Samba 还可以绑定到 Active Directory 域,可以本身充当 Active Directory 域控制器,或者可以与 LDAP 服务器一起使用。
添加用户
Samba 需要一个 Linux 用户帐户 - 您可以使用现有的用户帐户或创建一个新的帐户。
尽管用户名与 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
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/
。
确保 Linux 用户 guest
具有访问 guest_share.path
中文件的正确权限。
此外,请确保已根据 smb.conf.default 的共享定义部分正确定义了共享。
高级配置
启用符号链接跟踪
follow symlinks
选项可能存在安全风险。/etc/samba/smb.conf
... [global] follow symlinks = yes wide links = yes unix extensions = no
然后,重启 smb.service
。
为 macOS 客户端启用服务器端复制
服务器端复制消除了在服务器上复制文件时在服务器和客户端之间传输数据的需要。默认情况下启用此功能,但它不适用于 macOS 客户端。如果您有 macOS 客户端,则需要在 smb.conf
中添加以下配置,然后重启 smb.service
。
/etc/samba/smb.conf
... [global] fruit:copyfile = yes
Usershares 是一项功能,它使非 root 用户能够添加、修改和删除自己的共享定义。参见 smb.conf(5) § USERSHARES。
- 为 usershares 创建一个目录
# mkdir /var/lib/samba/usershares
- 创建一个用户组
# groupadd -r sambashare
- 将目录的所有者更改为
root
,并将组更改为sambashare
# chown root:sambashare /var/lib/samba/usershares
- 更改
usershares
目录的权限,以便sambashare
组中的用户可以创建文件。此命令还设置了 粘着位,这对于防止用户删除其他用户的 usershares 非常重要# 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.service
和 nmb.service
服务。
注销并重新登录。
如果要共享 home 目录中的路径,则必须使其可供 others 组访问。
在 GUI 中,您可以使用 Thunar 或 Dolphin - 右键单击任何目录并在网络上共享它。
在 CLI 中,使用以下命令之一,替换斜体 sharename、user、...
# 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)。
限制协议以提高安全性
server min protocol = SMB2_02
以保护自己免受勒索软件攻击。在 Samba 4.11 及更高版本中,SMB2 是默认的最小协议,因此无需进行任何更改。追加 server min protocol
和 server max protocol
到 /etc/samba/smb.conf
中,以强制使用最小和最大协议
/etc/samba/smb.conf
[global] server min protocol = SMB2_10 ; server max protocol = SMB3
有关受支持协议的概述,请参阅 smb.conf(5) 中的 server max protocol
。为了与旧客户端和/或服务器兼容,您可能需要将 client min protocol
或 server min protocol
设置为旧协议,但请注意,这会使您容易受到漏洞利用。
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 传输加密在 SMB 版本 3.0 或更高版本中可用。支持此类型加密的客户端包括 Windows 8 及更高版本、Windows server 2012 及更高版本以及 Samba 4.1 及更高版本的 smbclient。
要默认使用原生 SMB 传输加密,请全局和/或按共享设置 server smb encrypt
参数。可能的值为 off
、enabled
(默认值)、desired
或 required
/etc/samba/smb.conf
[global] server smb encrypt = desired
要在客户端配置加密,请使用选项 client smb encrypt
。
有关更多信息,特别是SMB1 的影响和SMB2 的影响段落,请参阅 smb.conf(5)。
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 提供了一个选项来阻止具有某些模式的文件,例如文件扩展名。此选项可用于防止病毒传播或劝阻用户浪费空间存储某些文件。有关此选项的更多信息,请参见 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/
提高吞吐量
默认设置对于大多数用户来说应该足够了。但是,正确设置“socket options”可以提高性能,但设置错误可能会同样程度地降低性能。在进行任何重大更改之前,请测试效果。
在应用以下列出的任何选项之前,请阅读 smb.conf(5) 手册页。
以下设置应追加到 /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
为旧客户端/设备启用访问
最新版本的 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)。
对于轻量级替代方案(不支持列出公共共享等),安装 提供 /usr/bin/mount.cifs
的 cifs-utils。
根据桌面环境,GUI 方法可能可用。有关与文件管理器一起使用,请参阅#文件管理器配置。
- smbclient 需要
/etc/samba/smb.conf
文件(参见#安装),您可以使用touch
实用程序将其创建为空文件。 - 安装 cifs-utils 或 smbclient 后,加载
cifs
内核模块或重新启动以防止挂载失败。
以下命令列出服务器上的公共共享
$ 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
)通常使用 Name Service Switch,默认情况下它不处理 NetBIOS。
要使用 NetBIOS 主机名解析,请安装 smbclient 软件包,它提供了一个 libnss 驱动程序。要使用它,请安装它以及 samba 软件包(它提供了 winbindd 守护进程),启动/启用 winbind.service
服务,并在 nsswitch.conf(5) 中的 hosts
行添加 wins
。
/etc/nsswitch.conf
... hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns wins ...
winbind.service
中当前存在错误,您可能需要按照此 错误报告 中描述的方式修改单元文件。现在,在主机解析期间(例如,当使用 mount.cifs
或仅使用 ping netbios-name
时),winbindd 将通过使用 NetBIOS 名称服务 (NBNS,也称为 WINS) 协议发送查询来解析主机名。
默认情况下,它会向您的本地网络发送广播查询。如果您有 WINS 服务器,您可以将 wins server = wins-server-ip
添加到 smb.conf
并重启 winbind.service
服务,然后 winbindd 和其他 Samba 客户端将向指定的 IP 发送单播查询。
如果您想解析本地主机名(在 smb.conf
中的 netbios name
选项中指定),请启动/启用 nmb.service
服务,它将处理传入的查询。
您可以使用 nmblookup
测试 WINS 解析。默认情况下,无论 wins server
选项如何,它都会向您的本地网络发送广播查询。
请注意,WINS 解析需要源自端口 137 的传入流量。
禁用 NetBIOS/WINS 支持
当不使用 NetBIOS/WINS 主机名解析时,可能更倾向于禁用此协议。
/etc/samba/smb.conf
[global] disable netbios = yes dns proxy = no
手动挂载
使用 mount.cifs
作为 type
挂载共享。并非所有下列选项都是必需或需要的。
# mount --mkdir -t cifs //SERVER/sharename /mnt/mountpoint -o username=username,password=password,workgroup=workgroup,iocharset=utf8,uid=username,gid=group
选项 uid
和 gid
对应于本地(例如客户端)用户/用户组,以使其对给定路径具有读/写访问权限。
- 如果使用的
uid
和gid
与服务器的用户不匹配,则forceuid
和forcegid
选项可能会有所帮助。但是请注意,当forceuid
或forcegid
生效时,分配给文件的权限可能无法反映真实的(服务器)权限。有关更多信息,请参见 mount.cifs(8) § 文件和目录所有权与权限 中的文件和目录所有权与权限部分。 - 要挂载无需身份验证的 Windows 共享,请使用
"username=*"
。
SERVER
— 服务器名称。sharename
— 共享目录。mountpoint
— 共享将被挂载到的本地目录。[-o options]
— 有关更多信息,请参见 mount.cifs(8)。
- 避免使用尾部的
/
。//SERVER/sharename/
将不起作用。 - 如果您的挂载不稳定、卡顿或冻结,请尝试使用
vers=
选项启用不同的 SMB 协议版本。例如,vers=2.0
用于 Windows Vista 挂载。 - 如果在关机时挂载的网络共享(cifs)上出现超时,请参阅 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.service
或 NetworkManager-wait-online.service
(取决于您的设置)以在启动时正确启用。使用 NetworkManager 和 GIO/gvfs
NetworkManager 可以配置为在网络状态更改时运行脚本。此脚本使用 gio 命令,以便像您的文件管理器一样自动挂载 Samba 共享,如下文 文件管理器配置 中所述。该脚本还会通过监听 pre-down
和 vpn-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.mount
只能在您要将共享挂载到 /mnt/myshare
下时使用。否则,可能会发生以下错误:systemd[1]: mnt-myshare.mount: Where= setting does not match unit name. Refusing.
。What=
共享的路径
Where=
挂载共享的路径
Options=
共享挂载选项
- 网络挂载单元自动获取对
remote-fs-pre.target
、network.target
和network-online.target
的After
依赖关系,并获得对remote-fs.target
的Before
依赖关系,除非设置了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
要使用 mnt-myshare.mount
,请启动该单元并启用它以在系统启动时运行。
自动挂载
要自动挂载共享(在访问时,例如 autofs),可以使用以下自动挂载单元。
/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
以在访问挂载路径时自动挂载共享。
smbnetfs
首先,检查您是否可以看到所有您感兴趣挂载的共享。
$ smbtree -U remote_user
如果这不起作用,请在 /etc/samba/smb.conf
中找到并修改以下行,使其相应。
domain master = auto
现在重启 smb.service
和 nmb.service
服务。
然后,将以下行添加到 /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
中找到。
如果您正在使用 Dolphin 或 GNOME 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 共享。
使用 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>,它显示了具有开放服务的 hosts。
使用 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_ro
和 samba_export_all_rw
使 Samba 能够读取或 “读写” 所有文件。
AppArmor 上的权限问题
如果使用位于家目录或 usershares 目录之外的 共享路径,请在 /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 版本。
有关更多信息,请参见 #为了更好的安全性而限制协议。
无法覆盖文件,权限错误
可能的解决方案
- 将挂载选项
nodfs
附加到/etc/fstab
条目。 - 将
msdfs root = no
添加到服务器的/etc/samba/smb.conf
的[global]
部分。
在 /etc/samba/smb.conf
的 global
部分中设置 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 在此版本中为某些用户(而非所有用户)禁用了不安全的 guest 登录有关。
要修复此问题,请打开组策略编辑器 (gpedit.msc
)。导航到计算机配置\管理模板\网络\Lanman 工作站 > 启用不安全的来宾登录 并启用它。或者,在注册表中更改以下值。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters] "AllowInsecureGuestAuth"=dword:1
错误:未能检索打印机列表:NT_STATUS_UNSUCCESSFUL
如果您是家庭用户,并且纯粹为了从服务器或 NAS 进行文件共享而使用 samba,那么您可能对通过它共享打印机不感兴趣。如果是这样,您可以通过将以下行添加到您的 /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
要修复此问题,请按照 #启用 Usershares 中所述启用 usershare。
并且您正在使用防火墙 (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.conf
中的 hosts 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
如果 NTLMv1 已启用时,NTLMv2 客户端无法进行身份验证,请在客户端上创建以下文件。
/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 之前的 mainline 内核版本中的默认值为 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 以使用 fruit 将
mapposix
(“SFM”,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)的缺点是会过滤掉包含不可打印字符的文件。
本节预设。
- Usershares 已按照前一节配置。
- 已从 GUI 以非 root 用户身份创建了共享文件夹。
- 在创建期间,已将 guest 访问设置为共享文件夹。
- 自上次修改
/etc/samba/smb.conf
文件以来,Samba 服务已至少重启过一次。
仅为了说明目的,在以下小节中假设。
- 共享文件夹位于用户家目录路径内 (
/home/yourUser/Shared
)。 - 共享文件夹名称为 MySharedFiles。
- Guest 访问是只读的。
- 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
验证 guest 用户对文件夹的访问权限
从终端运行以下命令。如果提示输入密码,只需按 Enter 键。
$ smbclient -L localhost
如果一切正常,MySharedFiles 应显示在 Sharename
列下。
运行以下命令以 guest 用户身份(匿名登录)访问共享文件夹。
$ smbclient -N //127.0.0.1/MySharedFiles
如果一切正常,将显示 samba 客户端提示符。
smb: \>
从 samba 提示符验证 guest 用户是否可以列出目录内容。
smb: \> ls
如果显示 NTFS_STATUS_ACCESS_DENIED
错误,则问题很可能出在 Unix 目录权限上。确保您的 samba 用户有权访问该文件夹及其所有父文件夹。您可以通过 sudo 到该用户并尝试列出挂载目录及其所有父目录来测试这一点。
挂载错误:主机已关闭
挂载 Synology NAS 服务器的共享时可能会看到此错误。使用挂载选项 vers=1.0
来解决它。
软件导致连接中止
利用 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 设备发现的支持。根据实际版本,从版本 1709 (“秋季创意者更新”) 开始的更高版本的 Windows 不再允许安装 SMBv1 客户端。这导致运行 Samba 的主机未在资源管理器的 “网络(邻居)” 视图中列出。尽管没有连接问题,并且 Samba 仍然可以正常运行,但是用户可能希望他们的 Samba 主机由 Windows 自动列出。wsdd 实现了 Web Service Discovery 主机守护程序。这使(Samba)主机(例如您的本地 NAS 设备)能够被 Web Service Discovery 客户端(如 Windows)找到。默认设置应适用于大多数安装,您只需要启动启用 wsdd.service
服务即可。
如果默认配置(将自身通告为 “WORKGROUP” 组中的机器主机名)应该是您在大多数情况下所需要的。如果需要,您可以通过将其他参数添加到 /etc/conf.d/wsdd
中的 wsdd 来更改配置选项(有关详细信息,请参见 wsdd 的手册页)。
wsdd2AUR 做同样的事情,但是是用 C 而不是 Python 编写的。默认情况下,它将在 smb.conf
中查找 netbios name
和 workgroup
值。
参见 GNOME/Files#Windows 计算机(版本 1709 或更高版本)的共享文件夹未在网络视图中显示。
从 iOS/iPadOS 14.5 开始,尝试使用 “文件” 应用程序从运行 iOS/iPadOS 的设备传输到 Arch Linux 上的 samba 共享将导致错误。
The operation couldn't be completed Operation canceled
要更正此问题,请将以下内容添加到您的 smb.conf
的 global 部分,并重启 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
将大大加快初始连接速度。由于这是客户端软件中的错误,请向冲突软件的作者报告此类情况。
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 服务以保持该二进制文件运行直到错误被修复。
参考:Redhat Bug [1]
参见
- 官方网站
- Samba: 简介
- Samba 3.2.x HOWTO 和参考指南 (已过时,但仍然是最全面的文档)
- 维基百科
- Gentoo:Samba/指南
- Debian:Samba/简易服务器
- KSMBD - 一个 Linux 内核服务器,它在内核空间中实现了 SMB3 协议,用于通过网络共享文件。