SMB (Server Message Block) ,SMB 是一种网络文件共享协议,允许 Windows、macOS 和 Linux 客户端访问服务器上的共享文件夹。我们将使用 Samba 软件包来实现 SMB 服务。

Samba 是一套开源软件套件,它实现了 SMB/CIFS 协议,从而使 Linux 服务器能够与 Windows 客户端进行文件和打印机共享。

1. 安装 Samba

1
2
3
4
5
6
7
8
9
10
# Ubuntu/Debian 系统
sudo apt update
sudo apt install samba
# 完整安装
sudo apt install samba smbclient cifs-utils


# CentOS/RHEL 系统
sudo yum update
sudo yum install samba

在 Ubuntu/Debian 系统上安装 Samba 时,通常会安装一系列核心软件包和相关的依赖,以便提供文件和打印共享服务。主要会安装以下软件包和涉及的服务:

1. 主要安装的软件包 (及其核心二进制文件)

当安装 samba 软件包时,它会作为元包(meta-package)拉取许多重要的依赖包,其中包括:

  • samba-common: 包含 Samba 服务共享的一些通用文件,如默认配置、脚本等。
  • samba-common-bin: 包含一些常用的 Samba 工具,如 testparm
  • smbclient: 提供 Samba/CIFS 客户端功能,用于连接其他 Samba 或 Windows 共享。
  • samba-libs: 核心 Samba 库文件。
  • python3-samba: 用于 Samba 管理工具的 Python 绑定,例如 samba-tool
  • libwbclient0: Samba 的 Winbind 客户端库,用于用户和组信息查询。
  • libsmbclient: Samba 客户端库。
  • samba (主包): 这个包本身包含了 smbdnmbd 守护进程的二进制文件,以及一些用于 AD DC 模式的二进制文件(如 samba 主进程,用于 AD DC)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mugster@mug:~$ apt list --installed | grep samba

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libldb2/noble-updates,now 2:2.8.0+samba4.19.5+dfsg-4ubuntu9.2 amd64 [已安装,自动]
python3-ldb/noble-updates,now 2:2.8.0+samba4.19.5+dfsg-4ubuntu9.2 amd64 [已安装,自动]
python3-samba/noble-updates,now 2:4.19.5+dfsg-4ubuntu9.2 amd64 [已安装,自动]
samba-ad-provision/noble-updates,noble-updates,now 2:4.19.5+dfsg-4ubuntu9.2 all [已安装,自动]
samba-common-bin/noble-updates,now 2:4.19.5+dfsg-4ubuntu9.2 amd64 [已安装,自动]
samba-common/noble-updates,noble-updates,now 2:4.19.5+dfsg-4ubuntu9.2 all [已安装,自动]
samba-dsdb-modules/noble-updates,now 2:4.19.5+dfsg-4ubuntu9.2 amd64 [已安装,自动]
samba-libs/noble-updates,now 2:4.19.5+dfsg-4ubuntu9.2 amd64 [已安装,自动]
samba-vfs-modules/noble-updates,now 2:4.19.5+dfsg-4ubuntu9.2 amd64 [已安装,自动]
samba/noble-updates,now 2:4.19.5+dfsg-4ubuntu9.2 amd64 [已安装]
# 或通过执行以下查看安装了哪些包
dpkg -l | grep samba

2. 默认启用的主要服务

在安装 samba 包后,通常会默认启用并启动以下 Systemd 服务,这些服务是提供文件共享功能所必需的:

  • smbd.service:
    • Samba Daemon (Samba 守护进程)。
    • 这是 Samba 文件服务器的核心服务。它负责处理客户端对共享文件和打印机的实际连接、认证、文件传输等操作。
  • nmbd.service:
    • NetBIOS Name Server Daemon (NetBIOS 名称服务器守护进程)。
    • 它负责处理 NetBIOS 名称注册和解析,使得 Windows 客户端可以通过 NetBIOS 名称(例如 \\YOUR_SAMBA_SERVER)来发现和连接 Samba 服务器,而不是仅仅通过 IP 地址。

