如何在 Ubuntu 16.04 上为小型组织设置 Samba 共享
作者选择了 Write for DOnations 计划。
介绍
Windows 环境中使用的 SMB/CIFS 网络协议,用于共享服务,例如文件和打印机访问以及 Active Directory。 Samba 还可用于在称为独立服务器 的配置中创建跨平台文件共享。
在本指南中,您将安装和配置一个独立的 Samba 服务器,以便为名为 Example.com 的假想小型组织提供网络文件存储或共享。该组织对其文件共享有几个要求: 1. 每个员工都需要一个个人的、私有的文件共享; 2. 所有员工都应该拥有对公共文件共享的读写权限; 3. 管理用户应具有对所有个人股份的读写权限和普通股份的所有权。
您的 Samba 服务器将满足所有这些要求。您还将了解如何从 Windows、Linux 和 macOS 访问共享。
先决条件
在开始本指南之前,您需要具备以下条件:
- <李> 具有非 root sudo 用户的 Ubuntu 16.04 服务器。请参阅 Ubuntu 16.04 初始服务器设置指南以获取更多信息。 Samba 对 RAM 和 CPU 的要求适中,可以在 1GB 服务器上正常运行。您更有可能用完存储空间,因此在选择服务器大小时,这应该是您的首要考虑因素。 <李> 允许在端口
445
上传入 TCP 连接。如果您正在使用如何在 Ubuntu 和 Debian 云服务器上使用 UFW 设置防火墙作为指导。如果您使用不同的或外部的防火墙,请参阅相关文档。 第 1 步 — 安装 Samba
让我们从使用 Ubuntu 的包管理系统安装 Samba 开始。
在安装新包之前,让我们更新本地包索引以包含 Ubuntu 存储库中的最新版本:
- sudo apt-get update
接下来,安装 Samba:
- sudo apt-get install samba
此命令将安装并启动 Samba 服务器 smbd
和 Samba NetBIOS 服务器 nmbd
。本教程不需要 nmbd
,因此为了安全起见,您可以使用 systemctl
停止和禁用它:
- sudo systemctl stop nmbd.service
- sudo systemctl disable nmbd.service
sudo systemctl disable nmbd.service
命令在运行时将产生以下输出:
Outputnmbd.service is not a native service, redirecting to systemd-sysv-install
Executing /lib/systemd/systemd-sysv-install disable nmbd
insserv: warning: current start runlevel(s) (empty) of script `nmbd' overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `nmbd' overrides LSB defaults (0 1 6).
此输出表明,由于 nmbd
没有本机 systemd
管理配置,因此它被较旧的 SysV 初始化系统禁用。
为避免运行未配置的启用网络的服务可能引起的安全问题,让我们停止 Samba 服务器,直到配置详细信息到位:
- sudo systemctl stop smbd.service
Samba 现已安装并准备好进行配置。
第 2 步 — 设置 Samba 的全局选项
让我们通过修改位于 /etc/samba/smb.conf
的配置文件来定义 Samba 服务器的行为方式。该文件有两部分:[global]
部分和 [shares]
部分。 [global]
部分配置 Samba 服务器的行为,[shares]
部分配置文件共享。让我们从在 [global]
部分设置指令开始。
不要直接编辑 /etc/samba/smb.conf
,而是将其重命名为 smb.conf.original
并创建一个名为 smb.conf< 的新文件/代码>:
- sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.orig
在编辑 /etc/samba/smb.conf
之前,让我们检查可用的接口,以便告诉 Samba 它应该识别哪些接口。输入以下内容:
- ip link
Output1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 02:21:2c:03:ef:e2 brd ff:ff:ff:ff:ff:ff
此输出表明 lo
是环回接口,eth0
是外部网络接口,尽管您的外部接口可能不同。请注意两者:您将在 smb.conf
文件的 [global]
部分中使用 interfaces
指令包含它们。
让我们开始使用 nano
或您最喜欢的编辑器编辑此文件:
- sudo nano /etc/samba/smb.conf
此文件的 [global]
部分将定义服务器的名称、角色和其他详细信息,包括网络接口:
[global]
server string = samba_server
server role = standalone server
interfaces = lo your_network_interface
bind interfaces only = yes
disable netbios = yes
smb ports = 445
log file = /var/log/samba/smb.log
max log size = 10000
这些指令指定以下内容:
server string
- 这是将在连接期间提供给用户的识别信息。您可以使用samba_server
或可以识别您的服务器的其他名称。在本教程中,您将看到字符串samba.example.com
表示组织 Example.com 的 Samba 共享。server role
- 这定义了将创建什么类型的 Samba 服务器。在这种情况下,它是一个独立服务器
,即文件共享。其他服务器类型包括域成员服务器和域控制器。interfaces
- 这些是 Samba 将绑定到的网络接口。lo
是环回接口 (127.0.0.1),并且是必需的。您还需要包含之前输出的外部网络接口。这通常是eth0
。bind interfaces only
- 这可确保 Samba 仅绑定到interfaces
行中列出的接口。作为一项安全措施,这会导致 Samba 忽略与指定的interfaces
不对应的数据包。disable netbios
- 这将禁用独立服务器中不需要的所有 NetBIOS 功能。这样做可以简化服务器名称解析过程和 SMB 流量的传输。smb ports
- 这设置了 Samba 将监听的端口。端口445
是 Samba 的标准端口。log file
- 设置 Samba 日志文件的名称和位置。max log size
- 这设置了日志文件的大小限制。列出的数字以字节为单位,等于 10MB。设置此大小限制时要记住一些事情:达到此限制时,Samba 将生成一个新的日志文件并将旧内容移动到一个具有.old
扩展名的副本中。如果再次超过限制,现有的.old
文件将被销毁。这可以防止磁盘/分区空间被单个日志文件的内容淹没。因此,您应该定义一个对您的系统资源有意义的文件大小。
如果在设置服务器时需要更详细的日志记录,请将以下行附加到 [global]
部分:
log level = 3 passdb:5 auth:5
这会将日志级别设置为 3(信息),从默认设置 1 增加日志信息的粒度。passdb
和 auth
调试类的较高设置为 5提供与用户身份验证相关的更多信息。
完成此部分的创建后保存并关闭文件。
每当您编辑 smb.conf
时,您都应该运行 Samba 实用程序 testparm
来检查没有语法错误:
- testparm
在 smb.conf
文件上运行 testparm
命令会产生以下输出:
OutputLoad smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
按 ENTER
会产生以下输出:
Output# Global parameters
[global]
server string = samba_server
interfaces = lo your_network_interface
bind interfaces only = Yes
server role = standalone server
log file = /var/log/samba/smb.log
max log size = 10000
smb ports = 445
disable netbios = Yes
idmap config * : backend = tdb
如果 testparm
报告 Loaded services file OK.
,则不存在会阻止 Samba 服务器启动的语法错误。
配置 [global]
部分是启动 Samba 服务器所需的全部。但是,如果没有共享配置,其功能将受到限制。共享由两部分组成,用户和目录,必须创建和配置这两部分以允许登录和测试。下一节将解释如何创建可以访问共享的用户。
第 3 步 — 创建用户
在此步骤中,我们将创建可以访问共享的用户。他们需要以 Samba 和系统用户的身份访问,以便在登录和读写文件系统时通过 Samba 服务器进行身份验证。
在假设的公司 Example.com 中,有四名员工需要添加到 Samba 服务器并在 Linux 系统上创建为用户:david、mike、jane 和 lucy。除了这四个之外,还有一个管理员用户可以访问和管理个人共享。该用户还将拥有每个人都可以访问的普通股。
添加系统用户的第一步是为每个用户创建主目录。 Samba 目录和数据将位于 /samba/
,而不是使用位于 /home/user
的标准主目录。将 Samba 数据保存在一个位置并与其他用户数据分开将使将来的管理任务(例如备份)更加容易。
注意:本指南中创建的用户无意使用 SSH 登录。如果您的用户已经在服务器上拥有帐户,您应该为他们创建一个专用的 Samba 用户以便遵循本指南。
下一节将解释添加第一个用户 david 的过程,但您需要为 mike、jane 和 lucy 重复此过程。
第一步是在文件系统的根目录下创建存储 Samba 数据的目录。此目录将称为 /samba/
,其组所有权将设置为 sambashare
,这是您在安装 Samba 时创建的组。
执行以下命令创建 /samba/
目录并将组所有权设置为 sambashare
:
- sudo mkdir /samba/
- sudo chown :sambashare /samba/
接下来,在 /samba/
目录下创建 david 的主目录:
- sudo mkdir /samba/david
现在,使用以下命令将 david 添加为系统用户:
- sudo adduser --home /samba/david --no-create-home --shell /usr/sbin/nologin --ingroup sambashare david
这些选项执行以下操作:
--home
- 设置用户主目录的位置。--no-create-home
- 这会阻止adduser
命令创建 david 的主目录。如果系统要创建此目录,它将填充当前设置不需要的配置文件,例如.bash_history
。--shell
- 设置 david 通过 SSH 登录时将分配给哪个 shell。访问 Samba 共享不需要 SSH 登录;将此设置为/usr/sbin/nologin
将禁用 SSH 登录。--in-group sambashare
- 这会将用户添加到sambashare
组,使他们能够读写自己的共享和公共共享。< /li>
运行此命令时,系统将提示您输入密码。选择 10 个或更多字符的唯一的、非基于字典的密码。
现在系统用户 david 已经存在,您可以在他的 Samba 主目录上设置所有权和权限:
- sudo chown david:sambashare /samba/david/
- sudo chmod 2770 /samba/david/
将目录的权限设置为2770
,意味着在/samba/david/
下创建的新文件或目录将继承父目录的组所有权,而不是主目录的组所有权创建文件或目录的用户。这意味着,例如,如果管理员用户要在 david 的共享中创建一个新目录,david 将能够读取和写入它。
接下来,将 david 添加到 Samba 服务器。 Samba 保留自己的用户和密码数据库,用于验证登录。为了登录,必须将所有用户添加到 Samba 服务器并启用。执行以下 smbpasswd
命令来完成这两项任务:
- sudo smbpasswd -a david
- sudo smbpasswd -e david
此处使用的选项执行以下操作:
-a
- 这会将用户添加到 Samba 服务器而不启用它们。-e
- 这会启用之前添加的用户。
您在此处输入的密码将用于访问 Samba 共享,可以与系统密码不同。
用户 david 现在作为系统用户存在,无法通过 SSH 连接到服务器。他在 /samba/david
中有一个主目录,并且作为 Samba 用户注册并启用。
对每个 Samba 用户(mike、jane 和 lucy)重复此过程。
要创建管理员用户,请运行以下命令,将主目录更改为 /samba/everyone/
:
- sudo mkdir /samba/everyone
- sudo adduser --home /samba/everyone --no-create-home --shell /usr/sbin/nologin --ingroup sambashare admin
- sudo chown admin:sambashare /samba/everyone/
- sudo chmod 2770 /samba/everyone/
- sudo smbpasswd -a admin
- sudo smbpasswd -e admin
除了创建 admin 用户之外,让我们创建一个名为 admins 的组,以便于管理服务器。通过对每个共享的读写权限,该组可以简化添加和删除用户的工作。例如,如果个人用户充当管理员用户,然后离开组织,则需要将他们从每个共享中单独删除。还需要将新管理员手动添加到每个共享中。创建一个管理员组并赋予该组对共享的读写访问权限意味着添加和删除用户只需要一个命令。
执行以下命令创建一个名为 admins 的新组,并将用户 admin 添加到该组:
- sudo groupadd admins
- sudo usermod -G admins admin
通过运行第二个命令 sudo usermod -G admins admin
并用另一个用户代替 admin,可以将其他用户添加到 admins 组标记>
。
系统配置现已完成,组织 Example.com 的用户设置为系统用户和 Samba 用户。让我们继续配置 Samba 服务器,以便这些用户可以访问他们的共享目录。
第 4 步 — 配置 Samba 共享
每个共享在主 Samba 配置文件 /etc/samba/smb.conf
中都有自己的部分,位于全局参数之后。这些部分将定义每个共享的工作方式。
再次使用 nano
文本编辑器打开并编辑此文件:
- sudo nano /etc/samba/smb.conf
以下配置块将定义每个用户的个人共享:
...
[share_name]
path =
browseable =
read only =
force create mode =
force directory mode =
valid users =
这些选项包括:
share_name
- 这是您登录时将使用的共享名称。path
- 这是文件系统中共享的绝对路径。browsable
- 这设置其他用户是否能够看到共享。启用此选项仅允许 Samba 服务器的其他用户看到共享的存在。它不授予任何读取或写入权限。只读
- 设置有效用户
是否能够写入共享。force create mode
- 这会强制授予写入共享的任何文件的权限。force directory mode
- 这会强制共享中创建的任何目录的权限。valid users
- 这是有权访问共享的用户列表。此设置可以采用用户名或系统组,例如管理员。组必须在前面列出@
,例如@admins
。
为 david 添加以下共享配置块,定义他的主目录、该目录的组所有权权限以及应该有权访问他的共享的用户:
[david]
path = /samba/david
browseable = no
read only = no
force create mode = 0660
force directory mode = 2770
valid users = david @admins
请注意,目录权限将组所有权设置为父目录的所有权。
为迈克、简和露西创建一个共享块。仅更改共享 [name]
、path
和 valid users
以反映每个用户的名称。
[everyone]
共享在 [name]
、path
、valid users
和可浏览
选项,看起来像这样:
...
[everyone]
path = /samba/everyone
browseable = yes
read only = no
force create mode = 0660
force directory mode = 2770
valid users = @sambashare @admins
为 sambashare
组提供对共享的读写访问权限使所有用户都可以访问共享,因为他们是在创建时添加到该组的。
完整的 smb.conf
文件如下所示:
[global]
server string = samba_server
server role = standalone server
interfaces = lo your_network_interface
bind interfaces only = yes
disable netbios = yes
smb ports = 445
log file = /var/log/samba/smb.log
max log size = 10000
[david]
path = /samba/david
browseable = no
read only = no
force create mode = 0660
force directory mode = 2770
valid users = david @admins
[mike]
path = /samba/mike
browseable = no
read only = no
force create mode = 0660
force directory mode = 2770
valid users = mike @admins
[jane]
path = /samba/jane
browseable = no
read only = no
force create mode = 0660
force directory mode = 2770
valid users = jane @admins
[lucy]
path = /samba/lucy
browseable = no
read only = no
force create mode = 0660
force directory mode = 2770
valid users = lucy @admins
[everyone]
path = /samba/everyone
browseable = yes
read only = no
force create mode = 0660
force directory mode = 2770
valid users = @sambashare @admins
完成编辑后保存并关闭文件。
再次测试配置:
- testparm
这将产生如下所示的输出:
OutputLoad smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[david]"
Processing section "[jane]"
Processing section "[mike]"
Processing section "[lucy]"
Processing section "[everyone]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
配置检查完成后,让我们使用 systemctl
启动 Samba 服务器:
- sudo systemctl start smbd.service
Samba 服务器现在正在运行并准备好接受登录。下一步是登录到 Samba 服务器以测试它是否按预期工作。以下部分将介绍从 Windows、Linux 和 macOS 登录到 Samba 服务器。
第 5 步 — 登录到 Samba 服务器
在本节中,我们将介绍如何从 Linux、Windows 和 macOS 访问我们创建的 Samba 共享。
Linux——命令行
您可以使用名为 smbclient
的工具从命令行访问 Samba。大多数 Linux 发行版默认不包含此包,因此您需要使用本地包管理器安装它。
在 Debian 和 Ubuntu 服务器上使用以下命令安装 smbclient
:
- sudo apt-get update
- sudo apt-get install smbclient
在 Fedora 系统上,使用以下命令:
- sudo dnf update
- sudo samba-client
在 CentOS 上:
- sudo yum update
- sudo yum install samba-client
注意:在某些 Linux 发行版上,smbclient
将失败并显示以下错误消息:
Outputsmbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
如果您看到此错误消息,请检查以确保您已在 /etc/samba/smb.conf
中创建该文件。
smbclient
使用以下格式访问 Samba 共享:
- smbclient //your_samba_hostname_or_server_ip/share -U username
您可以使用服务器的 IP 或您在 /etc/samba/smb.conf
中定义的主机名来访问共享。此示例使用主机名 samba.example.com
访问您在前面步骤中创建的 Samba 服务器上的 david 共享:
- smbclient //samba.example.com/david -U david
如果 david 想要访问公共共享(everyone
),请将命令更改为:
- smbclient //samba.example.com/everyone -U david
运行 smbclient
命令后,系统会提示您输入 Samba 密码并登录到命令行界面,让人联想到 FTP 文本界面:
smb: \>
此接口最适用于测试用户名和密码以及读写访问。例如,您可以创建一个目录并列出其内容,如下所示:
- mkdir test
- ls
您应该看到以下输出:
Output . D 0 Fri Feb 2 14:49:01 2018
.. D 0 Wed Jan 24 12:11:33 2018
test D 0 Fri Feb 2 14:49:01 2018
通过键入以下内容删除目录:
- rmdir test
使用 GUI 工具通常更容易管理共享中的数据。下一节将介绍 KDE 的内置 GUI 工具。
Linux — KDE 与 Dolphin
Dolphin 是 KDE 中的默认文件管理器,具有访问 Samba 共享的内置功能。
打开 Dolphin 后,执行以下步骤:

