如何在Ubuntu16.04上为小型组织设置Samba共享
作为 Write for DOnations 计划的一部分,作者选择了 Tech Education Fund 来接受捐赠。
介绍
Samba 是 SMB/CIFS 网络协议 的开源实现,在 Windows 环境中用于共享服务,例如文件和打印机访问以及 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 连接。 如果您使用的是 UFW 防火墙,请参阅 如何在 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]
部分将定义服务器的名称、角色和其他详细信息,包括网络接口:
/etc/samba/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
这些指令指定以下内容:
server string
- 这是在连接期间将提供给用户的识别信息。 您可以使用samba_server
或其他名称来标识您的服务器。 在本教程中,您将看到字符串samba.example.com
来表示组织 Example.com 的 Samba 共享。server role
- 这定义了将创建什么类型的 Samba 服务器。 在这种情况下,它是standalone server
,即 文件共享。 其他服务器类型包括域成员服务器和域控制器。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]
部分:
/etc/samba/smb.conf
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 服务器所需的全部内容。 但是,如果没有共享配置,其功能将受到限制。 共享由两部分组成,一个用户和一个目录,必须创建和配置这两个部分以允许登录和测试。 下一节将解释如何创建可以访问共享的用户。
第三步——创建用户
在这一步中,我们将创建可以访问共享的用户。 他们需要以 Samba 和系统用户身份访问,以便在登录和读取和写入文件系统时通过 Samba 服务器进行身份验证。
在假设的公司 Example.com 中有四名员工需要添加到 Samba 服务器并在 Linux 系统上创建为用户:david、mike 、简和露西。 除了这四个之外,还有一个 admin 用户将能够访问和管理个人共享。 该用户还将拥有每个人都可以访问的普通共享。
添加系统用户的第一步是为每个用户创建主目录。 Samba 目录和数据将位于 /samba/
,而不是使用 /home/user
的标准主目录。 将 Samba 数据保存在一个位置并与其他用户数据分开将使未来的管理任务(例如备份)更加容易。
注意: 本指南中创建的用户并非旨在拥有 SSH 登录。 如果您的用户已经在服务器上拥有帐户,您应该为他们创建一个专用的 Samba 用户,以便遵循本指南。
下一节将解释添加第一个用户 david 的过程,但您需要对 mike、jane 和 重复此过程露西。
第一步是在文件系统的根目录下创建存储 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
- 设置当他通过 SSH 登录时将分配哪个 shell david。 访问 Samba 共享不需要 SSH 登录; 将此设置为/usr/sbin/nologin
将禁用 SSH 登录。--in-group sambashare
- 这会将用户添加到sambashare
组,授予他们对自己的共享和公共共享的读写访问权限。
运行此命令时,系统将提示您输入密码。 选择 10 个或更多字符的唯一、非基于字典的密码。
现在系统用户 david 已经存在,您可以设置他的 Samba 主目录的所有权和权限:
sudo chown david:sambashare /samba/david/ sudo chmod 2770 /samba/david/
将目录的权限设置为2770
意味着在/samba/david/
下创建的新文件或目录将继承父目录的组所有权,而不是创建文件或目录的用户的主组. 这意味着,例如,如果 admin 用户要在 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)重复此过程。
要创建 admin 用户,请运行以下命令,将主目录更改为 /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 的组,以便更轻松地管理服务器。 通过对每个共享的读取和写入权限,该组可以简化添加和删除用户的工作。 例如,如果个人用户充当 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
以下配置块将定义每个用户的个人共享:
/etc/samba/smb.conf
... [share_name] path = browseable = read only = force create mode = force directory mode = valid users =
这些选项包括:
share_name
- 这是您在登录时将使用的共享名称。path
- 这是文件系统中共享的绝对路径。browsable
- 设置其他用户是否能够看到共享。 启用此选项仅允许 Samba 服务器的其他用户看到共享的存在。 它不授予任何读取或写入权限。read only
- 设置valid users
是否能够写入共享。force create mode
- 这强制写入共享的任何文件的权限。force directory mode
- 这会强制在共享中创建的任何目录的权限。valid users
- 这是有权访问共享的用户列表。 此设置可以采用用户名或系统组,例如 admins。 组必须在前面列出@
例如@admins
。
为 david 添加以下共享配置块,定义他的主目录、该目录的组所有权的权限以及应该有权访问他的共享的用户:
/etc/samba/smb.conf
[david] path = /samba/david browseable = no read only = no force create mode = 0660 force directory mode = 2770 valid users = david @admins
请注意,目录权限将组所有权设置为父目录的所有权。
为 mike、jane 和 lucy 创建一个共享块。 仅更改共享 [name]
、path
和 valid users
以反映每个用户的名称。
[everyone]
共享在 [name]
、path
、valid users
和 browsable
选项中与其他共享不同,看起来像这样:
/etc/samba/smb.conf
... [everyone] path = /samba/everyone browseable = yes read only = no force create mode = 0660 force directory mode = 2770 valid users = @sambashare @admins
授予 sambashare
组对该共享的读写访问权限可以使所有用户都可以访问该共享,因为他们是在创建时添加到该组的。
完整的 smb.conf
文件将如下所示:
/etc/samba/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 — 带有 Dolphin 的 KDE
Dolphin 是 KDE 中的默认文件管理器,并具有访问 Samba 共享的内置功能。
打开 Dolphin 后,执行以下步骤:
- 从 Places 列表中选择 Network。
- 单击添加网络文件夹。
- 选择 Microsoft Windows 网络驱动器 选项。
- 点击下一步
- 输入 Samba 共享的详细信息: 名称 - 这是一个令人难忘的名称,将在 Dolphin 中显示为共享的书签。 服务器 - 这是 Samba 服务器的主机名或 IP 地址。 在本例中,它将是 samba.example.com。 文件夹 - 这是在 smb.conf 中设置的共享名称。
- 点击保存并连接 .
- 输入您要访问 Samba 共享的用户的用户名和密码。
- 单击确定。
Dolphin 现在将连接并打开 Samba 共享,如下所示:
您现在可以像使用本地目录一样使用 Samba 共享来复制、删除和重命名文件和目录。 共享也将作为永久书签出现在 Network 位置。
MacOS——命令行
MacOS 预装了可用于访问 Samba 共享的命令行工具。 通过单击 Terminal 图标,使用 Launchpad 打开终端。
这将在您的主目录中打开一个命令行终端。 要挂载 Samba 共享,您可以创建一个新目录作为共享的挂载点。 挂载点是两个文件系统连接的位置:在这种情况下,您的本地文件系统和远程 Samba 文件系统。
创建一个名为 samba
的新目录:
mkdir samba
接下来,在新的 samba
目录下挂载 Samba 共享。 此命令具有以下形式:
sudo mount_smbfs //username@your_samba_hostname_or_server_ip/share ./mount_point
将 Example.com 中的详细信息替换为用户 david 如下所示:
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 共享。
采取以下步骤:
- 打开Finder,点击菜单栏中的Go。
- 从选项列表中单击 连接到服务器 。
- 使用包含您的用户名、主机名或服务器 IP 以及您的共享名称的
smb://
格式 URL:smb://username@your_samba_hostname_or_server_ip/share
。 在此处显示的示例中,您将看到用户名 david 和主机名samba.example.com
。 - 单击带有 + 符号的按钮,将 Samba 共享添加为书签。
- 点击连接
- 选择注册用户
- 输入 Samba 共享用户的用户名和密码。
- 确定您是否希望 macOS 存储密码。
- 单击 连接 。
成功连接到 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 服务器的 Windows 样式地址和共享名称。 Windows 使用以下形式的 Samba URL:
\\your_samba_hostname_or_server_ip\share\
。 在示例图像中,服务器名称为samba.example.com
,共享名称为david
:\\samba.example.com\david
。 - 单击下一步。
- 输入用户的用户名和密码。
- 决定是否希望 Windows 记住密码。
- 单击确定。
文件资源管理器现在将连接到 Samba 共享。 连接成功完成后,将在文件资源管理器的 This PC 下创建一个新位置:
您现在可以使用此文件夹来管理 Samba 共享中的文件和文件夹,就像它是本地文件夹一样。
结论
在本文中,您使用 Samba 服务器创建了跨平台在线文件共享。 您还可以从 Windows、Linux 和 macOS 访问这些共享。
Samba 共享变得如此普遍,以至于许多应用程序都能够访问存储在其中的数据。 这些应用程序可以扩展 Samba 共享的功能和用途。 例如,移动版的媒体播放器 VLC 可以连接到您的 Samba 共享并流式传输音乐和视频。 要访问它,请选择 open MRL 并使用标准 Samba URL:smb://username@your_samba_hostname_or_server_ip/share
。 您还可以使用 Samba 共享作为跨平台备份实用程序 BackupPC 的备份目标。
除了充当简单的文件共享之外,Samba 还可以作为域控制器或域成员与 Windows Active Directory 一起使用。 Samba Wiki 用户文档 包含有关如何执行此操作的更多信息。