3. samba-ad-dc.service 的情况

  • samba-ad-dc.service 是用于 Samba Active Directory 域控制器 模式的服务。
  • 在普通的 apt install samba 操作中,samba-ad-dc.service服务单元文件会被安装,但默认情况下不会启用
  • 除非您执行了 samba-tool domain provision 命令来初始化 Samba AD DC 配置,否则该服务在启动时会因为“启动条件未满足”而失败,并保持 inactive (dead) 状态。
  • 它与 smbd.servicenmbd.service 是互斥的。如果 samba-ad-dc.service 成功运行,它会内置文件共享功能,就不需要 smbdnmbd 再单独运行了。反之,如果只想做文件服务器,就不需要 samba-ad-dc.service

总结:

  • samba 元包: 通过 apt install samba 安装的这个包,实际上是一个“入口点”,它会依赖并拉取所有构建 Samba 完整功能所需的底层库和工具。
  • 核心守护进程: smbdnmbd 是实现传统文件共享的两个主要守护进程。
  • AD DC 模式: Samba 4.x 引入的 AD DC 功能,由一个独立的 samba 主进程(通过 samba-ad-dc.service 管理)来提供,它是一个更复杂、功能更全面的服务,包含了文件共享在内的所有域控制器功能。
  • 服务隔离: 现代 Linux 发行版(特别是使用 Systemd)通过不同的服务单元文件来管理这些功能,以便管理员可以根据需求选择启用哪种模式,避免冲突。对于独立文件服务器,只需确保 smbd.servicenmbd.service 正常运行即可。

因此,当您执行 apt install samba 后,系统会为您准备好运行 Samba 文件服务器所需的所有组件,并且通常会默认尝试启动 smbdnmbd 服务,而 samba-ad-dc.service 则会等待特定的 AD DC 配置才能成功启动。

2. 配置防火墙

如果您的服务器启用了防火墙(如 ufwfirewalld),您需要开放 SMB 服务所需的端口。

1
2
3
4
5
6
# 对于 `ufw` (Ubuntu/Debian)
sudo ufw allow 'Samba'
sudo ufw status # 检查规则是否已添加
# 对于 `firewalld` (CentOS/RHEL)
sudo firewall-cmd --add-service=samba --permanent
sudo firewall-cmd --reload

基于 Samba 4.x 版本

3. smb.conf 配置指令

smb.conf 是 Samba 服务的核心配置文件,它通过丰富的指令来控制 Samba 的行为、共享资源、安全策略等。本指南旨在提供一个全面的 smb.conf 指令参考,帮助您理解和定制 Samba 服务。

smb.conf 文件由多个部分组成,每个部分都用方括号 [] 括起来,代表一个共享或一个配置范围。

  • [global]:全局配置,影响整个 Samba 服务。
  • [homes]:用户主目录共享配置。
  • [printers]:打印机共享配置。
  • [...共享名称]:自定义的文件共享配置。

1. 全局配置指令 ([global])

全局指令定义了 Samba 服务的整体行为,包括网络设置、安全策略和日志。

1.1. 基本网络与服务设置

  • workgroup: 定义 Samba 服务器所属的工作组或域名。
    • 示例: workgroup = WORKGROUP
  • netbios name: 服务器的 NetBIOS 名称。默认为主机名。
    • 示例: netbios name = SAMBA_SERVER
  • server string: 服务器的描述,在网络中可见。%v 会被替换为 Samba 版本。
    • 示例: server string = Samba Server %v
  • server role: 定义 Samba 服务器的角色,如 standalone server独立服务器,不参与任何域domain member加入一个windows AD域,不提供域控制器功能domain controllerSamba作为**域控(AD)**,负责用户/组/认证等。
    • 示例: server role = standalone server
  • interfaces: 绑定到特定的网络接口。
    • 示例: interfaces = 192.168.1.10/24 eth0
  • bind interfaces only: 仅绑定到 interfaces 指定的接口。
    • 示例: bind interfaces only = yes

