注意
本文档适用于 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 data
和rgw 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 defaults
as 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=3
和noacl
作为挂载选项来配置为使用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. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.