注意

本文档适用于 Ceph 开发版本。

NFS

Jewel 版本中的新增功能。

Note

当使用cephadm或rook基于的部署时,仅支持NFSv4协议。

Ceph对象网关的命名空间可以通过基于文件的NFSv4协议进行导出,与传统HTTP访问协议(S3和Swift)一起使用。

特别是,现在可以将Ceph对象网关配置为在嵌入NFS-Ganesha NFS服务器时提供基于文件的访问。

管理nfs-ganesha集群和rgw导出的最简单和首选的方法是使用ceph nfs ...命令。有关详细信息,请参阅CephFS 和 RGW 导出 over NFS for more details.

librgw

librgw.so共享库(Unix)为Ceph对象网关服务提供了一个可加载的接口,并在初始化时实例化一个完整的Ceph对象网关实例。

反过来,librgw.so导出rgw_file,这是一个有状态API,用于对RGW桶和对象进行文件导向的访问。该API是通用的,但其设计深受NFS-Ganesha的文件系统抽象层(FSAL)API的影响,该API主要为此而设计。

还提供了一组Python绑定。

命名空间规范

实现符合亚马逊网络服务(AWS)分层命名空间规范,将UNIX风格的路径名映射到S3桶和对象。

挂载命名空间的最顶层由S3桶组成,表示为NFS目录。桶的子文件和目录每个都表示为对象,遵循S3前缀和分隔符规范,'/'是唯一支持的路径分隔符[1].

例如,如果一个NFS客户端将RGW命名空间挂载到“/nfs”,那么在NFS命名空间中的文件“/nfs/mybucket/www/index.html”对应于桶/容器“mybucket”中的RGW对象“www/index.html。”

虽然通常对客户端不可见,但NFS命名空间是通过连接命名空间中对象所暗示的相应路径来组装的。叶子对象,无论是文件还是目录,都将始终在相应键名的RGW对象中实现,“<name>”如果是文件,“<name>/”如果是目录。非叶子目录(例如,上面提到的“www”)可能仅通过它们出现在一个或多个叶子对象名称中来暗示。在NFS中创建的目录或由NFS客户端直接操作的目录(例如,通过chown或chmod等属性设置操作)始终有一个叶子对象表示,用于存储Unix所有权和权限等实际属性。

支持的操作

RGW NFS接口支持对文件和目录的大多数操作,但有以下限制:

  • 不支持链接,包括符号链接。

  • 不支持NFS ACL。

    • 支持Unix用户和组所有权和权限都是支持。

  • 目录可能无法移动/重命名。

    • 文件可以在目录之间移动。

  • 仅支持完整的顺序writeI/O

    • 即,写操作被限制为上传.

    • 许多典型的I/O操作,例如就地编辑文件,必然会失败,因为它们执行非顺序存储。

    • 某些文件实用程序显然顺序写入(例如,某些版本的GNU tar)可能会由于频繁的非顺序存储而失败。

    • 当通过NFS挂载时,顺序应用程序I/O通常可以通过同步挂载选项(例如Linux中的-osync)被限制为顺序写入NFS服务器。

    • RGW NFS接口提供了一个混合安全模型,具有以下特征:

安全

The RGW NFS interface provides a hybrid security model with the following characteristics:

  • NFS协议安全由NFS-Ganesha服务器提供,如NFS服务器和客户端协商的那样

    • 例如,客户端可以是受信任的(AUTH_SYS),或者需要提供Kerberos用户凭证(RPCSEC_GSS)

    • RPCSEC_GSS线安全可以是完整性仅(krb5i)或完整性与隐私(加密,krb5p)

    • 各种NFS特定安全和权限规则可用

      • 例如,root-squashing

  • 每个RGW NFS挂载(即NFS-Ganesha导出)都关联了一套RGW/S3安全凭证(对NFS未知)

    • 所有通过NFS服务器执行的RGW对象操作都将由与存储在正在访问的导出中的凭证关联的RGW用户执行(目前仅支持RGW和RGW LDAP凭证)

      • 目前不支持Keystone等额外的RGW认证类型

手动配置一个NFS-Ganesha实例

每个NFS RGW实例都是一个NFS-Ganesha服务器实例嵌入一个完整的Ceph RGW实例。