1.2. 安全与认证

  • security: 定义认证模式。最常见的是 user
    • 示例: security = user
  • passdb backend: 密码数据库后端。tdbsam 是默认且推荐的。
    • 示例: passdb backend = tdbsam
  • encrypt passwords: 是否使用加密密码。必须为 yes
    • 示例: encrypt passwords = yes
  • guest account: 未认证用户使用的访客账户。
    • 示例: guest account = nobody
  • map to guest: 当用户认证失败时,如何处理。bad user 最常用。
    • 示例: map to guest = bad user
  • obey pam restrictions: 是否遵循 PAM 模块的认证限制。
    • 示例: obey pam restrictions = yes

1.3. 日志与调试

  • log file: 日志文件路径。%m 会被替换为客户端的 NetBIOS 名称。
    • 示例: log file = /var/log/samba/log.%m
  • max log size: 日志文件的最大大小(KB)。
    • 示例: max log size = 1000
  • log level: 日志级别,从 0(无日志)到 10(最高级别)。
    • 示例: log level = 3

1.4. 文件与目录权限

  • create mask: 创建文件时的权限掩码。
    • 示例: create mask = 0664
  • directory mask: 创建目录时的权限掩码。
    • 示例: directory mask = 0775
  • force user: 强制所有连接以指定用户身份进行文件操作。
    • 示例: force user = nobody
  • force group: 强制所有连接以指定组身份进行文件操作。
    • 示例: force group = nogroup

2. 共享配置指令 ([...共享名称])

每个共享配置块都定义了一个特定的共享目录的行为。

2.1. 共享目录与描述

  • comment: 对共享的描述。
    • 示例: comment = My Shared Folder
  • path: 共享文件夹在服务器上的绝对路径。
    • 示例: path = /srv/samba/shared_folder
  • browsable: 是否允许在网络中被浏览到。
    • 示例: browsable = yes

2.2. 访问权限与控制

  • read only: 是否为只读共享。yes 表示只读,no 表示可读写。
    • 示例: read only = no
  • writable: 与 read only 相反,通常只用一个。
    • 示例: writable = yes
  • guest ok: 是否允许访客(未经认证的用户)访问。
    • 示例: guest ok = yes
  • valid users: 允许访问此共享的用户列表。
    • 示例: valid users = user1, user2
  • invalid users: 禁止访问此共享的用户列表。
    • 示例: invalid users = root, administrator
  • read list: 具有只读权限的用户/组。
    • 示例: read list = @group_ro
  • write list: 具有读写权限的用户/组。
    • 示例: write list = @group_rw

2.3. 文件与目录权限

这些指令可以覆盖全局设置,仅对当前共享生效。

  • create mask: 对此共享创建文件时的权限掩码。

    • 示例: create mask = 0660
  • directory mask: 对此共享创建目录时的权限掩码。

    • 示例: directory mask = 0770
  • force user: 强制此共享的用户身份。

    • 示例: force user = samba_user
  • force group: 强制此共享的组身份。

    • 示例: force group = samba_group
  • map archive, map hidden, map system: 将文件属性映射为 DOS 属性。

    • 示例: map archive = no

    smb.conf,它定义了两个与 打印共享相关 的共享段:

  1. [printers]:实际打印任务共享(伪共享)
  2. [print$]:用于 Windows 客户端下载打印驱动
  • 向 Windows 客户端 自动提供驱动
  • 实现“Point and Print”功能(客户端无需手动安装驱动)

可选项:远程上传驱动权限(被注释)

1
; write list = root, @lpadmin

如果你希望 允许管理员远程上传打印驱动到该共享,需取消这行注释:

1
write list = root, @lpadmin

同时确保:

  • @lpadmin 是管理打印的系统组(Ubuntu 默认有)
  • /var/lib/samba/printers 目录权限允许这些用户写入:
1
2
sudo chown -R root:lpadmin /var/lib/samba/printers
sudo chmod -R 2775 /var/lib/samba/printers

2.4. 常用共享示例

匿名共享 (访客可读写)

1
2
3
4
5
6
[public_share]
comment = Public Shared Folder
path = /srv/samba/public
guest ok = yes
read only = no
browsable = yes

私有共享 (需要认证)

1
2
3
4
5
6
7
[private_share]
comment = Private Folder for Specific Users
path = /srv/samba/private
valid users = @samba_group, user1
read only = no
guest ok = no
browsable = yes

