随着企业数据量的持续增长,存储容量需求日益增大。如何采用没有容量上限的云存储替换本容量有限的本地磁盘,已成为广泛的需求和共识。特别是在企业中常用的 Samba 和 NFS 共享,如果能够使用云存储作为底层存储,就能有效解决存储扩容和本地磁盘损坏导致的数据丢失问题。
本文将以 Linux 系统为例,介绍如何将 JuiceFS(云原生分布式文件系统)作为 Samba 和 NFS 的底层存储,为企业提供高度可扩展的无限云存储解决方案。
本文会分别介绍在命令行和图形界面中的使用方法,读者可以根据自己的使用习惯参考相应内容。
在命令行中使用
通过执行 juicefs mount
命令,可以将 JuiceFS 文件系统以 FUSE 接口的形式挂载为本地的用户态文件系统,与本地文件系统在形态和用法上无异。这样一来,可以直接使用 JuiceFS 挂载点或子目录创建 Samba 或 NFS 共享。
创建 Samba 共享
主流 Linux 发行版的包管理器都会提供 Samba,可以直接安装,比如 Debian/Ubuntu 可以这样安装:
sudo apt install samba
对于需要配置 AD/DC 的,还需要安装其他的软件包,详情参考 Samba 官方安装指南。
根据 Samba 官方文档,通常建议使用支持扩展属性(xattr)的文件系统,JuiceFS 文件系统需要在挂载时使用 --enable-xattr
选项来启用扩展属性:
sudo juicefs mount -d --enable-xattr sqlite3://myjfs.db /mnt/myjfs
然后就可以使用 JuiceFS 挂载点或子目录创建共享,例如,创建一个名为 Media 的共享:
[Media]
path = /mnt/myjfs/media
guest ok = no
read only = no
browseable = yes
对 macOS 的扩展属性支持
如果 Samba 版本低于 4.9,且创建的 Samba 共享同时要提供给 macOS 用户使用,则需要在 Samba 的 [global] 全局配置部分添加 ea support = yes
选项来启用扩展属性支持,编辑配置文件 /etc/samba/smb.conf
,例如:
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
ea support = yes
Samba 4.9+ 默认开启了
ea support
选项,因此无需手动设置。
创建 NFS 共享
因为 NFS 是一种面向 Unix/Linux 系统的共享协议,不涉及对 xattr 扩展属性的要求,如果仅用于 NFS 共享,挂载时无需使用 --enable-xattr 选项,挂载点和子目录可直接用作 NFS 共享。
比如,将 JuiceFS 中的 media 目录通过 NFS 共享,在配置文件 /etc/exports
中添加:
"/mnt/myjfs/media" *(rw,sync,no_subtree_check,fsid=1)
NFS 共享配置的格式为:
<Share Path> <Allowed IPs>(options)
比如要将这个共享设置为仅允许 192.168.1.0/24
这个网段用户访问,则可以修改为:
"/mnt/myjfs/media" 192.168.1.0/24(rw,async,no_subtree_check,fsid=1)
共享选项:
-
rw - 代表允许读和写
-
async - 异步写入,速度快但会降低数据可靠性;也可以设置为 sync 写入速度慢但能提高数据可靠性。
-
no_subtree_check - 禁用子目录检查,这将允许客户端挂载共享目录的父目录和子目录,会降低一些安全性但能提高 NFS 的兼容性。也可以设置为 subtree_check 来启用子目录检查,这样仅允许客户端挂载共享目录和它的子目录。
-
fsid - 文件系统标识符,用于在 NFS 上标识不同的文件系统。在 NFSv4 中,NFS 的根目录所在的文件系统被定义为 fsid=0,其他文件系统需要在它之下且编号唯一。在这里,JuiceFS 就是一个外挂的 FUSE 文件系统,因此需要给它设置一个唯一的标识。
如果不熟悉或不喜欢在命令行管理 Samba 或 NFS 共享,可以使用图形化工具来简化这个过程,Cockpit 就是一个适用的开源工具。
图形化管理:在 Cockpit 中使用
Cockpit 是一个用于 Linux 服务器管理的 Web 界面工具,允许管理员在浏览器中直接执行各种管理任务,而无需使用命令行或其他复杂的工具。通过安装扩展程序,即可支持在图形化界面中管理 Samba 和 NFS 共享。
如果需要在本地长期稳定地提供 Samba 和 NFS 共享,可以考虑设置一个专用的服务器或虚拟机来实现。在专用主机上挂载 JuiceFS 文件系统,并使用 Cockpit 管理工具来配置和管理 Samba 和 NFS 共享,以便提供给本地网络中的计算机和业务系统使用。JuiceFS 负责将用户数据妥善上传到公有云对象存储或缓存到本地,进而提供一个近乎无限的存储空间。
硬件要求
Samba 和 NFS 都是基于网络的文件共享协议,它们的性能受硬件性能、网络带宽、客户端数量和文件访问模式等多种因素的影响。对于只有少量客户端的小规模网络,在较低配置的硬件上仍能很好的运行。
Samba 是面向 Windows 的共享协议,涉及到 Linux 与 Windows 之间的复杂转换,因此在客户端数量多且需要并发访问或涉及大量数据传输的场景,Samba 往往需要更多的 CPU 资源。在高负载环境下,NFS 可以提供更高的效率和吞吐量。
你需要根据实际情况灵活调整硬件和软件配置,请注意以下方面:
-
准备充足的 SSD 存储:作为 JuiceFS 缓存盘,建议缓存盘容量大于预期热数据量;
-
提高网络带宽:多客户端并发、大量数据传输时网络带宽可能成为性能瓶颈;
-
满足 Linux 系统运行的基本配置:比如 4核 CPU、8GB 内存、20GB 系统盘。
系统建议
Cockpit 是红帽公司(Red Hat)赞助的自由软件项目,它在 RHEL 及衍生版中均有预装可以开箱即用,相比 Ubuntu、Debian 等系统兼容性要更好,小问题也会少一些。以下是几个可以优先考虑选用的操作系统:
-
Rocky Linux
-
Almalinux
-
Fedora
当然,也可以根据个人偏好选择 Ubuntu、Debian、Archlinux、openSUSE 等系统。
安装和启动 Cockpit
主流 Linux 发行版均支持安装 Cockpit,如果你使用的系统没有预装,可以参考 Cockpit 官网进行安装。
对于本文使用的 Almalinux 系统,直接在终端启用 Cockpit 服务即可:
sudo systemctl enable --now cockpit.socket
使用 Cockpit
服务启动以后,在浏览器中输入 https://<your-local-ip>:9090
打开 Cockpit 界面(请将 <your-local-ip>
替换成实际的 IP 地址)。
由于涉及对系统的管理,应该使用具有 sudo 权限的账号或 root 用户登陆。
Cockpit 自带 Web Shell(基于网页的终端),所有涉及命令行的操作可以直接在这里执行,相对 SSH 登陆要方便很多。
安装 File Sharing 插件
Cockpit 本身默认只提供了系统管理最基本的功能,通过安装插件来可以增加更多管理功能,查看 Cockpit 支持的插件。
在插件列表中可以找到 File Sharing,这是一个由 45Drives 开发的第三方插件,作用是为 Cockpit 提供 Samba 和 NFS 共享管理界面。
访问 File Sharing 源码仓库,根据系统选择对应的软件包,在 Cockpit 终端执行命令进行下载(此处为示例,建议选择下载最新版):
curl -LO https://github.com/45Drives/cockpit-file-sharing/releases/download/v3.3.4/cockpit-file-sharing-3.3.4-1.el8.noarch.rpm
安装依赖的包和插件:
# 安装依赖的包
sudo dnf install fuse samba nfs-utils
# 安装插件
sudo dnf install ./cockpit-file-sharing-3.3.4-1.el8.noarch.rpm
安装完毕刷新页面即可看到 File Sharing 插件菜单和界面。
安装 JuiceFS 客户端
在终端执行以下命令可以一键安装 JuiceFS 最新稳定版客户端:
curl -sSL https://d.juicefs.com/install | sh -
也可以参考 JuiceFS 安装文档 了解其他安装方式。
创建 JuiceFS 文件系统
一个 JuiceFS 文件系统由以下两个部分组成:
-
对象存储:负责存储数据,查看 JuiceFS 支持的对象存储。
-
元数据引擎:负责存储文件元数据的数据库,查看 JuiceFS 支持的数据库。
公有云对象存储大多涉及存储费用、下行流量费用和 API 调用请求费用,请根据实际需求进行评估和选择。部分云计算公司会针对对象存储各个计费项提供“资源包”,相比按量付费会有一定的优惠,可以按需选用。为了保证读写速度,建议在创建 Bucket 时选择与你物理距离更近的地域。另外,JuiceFS 虽然同时支持标准存储和低频存储,但由于低频存储涉及最低存储时间和取回费用,对于本文介绍的内网数据共享场景而言,建议选择标准存储,私有读写。
由于本文介绍的是类似“云存储网关”的场景,即 JuiceFS 运行在本地的独立主机上,通过 Samba 和 NFS 共享协议提供存储给内网用户和业务系统使用,在元数据引擎方面可以有更灵活的选择:
-
如果只在一个内网中使用,可以选用 SQLite、BadgerDB 这样的单机数据库,也可以自行在内网部署 Redis、MySQL 等数据库使用。
-
如果有多地、多局域网需要同时共享使用 JuiceFS 文件系统,则应使用能够通过互联网访问的数据库,这种场景选择云平台的 RDS 数据库或自行在云服务器上部署 Redis、MySQL、PostgreSQL 等会是更好的选择。
下面是一个使用 SQLite 单机数据库作为元数据引擎创建 JuiceFS 文件系统的示例:
juicefs format --storage oss \
--bucket https://myjfs.oss-cn-shanghai.aliyuncs.com \
--access-key your-access-key \
--secret-key your-secret-key \
sqlite3:///home/herald/myjfs.db \
myjfs
创建文件系统时有以下几个细节需要注意:
-
不同的对象存储有相应的类型名,比如 AWS 为
s3
,阿里云为oss
,腾讯云为cos
等,更多类型请参考 JuiceFS 文档。 -
如果平台分别提供了内网和外网 Bucket 地址,需要选择外网地址(因为需要从本地访问)。
-
Access Key 和 Secret Key 用于访问对象存储时的身份认证,请参考所选对象存储的文档了解如何创建。
-
数据库地址支持绝对路径和相对路径,当配置开机自动挂载时需要使用绝对路径。
挂载 JuiceFS 文件系统
对于新创建的 JuiceFS 文件系统,可以先手动挂载一次,确认无误后再配置开机自动挂载,例如:
sudo juicefs mount --enable-xattr \
--cache-dir /your-ssd \
--cache-size 1024000 \
sqlite3:///home/herald/myjfs.db \
/mnt/myjfs
这是前台挂载,JuiceFS 客户端会实时输出关键的操作信息,你可以据此来排查解决警告和错误。
如果执行命令时提示 sudo: juicefs: command not found
,请修改 /etc/sudoers
文件,修改 secure_path
天添加 /usr/local/bin
,修改后类似这样:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
确认挂载没有问题,接下来配置 JuiceFS 开机自动挂载。使用快捷键 ctrl + c 结束程序,然后执行命令,创建一个名为 mount.juicefs
的客户端软连接:
sudo ln -s /usr/local/bin/juicefs /sbin/mount.juicefs
编辑 /etc/fstab
文件,另起一行填入 JuiceFS 的挂载信息,例如:
# <元数据引擎 URL> <挂载点> <文件系统类型> <挂载选项>
sqlite3:///home/herald/myjfs.db /mnt/myjfs juicefs _netdev,max-uploads=50,writeback,cache-size=1024000,enable-xattr 0 0
其中涉及的挂载选项(请根据实际情况调整具体的值):
-
_netdev
指示系统在网络设备可用之前不要挂载文件系统,这对于需要网络访问的文件系统很重要。 -
max-uploads=50
挂载选项限制同时上传到文件系统的最并发数,有助于防止文件系统过载。 -
writeback
挂载选项用来开启写缓存,文件先写到本地缓存然后在后台上传到公有云对象存储。 可以提高性能,但写入数据时意外断电可能会导致数据丢失。 -
cache-size=1024000
挂载选项指定用于文件系统的缓存大小,以 MiB 为单位,这里设置了 1TB 缓存。 -
enable-xattr
挂载选项让 JuiceFS 启用 xattr 扩展属性支持。
因为 /etc/fstab 以 root 用户身份执行挂载,因此在挂载信息中无需添加
allow_other
挂载选项。
重启或执行以下命令挂载 JuiceFS:
# 重载 systemd 进程
sudo systemctl daemon-reload
# 挂载全部文件系统
sudo mount -a
创建 Samba 共享
回到 File Sharing 插件界面
对于 Samba 版本低于 4.9 的用户,且需要在 macOS 中访问共享,请在 Samba 选项卡中展开 Global 的 Advanced Settings,添加 ea support = yes
启用面向苹果产品的扩展属性支持。
然后开始创建共享,点击 Shares
部分的 +
开始创建 Samba 共享。
- Share Name:共享名称,支持中文。
- Share Description:可选的共享描述
- Path:共享文件夹的路径,填写 JuiceFS 的挂载点或子目录。如果指定的目录不存在,可以点击下方的 Create now 进行创建。点击下方的 Edit Permissions 可以调整目录的权限。
其他选项可以根据需要自行调整
点击 Confirm
按钮完成创建。在 Windows 或 macOS 上通过文件管理器尝试访问,这里以 macOS 为例:
打开 Finder
,使用快捷键 command + k
,在地址栏输入 JuiceFS 所在主机的内网 IP 地址,例如:
输入用户名和密码验证身份,然后在弹出的共享目录中选择要打开 Samba 共享目录
如果打开共享发现没有访问权限,可以回到 File Sharing 找到对应的共享,通过 Edit Permissions
调整目录权限。
与此同时,还可以结合 Cockpit 的用户账户管理功能,根据用户和组来分配 Samba 共享的访问权限,从而实现灵活的多用户、多权限的共享访问和管理能力。
Samba 用户问题
Samba 有一套自己的用户数据库,它与操作系统用户之间是独立的,但是当在 Samba 数据库中创建了与系统相同的用户时,系统会自动进行映射,从而实现在 Samba 共享中显示用户 Home 目录的功能。
比如,我的系统账户是 herald,我可以这样为他创建 Samba 账户:
sudo smbpasswd -a herald
根据命令提示设置密码即可,Samba 账户可以设置与系统用户不同的密码。
你还可以安装 Cockpit Identities 插件,可以在图形化用户界面来管理系统账户和 Samba 账户。
创建 NFS 共享
与 Samba 共享的创建类似,在 File Sharing 中切换到 NFS 标签,在 Shares 中点击 +
添加共享:
-
Share Path:共享目录的路径,填写 JuiceFS 的挂载点或子目录。如果指定的目录不存在,可以点击下方的
Create now
进行创建。点击下方的Edit Permissions
可以调整目录的权限。 -
Clients:用来设置 NFS 共享允许的客户端,Host 设置允许的主机地址,Settings 设置挂载参数。
Tips:如前述,JuiceFS 是外挂的 FUSE 文件系统,使用它作为共享目录,需要设置一个大于 0 的 fsid,例如:
rw,async,no_subtree_check,fsid=1
。
然后使用任何有 NFS 客户端的主机挂载即可,例如:
sudo mount -t nfs 192.168.1.26:/mnt/myjfs/nfs mnt
macOS 挂载 NFS
macOS 支持挂载 NFS 共享,但执行挂载命令时会报错 Operation not permitted
,可以使用 -o resvport
参数来解决这个问题,例如:
sudo mount -t nfs -o resvport 192.168.1.26:/mnt/myjfs/nfs mnt
总结
本文介绍了如何使用 JuiceFS 文件系统作为 NFS 和 Samba 的共享存储,实现一个面向内网且几乎没有容量上限的共享存储空间。通过引入 Cockpit 的图形化管理界面,让读者可以更方便地管理多用户、多权限的 Samba 和 NFS 共享。另外还分享了各种共享在挂载访问时常见的问题和解决方法,希望这篇内容能够对你有一些帮助,如果有其他疑问欢迎加入 JuiceFS 社区与大家共同交流。