因此,RGW NFS配置包括Ceph和Ceph对象网关特定的配置在本地ceph.conf中,以及NFS-Ganesha特定的配置在NFS-Ganesha配置文件ganesha.conf中。

ceph.conf

RGW NFS所需的ceph.conf配置包括:

  • 有效的[client.rgw.{instance-name}]节

  • 最小实例配置的有效值,特别是,安装并正确的keyring

其他配置变量(例如,rgw datargw backend store)是可选的。

少数配置变量(例如,rgw_nfs_namespace_expire_secs)是RGW NFS独有的。

特别是,前端选择由librgw.so运行时特殊处理。默认情况下,仅启动rgw-nfs前端。通过配置选项启用额外的前端(例如,beast)。其语法与普通rgw nfs frontends config option. Its syntax is identical to the ordinary rgw frontends选项相同。rgw frontend defaultsas normal。

ganesha.conf

用于RGW NFS的严格最小ganesha.conf包括一个嵌入FSAL块的EXPORT块,类型为RGW:

EXPORT
{
     Export_ID={numeric-id};
     Path = "/";
     Pseudo = "/";
     Access_Type = RW;
     SecType = "sys";
     NFS_Protocols = 4;
     Transport_Protocols = TCP;

     # optional, permit unsquashed access by client "root" user
     #Squash = No_Root_Squash;

     FSAL {
             Name = RGW;
             User_Id = {s3-user-id};
             Access_Key_Id ="{s3-access-key}";
             Secret_Access_Key = "{s3-secret}";
     }
}

Export_ID必须有一个整数值,例如,“77”

Path(对于RGW)应该是“/”

Pseudo定义一个NFSv4伪根名称(仅NFSv4)

SecType = sys;允许客户端无需Kerberos认证即可连接

Squash = No_Root_Squash;允许客户端根用户覆盖权限(Unix惯例)。当root-squashing启用时,根用户尝试的操作将像由NFS-Ganesha服务器上的本地“nobody”(和“nogroup”)用户执行

RGW FSAL还支持RGW特定配置变量在RGW配置节中:

RGW {
    cluster = "{cluster name, default 'ceph'}";
    name = "client.rgw.{instance-name}";
    ceph_conf = "/opt/ceph-rgw/etc/ceph/ceph.conf";
    init_args = "-d --debug-rgw=16";
}

cluster设置一个Ceph集群名称(必须与要导出的集群匹配)

name设置一个RGW实例名称(必须与要导出的集群匹配)

ceph_conf提供一个非默认ceph.conf文件的路径以使用

其他有用的NFS-Ganesha配置:

任何应该支持NFSv3的EXPORT块应该在NFS_Protocols设置中包含版本3。此外,NFSv3是支持UDP传输的最后一个主要版本。要启用UDP,请将其包含在Transport_Protocols设置中。例如:

EXPORT {
 ...
   NFS_Protocols = 3,4;
   Transport_Protocols = UDP,TCP;
 ...
}

一个重要的选项系列涉及与Linux idmapping服务的交互,该服务用于跨系统规范化用户和组名称。idmapper集成的详细信息在此未提供。

使用Linux NFS客户端时,可以配置NFS-Ganesha接受客户端提供的数字用户和组标识符,使用NFSv4,默认情况下会将其字符串化——这在小型设置和实验中可能很有用:

NFSV4 {
    Allow_Numeric_Owners = true;
    Only_Numeric_Owners = true;
}

故障排除

NFS-Ganesha配置问题通常通过使用调试选项运行服务器来调试,这些选项由LOG配置节控制。

NFS-Ganesha日志消息按各种组件分组,可以单独为每个组件启用日志记录。组件日志记录的有效值包括:

*FATAL* critical errors only
*WARN* unusual condition
*DEBUG* mildly verbose trace output
*FULL_DEBUG* verbose trace output