用户主目录共享 ([homes])

这个特殊的共享用于自动为每个认证用户提供一个共享,指向他们的主目录。

1
2
3
4
[homes]
comment = Home Directories
browsable = no
writable = yes

通常,您不需要手动为每个用户创建共享,只需在 smb.conf 中添加 [homes] 即可。

4. 密码管理

  • smbpasswd -a <username>: 为一个系统用户添加 Samba 密码。
    • 示例: sudo smbpasswd -a samba_user
  • smbpasswd -e <username>: 启用一个 Samba 用户。
    • 示例: sudo smbpasswd -e samba_user
  • smbpasswd -x <username>: 删除一个 Samba 用户。
    • 示例: sudo smbpasswd -x samba_user
  • pdbedit -L: 列出 Samba 密码数据库中的所有用户。
    • 示例: sudo pdbedit -L

smb.conf 是一个高度可定制的配置文件,掌握其指令可以帮助您根据具体需求部署安全、灵活的 SMB 服务。在修改配置后,务必使用 testparm 命令检查语法,并重启 Samba 服务以使更改生效。

5. 一些问题

当配置完服务,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mugster@mug:~/Desktop$ systemctl status samba.service 

○ samba-ad-dc.service - Samba AD Daemon

     Loaded: loaded (/usr/lib/systemd/system/samba-ad-dc.service; enabled; preset: enabled)

     Active: inactive (dead) (Result: exec-condition) since Sat 2025-08-02 16:03:14 CST; 32min ago

  Condition: start condition unmet at Sat 2025-08-02 16:03:14 CST; 32min ago

       Docs: man:samba(8)

             man:samba(7)

             man:smb.conf(5)

    Process: 9915 ExecCondition=/usr/share/samba/is-configured samba (code=exited, status=1/FAILURE)

        CPU: 78ms

systemctl status samba-ad-dc.service 输出显示,Samba AD 守护进程服务处于 inactive (dead) 状态,并且 start condition unmet

这表示 samba-ad-dc.service 没有启动,因为它不符合启动的先决条件。具体来说,ExecCondition=/usr/share/samba/is-configured samba 命令的执行失败了(code=exited, status=1/FAILURE)。

这通常发生在以下情况:

  1. **服务器尚未配置为 Samba Active Directory 域控制器 (AD DC)**:samba-ad-dc.service 是专门用于运行 Samba 作为 Active Directory 域控制器时使用的服务。如果您没有运行 samba-tool domain provision 来完成 AD DC 的配置,这个条件检查就会失败,服务也就无法启动。
  2. AD DC 配置不完整或有误:即使您尝试过配置 AD DC,如果配置过程中出现错误或不完整,也会导致此服务无法启动。
  • 如果想部署 Samba AD 域控制器:需要运行 samba-tool domain provision 命令来初始化域控制器配置。

  • 如果只是想部署一个独立的文件服务器:通常只需要 smbd.servicenmbd.service 这两个服务运行即可。在这种情况下,samba-ad-dc.service 是不需要的,甚至可能与独立文件服务器服务冲突。可能需要禁用 samba-ad-dc.service 并检查 smbd.servicenmbd.service 的状态。

1
2
3
4
5
6
7
8
sudo systemctl disable samba-ad-dc.service
sudo systemctl stop samba-ad-dc.service

sudo systemctl enable smbd.service
sudo systemctl start smbd.service

sudo systemctl enable nmbd.service
sudo systemctl start nmbd.service

6. 完整配置示例

配置 Samba 作为纯文件共享服务器(非域控,适合局域网环境或小型组织/家庭 NAS),提供:

  • 用户/密码访问控制 ✅
  • 访客共享(可选)✅
  • 限定目录共享 ✅
  • Windows 映射网络驱动器兼容 ✅

一、环境假设

你想实现如下功能:

需求配置方式
基础共享目录/srv/share/
有用户权限控制允许用户 alicebob
可选访客访问允许 guest 访问 /srv/guestshare
禁止非授权用户只有指定用户才能访问主共享目录

