作者选择了技术教育基金 ,作为Write for DOnations计划的一部分,获得200美元的捐赠。
介绍
Samba是Windows环境中用于共享服务(如文件和打印机访问以及Active Directory)的SMB / CIFS网络协议的开源实现。 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 Cloud Server上使用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 init系统禁用的。
为了避免运行未配置的启用网络的服务可能导致的安全问题,让我们停止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服务器。 在这种情况下,它是一个standalone server
,即文件共享。 其他服务器类型包括域成员服务器和域控制器。 -
interfaces
- 这些是Samba将绑定到的网络接口。lo
是回送接口(127.0.0.1)并且是必需的。 您还需要包含您之前输出的外部网络接口。 这通常是eth0
。 -
bind interfaces only
- 这确保了Samba仅绑定到interfaces
线上列出的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
- 这将设置在通过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/
下创建的新文件或目录将继承父目录的组所有权,而不是创建该文件或目录的用户的主组。 这意味着,例如,如果管理员用户要在大卫的份额中创建一个新目录, 大卫就能够读取和写入它。
接下来,将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
除了创建管理员用户之外,我们还要创建一个名为admins的组,以便更轻松地管理服务器。 通过对每个共享的读写权限,该组可以简化添加和删除用户的工作。 例如,如果单个用户以管理员用户身份工作,然后离开组织,他们需要从每个共享中单独删除。 新管理员也需要手动添加到每个共享中。 创建一个管理员组并给这个组读写共享权限意味着添加和删除用户只需要一个命令。
执行以下命令以创建一个名为admins的新组,并将用户admin添加到此组中:
sudo groupadd admins
sudo usermod -G admins admin
可以通过运行第二个命令sudo usermod -G admins admin
和其他用户替换sudo usermod -G admins admin
来将其他用户添加到管理员组。
系统配置现在已完成,组织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服务器的其他用户查看共享的存在。 它不赋予任何读取或写入权限。 -
read only
- 它设置valid users
是否能够写入共享。 -
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
请注意,目录权限将组所有权设置为父目录的所有权。
为mike , jane和lucy创建一个共享块。 只更改共享[name]
, path
和valid users
以反映每个用户的名称。
[everyone]
共享将与[name]
, path
, valid users
和browsable
选项中的其他人不同,并且将如下所示:
...
[everyone]
path = /samba/everyone
browseable = yes
read only = no
force create mode = 0660
force directory mode = 2770
valid users = @sambashare @admins
为sambashare
组提供对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
如果大卫想要访问共享共享( 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共享的内置功能。
打开海豚后,采取以下步骤:
- 从位置列表中选择网络 。
- 点击添加网络文件夹 。
- 选择Microsoft Windows网络驱动器选项。
- 点击下一步
- 输入Samba共享的详细信息:
- 名称 - 这是一个令人难忘的名字,将作为共享的Dolphin书签显示。
- 服务器 - 这是Samba服务器的主机名或IP地址。 在这个例子中,它将是
samba.example.com
。 - 文件夹 - 这是在
smb.conf
中设置的共享名称。
- 点击保存并连接 。
- 输入您将要访问Samba共享的用户的用户名和密码。
- 点击确定 。
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共享。
采取以下步骤:
- 打开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
当输入此命令时,系统会提示您输入大卫的用户名和密码。 输入这些信息后,您将收到确认该共享已成功挂载的确认信息:
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文件资源管理器将其保存为书签。 通过打开File Explorer开始这些步骤:
- 右键点击这台电脑 。
- 在随后的页面上点击添加网络位置 ,然后点击下一步 。
- 点击选择一个自定义网络位置 。
- 点击下一步
- 输入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共享中的音乐和视频。 要访问它,请选择打开MRL并使用标准Samba URL: smb:// username @ your_samba_hostname_or_server_ip / share
。 您还可以使用Samba共享作为跨平台备份实用程序BackupPC的备份目标。
除了充当简单的文件共享之外,Samba还可以作为域控制器或域成员与Windows Active Directory配合使用。 Samba Wiki 用户文档包含有关如何执行此操作的更多信息。