之前分享了一篇如何用nfs搭建一个文件共享服务器,很多粉丝朋友说用smb好。在粉丝朋友的建议下,我也学习了一下smb服务,写下这篇关于如何搭建smb的文章,这里再次感谢提建议的粉丝朋友。有交流才会有进步!!!
我会详细介绍Windows、Mac、Linux三个平台的连接方法,毕竟现在的环境越来越多样化了。
什么是SMB,为什么选择它
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
控制共享是否在网络邻居中可见,writable
和read only
控制写权限,guest ok
控制是否允许匿名访问。
create mask
和directory 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是最简单的,毕竟这是微软自家的协议。
方法一:通过文件资源管理器
- 打开文件资源管理器
- 在地址栏输入:
\\服务器IP地址
或者\\FILESERVER
- 按回车键,会弹出认证对话框
- 输入用户名和密码(比如smbuser1和对应密码)
- 勾选"记住我的凭据",下次就不用重复输入了
方法二:映射网络驱动器
这种方法更方便,可以把SMB共享映射成本地驱动器:
- 右键点击"此电脑",选择"映射网络驱动器"
- 选择一个驱动器号(比如Z:)
- 在文件夹路径中输入:
\\服务器IP\共享名
(比如\\192.168.1.100\public
) - 勾选"登录时重新连接"和"使用其他凭据连接"
- 输入用户名和密码
- 点击完成
映射成功后,这个共享就会像本地硬盘一样出现在"此电脑"中。
方法三:命令行方式
对于喜欢用命令行的朋友,也可以用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连接
- 打开Finder
- 按快捷键
Command + K
,或者点击菜单栏"前往" -> “连接服务器” - 在服务器地址中输入:
smb://服务器IP地址
或者smb://FILESERVER
- 点击连接
- 选择认证方式,通常选择"注册用户"
- 输入用户名和密码
- 选择要挂载的共享目录
方法二:通过网络浏览
- 打开Finder
- 在侧边栏点击"网络"
- 如果SMB服务器配置正确,应该能看到服务器图标
- 双击服务器图标,输入认证信息
方法三:命令行方式
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):
-
打开文件管理器
-
点击侧边栏的"其他位置"
-
在
-
"连接到服务器"中输入:
smb://192.168.1.100
- 输入用户名和密码
KDE(Dolphin):
- 打开Dolphin文件管理器
- 在地址栏输入:
smb://192.168.1.100
- 输入认证信息
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
故障排除经验
在使用过程中,不同平台可能遇到不同的问题。
通用排查步骤
- 检查网络连通性
ping 服务器IP
telnet 服务器IP 445
- 检查服务状态
systemctl status smb nmb
- 查看日志
tail -f /var/log/samba/log.smbd
- 测试配置
testparm
平台特定问题
Windows平台:
- 清除缓存的凭据:
控制面板 -> 凭据管理器
- 重置网络:
netsh winsock reset
Mac平台:
- 清除Keychain中的凭据
- 重启Finder:
killall Finder
Linux平台:
- 检查SELinux:
getenforce
- 查看挂载状态:
mount | grep cifs
总结
搭建SMB服务器看起来简单,但是要做好还是需要注意很多细节。从基础安装到配置优化,从权限管理到安全防护,每个环节都不能马虎。
特别是在多平台环境下,不同操作系统的行为差异还是挺大的。Windows用户习惯了图形界面操作,Mac用户注重简洁易用,Linux用户更喜欢命令行的灵活性。作为管理员,需要考虑到各种用户的使用习惯。
我这次搭建下来,最大的感受就是要多测试,多验证。不同的客户端系统、不同的网络环境都可能遇到不同的问题。遇到问题不要慌,多查日志,多搜索,总能找到解决方案。
另外,文档很重要。我把所有的配置和遇到的问题都记录下来了,方便以后维护和排错。特别是各个平台的连接方法,整理成文档后,用户遇到问题时可以自助解决,减少了不少工作量。
如果你也在考虑搭建文件共享服务器,SMB确实是一个不错的选择。虽然过程中会遇到一些问题,但是解决了之后就会发现,真香!
希望我的这些经验能帮到大家,特别是各个平台的连接方法,应该能解决大部分用户的使用问题。如果在搭建过程中遇到问题,欢迎留言讨论。运维这条路上,大家互相帮助才能走得更远。
觉得这篇文章对你有帮助的话,记得点赞转发哦!更多实用的运维技术分享,请关注@运维躬行录,我们一起在运维的道路上不断学习,不断进步!
如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!
公众号:运维躬行录
个人博客:躬行笔记