二、完整配置文件 /etc/samba/smb.conf

编辑该文件前请备份原始文件:

1
2
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
sudo nano /etc/samba/smb.conf

填入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[global]
workgroup = WORKGROUP
server string = Ubuntu Samba Server
netbios name = mugserver
security = user
map to guest = Bad User
server role = standalone server
dns proxy = no

# 支持 Windows 中文路径
unix charset = UTF-8
dos charset = CP936

# 日志
log file = /var/log/samba/log.%m
max log size = 1000

# 不允许 Samba 成为 DC 或成员服务器
local master = yes
preferred master = yes
os level = 33

# ========== 用户共享 ==========
[share]
comment = Private Shared Folder
path = /srv/share
valid users = alice, bob
read only = no
create mask = 0660
directory mask = 0770
force group = sambashare
browseable = yes

# ========== 访客共享 ==========
[guestshare]
comment = Public Folder
path = /srv/guestshare
guest ok = yes
read only = yes
browseable = yes

三、目录权限配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建共享目录
sudo mkdir -p /srv/share /srv/guestshare

# 设置属主属组
sudo groupadd sambashare
sudo usermod -aG sambashare alice
sudo usermod -aG sambashare bob
sudo chown -R root:sambashare /srv/share
sudo chmod -R 2770 /srv/share

# 访客目录
sudo chown -R nobody:nogroup /srv/guestshare
sudo chmod -R 0755 /srv/guestshare

四、添加 Samba 用户

Samba 维护自己的密码数据库,使用 smbpasswd 添加用户:

1
2
sudo smbpasswd -a alice
sudo smbpasswd -a bob

启用 Samba 用户:

1
2
sudo smbpasswd -e alice
sudo smbpasswd -e bob
1
sudo systemctl restart smbd nmbd

查看状态确认:

1
sudo systemctl status smbd

Windows 客户端访问

方式一:资源管理器访问

1
\\mugserver\share

系统会弹出登录窗口,输入:

  • 用户名:alice
  • 密码:你在 smbpasswd 设置的

方式二:映射网络驱动器

  • 打开“此电脑” → 点击“映射网络驱动器”
  • 输入地址 \\<Samba服务器IP>\share
  • 选择“使用其他凭据”
  • 输入用户名和密码(与上面一致)

七、测试访问

在 Ubuntu 本机也可以测试:

1
smbclient //localhost/share -U alice

可选增强

功能简述
通过 ACL 细粒度权限管理比 chmod 更灵活
配置基于 IP 段的访问控制限定公司内部访问
文件审计日志审计谁访问/删除了文件
自动挂载共享目录在客户端开机自动挂载

配置ACL 权限控制自动挂载共享目录(Linux / Windows 客户端)SMB over VPN 的远程访问

7. net usershare

Samba 配置中的两个关键点:usershare allow guests = yesnet usershare。它们都与 Samba 的用户共享 (User Share) 功能有关,特别是与非特权用户创建共享的能力以及访客访问这些共享的方式相关。

1. usershare allow guests = yes (Samba 全局配置)

  • 指令位置: 这个指令位于 Samba 主配置文件 /etc/samba/smb.conf[global] 全局配置部分。
  • 作用: 当设置为 yes 时,它允许由非 root 用户通过 net usershare add 命令创建的用户共享 (user shares) 可以被未经认证的访客访问。
  • 默认值: 通常,此指令的默认值是 no。这意味着即使启用了用户共享功能,这些共享也默认需要用户名和密码才能访问,访客无法直接访问。
  • 安全性考虑: 将此设置为 yes 会降低安全性,因为它允许任何人访问用户创建的共享而无需认证。在生产环境或安全性要求较高的网络中,应谨慎使用此选项,或设置为 no,以确保只有经过身份验证的用户才能访问这些共享。
  • 前提: 这个设置只有在 usershare max shares(用户共享最大数量)或 usershare path(用户共享的根目录)等用户共享相关选项启用时才生效。

示例 (smb.conf[global] 部分):

1
2
3
4
5
6
[global]
# ... 其他全局设置 ...
usershare allow guests = yes
usershare max shares = 100
usershare path = /var/lib/samba/usershares
# ...