Dolphin 现在将连接并打开如下所示的 Samba 共享:

您现在可以像使用本地目录一样使用 Samba 共享来复制、删除和重命名文件和目录。该共享还将作为永久书签出现在网上邻居中。
MacOS——命令行
MacOS 预装了可用于访问 Samba 共享的命令行工具。单击“终端”图标,使用 Launchpad 打开终端。
这将在您的主目录中打开一个命令行终端。要安装 Samba 共享,您可以创建一个新目录作为共享的安装点。挂载点是连接两个文件系统的位置:在本例中,是您的本地文件系统和远程 Samba 文件系统。
创建一个名为 samba
的新目录:
- mkdir samba
接下来,将 Samba 共享挂载到新的 samba
目录下。此命令具有以下形式:
- sudo mount_smbfs //username@your_samba_hostname_or_server_ip/share ./mount_point
用用户 david 替换 Example.com 中的详细信息如下所示:
- sudo mount_smbfs //david@samba.example.com/david ./samba
samba
目录现在将在 Example.com Samba 服务器上显示 david 共享的内容。可以使用ls
、rm
和mkdir
等常规工具来操作文件和目录;但是,samba
目录在挂载共享后将归 root 所有。因此,您需要使用 sudo
来访问 samba
目录及其内容。
要卸载 Samba 共享,请从运行 mkdir
命令的同一目录运行 umount
命令:
- umount samba
下一节将介绍如何使用 macOS 中的桌面 GUI 应用程序访问 Samba 共享。
MacOS——桌面
MacOS 还可以使用 Finder 应用程序访问 Samba 共享。
采取以下步骤:

