Skip to main content

samba

从 5.2 开始,JuiceFS 开始公测 Windows 客户端,可以查看快速上手了解如何安装和挂载。但如果你的场景属于大规模使用,或者需要 AD 域支持,又或者希望使用尽可能稳定、成熟的方案,我们目前仍然推荐通过在 Linux 服务器上部署 Samba 的方式来使用 JuiceFS。本章介绍 Samba 的部署以及对接 JuiceFS。JuiceFS 企业版并不对 Samba 的运维提供技术支持,因此如果在过程中遇到 Samba 使用相关问题,请阅读 Samba 官方文档,或者寻求社区帮助。

挂载 JuiceFS

准备好用于运行 Samba 的 Linux 服务器后,参考快速上手创建和挂载 JuiceFS 文件系统。针对 Samba 场景,挂载的时候推荐做一些针对性的参数调优:

juicefs mount smb-gateway /mnt/jfs \
--update-fstab \
--cache-dir /dev/shm \
--no-posix-lock \
--no-bsd-lock \
--buffer-size 1000

部署 Samba 网关

安装 Samba 以及相关工具:

# Debian 及衍生版本
apt install -y samba cifs-utils

# RHEL 及衍生版本
yum install -y samba* cifs-utils

将挂载好的 JuiceFS 目录 /jfs 配置为共享目录,假设共享路径名字叫 juicefs(即可以通过 \\HOST\juicefs 访问到该目录),将以下内容添加到 /etc/samba/smb.conf

/etc/samba/smb.conf
[juicefs]
writable = yes
browseable = yes
read only = No
comment = JuiceFS
create mask = 0664
directory mask = 0777
guest ok = Yes
path = /jfs
read list = root
valid users = root
write list = root

配置完成后,启动 Samba:

systemctl enable --now {smb,nmb}
# 打印出监听端口,在对端确认网络畅通,如果无法访问,则先行解决网络或安全组问题
lsof -PiTCP | grep smb

为 Samba 添加 root 用户 smbpasswd -a root,会提示输入密码,设置密码。该用户便是之后在 Windows 上访问 Samba 所用的账号。

用类似下方命令验证 Samba 可以顺利挂载:

# 测试协议、网络畅通,打印出可供挂载的文件系统
smbclient -U root -L <Samba-IP>
# 推荐先在 Linux 下挂载,验证可用
mount -t cifs -o username=root,password=xxx //<Samba-IP>/juicefs /mnt/samba
# 在 Windows 下挂载
net use Z: \\<Samba-IP>\juicefs "<password>" /user:root

对于多节点 Samba 集群,我们建议避免采用 CTDB 搭建 Samba 集群,从实践看来在高并发场景下资源消耗较大。如果水平扩展需要,可以部署多个无状态的单个 Samba 节点,将这一系列 Samba 节点地址配置成同一个 DNS 域名,以 DNS 轮询方式来做负载均衡。

多用户支持

Samba 支持多用户,在配置文件中声明多个共享文件系统,并恰当配置每一个文件系统的子目录和用户,就能实现多用户支持,同时对每个用户的挂载目录进行控制。

配置文件的撰写也十分简单,注意所挂载的子目录需要提前创建好,相关用户也需要用 smbpasswd 创建并设置密码。

/etc/samba/smb.conf
[bob]
writable = yes
browseable = yes
read only = No
comment = JuiceFS for bob
create mask = 0664
directory mask = 0777
guest ok = Yes
path = /jfs/bob
read list = bob
valid users = bob
write list = bob

[alice]
writable = yes
browseable = yes
read only = No
comment = JuiceFS for alice
create mask = 0664
directory mask = 0777
guest ok = Yes
path = /jfs/alice
read list = alice
valid users = alice
write list = alice

问题排查

挂载 CIFS 失败

常见错误比如:

  • CIFS VFS: \\xxx\xxx BAD_NETWORK_NAME: \\xxx\xxx:说明文件系统名称不对,请用上方步骤中介绍的 smbclient 罗列出服务端可供挂载的文件系统,检查是否存在。
  • CIFS VFS: cifs_mount failed w/return code = -13:该错误码表明认证失败,请检查用户名和密码。

net use 命令报错

对于 JuiceFS Windows 客户端,通过 net use 挂载文件系统的能力是 WinFsp 提供的,因此当 net use 命令报错时,我们难以在 WinFsp 空间内排查和解决问题,这时候推荐直接用 juicefs.exe 前台运行模式挂载,可以加上 -v 参数打印更为丰富的日志:

.\juicefs.exe mount juicefs Z: -v

由于 JuiceFS Windows 客户端不支持多用户,如果你已经用用户 A 挂载了 JuiceFS 或者 Samba,再用用户 B 挂载时,将会看到类似下方报错:

发生系统错误 1219.

不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接。中断此服务器或共享资源的所有连接,然后再试一次。

此时需要检查是否还有窗口存在未关闭的网络连接,或者尝试通过 net use * /delete 命令断开网络连接。有关 net use 命令的详细说明请参考官方文档

文件权限错误

挂载了 Samba,但遭遇类似 permission denied 错误,此时需要确保 SELinux 关闭。在所有 Samba 节点上执行:

setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

域账号无法访问 Samba 挂载点

用户 A 挂载了 Samba,用域账号 B 是无权限访问文件系统的。因此如果你的场景允许,请直接用 B 来执行挂载,这样一来,作为挂载的执行用户,B 就有权限访问挂载点,绕过了权限问题。