Samba是Windows环境中使用的SMB / CIFS网络协议的开源实现,用于共享服务,如文件和打印机访问以及Active Directory。Samba还可用于在名为独立服务器的配置中创建跨平台文件共享。
在本教程中,您将安装和配置独立Samba服务器,以便为名为Example.com的虚拟小型组织提供网络文件存储或共享。该组织对其文件共享有几个要求:1. 每个员工都需要一个私人文件共享; 2. 所有员工都应具有对共同文件共享的读写权限; 3. 管理用户应具有对所有个人共享和普通共享所有权的读写权限。
您的Samba服务器将满足所有这些要求。您还将学习如何从Windows,Linux和macOS访问共享。
在开始本教程之前,您需要以下内容:
sudo
命令的非root账号的Ubuntu 16.04服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器。Samba具有适度的RAM和CPU要求,并且在1GB服务器上运行良好。您更有可能耗尽存储空间,因此在选择服务器大小时,这应该是您的首要考虑因素。让我们首先使用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
命令将生成以下输出:
Output
nmbd.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现已安装并准备配置。
让我们通过修改位于/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
Output
1: 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
行上列出的接口。作为安全措施,这会导致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(info),从默认设置1增加日志信息的粒度。passdb
和auth
调试类的较高设置5, 提供了与用户身份验证相关的更多信息。
完成此部分的创建后,保存并关闭该文件。
无论何时编辑smb.conf
,都应运行Samba实用程序testparm
以检查是否存在语法错误:
$ testparm
在smb.conf
文件上运行testparm
命令会产生以下输出:
Output
Load 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、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的共享中创建一个新目录,那么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
将其他用户添加到管理员组,并用另一个用户替换admin
。
系统配置现已完成,组织Example.com的用户设置为系统和Samba用户。让我们继续配置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
共享组读写权限使所有用户访问该共享,因为他们被创建时加入了这个群体。
完整的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
这将产生如下所示的输出:
Output
Load 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服务器。
在本节中,我们将介绍如何访问我们从Linux,Windows和macOS创建的Samba共享。
您可以使用一个名为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将失败,并显示以下错误消息: Output smbclient: 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: >
此接口对于测试用户名和密码以及读写访问非常有用。例如,您可以创建一个目录并列出其内容,如下所示:
smb: > mkdir test
smb: > 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
输入以下命令删除目录:
smb: > rmdir test
使用GUI工具管理共享中的数据通常更容易。下一节将介绍KDE的内置GUI工具。
Dolphin是KDE中的默认文件管理器,具有访问Samba共享的内置功能。
打开Dolphin后,请执行以下步骤:
1. 从邻居列表选择网络。
2. 单击“ 添加网络文件夹”。
3.选择Microsoft Windows网络驱动器选项。
4.单击下一步
5.输入Samba共享的详细信息:
samba.example.com
。smb.conf
中设置的共享的名称。6.单击“ 保存并连接”。
7.输入您要访问Samba共享的用户的用户名和密码。
8.单击确定。
Dolphin现在将连接并打开Samba共享,如下所示:
您现在可以将Samba共享用作复制、删除和重命名文件和目录的本地目录。该共享还将显示为网络位置中的永久书签。
MacOS预先安装了可用于访问Samba共享的命令行工具。单击终端图标,使用Launchpad打开终端。
这将在您的主目录中打开命令行终端。要挂载Samba共享,您可以创建一个新目录,该目录将充当共享的挂载点。挂载点是两个文件系统连接的位置:在本教程中,是本地文件系统和远程Samba文件系统。
创建一个名为samba
的新目录:
$ mkdir samba
接下来,将Samba共享安装在新samba
目录下。此命令具有以下形式:
$ sudo mount_smbfs //username@your_samba_hostname_or_server_ip/share ./mount_point
用user 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共享,请从运行umount
命令的同一目录运行mkdir
命令:
$ umount samba
下一节将介绍如何使用macOS中的桌面GUI应用程序访问Samba共享。
MacOS还可以使用Finder应用程序访问Samba共享。
采取以下步骤:
1. 打开Finder并单击菜单栏中的Go。
2. 单击选项列表中的“ 连接到服务器 ”。
3.使用包含用户名,主机名或服务器IP以及共享名称的smb://
格式URL:smb:// username @ your_samba_hostname_or_server_ip / share
。 在此处显示的示例中,您将看到用户名david和主机名samba.example.com
。
4. 通过单击带有+符号的按钮为Samba共享添加书签。
5. 单击连接
6.选择注册用户
7.输入Samba共享用户的用户名和密码。
8.确定您是否希望macOS存储密码。
9.单击连接。
成功连接到Samba共享后,它将显示在Finder中,如下所示:
下一节将探讨如何从Windows 10访问Samba共享。
从Windows命令行挂载Samba共享只需要一个命令:
C:> net use drive_letter \your_samba_hostname_or_server_ip\share
从用户david的共享中替换变量并将驱动器号设置为X:
:
C:> net use X: \samba.example.com\david
输入此命令后,系统将提示您输入david的用户名和密码。输入这些内容后,您将收到已成功装入共享的确认:
Output
Enter 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还具有连接到Samba共享的本机功能。以下步骤将连接到您的Samba共享,并使用Windows文件资源管理器将其保存为书签。打开文件资源管理器开始这些步骤:
1. 右键单击此PC。
2. 单击“ 添加网络位置”,然后单击下一页上的“ 下一步 ”。
3.单击“ 选择自定义网络位置”。
4.单击下一步
5.输入Samba服务器的Windows样式地址和共享名称。Windows使用以下形式的Samba URL : \\your_samba_hostname_or_server_ip\share\
. 在示例图像中,服务器名称为samba.example.com
,共享名称为:david:
\\samba.example.com\david
。
6.单击下一步。
7.输入用户的用户名和密码。
8.确定您是否希望Windows记住密码。
9.单击确定。
文件资源管理器现在将连接到Samba共享。连接成功完成后,将在“文件资源管理器”中的“ This PC”下创建一个新位置:
您现在可以使用此文件夹来管理Samba共享中的文件和文件夹,就像它是本地文件夹一样。
在本文中,您使用Samba服务器创建了跨平台的联机文件共享。您还从Windows,Linux和macOS访问了这些共享。
Samba共享很普遍,许多应用程序都能够访问存储在其中的数据。这些应用程序可以扩展Samba共享的功能和实用性。例如,媒体播放器的移动版本可以连接到Samba共享并从中流式传输音乐和视频。要访问它,请选择打开MRL并使用标准Samba URL :smb://username@your_samba_hostname_or_server_ip/share
. 您还可以使用跨平台备份实用程序BackupPC将Samba共享用作备份的目标。
除了充当简单文件共享之外,Samba还可以将Windows Active Directory用作域控制器或域成员。Samba Wiki 用户文档包含有关如何执行此操作的详细信息。
更多Linux教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Set Up a Samba Share For A Small Organization on Ubuntu 16.04 》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。