成功连接到 Samba 共享后,它将出现在 Finder 中,如下所示:

下一节将探讨如何从 Windows 10 访问 Samba 共享。
Windows 10——命令行
从 Windows 命令行挂载 Samba 共享只需要一个命令:
- net use drive_letter \\your_samba_hostname_or_server_ip\share
替换用户 david 的共享中的变量并将驱动器号设置为 X:
:
- net use X: \\samba.example.com\david
输入此命令后,系统将提示您输入 david 的用户名和密码。输入这些后,您将收到共享已成功安装的确认信息:
OutputEnter the user name for 'samba.example.com': david
Enter the password for samba.example.com:
The command completed successfully.
现在,您将能够在文件资源管理器中浏览 Samba 共享并像操作本地计算机一样操作文件和目录。
下一节将介绍如何使用 Windows GUI 工具访问 Samba 共享。
Windows 10 — 桌面
Windows 10 还具有连接到 Samba 共享的本机功能。以下步骤会将您连接到您的 Samba 共享,并使用 Windows 文件资源管理器将其保存为书签。通过打开文件资源管理器开始这些步骤:

文件资源管理器现在将连接到 Samba 共享。连接成功完成后,将在文件资源管理器中的“此电脑”下创建一个新位置:

您现在可以使用此文件夹来管理 Samba 共享中的文件和文件夹,就好像它是本地文件夹一样。
结论
在本文中,您使用 Samba 服务器创建了跨平台在线文件共享。您还从 Windows、Linux 和 macOS 访问了这些共享。
Samba 共享变得如此普遍,以至于许多应用程序都能够访问存储在其中的数据。这些应用程序可以扩展 Samba 共享的功能和用途。例如,媒体播放器BackupPC 的移动版本。
除了充当简单的文件共享之外,Samba 还可以作为域控制器或域成员与 Windows Active Directory 一起工作。 Samba Wiki 用户文档包含有关如何执行此操作的更多信息。