Example:

 LOG {

       Components {
               MEMLEAKS = FATAL;
               FSAL = FATAL;
               NFSPROTO = FATAL;
               NFS_V4 = FATAL;
               EXPORT = FATAL;
               FILEHANDLE = FATAL;
               DISPATCH = FATAL;
               CACHE_INODE = FATAL;
               CACHE_INODE_LRU = FATAL;
               HASHTABLE = FATAL;
               HASHTABLE_CACHE = FATAL;
               DUPREQ = FATAL;
               INIT = DEBUG;
               MAIN = DEBUG;
               IDMAPPER = FATAL;
               NFS_READDIR = FATAL;
               NFS_V4_LOCK = FATAL;
               CONFIG = FATAL;
               CLIENTID = FATAL;
               SESSIONS = FATAL;
               PNFS = FATAL;
               RW_LOCK = FATAL;
               NLM = FATAL;
               RPC = FATAL;
               NFS_CB = FATAL;
               THREAD = FATAL;
               NFS_V4_ACL = FATAL;
               STATE = FATAL;
               FSAL_UP = FATAL;
               DBUS = FATAL;
       }
       # optional: redirect log output
#      Facility {
#              name = FILE;
#              destination = "/tmp/ganesha-rgw.log";
#              enable = active;
       }
}

运行多个NFS网关

每个NFS-Ganesha实例都是一个完整的网关端点,限制是当前一个NFS-Ganesha实例不能配置为导出HTTP服务。与普通网关实例一样,可以启动任意数量的NFS-Ganesha实例,从集群导出相同或不同的资源。这使NFS-Ganesha实例的集群化成为可能。然而,这并不意味着高可用性。

当常规网关实例和NFS-Ganesha实例重叠相同的数据资源时,它们可以通过标准S3 API和通过NFS-Ganesha实例作为导出访问。可以将NFS-Ganesha实例与同一主机上的Ceph对象网关实例并置。

RGW与RGW NFS

从同一程序实例导出NFS命名空间和其他RGW命名空间(例如,通过Civetweb HTTP前端导出的S3或Swift)目前不受支持。

在NFS外部添加对象和桶时,这些对象将在rgw_nfs_namespace_expire_secs设置的时间出现,该设置默认为300秒(5分钟)。在Ceph配置文件中覆盖rgw_nfs_namespace_expire_secs的默认值以更改刷新率。

如果导出不符合有效S3桶命名要求的Swift容器,请在Ceph配置文件的[client.rgw]节中将rgw_relaxed_s3_bucket_names设置为true。例如,如果Swift容器名称包含下划线,它不是有效的S3桶名称,除非rgw_relaxed_s3_bucket_names设置为true。

配置NFSv4客户端

要访问命名空间,请将配置的NFS-Ganesha导出(s)挂载到本地POSIX命名空间中的所需位置。如前所述,此实现有一些独特的限制:

  • 偏好NFS 4.1及以上协议版本

    • 使用NFSv4 OPEN和CLOSE操作来跟踪上传事务

  • 要成功上传数据,客户端必须保留写顺序

    • 在Linux和许多Unix NFS客户端上,使用-osync挂载选项

挂载 NFS 资源的约定是平台特定的。以下约定适用于 Linux 和某些 Unix 平台:

从命令行:

mount -t nfs -o nfsvers=4.1,noauto,soft,sync,proto=tcp <ganesha-host-name>:/ <mount-point>

在/etc/fstab:

<ganesha-host-name>:/ <mount-point> nfs noauto,soft,nfsvers=4.1,sync,proto=tcp 0 0

指定NFS-Ganesha主机名和客户端上的挂载点路径。

配置NFSv3客户端

Linux客户端可以通过提供nfsvers=3noacl作为挂载选项来配置为使用NFSv3挂载。要使用UDP作为传输,请将proto=udp添加到挂载选项中。但是,TCP是首选的传输:

<ganesha-host-name>:/ <mount-point> nfs noauto,noacl,soft,nfsvers=3,sync,proto=tcp 0 0

如果挂载将使用版本3和UDP,请将NFS Ganesha EXPORT块Protocols设置与版本3和Transports设置与UDP一起配置。

NFSv3语义

由于NFSv3不会向文件服务器通信客户端OPEN和CLOSE操作,RGW NFS不能使用这些操作来标记文件上传事务的开始和结束。相反,RGW NFS在向文件在偏移量0处发送第一个写入时启动一个新的上传,并在一段时间内未看到对该文件的任何新写入时最终确定上传,默认情况下为10秒。要更改此超时,请在Ceph配置文件的RGW节中设置rgw_nfs_write_completion_interval_s的替代值。

参考资料

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.