2. net usershare (Samba 命令行工具)

net usershare 是一个 Samba 命令行工具,它允许非 root 用户在桌面环境中(例如通过 Nautilus 文件管理器右键点击文件夹共享)或命令行中创建、修改和删除自己的 Samba 共享。这些共享被称为“用户共享”或“非特权共享”,因为它们不是由 root 用户在 smb.conf 中直接定义的,而是由普通用户动态创建的。要使用户共享,前提:

1
2
3
4
5
6
# 不能设置为0,也可以注释掉不设置,最佳实践是显式地设置希望的 usershare max shares 值
usershare max shares = 100
# (可选)如果设置为 yes (推荐),则只有共享目录的所有者才能修改或删除该共享,增加了安全性。
usershare owner only = yes
# 允许由 net usershare 创建的共享可以被未经认证的访客访问。如果设置为 no,则即使用户在创建共享时指定了 guest_ok=y,该共享仍然需要认证。
usershare allow guests = yes

用户共享存储目录的权限:

usershare path 中指定的目录(例如 /var/lib/samba/usershares)必须具有正确的权限,以便普通用户可以在其中创建共享配置文件。

被共享的目录在 Linux 文件系统层面上也必须具有适当的权限,以便 Samba 用户(包括访客用户 nobodynogroup,以及其他 Samba 认证用户)能够访问其内容。通常,该目录的权限需要设置为允许 Samba 服务和创建共享的用户进行操作。

1
2
3
4
5
6
sudo mkdir -p /var/lib/samba/usershares
sudo chmod 1777 /var/lib/samba/usershares
# 或者更安全的,设置组成员权限
chmod 1775 /home/myuser/my_docs
# 并确保相关用户在 sambauser_group 组中
chown myuser:sambauser_group /var/lib/samba/usershares
  • 1777 权限(粘滞位)允许所有用户在目录中创建文件,但只能删除自己创建的文件。这对于共享目录来说是常见的安全设置。

常见的 net usershare 子命令:

  • net usershare add <sharename> <path> [comment] [options]:

    • 用途: 创建一个新的用户共享。

    • <sharename>: 共享的名称(客户端将看到的名称)。

    • <path>: 要共享的本地目录路径。

    • [comment]: 共享的描述。

    • [options]: 可以添加一些共享选项,例如 guest_ok=y (允许访客访问,需要 usershare allow guests = yes 全局设置支持),read_only=y (只读)。

    • 示例: 允许访客读写访问 /home/myuser/public 目录

      1
      net usershare add public_data /home/myuser/public "My Public Share" Everyone:F guest_ok=y

      这里的 Everyone:F 是一个权限字符串,表示对所有人(包括访客)都给予完全控制(Full Control)。

      net usershare add 中的 ACL 格式如下:

      1
      user:[R|F]
      • R:只读(Read-only)
      • F:完全控制(Full-control)
  • net usershare delete <sharename>:

    • 用途: 删除一个已存在的用户共享。

    • 示例:

      1
      net usershare delete public_data
  • net usershare info [sharename]:

    • 用途: 列出所有用户共享的信息,或查看特定共享的详细信息。

    • 示例:

      1
      net usershare info
  • net usershare list:

    • 用途: 简单列出所有用户共享的名称。

用户共享的配置存储位置:

用户通过 net usershare add 命令创建的共享配置信息,通常不会直接写入 /etc/samba/smb.conf。它们通常存储在一个单独的目录中,例如 /var/lib/samba/usershares,每个共享对应一个独立的文件。

  • usershare allow guests = yes 是一个全局开关:它决定了所有由普通用户通过 net usershare 创建的共享,是否有可能被访客访问。如果这个全局开关是 no,那么即使你在 net usershare add 命令中尝试设置 guest_ok=y,该共享仍然需要认证才能访问。
  • net usershare 是用户端创建共享的接口:它允许非 root 用户动态地、无需修改主 smb.conf 文件就能创建共享。这对于桌面用户共享自己的文件非常方便。
  • 权限层级:
    1. 文件系统权限: 用户共享的目录必须具有适当的 Linux 文件系统权限,以便 Samba 用户(包括访客用户 nobodynogroup)能够访问。
    2. Samba 共享权限: net usershare add 命令中的选项(如 guest_ok=y, read_only=y, 以及 ACL 字符串如 Everyone:F)定义了 Samba 层面上的共享访问权限。
    3. 全局控制: usershare allow guests = yes 作为最高级别的全局控制,决定了用户共享的访客访问是否被系统允许。

