Linux与windows系统之间的文件共享方案-Samba
Linux与Windows系统之间的文件共享方案-Samba
1. samba 介绍
samba 是一种开源软件套件,允许 Linux 和 Unix 系统与 Windows 系统进行文件和打印共享。它实现了 SMB/CIFS 协议,能够使非 Windows 系统出现在 Windows 网络中,并能够与 Windows 系统共享文件和资源。samba 还支持域控制器功能,使其能够管理 Windows 域中的计算机和用户。
2. samba 安装
2.1 在 Ubuntu/Debian 上安装 samba
- 更新软件包列表:
sudo apt update
- 安装 samba:
sudo apt install samba
- 检查安装是否成功:
sudo smbstatus
2.2 在 CentOS/RHEL 上安装 samba
- 更新软件包列表:
sudo yum update
- 安装 samba:
sudo yum install samba
- 检查安装是否成功:
sudo smbstatus
# 本文部署的版本
[root@smb ~]# smbstatus
samba version 4.10.16
PID Username Group Machine Protocol Version Encryption Signing
---------------------------------------------------------------------------------------- ---------------------
Service pid Machine Connected at Encryption Signing
---------------------------------------------------------------------------------------------
No locked files
说明:
Centos/RHEL镜像源仓库中的
samba
包仅支持将 Samba 作为域成员和 NT4 PDC 或 BDC 使用,不提供用于将 Samba 作为 AD DC 运行的包。作为替代方案可选如下:
- 从源代码构建 Samba。有关详细信息,请参见从源代码构建 Samba。
- 使用来自可信来源的支持 AD 的第三方包。
3. samba 实战
3.1 配置共享目录
- 创建共享文件夹:
sudo mkdir -p /srv/samba/public
sudo mkdir -p /srv/samba/share
- 设置目录权限:
# 创建系统用户和组,后续用于samba认证
sudo groupadd smbgroup -g 6000
sudo useradd smbuser -u 6000 -g 6000 -s /sbin/nologin -d /dev/null
# 设置权限
sudo chmod -R 2777 /srv/samba/public
sudo chown -R smbuser:smbgroup /srv/samba/public
sudo chmod -R 2777 /srv/samba/share
sudo chown -R smbuser:smbgroup /srv/samba/share
- 编辑 samba 配置文件
/etc/samba/smb.conf
,添加共享设置:
[global]
workgroup = samba
security = user
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw
# global区域增加下面配置,配置无账号密码访问
map to guest = bad user # global区域增加配置
...
# 增加public共享,无需认证
[public]
path = /srv/samba/public
read only = No
# 配置无账号密码访问
guest ok = yes
guest only = yes
# 增加share共享,需要用户名密码认证
[share]
path = /srv/samba/share
browseable = No
read only = No
valid users = @smbgroup
write list = @smbgroup
read list = @smbgroup
create mode = 0774
force create mode = 0774
force directory mode = 0774
关于smb.conf
配置文件内容的更多选项和说明可以参考示例文件/etc/samba/smb.conf.example
。
- 使用命令
testparm
测试配置文件是否正确:
# 输入命令后,回车进行检查。
[root@smb ~]# testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
# Global parameters
[global]
map to guest = Bad User
printcap name = cups
security = USER
workgroup = samba
idmap config * : backend = tdb
cups options = raw
[homes]
browseable = No
comment = Home Directories
inherit acls = Yes
read only = No
valid users = %S %D%w%S
[printers]
browseable = No
comment = All Printers
create mask = 0600
path = /var/tmp
printable = Yes
[print$]
comment = Printer Drivers
create mask = 0664
directory mask = 0775
force group = @printadmin
path = /var/lib/samba/drivers
write list = @printadmin root
[public]
guest ok = Yes
guest only = Yes
path = /srv/samba/public
read only = No
[share]
browseable = No
create mask = 0774
force create mode = 0774
force directory mode = 0774
path = /srv/samba/share
read list = @smbgroup
read only = No
valid users = @smbgroup
write list = @smbgroup
- 重启 samba 服务:
# 重启服务
sudo systemctl restart smb
# 查看服务状态
sudo systemctl status smb
3.3 创建 samba 用户
如果需要进行身份验证,可以为用户创建 samba 账户:
# 创建samba用户,该用户需要先在系统用户中创建。
sudo smbpasswd -a smbuser # 设置密码
# 启用用户
sudo smbpasswd -e smbuser
Enabled user smbuser.
3.4 关于samba的防火墙配置
确保你的防火墙允许 samba 的流量。
对于 ufw(适用于 Ubuntu):
sudo ufw allow 'samba'
对于 firewalld(适用于 RHEL/CentOS):
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload
说明:
samba使用的端口和协议,确保流量经过的防火墙放行。
- tcp/139,445端口;
- udp/137,138端口;
3.5 在 客户端访问 samba 共享
3.5.1 windows客户端中访问samba共享
打开文件资源管理器或者win+r
运行窗口。
访问share共享,认证后进入:\\samba服务器ip\share
访问public共享,无需认证:\\samba服务器ip\public
3.5.2 linux客户端中访问samba共享
linux下访问samba共享需要安装相关客户端:
# yum
sudo yum install -y cifs-utils samba-client
# apt
sudo apt install cifs-utils smbclient
- 通过smbclient访问:
# 通过smbaclient挂载,smbclient //<sambaserver-ip>/<share-dir> -U <sambausername>
[root@client ~]# smbclient //10.252.216.2/share -U smbuser
Enter samba\smbuser's password: # 输入密码验证
Try "help" to get a list of possible commands.
[root@client ~]# smbclient //10.252.216.2/public
Enter samba\root's password: # 直接回车进入
Try "help" to get a list of possible commands.
smb: \> list
0: server=10.252.216.2, share=public
smb: \> dir
. D 0 Fri Sep 6 10:15:18 2024
.. D 0 Fri Sep 6 09:42:09 2024
asdf D 0 Fri Sep 6 09:57:34 2024
aaa.txt A 0 Fri Sep 6 09:57:39 2024
bbb.txt A 0 Fri Sep 6 10:15:17 2024
41921540 blocks of size 1024. 37915996 blocks available
smb: \> mkdir test
smb: \> ls
. D 0 Fri Sep 6 10:32:23 2024
.. D 0 Fri Sep 6 09:42:09 2024
asdf D 0 Fri Sep 6 09:57:34 2024
aaa.txt A 0 Fri Sep 6 09:57:39 2024
bbb.txt A 0 Fri Sep 6 10:15:17 2024
test D 0 Fri Sep 6 10:32:23 2024
smb: \> exit
- 通过mout挂载
通过mount命令行直接挂载使用:
# 访问需要认证的共享
sudo mkdir /share
sudo mount.cifs //10.252.216.2/share /share -o username=smbuser,password=smbuser # 命令行传递认证信息
# 通过认证文件传递
sudo vi /.smb-credentials.txt
username=xxx # 写入用户名和密码
password=xxx
sudo chmod 644 /.smb-credentials.txt # 设置权限
sudo mount.cifs //10.252.216.2/share /share -o credentials=/.smb-credentials.txt
# 无认证共享访问挂载仍然会提示输入密码,直接回车即可。
sudo mkdir /public
sudo mount.cifs //10.252.216.2/public /public
- 通过fstab文件实现开机自动挂载:
[root@client share]# cat /etc/fstab
...
//10.252.216.2/share /share cifs _netdev,user,iocharset=utf8,nofail,credentials=/.smb-credentials.txt 0 0
//10.252.216.2/public /public cifs _netdev,user,guest,iocharset=utf8,nofail 0 0
挂载选项说明:
_netdev
: 表示此挂载依赖于网络,确保网络可用时才尝试挂载,避免在系统启动前挂载时产生问题。user
:表示允许普通用户(非 root 用户)执行挂载操作。guest
: 以匿名用户的身份挂载(用于无需认证的 samba 共享)。nofail
:表示如果开机时挂载失败时系统不会进入紧急维护模式,如果已经设置了noauto
,则无需设置。credentials
: 用于需要认证的samba共享,配置认证文件路径。username
:用于认证的用户名,username=your_username
,与credentials
选项配置一种即可。password
:用于认证的密码,password=your_password
,与credentials
选项配置一种即可。noauto
: 表示不在系统启动时或通过mount -a
时自动挂载这些文件系统,当配置改选项后,需要手动mount挂载。
修改完 fstab 后可以通过 mount -a
重新挂载或者直接重启进行验证。
linux下除了上述的挂载方式之外,还可以借助autofs等工具实现自动挂载,有兴趣的可以自行研究。
3.6 查看samba服务器状态
[root@smb ~]# smbstatus
samba version 4.10.16
PID Username Group Machine Protocol Version Encryption Signing
----------------------------------------------------------------------------------------------------------------------------------------
77753 smbuser smbgroup 10.252.254.190 (ipv4:10.252.254.190:56914) SMB3_11 - partial(AES-128-CMAC)
Service pid Machine Connected at Encryption Signing
---------------------------------------------------------------------------------------------
share 77753 10.252.254.190 Fri Sep 6 09:51:28 AM 2024 CST - -
IPC$ 77753 10.252.254.190 Fri Sep 6 09:57:24 AM 2024 CST - -
public 77753 10.252.254.190 Fri Sep 6 09:57:32 AM 2024 CST - -
Locked files:
Pid User(ID) DenyMode Access R/W Oplock SharePath Name Time
--------------------------------------------------------------------------------------------------
77753 6000 DENY_NONE 0x100081 RDONLY NONE /srv/samba/share . Fri Sep 6 09:57:24 2024
77753 99 DENY_NONE 0x100081 RDONLY NONE /srv/samba/public . Fri Sep 6 09:57:40 2024
备注:
如果访问失败,除了samba服务、配置、网络检查之外,确保samba服务器关闭selinux或者AppArmor,selinux开启会影响samb客户端访问。
4. 相关资料
- Samba 官方文档主页
- Samba 安装手册
- Samba 参考手册
- Samba Wiki 用户文档
- SELinux/samba - Fedora Project Wiki
- Samba 配置示例
- Samba 性能调整和最佳实践