实现无限存储:基于JuiceFS 创建 Samba 和 NFS 共享

338 阅读14分钟

随着企业数据量的持续增长,存储容量需求日益增大。如何采用没有容量上限的云存储替换本容量有限的本地磁盘,已成为广泛的需求和共识。特别是在企业中常用的 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 文件系统由以下两个部分组成:

公有云对象存储大多涉及存储费用、下行流量费用和 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 社区与大家共同交流。