搭建SMB文件共享服务器踩坑记:从入门到放弃再到真香的血泪史

之前分享了一篇如何用nfs搭建一个文件共享服务器,很多粉丝朋友说用smb好。在粉丝朋友的建议下,我也学习了一下smb服务,写下这篇关于如何搭建smb的文章,这里再次感谢提建议的粉丝朋友。有交流才会有进步!!!

我会详细介绍Windows、Mac、Linux三个平台的连接方法,毕竟现在的环境越来越多样化了。

image-20250806233655147

image-20250806234018233

image-20250806234040962

image-20250806234106506

什么是SMB,为什么选择它

img

SMB全称Server Message Block,说白了就是一个网络文件共享协议。Windows系统天生就支持这个协议,Linux也可以通过Samba来实现。

有Windows有Linux,还有Mac用户,SMB算是兼容性最好的选择了。而且配置相对简单,维护成本也不高。不过话说回来,简单是相对的…后面你们就知道了。

环境准备和基础安装

我这次用的是CentOS 7.9的系统,配置不算高:4核8G内存,500G硬盘。对于一般的文件共享需求来说完全够用了。

安装Samba的过程倒是很顺利:

yum update -y
yum install -y samba samba-client samba-common

安装完成后需要启动服务:

systemctl start smb
systemctl start nmb
systemctl enable smb
systemctl enable nmb

这里有个小细节,很多人只启动了smb服务,忘记了nmb服务。nmb是NetBIOS名称服务,虽然不是必须的,但是启动了会让网络发现更方便一些。

配置文件的那些事

Samba的主配置文件是/etc/samba/smb.conf,这个文件的结构还是比较清晰的。分为全局配置和共享配置两部分。

我先备份了原始配置文件:

cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

然后开始修改配置。全局配置部分我是这样写的:

[global]
workgroup = WORKGROUP
server string = File Server
netbios name = FILESERVER
security = user
map to guest = bad user
dns proxy = no
log file = /var/log/samba/log.%m
max log size = 1000
syslog = 0
panic action = /usr/share/samba/panic-action %d
server role = standalone server
passdb backend = tdbsam
obey pam restrictions = yes
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
pam password change = yes

这里面有几个参数需要特别注意。security = user表示使用用户认证模式,这是最常用的方式。map to guest = bad user的意思是当用户名不存在时,将其映射为guest用户。

配置完全局参数后,就要配置具体的共享目录了。

创建共享目录和用户管理

我创建了几个不同用途的共享目录:

mkdir -p /srv/samba/public
mkdir -p /srv/samba/private
mkdir -p /srv/samba/upload

权限设置这块比较关键:

chmod 755 /srv/samba/public
chmod 750 /srv/samba/private
chmod 777 /srv/samba/upload

用户管理是SMB配置中比较复杂的一部分。Samba有自己的用户数据库,但是这些用户必须是系统中已经存在的用户。

我创建了几个专门用于文件共享的用户:

useradd -M -s /sbin/nologin smbuser1
useradd -M -s /sbin/nologin smbuser2
useradd -M -s /sbin/nologin smbguest

-M参数表示不创建家目录,-s /sbin/nologin表示这些用户不能登录系统,只能用于SMB认证。

然后为这些用户设置SMB密码:

smbpasswd -a smbuser1
smbpasswd -a smbuser2
smbpasswd -a smbguest

这里有个坑,SMB的密码和系统密码是独立的。即使系统用户没有密码,也必须为其设置SMB密码才能正常使用。

共享配置的细节

在smb.conf文件中添加共享配置:

[public]
comment = Public Share
path = /srv/samba/public
browseable = yes
writable = yes
guest ok = yes
read only = no
create mask = 0644
directory mask = 0755

[private]
comment = Private Share
path = /srv/samba/private
browseable = yes
writable = yes
guest ok = no
valid users = smbuser1, smbuser2
read only = no
create mask = 0640
directory mask = 0750

[upload]
comment = Upload Directory
path = /srv/samba/upload
browseable = yes
writable = yes
guest ok = yes
read only = no
create mask = 0666
directory mask = 0777

这里的配置参数还是挺多的。browseable控制共享是否在网络邻居中可见,writableread only控制写权限,guest ok控制是否允许匿名访问。

create maskdirectory mask控制新建文件和目录的权限,这个设置不当的话会导致权限问题。

防火墙和SELinux配置

配置完Samba后,还需要处理防火墙和SELinux的问题。

(偷懒可以直接全关了!正经人谁开防火墙!)

防火墙配置:

firewall-cmd --permanent --add-service=samba
firewall-cmd --reload

