Samba是在Linux和UNIX系统上实现SMB协议的软件。本文介绍通过Samba实现虚拟机和主机之间的文件共享。
操作环境
操作系统
主机Win11,虚拟机Ubuntu 22.04。
网络环境
主机和虚拟机在同一网络。
网络配置参考:VSCode SSH 连接 VMware虚拟机Linux Ubuntu 22.04 配置。
SMB简介
SMB协议
SMB(Server Messages Block)信息服务块,是计算机网络中应用层协议,是客户机/服务器型协议。客户机通过SMB协议访问服务器上的共享文件系统、打印机及其他资源。
SMB协议为局域网用户提供相关的功能和机制,来保证传输的可靠性。局域网中90%的数据包以及95%的字节是通过SMB协议进行传输。SMB协议解决了网络的稳定性和数据流在共享带宽时的公平性、拥塞控制及效率等问题。
SMB与Samba
1991 年,还在读大学的著名黑客、技术大牛Andrew Tridgwell就有这样的困扰,他手上有三部机器,分别是跑DOS的个人计算机、DEC公司的Digital Unix系统以及Sun的Unix系统,在当时,DEC公司有发展出一套称为PATHWORKS的软件,这套软件可以用来分享DEC的Unix与个人计算机的DOS这两个操作系统的档案数据,Sun的Unix无法藉由这个软件来进行数据分享。为了解决这样的问题,他就自行写了个程序去侦测当DOS与DEC的Unix系统在进行数据分享传送时所使用到的通讯协议信息,然后将这些重要的信息撷取下来,并且基于上述所找到的通讯协议而开发出ServerMessage Block (SMB) 这个档案系统,而就是这套 SMB软件能够让Unix与DOS互相的分享数据。
Tridgwell去申请SMBServer ( Server Message Block 的简写 ) 这个名字来做为他撰写的这个软件的商标,可惜的是,SMB不符合商标注册的要求,因此没有办法达成注册。既然如此的话,那么能不能在字典里面找到相关的字词可以做为商标来注册呢?翻了老半天,这个SAMBA刚好含有SMB,又是热情有劲的拉丁舞蹈的名称,不如就用这个名字来做为商标好了。如此,这成为今天所使用的SAMBA的名称由来。
后来微软对这个SMB协议进行了重大更改,更改后的版本也是最常见的版本。
虚拟机配置
安装和启动Samba服务
安装Samba软件。

