作者选择了 技术教育基金作为 写给捐款计划的一部分接受捐款。
介绍
Samba是 [SMB/CIFS 网络协议](https://msdn.microsoft.com/en-us/library/windows/desktop/aa365233(v=vs.85.aspx)的开源实现,用于 Windows 环境中共享服务,如文件和打印机访问和 Active Directory。
在本指南中,您将安装并配置一个独立的 Samba 服务器,以便为假设的小型组织 Example.com提供网络文件存储或 _shares。
您的 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存储库的最新版本:
1sudo apt-get update
接下来,安装 Samba:
1sudo apt-get install samba
此命令将安装并启动Samba服务器smbd
和Samba NetBIOS服务器nmbd
。nmbd
不需要本教程,因此为了安全,您可以停止并禁用systemctl
:
1sudo systemctl stop nmbd.service
2sudo systemctl disable nmbd.service
sudo systemctl disable nmbd.service
命令在运行时会产生以下输出:
1[secondary_label Output]
2nmbd.service is not a native service, redirecting to systemd-sysv-install
3Executing /lib/systemd/systemd-sysv-install disable nmbd
4insserv: warning: current start runlevel(s) (empty) of script `nmbd' overrides LSB defaults (2 3 4 5).
5insserv: 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 服务器,直到配置细节为止:
1sudo systemctl stop smbd.service
Samba 已安装并准备好配置。
步骤 2:设置 Samba 的全球选项
让我们通过修改位于 /etc/samba/smb.conf 的配置文件来定义 Samba 服务器的行为方式. 这个文件有两个部分:一个
[全球] 部分和一个 [共享] 部分. 一个
[全球] 部分配置了 Samba 服务器的行为,而一个 `[共享] 部分配置了文件共享。
不要直接编辑/etc/samba/smb.conf
,而是将其改名为smb.conf.original
,然后创建一个名为smb.conf
的新文件:
1sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.orig
在编辑 /etc/samba/smb.conf
之前,让我们检查可用的接口,以便告诉 Samba 应该识别哪些接口。
1ip link
1[secondary_label Output]
21: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
3 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
42: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
5 link/ether 02:21:2c:03:ef:e2 brd ff:ff:ff:ff:ff:ff
此输出表示lo
是循环接口,eth0
是外部网络接口,尽管您的外部接口可能有所不同。
让我们开始用nano
或您最喜欢的编辑器编辑此文件:
1sudo nano /etc/samba/smb.conf
该文件的全球
部分将定义服务器的名称、角色和其他细节,包括网络接口:
1[label /etc/samba/smb.conf]
2[global]
3 server string = samba_server
4 server role = standalone server
5 interfaces = lo your_network_interface
6 bind interfaces only = yes
7 disable netbios = yes
8 smb ports = 445
9 log file = /var/log/samba/smb.log
10 max log size = 10000
这些指令规定如下:
服务器串' - 这是在连接期间提供给用户的识别信息. 您可以使用
samba_ server或其他名称来识别您的服务器 。 在整个教学过程中,您可以看到字符串
samba.example.com'来表示该组织的 Samba 份额 example.com。 *服务器角色' - 这定义了 Samba 服务器的创建类型 。 在这种情况下,它是
独立的服务器',即文件共享。 其他服务器类型包括域成员服务器和域控制器.界面 ' - 这些是 Samba 绑定的网络接口 。
lo'是回路接口(127.0.0.1)并需要。 您还需要包含您早些时候输出的外部网络接口 。 这通常是`eth0'。仅限接口' - 这确保了Samba只与 " 界面 " 线上所列的接口相接。 作为一项安全措施,这导致Samba忽略不符合规定的 " 界面 " 的包。 *
残疾网生' - 这将禁用独立服务器中不需要的所有 NetBIOS 功能 。 这样做简化了服务器名称解析过程和运输SMB流量.- " smb ports " - 此设定 Samba 将聆听的端口 。 `445'港是Samba的标准港口。
日志文件
- 此设定 Samba 日志文件的名称和位置 。 *`最大日志大小 ' - 此设定日志文件的大小限制 。 列出的数字以字节表示,等于10MB. 在设定此尺寸限制时, 有些事情需要记住 : 到达后,Samba将生成一个新的日志文件,并用 ".old " 扩展来移动旧内容。 如果再超过限额,现有的 ".old " 文件将被销毁。 这可以防止磁盘/分区空间被单个日志文件的内容所淹没. 因此,您应该定义一个对您的系统资源有意义的文件大小 。 (英语)
如果您想要在设置服务器时进行更详细的日志记录,请将下列行附加到[全球]
部分:
1[label /etc/samba/smb.conf]
2 log level = 3 passdb:5 auth:5
这将日志级别设置为3(info),从默认设置为1增加日志信息的细微性。
保存并关闭文件,当您完成创建此部分。
每当你编辑「smb.conf」时,你应该运行 Samba 实用程序「testparm」来检查没有语法错误:
1testparm
在「smb.conf」文件上运行「testparm」命令会产生以下输出:
1[secondary_label Output]
2Load smb config files from /etc/samba/smb.conf
3Loaded services file OK.
4Server role: ROLE_STANDALONE
5
6Press enter to see a dump of your service definitions
点击ENTER
将产生以下输出:
1[secondary_label Output]
2# Global parameters
3[global]
4 server string = samba_server
5 interfaces = lo your_network_interface
6 bind interfaces only = Yes
7 server role = standalone server
8 log file = /var/log/samba/smb.log
9 max log size = 10000
10 smb ports = 445
11 disable netbios = Yes
12 idmap config * : backend = tdb
如果testparm
报告已加载服务文件是对的
,那么没有语法错误会阻止 Samba 服务器启动。
配置[全球]
部分是启动 Samba 服务器所需的一切。然而,其功能将没有共享配置而受到限制。 共享由两个部分组成,一个用户和一个目录,这两个部分都必须创建和配置以允许登录和测试。 下一个部分将解释如何创建可以访问共享的用户。
步骤三:创建用户
在此步骤中,我们将创建可以访问共享的用户,他们将需要作为 Samba 和系统用户访问,以便在登录并阅读和写入文件系统时通过 Samba 服务器进行身份验证。
在假设公司 Example.com中,有四名员工需要被添加到Samba服务器上,并在Linux系统上创建为用户: david, mike, jane和 lucy. 除了这四个,还会有一个 admin用户,他将能够访问和管理个人共享。
添加系统用户的第一个步骤是为每个用户创建主目录,而不是使用在/home/user
的标准主目录,Samba目录和数据将位于/samba/
。
<$>[注] **注:**本指南中创建的用户不打算有SSH登录. 如果您的用户已经在服务器上有帐户,您应该为他们创建一个专用的Samba用户,以遵循本指南。
下一节将解释添加第一个用户 david的过程,但您需要对 mike、 jane 和 lucy 重复这个过程。
第一步是创建将 Samba 数据存储在文件系统的根部的目录,该目录将被命名为 /samba/
,其组所有权将被设置为 `sambashare',一个创建在安装 Samba 时的组。
运行以下命令来创建 /samba/
目录,并将组所有权设置为 `sambashare’:
1sudo mkdir /samba/
2sudo chown :sambashare /samba/
接下来,在 /samba/
目录下创建 david 的主目录:
1sudo mkdir /samba/david
现在,用以下命令作为系统用户添加 david:
1sudo adduser --home /samba/david --no-create-home --shell /usr/sbin/nologin --ingroup sambashare david
选项做如下:
--home
- 此设置了用户主目录的位置。--no-create-home
- 这阻止了adduser命令创建 **david**的主目录。如果系统创建了此目录,它将充满了当前设置不需要的配置文件,如
.bash_history`。--shell
- 此设置将使 shell david在 SSH 登录时分配给用户。 访问 Samba 份额时不需要 SSH 登录;此设置为/usr/sbin/nologin
将禁用 SSH 登录。
当您运行此命令时,您将被要求提供密码,选择一个10个或更多字符的独特的非字典密码。
现在系统用户 ** david** 已经存在,您可以在他的 Samba 主目录中设置所有权和权限:
1sudo chown david:sambashare /samba/david/
2sudo chmod 2770 /samba/david/
将目录的权限设置为2770
意味着在/samba/david/
下创建的新文件或目录将继承主目录的组所有权,而不是创建文件或目录的用户的主要组。
接下来,在 Samba 服务器中添加 david。 Samba 保留了自己的用户和密码数据库,用于验证登录。 为了登录,所有用户必须被添加到 Samba 服务器并启用。 执行以下smbpasswd
命令来完成这两个任务:
1sudo smbpasswd -a david
2sudo smbpasswd -e david
在这里使用的选项是如下:
-a
- 这将用户添加到 Samba 服务器中,而不允许他们。-e
- 这将允许之前添加的用户。
您在这里输入的密码将用于访问 Samba 共享,并可能与系统密码不同。
用户 david现在作为一个系统用户而没有进入服务器的SSH的能力。他有一个主目录在 /samba/david
,并注册并启用作为一个Samba用户。
对于每个 Samba 用户(mike, jane和 lucy)重复这个过程。
要创建 admin用户,请通过以下命令运行,将主目录更改为 /samba/everyone/
:
1sudo mkdir /samba/everyone
2sudo adduser --home /samba/everyone --no-create-home --shell /usr/sbin/nologin --ingroup sambashare admin
3sudo chown admin:sambashare /samba/everyone/
4sudo chmod 2770 /samba/everyone/
5sudo smbpasswd -a admin
6sudo smbpasswd -e admin
除了创建 admin用户之外,我们还可以创建一个名为 admins的组,以便更容易管理服务器。 通过对每个共享的阅读和写入权限,这个组可以简化添加和删除用户的工作。 例如,如果个别用户作为 admin用户,然后离开组织,他们需要从每个共享中单独删除。
执行以下命令创建一个名为 admins的新组,并将用户 admin添加到该组:
1sudo groupadd admins
2sudo usermod -G admins admin
可以通过运行第二个命令,‘sudo usermod -G admins admin’,并代替另一个用户而不是‘admin’,添加额外的用户到 admins组。
现在,系统配置已经完成,组织 Example.com的用户被设置为系统和Samba用户。
步骤 4 – 配置 Samba 份额
每个共享将有自己的部分在主 Samba 配置文件, `/etc/samba/smb.conf,根据全球参数。
使用nano
文本编辑器再次打开和编辑此文件:
1sudo nano /etc/samba/smb.conf
以下配置块将定义每个用户的个人份额:
1[label /etc/samba/smb.conf]
2...
3[share_name]
4 path =
5 browseable =
6 read only =
7 force create mode =
8 force directory mode =
9 valid users =
这些选项包括:
share_name
- 这是您在登录时使用的共享名称。path
- 这是文件系统中共享的绝对路径。browsable
- 这决定了其他用户是否能够看到共享。 启用此选项只允许 Samba 服务器的其他用户看到共享的存在。 它不授予任何读取或写入权限。只读
- 这决定了有效用户
是否能够写入共享。强制创建模式
- 这强制了任何写给共享的文件的权限。强制目录模式
- 这强制了在共享中创建的任何目录的权限。- `有效用户
添加以下共享配置块,定义其主目录、该目录的组所有权权限以及应该访问其共享的用户:
1[label /etc/samba/smb.conf]
2[david]
3 path = /samba/david
4 browseable = no
5 read only = no
6 force create mode = 0660
7 force directory mode = 2770
8 valid users = david @admins
请注意,目录权限将组所有权设置为母目录的所有权。
创建 mike, jane和 lucy的共享区块,只更改名称
、路径
和有效用户
的共享,以反映每个用户的姓名。
[每个人]
共享将不同于其他[名称]
,路径
,有效用户
和可浏览
选项,并将看起来如下:
1[label /etc/samba/smb.conf]
2...
3[everyone]
4 path = /samba/everyone
5 browseable = yes
6 read only = no
7 force create mode = 0660
8 force directory mode = 2770
9 valid users = @sambashare @admins
允许「sambashare」组读写访问共享,允许所有用户访问共享,因为他们在创建时被添加到该组。
完整的「smb.conf」檔案將看起來像這樣:
1[label /etc/samba/smb.conf]
2[global]
3 server string = samba_server
4 server role = standalone server
5 interfaces = lo your_network_interface
6 bind interfaces only = yes
7 disable netbios = yes
8 smb ports = 445
9 log file = /var/log/samba/smb.log
10 max log size = 10000
11
12[david]
13 path = /samba/david
14 browseable = no
15 read only = no
16 force create mode = 0660
17 force directory mode = 2770
18 valid users = david @admins
19
20[mike]
21 path = /samba/mike
22 browseable = no
23 read only = no
24 force create mode = 0660
25 force directory mode = 2770
26 valid users = mike @admins
27
28[jane]
29 path = /samba/jane
30 browseable = no
31 read only = no
32 force create mode = 0660
33 force directory mode = 2770
34 valid users = jane @admins
35
36[lucy]
37 path = /samba/lucy
38 browseable = no
39 read only = no
40 force create mode = 0660
41 force directory mode = 2770
42 valid users = lucy @admins
43
44[everyone]
45 path = /samba/everyone
46 browseable = yes
47 read only = no
48 force create mode = 0660
49 force directory mode = 2770
50 valid users = @sambashare @admins
保存并关闭文件,当你完成编辑。
再次测试配置:
1testparm
这将产生看起来如下的输出:
1[secondary_label Output]
2Load smb config files from /etc/samba/smb.conf
3rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
4Processing section "[david]"
5Processing section "[jane]"
6Processing section "[mike]"
7Processing section "[lucy]"
8Processing section "[everyone]"
9Loaded services file OK.
10Server role: ROLE_STANDALONE
11
12Press enter to see a dump of your service definitions
完成配置检查后,让我们用systemctl
启动 Samba 服务器:
1sudo systemctl start smbd.service
Samba 服务器现在运行并准备接受登录。下一步是登录 Samba 服务器,以测试它是否按预期工作。
步骤 5 – 登录到 Samba 服务器
在本节中,我们将介绍如何访问我们从 Linux、Windows 和 macOS 创建的 Samba 共享。
Linux - 命令线
您可以使用名为smbclient
的工具从命令行访问 Samba. 此包在大多数Linux发行版上默认不包含,因此您需要在本地的包管理器上安装它。
在 Debian 和 Ubuntu 服务器上,使用以下命令安装smbclient
:
1sudo apt-get update
2sudo apt-get install smbclient
在 Fedora 系统上,使用以下方法:
1sudo dnf update
2sudo samba-client
关于百度:
1sudo yum update
2sudo yum install samba-client
<$>[注]
注: 在某些Linux发行版中,smbclient
会出现以下错误消息:
1[secondary_label Output]
2smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
如果您看到此错误消息,请确保您已在 /etc/samba/smb.conf
创建该文件。
smbclient
使用以下格式访问 Samba 共享:
1smbclient //your_samba_hostname_or_server_ip/share -U username
您可以使用您的服务器的 IP 或您在 `/etc/samba/smb.conf 中定义的主机名来访问共享。
1smbclient //samba.example.com/david -U david
如果 david想要访问共同共享(‘每个人’),请将命令更改为:
1smbclient //samba.example.com/everyone -U david
在运行smbclient
命令后,您将被提示使用 Samba 密码并登录到一个类似 FTP 文本接口的命令行界面:
1smb: \>
此界面最有用的是测试用户名和密码以及读写访问,例如,您可以创建一个目录并列出其内容如下:
1mkdir test
2ls
你应该看到以下结果:
1[secondary_label Output]
2 . D 0 Fri Feb 2 14:49:01 2018
3 .. D 0 Wed Jan 24 12:11:33 2018
4 test D 0 Fri Feb 2 14:49:01 2018
通过键入删除目录:
1rmdir test
在共享中管理数据通常更容易使用 GUI 工具,下一节将探讨 KDE 的内置 GUI 工具。
Linux - KDE 與 Dolphin
Dolphin 是 KDE 的默认文件管理器,具有内置的功能来访问 Samba 共享。
打开 Dolphin 后,请执行以下步骤:
- 从
位置
列表中选择网络
选项。 2 点击添加网络文件夹
选项。
3. Select the Microsoft Windows network drive option.
4. Click Next
5. Enter the details for the Samba share:
- Name - 这是一个可记忆的名称,将显示为Dolphin的页面标记。
- Server - 这是Samba服务器的托管名称或IP地址. 在本示例中,它将是
samba.example.com
. - Folder - 这是在
smb.conf
中设置的份额的名称。
- 点击 ** 保存和连接**.
- 输入您要访问 Samba 共享的用户的用户名和密码。
- 点击 OK.
Dolphin 现在将连接并打开 Samba 共享,它将看起来像这样:
现在您可以使用 Samba 共享,就像是本地目录来复制、删除和更名文件和目录一样。
macOS - 命令行
macOS 配备了预先安装的命令行工具,您可以使用它们访问 Samba 共享. 使用 Launchpad 打开终端,点击 Terminal 图标。
这将打开您的主目录中的命令行终端。为了安装 Samba 共享,您可以创建一个新的目录,该目录将作为该共享的安装点。
创建一个名为samba
的新目录:
1mkdir samba
接下来,在新的samba
目录下安装 Samba 共享。
1sudo mount_smbfs //username@your_samba_hostname_or_server_ip/share ./mount_point
将 Example.com 的细节替换为用户 David 看起来像这样:
1sudo mount_smbfs //[email protected]/david ./samba
samba
目录现在将显示在 Example.com Samba 服务器上的 david 共享的内容. 文件和目录可以通过ls
、rm
和mkdir
等正常工具进行操作;但是,在共享被安装后,samba
目录将由 root 拥有。
要卸载 Samba 共享,请从您运行mkdir
命令的相同目录中运行上
命令:
1umount samba
下一节将讨论使用 macOS 的桌面 GUI 应用程序访问 Samba 共享。
MacOS - 桌面
macOS 还可以使用 Finder 应用程序访问 Samba 共享。
采取以下步骤:
- 打开 Finder并点击 Go在菜单栏中。
- 从选项列表中点击 连接到服务器。
- 使用一个包含您的用户名、主机名或服务器 IP 和您的共享名称的
smb://username@your_samba_hostname_or_server_ip/share
格式的 URL。
In the example shown here, you will see the username david and the hostname samba.example.com
.
4. Bookmark the Samba share by clicking on the button with a + symbol.
5. Click Connect
6. Select Registered User
7. Enter the username and password for the Samba share user.
8. Decide if you would like macOS to store the password.
9. Click Connect.
成功连接到 Samba 共享后,它将如下所示出现在 Finder 中:
下一节将探讨如何从 Windows 10 访问 Samba 共享。
Windows 10 - 命令行
从 Windows 命令行组合 Samba 共享只需要一个命令:
1net use drive_letter \\your_samba_hostname_or_server_ip\share
取代用户 david的份额中的变量,并将驱动字母设置为 X:
:
1net use X: \\samba.example.com\david
当这个命令被输入时,您将被要求提供 David的用户名和密码. 输入后,您将收到一个确认共享已成功安装:
1[secondary_label Output]
2Enter the user name for 'samba.example.com': david
3Enter the password for samba.example.com:
4The command completed successfully.
您现在将能够浏览 File Explorer 中的 Samba 共享,并操纵文件和目录,仿佛它们是本地的计算机。
下一节将讨论使用 Windows GUI 工具来访问 Samba 共享。
Windows 10 - 桌面
Windows 10 还具有连接到 Samba 共享的原始功能。以下步骤将使您连接到您的 Samba 共享,并使用 Windows 文件浏览器将其保留为标记。
- 右键单击 此 PC.
- 单击 ** 添加网络位置**,然后在下面的页面上单击 ** 下一步**。
3. Click on Choose a custom network location.
4. Click Next
5. Enter the Windows style address of the Samba server and the share name. Windows uses the following form of a Samba URL:
\\your_samba_hostname_or_server_ip\share\
.
In the example image the server name is samba.example.com
and the share name is david
: \\samba.example.com\david
.
6. Click Next.
7. Enter the username and password for the user.
8. Decide whether or not you want Windows to remember the password.
9. Click OK.
文件浏览器现在将连接到 Samba 共享. 一旦连接成功完成,在文件浏览器中将创建一个新的位置 This PC:
您现在可以使用此文件夹来管理 Samba 共享中的文件和文件夹,就像是本地文件夹一样。
结论
在本文中,您使用 Samba 服务器创建了跨平台的在线文件共享,您还从 Windows、Linux 和 macOS 访问了这些共享。
Samba 共享已经变得如此普遍,以至于许多应用程序能够访问存储在它们中的数据。这些应用程序可以扩展您的 Samba 共享的功能和实用性。例如,移动版本的媒体播放器 VLC可以连接到并从您的 Samba 共享中流音乐和视频。 要访问它,请选择 open MRL 并使用标准的 Samba URL: smb://username@your_samba_host_nameor_server_ip/share
。 您也可以使用 Samba 共享作为跨平台备份工具 BackupPC的目的地。
除了作为一个简单的文件共享,Samba可以使用Windows Active Directory作为域控制器或域的成员。