安全性建议:

  • 在服务器环境中,如果不需要让普通用户随意创建和共享文件夹,或者出于安全考虑,通常会禁用或限制用户共享功能。可以通过设置 usershare max shares = 0 来禁用。
  • 如果允许用户共享,并且需要访客访问,请确保共享目录本身的文件系统权限是安全的,并且仅共享必要的数据。
  • 对于生产服务器,通常建议所有共享都由管理员在 /etc/samba/smb.conf 中显式定义和管理,而不是依赖用户共享。这样可以更好地控制权限和审计。

理解这两个概念,有助于您在部署 Samba 时,区分由管理员集中管理的共享(通过 smb.conf 中的 [sharename] 段)和由普通用户动态创建的共享(通过 net usershare),并根据安全需求进行相应的配置。

如何查看您的 Samba 系统当前使用的有效配置(包括默认值):

您可以使用 testparm 命令来检查 Samba 会话的实际配置,它会显示所有默认值和您自定义的值。

1
testparm -s
  • -s 参数表示“silent”,它会跳过交互式提示,直接打印出配置。

查找相关配置项:

在输出中,应该能够找到 usershare max shares 的有效值。

8.关于打印服务

操作系统打印服务组件功能作用
WindowsPrint Spooler管理打印作业和与打印机通信
LinuxCUPS(Common Unix Printing System)管理打印作业和打印机驱动,支持网络打印

二者是 不同平台下的打印系统核心服务,作用类似,都是实现:

  • 打印任务队列管理
  • 与打印驱动交互
  • 支持本地或网络打印

Windows:

  • 安装打印驱动时,系统会确保 Print Spooler 服务已启用(这是基础服务)。
  • 一般默认已经启用该服务,除非手动禁用或系统精简版本。
1
2
3
4
net stop spooler
net start spooler
# PowerShell
Restart-Service -Name Spooler

Linux:

  • 安装打印驱动(如 HP、Epson 驱动)通常依赖于已安装的 CUPS。
  • 必须明确安装 cups,驱动才能生效。
  • 安装 CUPS 后,一般自动启动 cups.service
1
2
3
4
5
6
7
8
9
10
# 1. 查看是否安装了 cups
dpkg -l | grep cups # Debian/Ubuntu
rpm -qa | grep cups # RHEL/CentOS/Fedora

# 2. 查看服务是否运行
systemctl status cups

# 3. 查看监听端口(默认是 631)
ss -tlnp | grep 631

使用 Samba 提供打印服务

Samba 提供打印服务主要是通过与 CUPS (Common Unix Printing System) 集成来实现的。CUPS 是 Linux 和 macOS 中标准的打印系统。

以下是使用 Samba 提供打印服务的典型步骤:

前提条件:

  1. 安装并配置 CUPS: 确保您的 Linux 服务器上已经安装并配置了 CUPS,并且本地用户可以通过 CUPS 正常打印。您可以通过浏览器访问 http://localhost:631 来管理 CUPS 打印机。
  2. 安装 Samba: 确保已安装 Samba 软件包(smbdnmbd 服务正常运行)。