如果你的系统使用iptables,需要开放这些端口:

iptables -A INPUT -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -p tcp --dport 445 -j ACCEPT
iptables -A INPUT -p udp --dport 137 -j ACCEPT
iptables -A INPUT -p udp --dport 138 -j ACCEPT

SELinux的配置稍微复杂一些:

setsebool -P samba_enable_home_dirs on
setsebool -P samba_export_all_rw on

如果共享目录不在标准位置,还需要设置SELinux上下文:

semanage fcontext -a -t samba_share_t "/srv/samba(/.*)?"
restorecon -R /srv/samba

我记得当时在这里卡了很久,总是提示权限拒绝。后来才发现是SELinux的问题。

Windows系统连接SMB服务器

Windows连接SMB是最简单的,毕竟这是微软自家的协议。

方法一:通过文件资源管理器

  1. 打开文件资源管理器
  2. 在地址栏输入:\\服务器IP地址 或者 \\FILESERVER
  3. 按回车键,会弹出认证对话框
  4. 输入用户名和密码(比如smbuser1和对应密码)
  5. 勾选"记住我的凭据",下次就不用重复输入了

方法二:映射网络驱动器

这种方法更方便,可以把SMB共享映射成本地驱动器:

  1. 右键点击"此电脑",选择"映射网络驱动器"
  2. 选择一个驱动器号(比如Z:)
  3. 在文件夹路径中输入:\\服务器IP\共享名(比如\\192.168.1.100\public
  4. 勾选"登录时重新连接"和"使用其他凭据连接"
  5. 输入用户名和密码
  6. 点击完成

映射成功后,这个共享就会像本地硬盘一样出现在"此电脑"中。

方法三:命令行方式

对于喜欢用命令行的朋友,也可以用net命令:

net use Z: \\192.168.1.100\public /user:smbuser1 密码

断开连接:

net use Z: /delete

Windows连接常见问题

问题1:提示"找不到网络路径"

这通常是网络连通性问题,可以先ping一下服务器IP:

ping 192.168.1.100
telnet 192.168.1.100 445

问题2:Windows 10无法连接

Windows 10默认禁用了SMB1协议,如果Samba配置的协议版本太低会连不上。解决方法是在Samba配置中设置:

min protocol = SMB2
max protocol = SMB3

问题3:凭据错误

确保用户名密码正确,注意Samba的用户名不包含域名前缀。

Mac系统连接SMB服务器

Mac系统对SMB的支持也很好,连接方式也比较简单。

方法一:通过Finder连接

  1. 打开Finder
  2. 按快捷键 Command + K,或者点击菜单栏"前往" -> “连接服务器”
  3. 在服务器地址中输入:smb://服务器IP地址 或者 smb://FILESERVER
  4. 点击连接
  5. 选择认证方式,通常选择"注册用户"
  6. 输入用户名和密码
  7. 选择要挂载的共享目录

方法二:通过网络浏览

  1. 打开Finder
  2. 在侧边栏点击"网络"
  3. 如果SMB服务器配置正确,应该能看到服务器图标
  4. 双击服务器图标,输入认证信息

方法三:命令行方式

Mac也可以通过命令行连接:

# 创建挂载点
sudo mkdir /Volumes/smbshare

# 挂载SMB共享
sudo mount -t smbfs //smbuser1:密码@192.168.1.100/public /Volumes/smbshare

卸载:

sudo umount /Volumes/smbshare

Mac连接常见问题

问题1:连接速度慢

Mac默认会尝试多种SMB协议版本,可能导致连接慢。可以在连接时指定协议版本:

smb://192.168.1.100/public

改为:

smb://192.168.1.100/public?protocol_vers_map=7

问题2:中文文件名显示异常

这通常是字符编码问题,确保Samba配置中设置了正确的字符集。

问题3:权限问题

Mac用户可能遇到无法写入的问题,检查文件系统权限和SMB配置中的权限设置。

Linux系统连接SMB服务器

Linux连接SMB需要安装客户端工具,方法也比较多样。

安装客户端工具

不同发行版的安装命令:

# CentOS/RHEL
yum install -y samba-client cifs-utils

# Ubuntu/Debian
apt-get install -y smbclient cifs-utils

# Fedora
dnf install -y samba-client cifs-utils

方法一:使用smbclient

smbclient类似于FTP客户端,可以交互式地访问SMB共享:

# 列出服务器上的共享
smbclient -L //192.168.1.100 -U smbuser1

# 连接到特定共享
smbclient //192.168.1.100/public -U smbuser1

连接成功后会进入交互模式,常用命令:

ls          # 列出文件
cd 目录名    # 切换目录
get 文件名   # 下载文件
put 文件名   # 上传文件
mget *      # 批量下载
mput *      # 批量上传
exit        # 退出

方法二:挂载SMB共享

这是最常用的方法,可以把SMB共享挂载到本地目录:

# 创建挂载点
sudo mkdir /mnt/smbshare

# 挂载共享
sudo mount -t cifs //192.168.1.100/public /mnt/smbshare -o username=smbuser1,password=密码

为了安全起见,不建议在命令行中直接输入密码。可以创建一个凭据文件:

# 创建凭据文件
sudo vim /etc/samba/credentials

# 文件内容
username=smbuser1
password=你的密码
domain=WORKGROUP

设置文件权限:

sudo chmod 600 /etc/samba/credentials

然后挂载时引用这个文件:

sudo mount -t cifs //192.168.1.100/public /mnt/smbshare -o credentials=/etc/samba/credentials

方法三:开机自动挂载

如果需要开机自动挂载,可以编辑/etc/fstab文件:

sudo vim /etc/fstab

添加一行:

//192.168.1.100/public /mnt/smbshare cifs credentials=/etc/samba/credentials,uid=1000,gid=1000,iocharset=utf8 0 0

这里的uid和gid是你当前用户的ID,可以通过id命令查看。

方法四:图形界面连接

如果你使用的是带图形界面的Linux发行版,也可以通过文件管理器连接:

GNOME(Nautilus):

  1. 打开文件管理器

  2. 点击侧边栏的"其他位置"

  3. "连接到服务器"中输入:smb://192.168.1.100

    1. 输入用户名和密码

    KDE(Dolphin):

    1. 打开Dolphin文件管理器
    2. 在地址栏输入:smb://192.168.1.100
    3. 输入认证信息

Linux连接常见问题

问题1:mount.cifs: command not found
这说明没有安装cifs-utils包:

yum install -y cifs-utils

问题2:Permission denied

检查几个方面:

  • SMB用户权限
  • 本地文件系统权限
  • SELinux设置

问题3:协议版本不兼容

可以在挂载时指定SMB协议版本:

sudo mount -t cifs //192.168.1.100/public /mnt/smbshare -o username=smbuser1,vers=2.0

问题4:中文文件名乱码

添加字符集参数:

sudo mount -t cifs //192.168.1.100/public /mnt/smbshare -o username=smbuser1,iocharset=utf8

故障排除经验

在使用过程中,不同平台可能遇到不同的问题。

通用排查步骤

  1. 检查网络连通性
ping 服务器IP
telnet 服务器IP 445
  1. 检查服务状态
systemctl status smb nmb
  1. 查看日志
tail -f /var/log/samba/log.smbd
  1. 测试配置
testparm

平台特定问题

Windows平台:

  • 清除缓存的凭据:控制面板 -> 凭据管理器
  • 重置网络:netsh winsock reset

Mac平台:

  • 清除Keychain中的凭据
  • 重启Finder:killall Finder

Linux平台:

  • 检查SELinux:getenforce
  • 查看挂载状态:mount | grep cifs

总结

搭建SMB服务器看起来简单,但是要做好还是需要注意很多细节。从基础安装到配置优化,从权限管理到安全防护,每个环节都不能马虎。

特别是在多平台环境下,不同操作系统的行为差异还是挺大的。Windows用户习惯了图形界面操作,Mac用户注重简洁易用,Linux用户更喜欢命令行的灵活性。作为管理员,需要考虑到各种用户的使用习惯。

我这次搭建下来,最大的感受就是要多测试,多验证。不同的客户端系统、不同的网络环境都可能遇到不同的问题。遇到问题不要慌,多查日志,多搜索,总能找到解决方案。

另外,文档很重要。我把所有的配置和遇到的问题都记录下来了,方便以后维护和排错。特别是各个平台的连接方法,整理成文档后,用户遇到问题时可以自助解决,减少了不少工作量。

如果你也在考虑搭建文件共享服务器,SMB确实是一个不错的选择。虽然过程中会遇到一些问题,但是解决了之后就会发现,真香!

希望我的这些经验能帮到大家,特别是各个平台的连接方法,应该能解决大部分用户的使用问题。如果在搭建过程中遇到问题,欢迎留言讨论。运维这条路上,大家互相帮助才能走得更远。


觉得这篇文章对你有帮助的话,记得点赞转发哦!更多实用的运维技术分享,请关注@运维躬行录,我们一起在运维的道路上不断学习,不断进步!

如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!

公众号:运维躬行录

个人博客:躬行笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值