linux-tutorial 实战:Samba 跨平台文件共享服务的安装配置与排错指南
【免费下载链接】linux-tutorial:penguin: Linux教程,主要内容:Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial
Samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的开源免费软件,它让 Linux 服务器可以将目录以「网络共享」的形式暴露给 Windows、macOS 等异构操作系统。本文基于 linux-tutorial 项目中的 Samba 应用 文档展开,以一个完整的「共享 /share/fs 目录」实战示例为主线,覆盖 Samba 的安装、smb.conf 全量参数详解、用户管理、防火墙与 SELinux 排错,并结合作者仓库内的运维脚本来印证生产环境中的常规操作。
1. Samba 能做什么:跨系统的文件共享协议
Samba 实现了 SMB/CIFS 协议,提供了在不同计算机(即使操作系统不同)上共享服务的能力。其典型应用场景包括:
- 让 Windows 客户端直接通过资源管理器访问 Linux 服务器上的文件目录(形如
\\192.168.x.x\fs); - 让 macOS 客户端通过 Finder 访问共享(形如
smb://192.168.x.x/fs); - 在同一工作组的异构网络内提供统一的文件访问入口。
在整个 linux-tutorial 仓库中,Samba 属于「Linux 运维」章节的典型应用之一,与 NTP、Firewalld、Iptables 等共同构成日常系统运维知识体系,详见 Linux 系统运维索引。
2. 安装与基础配置:以共享 /share/fs 为例
本节以一个完整的示例演示如何配置 Samba 实现 Linux 与 Windows 的文件共享。目标:假设希望共享 Linux 服务器上的/share/fs目录。
2.1 查看是否已经安装 Samba
不同发行版使用不同的包管理查询方式:
- CentOS:
rpm -qa | grep samba - Ubuntu:
dpkg -l | grep samba
2.2 安装 Samba 工具
- CentOS:
yum install -y samba samba-client samba-common - Ubuntu:
sudo apt-get install -y samba samba-client
其中samba-client提供smbclient等客户端工具,后面的「测试 Samba 服务」环节会用到;samba-common提供公共配置与文档。
2.3 配置 Samba
Samba 服务的配置文件是/etc/samba/smb.conf,如果没有该文件则 Samba 无法启动。执行以下命令编辑配置文件:
vim /etc/samba/smb.conf修改配置如下:
[global] workgroup = SAMBA security = user passdb backend = tdbsam printing = cups printcap name = cups load printers = yes cups options = raw [homes] comment = Home Directories valid users = %S, %D%w%S browseable = No read only = No inherit acls = Yes [printers] comment = All Printers path = /var/tmp printable = Yes create mask = 0600 browseable = No [print$] comment = Printer Drivers path = /var/lib/samba/drivers write list = @printadmin root force group = @printadmin create mask = 0664 directory mask = 0775 [fs] comment = share folder path = /share/fs browseable = yes writable = yes read only = no guest ok = yes create mask = 0777 directory mask = 0777 public = yes valid users = root关于这段配置的几点说明:
[global]是全局配置段;[homes]、[printers]、[print$]是系统内置的特殊共享;这里额外添加的[fs]标签,才是真正用于共享文件目录的区域;path属性被设置为/share/fs,意味着准备共享/share/fs目录,需要根据实际需要修改路径。/share/fs目录的权限要设置为777:chmod 777 /share/fs;browseable、writable、read only等属性用于配置共享目录的访问权限,含义直观(是否可浏览、是否可写、是否只读);valid users指定允许访问的用户,注意该用户必须是 Linux 机器上实际存在的用户;create mask/directory mask用于控制新建文件与目录的权限位,示例中设为 0777 以便 Windows 客户端自由读写。
2.4 创建 Samba 用户
创建的 Samba 用户必须是 Linux 机器上实际存在的用户(即先有系统账号,再为其设置 Samba 密码):
$ sudo smbpasswd -a root New SMB password: Retype new SMB password: Added user root.根据提示输入 Samba 用户的密码。当 Samba 服务成功安装、启动后,通过 Windows 系统访问机器共享目录时,就要输入这里配置的用户名、密码。
常用的用户管理命令:
- 查看 Samba 服务器中已拥有哪些用户:
pdbedit -L - 删除 Samba 服务中的某个用户:
smbpasswd -x 用户名
2.5 启动 Samba 服务
不同系统的服务管理方式不同:
CentOS 6
$ sudo service samba restart # 重启 samba $ sudo service smb restart # 重启 sambaCentOS 7(推荐使用 systemctl)
$ sudo systemctl start smb.service # 启动 samba $ sudo systemctl restart smb.service # 重启 samba $ sudo systemctl enable smb.service # 设置开机自动启动 $ sudo systemctl status smb.service # 查询 samba 状态Ubuntu 16.04.3
$ sudo service smbd restart关于 systemd 的更多用法(enable/disable/start/stop/restart/status 等),可参考仓库中的 systemd 运维文档。
2.6 为 Samba 添加防火墙规则
$ sudo firewall-cmd --permanent --zone=public --add-service=samba $ sudo firewall-cmd --reload第一条命令将 samba 服务(即 137/138/139/445 等端口)永久加入 public 区域的放行规则,第二条命令让规则立即生效。firewall-cmd的更多用法(如--list-ports、--query-port、按端口放行--add-port=445/tcp --permanent等)参见仓库中的 Firewalld 文档。
2.7 测试 Samba 服务
$ smbclient //localhost/fs -U root输入 Samba 用户的密码,如果成功,就会进入smb: \>交互提示符,此时即可用ls、put、get等命令测试共享目录的读写。
2.8 访问 Samba 服务共享的目录
- Windows:在资源管理器地址栏访问
\\<你的ip>\<你的共享路径>,例如\\192.168.1.100\fs; - macOS:与 Windows 类似,直接在 Finder 中访问
smb://<你的ip>/<你的共享路径>即可。
如果客户端与服务器处于不同网段或出现域名解析问题,可先参照仓库中的 网络运维文档 检查/etc/hosts与/etc/resolv.conf的网络配置。
3. smb.conf 配置详解
smb.conf是整个 Samba 的核心,分为[global]全局参数段与若干[共享名]共享参数段。理解每一个参数,才能在生产环境里准确控制访问权限与行为。
3.1 Samba 默认配置
安装完成后,/etc/samba/smb.conf会包含一份默认配置。建议先备份再使用:
$ cp /etc/samba/smb.conf /etc/samba/smb.conf.bak一份典型的默认smb.conf内容如下:
[global] workgroup = SAMBA security = user passdb backend = tdbsam printing = cups printcap name = cups load printers = yes cups options = raw [homes] comment = Home Directories valid users = %S, %D%w%S browseable = No read only = No inherit acls = Yes [printers] comment = All Printers path = /var/tmp printable = Yes create mask = 0600 browseable = No [print$] comment = Printer Drivers path = /var/lib/samba/drivers write list = root create mask = 0664 directory mask = 07753.2 全局参数 [global]
[global] config file = /usr/local/samba/lib/smb.conf.%m说明:config file可以让你使用另一个配置文件来覆盖缺省的配置文件。如果文件不存在,则该项无效。这个参数很有用,可以使得 Samba 配置更灵活,可以让一台 Samba 服务器模拟多台不同配置的服务器。比如,你想让 PC1(主机名)这台电脑在访问 Samba Server 时使用它自己的配置文件,那么先在/etc/samba/host/下为 PC1 配置一个名为smb.conf.pc1的文件,然后在smb.conf中加入:config file=/etc/samba/host/smb.conf.%m。这样当 PC1 请求连接 Samba Server 时,smb.conf.%m就被替换成smb.conf.pc1。这样,对于 PC1 来说,它所使用的 Samba 服务就是由smb.conf.pc1定义的,而其他机器访问 Samba Server 则还是应用smb.conf。
workgroup = WORKGROUP说明:设定 Samba Server 所要加入的工作组或者域。
server string = Samba Server Version %v说明:设定 Samba Server 的注释,可以是任何字符串,也可以不填。宏%v表示显示 Samba 的版本号。
netbios name = smbserver说明:设置 Samba Server 的 NetBIOS 名称。如果不填,则默认会使用该服务器的 DNS 名称的第一部分。netbios name和workgroup名字不要设置成一样了。
interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24说明:设置 Samba Server 监听哪些网卡,可以写网卡名,也可以写该网卡的 IP 地址。
hosts allow = 127.192.168.1 192.168.10.1说明:表示允许连接到 Samba Server 的客户端,多个参数以空格隔开。可以用一个 IP 表示,也可以用一个网段表示。hosts deny与hosts allow刚好相反。例如:
# 表示容许来自172.17.2.*.*的主机连接,但排除172.17.2.50 hosts allow = 172.17.2.EXCEPT172.17.2.50 # 表示容许来自172.17.2.0/255.255.0.0子网中的所有主机连接 hosts allow = 172.17.2.0/255.255.0.0 # 表示容许来自M1和M2两台计算机连接 hosts allow = M1,M2 # 表示容许来自SC域的所有计算机连接 hosts allow = @SCmax connections = 0说明:max connections用来指定连接 Samba Server 的最大连接数目。如果超出连接数目,则新的连接请求将被拒绝。0 表示不限制。
deadtime = 0说明:deadtime用来设置断掉一个没有打开任何文件的连接的时间,单位是分钟,0 代表 Samba Server 不自动切断任何连接。
time server = yes/no说明:time server用来设置让 nmdb 成为 Windows 客户端的时间服务器。
log file = /var/log/samba/log.%m说明:设置 Samba Server 日志文件的存储位置以及日志文件名称。在文件名后加个宏%m(主机名),表示对每台访问 Samba Server 的机器都单独记录一个日志文件。如果 pc1、pc2 访问过 Samba Server,就会在/var/log/samba目录下留下log.pc1和log.pc2两个日志文件。
max log size = 50说明:设置 Samba Server 日志文件的最大容量,单位为 kB,0 代表不限制。
security = user说明:设置用户访问 Samba Server 的验证方式,一共有四种验证方式:
share:用户访问 Samba Server 不需要提供用户名和口令,安全性能较低;user:Samba Server 共享目录只能被授权的用户访问,由 Samba Server 负责检查账号和密码的正确性,账号和密码要在本 Samba Server 中建立(当前版本的主流默认模式);server:依靠其他 Windows NT/2000 或 Samba Server 来验证用户的账号和密码,是一种代理验证。此种安全模式下,系统管理员可以把所有的 Windows 用户和口令集中到一个 NT 系统上,使用 Windows NT 进行 Samba 认证,远程服务器可以自动认证全部用户和口令,如果认证失败,Samba 将使用用户级安全模式作为替代的方式;domain:域安全级别,使用主域控制器(PDC)来完成认证。
passdb backend = tdbsam说明:passdb backend就是用户后台的意思。目前有三种后台:smbpasswd、tdbsam和ldapsam。sam 应该是 security account manager(安全账户管理)的简写。
smbpasswd:该方式是使用 SMB 自己的工具smbpasswd来给系统用户(真实用户或者虚拟用户)设置一个 Samba 密码,客户端就用这个密码来访问 Samba 的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件;tdbsam:该方式则是使用一个数据库文件来建立用户数据库。数据库文件叫passdb.tdb,默认在/etc/samba目录下。passdb.tdb用户数据库可以使用smbpasswd -a来建立 Samba 用户,不过要建立的 Samba 用户必须先是系统用户。也可以使用pdbedit命令来建立 Samba 账户,pdbedit命令的参数很多,这里列出几个主要的:pdbedit -a username:新建 Samba 账户;pdbedit -x username:删除 Samba 账户;pdbedit -L:列出 Samba 用户列表,读取passdb.tdb数据库文件;pdbedit -Lv:列出 Samba 用户列表的详细信息;pdbedit -c "[D]" -u username:暂停该 Samba 用户的账号;pdbedit -c "[]" -u username:恢复该 Samba 用户的账号;
ldapsam:该方式则是基于 LDAP 的账户管理方式来验证用户。首先要建立 LDAP 服务,然后设置passdb backend = ldapsam:ldap://LDAP Server。
encrypt passwords = yes/no说明:是否将认证密码加密。因为现在 Windows 操作系统都是使用加密密码,所以一般要开启此项。不过配置文件默认已开启。
smb passwd file = /etc/samba/smbpasswd说明:用来定义 Samba 用户的密码文件。smbpasswd文件如果没有那就要手工新建。
username map = /etc/samba/smbusers说明:用来定义用户名映射,比如可以将root换成administrator、admin等。不过要事先在smbusers文件中定义好。比如:root = administrator admin,这样就可以用administrator或admin这两个用户来代替root登陆 Samba Server,更贴近 Windows 用户的使用习惯。
guest account = nobody说明:用来设置 guest 用户名。
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192说明:用来设置服务器和客户端之间会话的 Socket 选项,可以优化传输速度。
domain master = yes/no说明:设置 Samba 服务器是否要成为网域主浏览器,网域主浏览器可以管理跨子网域的浏览服务。
local master = yes/no说明:local master用来指定 Samba Server 是否试图成为本地网域主浏览器。如果设为no,则永远不会成为本地网域主浏览器。但是即使设置为yes,也不等于该 Samba Server 就能成为主浏览器,还需要参加选举。
preferred master = yes/no说明:设置 Samba Server 一开机就强迫进行主浏览器选举,可以提高 Samba Server 成为本地网域主浏览器的机会。如果该参数指定为yes时,最好把domain master也指定为yes。使用该参数时要注意:如果在本 Samba Server 所在的子网有其他的机器(不论是 Windows NT 还是其他 Samba Server)也指定为首要主浏览器时,那么这些机器将会因为争夺主浏览器而在网络上大发广播,影响网络性能。如果同一个区域内有多台 Samba Server,将上面三个参数设定在一台即可。
os level = 200说明:设置 Samba 服务器的os level。该参数决定 Samba Server 是否有机会成为本地网域的主浏览器。os level从 0 到 255,winNT 的os level是 32,win95/98 的os level是 1,Windows 2000 的os level是 64。如果设置为 0,则意味着 Samba Server 将失去浏览选择。如果想让 Samba Server 成为 PDC,那么将它的os level值设大些。
domain logons = yes/no说明:设置 Samba Server 是否要做为本地域控制器。主域控制器和备份域控制器都需要开启此项。
logon script = %u.bat说明:当使用者用 Windows 客户端登陆,那么 Samba 将提供一个登录脚本(原文写作logon . = %u.bat,实际常见写法为logon script = %u.bat)。如果设置成%u.bat,那么就要为每个用户提供一个登录脚本。如果人比较多,那就比较麻烦。可以设置成一个具体的文件名,比如start.bat,那么用户登陆后都会去执行start.bat,而不用为每个用户设定一个登录脚本了。这个文件要放置在[netlogon]的path设置的目录路径下。
wins support = yes/no说明:设置 Samba 服务器是否提供 WINS 服务。
wins server = wins服务器IP地址说明:设置 Samba Server 是否使用别的 WINS 服务器提供 WINS 服务。
wins proxy = yes/no说明:设置 Samba Server 是否开启 WINS 代理服务。
dns proxy = yes/no说明:设置 Samba Server 是否开启 DNS 代理服务。
load printers = yes/no说明:设置是否在启动 Samba 时就共享打印机。
printcap name = cups说明:设置共享打印机的配置文件。
printing = cups说明:设置 Samba 共享打印机的类型。现在支持的打印系统有:bsd、sysv、plp、lprng、aix、hpux、qnx。
3.3 共享参数 [共享名]
[共享名] comment = 任意字符串说明:comment是对该共享的描述,可以是任意字符串。
path = 共享目录路径说明:path用来指定共享目录的路径。可以用%u、%m这样的宏来代替路径里的 unix 用户和客户机的 Netbios 名,用宏表示主要用于[homes]共享域。例如:如果我们不打算用 home 段做为客户的共享,而是在/home/share/下为每个 Linux 用户以他的用户名建个目录,作为他的共享目录,这样path就可以写成:path = /home/share/%u;。用户在连接到这共享时具体的路径会被他的用户名代替,要注意这个用户名路径一定要存在,否则,客户机在访问时会找不到网络路径。同样,如果我们不是以用户来划分目录,而是以客户机来划分目录,为网络上每台可以访问 Samba 的机器都各自建个以它的 netbios 名的路径,作为不同机器的共享资源,就可以这样写:path = /home/share/%m。
browseable = yes/no说明:browseable用来指定该共享是否可以浏览。
writable = yes/no说明:writable用来指定该共享路径是否可写。
available = yes/no说明:available用来指定该共享资源是否可用。
admin users = 该共享的管理者说明:admin users用来指定该共享的管理员(对该共享具有完全控制权限)。在 Samba 3.0 中,如果用户验证方式设置成security=share时,此项无效。例如:admin users = bobyuan,jane(多个用户中间用逗号隔开)。
valid users = 允许访问该共享的用户说明:valid users用来指定允许访问该共享资源的用户。例如:valid users = bobyuan,@bob,@tech(多个用户或者组中间用逗号隔开,如果要加入一个组就用@+组名表示)。
invalid users = 禁止访问该共享的用户说明:invalid users用来指定不允许访问该共享资源的用户。例如:invalid users = root,@bob(多个用户或者组中间用逗号隔开)。
write list = 允许写入该共享的用户说明:write list用来指定可以在该共享下写入文件的用户。例如:write list = bobyuan,@bob。
public = yes/no说明:public用来指定该共享是否允许 guest 账户访问。
guest ok = yes/no说明:意义同public。
几个特殊共享:
[homes] comment = Home Directories browseable = no writable = yes valid users = %S ; valid users = MYDOMAIN\%S [printers] comment = All Printers path = /var/spool/samba browseable = no guest ok = no writable = no printable = yes [netlogon] comment = Network Logon Service path = /var/lib/samba/netlogon guest ok = yes writable = no share modes = no [Profiles] path = /var/lib/samba/profiles browseable = no guest ok = yes[homes]:为每个系统用户动态映射其主目录的共享,%S会被替换为当前登录用户名;[printers]:打印机共享,配合[global]中的printing、printcap name使用;[netlogon]:配合域登录(domain logons = yes)提供网络登录脚本目录;[Profiles]:用于存放用户的漫游配置文件。
4. 常见问题排查
4.1 你可能没有权限访问网络资源
问题现象:
- 出现NT_STATUS_ACCESS_DENIED错误;
- Windows 下成功登陆 Samba 后,点击共享目录仍然提示——你可能没有权限访问网络资源。
解决步骤:
- 检查是否配置了防火墙规则
# 一种方法是强行关闭防火墙 $ sudo service iptables stop # 另一种方法是配置防火墙规则 $ sudo firewall-cmd --permanent --zone=public --add-service=samba $ sudo firewall-cmd --reload在 CentOS 7 环境中,仓库提供了配套的 stop-firewall.sh 运维脚本,通过systemctl stop firewalld与systemctl disable firewalld实现「停止并禁用开机自启」,适合内网测试环境快速排障;生产环境仍建议按上述firewall-cmd方式精细化放行。
- 关闭 SELinux
# 将 /etc/selinux/config 文件中的 SELINUX 设为 disabled $ sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 重启生效 $ reboot这一操作在仓库中同样有脚本化实现:在 sys-settings.sh 中,closeSelinux()函数即通过sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config完成同样的修改,并随「全部执行」选项一并调用,可作为批量初始化虚拟机时参考。另外,仓库中的 syscheck.sh 系统检查脚本要求以 root 用户执行、读取系统发行版信息,可在排障前先对服务器整体环境做一次体检。
说明:SELinux 对于 Samba 共享目录的访问限制是常见排障点。若不想全局禁用 SELinux,也可仅对共享目录设置 Samba 的 SELinux 布尔值(如
setsebool -P samba_enable_home_dirs on等),本文不做展开。
4.2 Windows 下对 Samba 的清理操作
1. Windows 清除访问 Samba 局域网密码缓存
在 dos 窗口中输入control userpasswords2或者control keymgr.dll,然后【高级】/【密码管理】,删掉保存的该机器密码。
2. Windows 清除连接的 Linux 的 Samba 服务缓存
- 打开 win 的命令行;
- 输入
net use,就会打印出当前缓存的连接上列表; - 根据列表,一个个删除连接:
net use 远程连接名称 /del;或者一次性全部删除:net use * /del。
5. 小结
本文从 linux-tutorial 的 Samba 应用 出发,完整走通了「安装 → 配置 smb.conf → 创建 Samba 用户 → 启动服务 → 放行防火墙 → 客户端访问」的闭环流程,并对[global]全局参数与[共享名]共享参数做了全量解读。Samba 排障的三大关键点——防火墙、SELinux、客户端本地缓存——也在仓库运维脚本(stop-firewall.sh、sys-settings.sh)与 Firewalld 文档 中找到了印证与扩展。掌握这些配置项,即可在异构网络环境中稳定、安全地搭建跨平台文件共享服务。
【免费下载链接】linux-tutorial:penguin: Linux教程,主要内容:Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考