配置步骤:

  1. 编辑 /etc/samba/smb.conf 文件

    打开 Samba 主配置文件:

    1
    sudo nano /etc/samba/smb.conf
  2. 配置 [global] 全局段

    [global] 段中,添加或修改以下与打印相关的参数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    [global]
    ; ... 其他全局设置 ...

    # 告诉 Samba 使用 CUPS 作为其打印后端
    printing = cups

    # 定义打印机列表的来源。cups 将从 CUPS 系统中获取打印机列表
    printcap name = cups

    # 允许 Samba 自动加载 CUPS 中所有可用的打印机
    load printers = yes

    # 允许客户端浏览打印机列表
    browseable = yes

    # 启用打印服务
    printable = yes

    # 如果您希望所有用户都能匿名打印(不推荐生产环境)
    # guest ok = yes
    ; 或
    # map to guest = Bad User # 配合全局设置允许未认证用户映射为访客

    # Windows 客户端上传打印驱动的目录 (可选,如果希望集中管理驱动)
    ; print drivers = /var/lib/samba/printers
  3. 配置 [printers] 共享段

    Samba 有一个特殊的预定义共享 [printers]。当 load printers = yes 被设置时,Samba 会自动为 CUPS 中检测到的所有打印机创建共享,并使用 [printers] 段中的参数作为这些自动共享的默认配置。

    找到或添加以下 [printers] 段:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [printers]
    comment = All Printers
    path = /var/spool/samba ; 用于存储打印任务的假路径,Windows 客户端不直接访问
    browseable = yes ; 允许在网络中被发现
    guest ok = yes ; 如果您希望访客可以直接打印 (谨慎使用)
    printable = yes ; 允许打印到此共享(必须)
    # 以下选项用于允许 Windows 客户端上传驱动,如果需要集中管理驱动
    ; use client driver = no ; 告诉 Samba 使用服务器端的驱动,而不是客户端驱动 (通常默认会用客户端驱动)
    ; writeable = yes ; 允许写入 (Windows 客户端需要写入驱动)
    ; create mode = 0700 ; 打印队列文件的权限
    ; printer admin = @lpadmin root ; 允许指定用户或组管理打印机,安装驱动等

    注意: path 指令指向的通常是一个临时的假目录,用于存放打印作业。Windows 客户端并不直接访问这个目录,而是通过 Samba 协议向打印机队列发送数据。

  4. 创建打印假脱机目录并设置权限 (如果不存在)

    1
    2
    sudo mkdir -p /var/spool/samba
    sudo chmod 1777 /var/spool/samba # 重要的权限设置,允许所有用户写入

    1777 权限(粘滞位)意味着文件可以由任何人创建,但只能由其所有者或 root 用户删除。

  5. 重启 Samba 服务

    1
    sudo systemctl restart smbd nmbd

客户端连接打印机:

在 Windows 客户端上,可以通过以下方式添加网络打印机:

  • 打开“设备和打印机”。

  • 点击“添加打印机”。

  • 选择“添加网络、无线或 Bluetooth 打印机”。

  • 通常会自动发现 Samba 服务器,然后您可以选择列表中的打印机。

  • 如果未自动发现,可以尝试手动输入 \\您的Samba服务器IP地址\打印机名称

  • Windows 会提示您安装打印机驱动程序。通常情况下,Windows 客户端会使用本地已有的驱动程序,或者需要您手动提供驱动程序。

  • “提供打印服务” 指的是在服务器端,通过 Samba 配置,使得该服务器能够向网络上的其他设备(特别是 Windows 客户端)暴露其连接的打印机,并允许这些设备通过 Samba 协议进行打印。这是服务器的行为。

  • “打印机共享”“提供打印服务”的结果。当服务器成功提供了打印服务后,其上的打印机才能被网络中的其他客户端“共享”并使用。

它们之间的关系可以这样理解:

  1. 如果选择不提供 Samba 打印服务
    • 这意味着在 smb.conf 中没有配置 printing = cupsload printers = yes 等相关参数,或者这些服务被禁用了。
    • 在这种情况下, Linux 服务器虽然可能有本地连接的打印机,并且本地用户可以通过 CUPS 正常使用,但是 Windows 或其他 SMB 客户端将无法通过 Samba 协议发现或连接到这些打印机。 它们之间没有连接的桥梁。
    • 所以,不提供服务就无法实现 Samba 层面上的打印机共享
  2. 如果选择提供 Samba 打印服务
    • 这意味着您正确配置了 smb.conf,并启用了 smbdnmbd 服务。
    • 此时,您的 Samba 服务器就成为了一个打印服务器,它能够将本地的 CUPS 打印机“共享”给网络中的所有兼容 SMB 协议的客户端。