sudo apt update
sudo apt install samba
查看samba服务是否正在运行
查看Samba服务是否正在运行。
sudo systemctl status smbd
sudo systemctl status nmbd
或使用以下命令。
sudo systemctl status smbd nmbd
这里smbd
是Samba服务器后台程序,负责管理Samba共享,而nmbd
是NetBIOS名称服务器,负责提供网络浏览和名称解析。
如果没运行,手动启动。
sudo systemctl start smbd nmbd
配置samba服务设置为开机启动
配置samba服务设置为开机启动。
sudo systemctl enable smbd nmbd
配置共享目录
创建一个共享目录。
mkdir /home/user0/share
目录所属用户和用户组。
sudo chown user0:user0 /home/user0/share
目录访问权限。
sudo chmod 0775 /home/user0/share
修改配置文件
编辑配置文件/etc/samba/smb.conf
。
sudo vim /etc/samba/smb.conf
可选配置以下内容。
[ShareName]
# 基础配置
comment = [comment]
path = [directoy path]
available = [yes/no]
browseable = [yes/no]
# 用户权限
valid users = [username1],[username2],@[usergroupname]
read list = [username1],[username2],@[usergroupname]
write list = [username1],[username2],@[usergroupname]
guest ok = [yes/no]
# 访问权限
read only = [yes/no]
writable = [yes/no]
directory mask = 0775
create mask = 0775
[ShareName]
:共享的名称,这个名称在访问共享时显示,可根据需要更改。
[基础配置]
\qquadcomment
:描述性注释,访问所配置的资源时显示。
\qquadpath
:要共享的文件夹的绝对路径。
\qquadavailable
:共享资源是否可用。
\qquadbrowseable
:设置为yes
使共享在网络浏览器中可见。
[用户权限]
\qquadvalid users
:允许访问该共享资源的用户,多个用户用,
隔开,如果配置的是用户组前面加@
。
\qquadread list
:允许读该共享资源的用户。
\qquadwrite list
:允许写该共享资源的用户。
\qquadguest ok
:设置为yes
允许没有有效用户账户的用户访问共享。
[访问权限]
\qquadread only
:设置为no
允许用户写入文件。
\qquadwritable
:是否可写入。
\qquaddirectory mask
:设置创建目录的访问权限。
\qquadcreate mask
:创建文件的访问权限。
将配置添加到配置文件结尾
将配置添加到配置文件结尾。
[share]
comment = File share
path = /home/user0/share
available = yes
browseable = yes
valid users = user0
read only = no
writable = yes
检查配置文件语法是否正确
检查配置文件语法是否正确。
sudo testparm /etc/samba/smb.conf
重启Samba服务以应用配置更改
重启Samba服务以应用配置更改。
sudo systemctl restart smbd nmbd
设置防火墙允许samba连接
设置防火墙允许samba连接。
sudo ufw allow samba
添加samba用户
pdbedit。
pdbedit
用于管理由PAM模块pam_krb5_misc
提供的MIT Kerberos数据库。
添加允许登录的samba用户
添加允许登录的samba用户。
sudo pdbedit -a [username]
或sudo smbpasswd -a [username]
此处的[username]
必须是系统中用户的用户名,否则添加失败。
查看当前已在samba服务中添加的用户
查看当前已在samba服务中添加的用户。
sudo pdbedit -L
注:
sudo smbpasswd -L [username]
是禁用(锁定)当前用户或指定用户的SMB密码,阻止用户通过SMB协议访问Samba共享资源。如果不加[username]
,默认是当前用户。
使用sudo undo smbpasswd -L [username]
解除锁定。
*删除用户命令。
pdbedit -x username
或smbpasswd -x [username]
主机配置
添加连接配置
找到此电脑——右键——添加一个网络位置。
下一步。
选择自定义网络位置,下一步。
输入虚拟机地址,点浏览。
选择配置的目录。
此处的
samba
是在/etc/samba/smb.conf
中配置的[ShareName]
。
下一步。
输入名称,这个名称在此电脑——网络位置中显示。
点击完成。
输入Ubuntu中配置的用户名
和Samba密码
,点确定。
*如果勾选了
记住我的凭据
,此处添加的凭据可在控制面板\用户帐户\凭据管理器
中编辑和删除。
打开了虚拟机中共享的/home/user0/share
目录。
此时在此电脑——网络位置中,添加了Ubuntu中共享的目录。
问题排查
连接问题 1
没有权限访问共享的目录。
1、samba配置及目录权限。
检查Samba用户
是否和/etc/samba/smb.conf
中配置的valid users = [username]
一致。
sudo pdbedit -L
sudo vim /etc/samba/smb.conf
检查/etc/samba/smb.conf
中配置的用户权限和访问权限。
sudo vim /etc/samba/smb.conf
检查/home/user0/share
这个路径的home
、user0
、share
权限。
home
:其它用户访问权限不低于1
,默认755
。
user0
:所有者访问权限不低于1
,默认755
。
share
:所有者权限不低于5
,默认755
。
重启Samba服务。
sudo systemctl restart smbd nmbd
2、删除Windows连接Linux的Samba服务缓存
打开PowerShell,查看网络共享资源连接。
net use
删除网络共享连接记录。
net use \192.168.37.129\samba /del
PS C:\Users\Administrator> net use
会记录新的网络连接。
状态 本地 远程 网络
-------------------------------------------------------------------------------
已断开连接 \\192.168.37.129\samba Microsoft Windows Network
命令成功完成。
PS C:\Users\Administrator> net use \\192.168.37.129\samba /del
\\192.168.37.129\samba 已经删除。
PS C:\Users\Administrator> net use
会记录新的网络连接。
列表是空的。
PS C:\Users\Administrator>
或
net use * /del
删除全部的连接记录。
PS C:\Users\Administrator> net use * /del
你有以下的远程连接:
\\192.168.37.129\samba
继续运行会取消连接。
你想继续此操作吗? (Y/N) [N]: y
命令成功完成。
PS C:\Users\Administrator>
3、在Windows中重新添加连接配置
按添加连接配置在Windows中重新添加连接。
连接问题 2
不允许使用不同的用户名多重连接访问同一个共享资源。
1、在Ubuntu中删除多余的Samba用户
在Ubuntu中删除多余的Samba用户
。
sudo pdbedit -L
sudo pdbedit -x [username]
重启Samba服务。
sudo systemctl restart smbd nmbd
2、删除Windows连接Linux的Samba服务缓存
打开PowerShell,查看网络共享资源连接。
net use
删除网络共享连接记录。
net use \192.168.37.129\samba /del
3、在Windows中重新添加连接配置
按添加连接配置在Windows中重新添加连接。
使用root用户访问共享
1、在配置文件中添加root用户
编辑配置文件。
sudo vim /etc/samba/smb.conf
在配置文件中添加root用户。
[share]
comment = File share
path = /home/user0/share
available = yes
browseable = yes
valid users = user0,root # 添加root用户
read only = no
writable = yes
重启samba服务。
sudo systemctl restart smbd nmbd
2、添加root为Samba用户
添加root为samba用户。
sudo pdbedit -a root
3、在Windows中以root用户登录
输入root
和密码
,点确定。
参考
Distribution-specific Package Installation - SambaWiki
SMB小传 —— SMB网络文件系统协议介绍-阿里云开发者社区 (aliyun.com)
定义 SMB 及其安全注意事项 - Training | Microsoft Learn
smb_百度百科 (baidu.com)
smb_360百科 (so.com)
SMB协议简介-CSDN博客
samba(软件)_百度百科 (baidu.com)
windows下访问虚拟机的两种方式
samba的配置文件/etc/samba/smb.conf 笔记240722-CSDN博客
windows如何访问Linux系统通过Samba协议共享的文件?_windows 访问samba-CSDN博客