NFS Ganesha 是一台 NFS 服务器(请参见与 NFS 共享文件系统),它在用户地址空间中运行,而不是作为操作系统内核的一部分运行。借助 NFS Ganesha,您可以插入自己的存储机制(例如 Ceph),并从任何 NFS 客户端访问它。
系统按用户将 S3 存储桶导出到 NFS,例如,通过路径 GANESHA_NODE:/用户名/存储桶名
导出。
默认通过路径 GANESHA_NODE:/cephfs
导出 CephFS。
由于客户端与存储区之间的额外网络跃点会导致协议开销增加并产生额外的延迟,因此与使用本机 CephFS 或对象网关客户端相比,通过 NFS 网关访问 Ceph 可能会使应用性能大幅降低。
有关安装说明,请参阅第 12 章 “安装 NFS Ganesha”。
有关可在配置文件中使用的所有参数的列表,请参见:
man ganesha-config
man ganesha-ceph-config
,用于 CephFS 文件系统抽象层 (FSAL) 选项。
man ganesha-rgw-config
,用于对象网关 FSAL 选项。
本节包含的信息可帮助您配置 NFS Ganesha 服务器,以导出可通过对象网关和 CephFS 访问的集群数据。
NFS Ganesha 配置包含两个部分:服务配置和导出项配置。服务配置通过 /etc/ganesha/ganesha.conf
控制。注意,对此文件所做的更改在执行 DeepSea 阶段 4 时将被覆盖。要永久更改这些设置,请编辑位于 Salt Master 上的文件 /srv/salt/ceph/ganesha/files/ganesha.conf.j2
。导出项配置以 RADOS 对象的形式存储在 Ceph 集群中。
服务配置存储在 /etc/ganesha/ganesha.conf
中,用于控制所有 NFS Ganesha 守护进程设置,包括 Ceph 集群中存储导出项配置的位置。注意,对此文件所做的更改在执行 DeepSea 阶段 4 时将被覆盖。要永久更改这些设置,请编辑位于 Salt Master 上的文件 /srv/salt/ceph/ganesha/files/ganesha.conf.j2
。
RADOS_URLS
部分用于配置为了从 RADOS 对象读取 NFS Ganesha 配置所需进行的 Ceph 集群访问。
RADOS_URLS { Ceph_Conf = /etc/ceph/ceph.conf; UserId = "ganesha.MINION_ID"; watch_url = "rados://RADOS_POOL/ganesha/conf-MINION_ID"; }
Ceph 配置文件路径位置。
CephX 用户 ID。
用于查看重新加载通知的 RADOS 对象 URL。
RGW { ceph_conf = "/etc/ceph/ceph.conf"; name = "name"; cluster = "ceph"; }
指向 ceph.conf
文件。与 DeepSea 一起部署时,不需要更改此值。
NFS Ganesha 使用的 Ceph 客户端用户名。
Ceph 集群的名称。SUSE Enterprise Storage 6 目前只支持一个集群名称,默认为 ceph
。
%url rados://RADOS_POOL/ganesha/conf-MINION_ID
NFS Ganesha 支持从 RADOS 对象读取配置。使用 %url
指令可指定用于识别 RADOS 对象位置的 RADOS URL。
RADOS URL 可采用以下两种格式:rados://<POOL>/<OBJECT>
或 rados://<POOL>/<NAMESPACE>/<OBJECT>
,其中 POOL
是存储对象的 RADOS 存储池,NAMESPACE
是存储对象的存储池名称空间,OBJECT
是对象名称。
为了支持 Ceph Dashboard 的 NFS Ganesha 管理功能,您需要遵循每个服务守护进程的 RADOS 对象的命名约定。对象名称必须采用 conf-MINION_ID
格式,其中 MINION_ID 是正在运行此服务的节点的 Salt Minion ID。
DeepSea 已负责执行正确生成此 URL 的工作,您无需再进行任何更改。
NFS Ganesha 默认使用端口 2049 提供 NFS 支持,使用 875 提供 rquota 支持。要更改默认端口号,请在 NFS_CORE_PARAM
段落中使用 NFS_Port
和 RQUOTA_Port
选项,例如:
NFS_CORE_PARAM { NFS_Port = 2060; RQUOTA_Port = 876; }
导出项配置以 RADOS 对象的形式存储在 Ceph 集群中。每个导出块都存储在各自名为 export-<id>
的 RADOS 对象中,其中,<id>
必须与导出项配置的 Export_ID
属性匹配。导出项与 NFS Ganesha 服务之间的关联通过 conf-MINION_ID
对象实现。每个服务对象包含该服务导出的每个导出项的 RADOS URL 列表。导出块如下所示:
EXPORT { Export_Id = 1; Path = "/"; Pseudo = "/"; Access_Type = RW; Squash = No_Root_Squash; [...] FSAL { Name = CEPH; } }
要为上面的导出块创建 RADOS 对象,我们需要先将导出块代码存储到一个文件中。然后可以使用 RADOS CLI 工具将之前保存的文件的内容存储到 RADOS 对象中。
cephadm@adm >
rados -p POOL -N NAMESPACE put export-EXPORT_ID EXPORT_FILE
创建导出对象后,我们便可将导出项与服务实例进行关联,方法是为服务对象添加导出对象的相应 RADOS URL。下面的章节说明如何配置导出块。
每个导出项都需要有唯一的“Export_Id”(强制)。
相关 CephFS 存储池中的导出项路径(强制)。允许从 CephFS 中导出子目录。
目标 NFS 导出项路径(对于 NFSv4 为强制)。它定义在哪个 NFS 导出项路径下可获得导出的数据。
示例:使用值 /cephfs/
并执行
root #
mount GANESHA_IP:/cephfs/ /mnt/
之后,CephFS 数据可在客户端上的目录 /mnt/cephfs/
中获得。
“RO”表示只读访问权限,“RW”表示读写访问权限,“None”表示禁止访问。
如果您在主 EXPORT
段落保留 Access_Type = RW
,并在 CLIENT
段落限制特定客户端的访问,其他客户端仍可连接。要禁止所有客户端的访问而只允许特定客户端进行访问,请在 EXPORT
段落设置 Access_Type = None
,然后在 CLIENT
段落为一个或多个客户端指定限制较少的访问模式:
EXPORT { FSAL { access_type = "none"; [...] } CLIENT { clients = 192.168.124.9; access_type = "RW"; [...] } [...] }
NFS 匿名访问选项。
导出“文件系统抽象层”。请参见第 21.2.2.2 节 “FSAL 子段落”。
EXPORT { [...] FSAL { Name = CEPH; } }
定义 NFS Ganesha 使用的后端。允许的值为 CEPH
(表示 CephFS)或 RGW
(表示对象网关)。根据您的选择,必须在 policy.cfg
中定义 role-mds
或 role-rgw
。
可为集群节点定义自定义 NFS Ganesha 角色。然后可在 policy.cfg
中将这些角色指定给节点。角色允许:
分别使用不同的 NFS Ganesha 节点来访问对象网关和 CephFS。
将不同的对象网关用户指定给 NFS Ganesha 节点。
拥有不同的对象网关用户可让 NFS Ganesha 节点访问不同的 S3 存储桶。S3 存储桶可用于进行访问控制。注意:不要将 S3 存储桶与 CRUSH 索引中使用的 Ceph 存储桶混淆。
下面针对 Salt Master 的示例过程展示如何创建两个具有不同对象网关用户的 NFS Ganesha 角色。在此示例中,使用了角色 gold
和 silver
,DeepSea 已经提供了它们的示例配置文件。
使用您选择的编辑器打开 /srv/pillar/ceph/stack/global.yml
文件。如果该文件不存在,请予以创建。
该文件需要包含以下几行:
rgw_configurations: - rgw - silver - gold ganesha_configurations: - silver - gold
稍后可以在 policy.cfg
中指定这些角色。
创建 /srv/salt/ceph/rgw/users/users.d/gold.yml
文件并添加以下内容:
- { uid: "gold1", name: "gold1", email: "gold1@demo.nil" }
创建 /srv/salt/ceph/rgw/users/users.d/silver.yml
文件并添加以下内容:
- { uid: "silver1", name: "silver1", email: "silver1@demo.nil" }
现在,需要为每个角色创建 ganesha.conf
的模板。使用 DeepSea 的原始模板是较佳的做法。创建两个副本:
root@master #
cd
/srv/salt/ceph/ganesha/files/root@master #
cp
ganesha.conf.j2 silver.conf.j2root@master #
cp
ganesha.conf.j2 gold.conf.j2
新的角色需要密钥环来访问集群。要提供访问权限,请复制 ganesha.j2
:
root@master #
cp
ganesha.j2 silver.j2root@master #
cp
ganesha.j2 gold.j2
复制对象网关的密钥环:
root@master #
cd
/srv/salt/ceph/rgw/files/root@master #
cp
rgw.j2 silver.j2root@master #
cp
rgw.j2 gold.j2
对象网关还需要不同角色的配置:
root@master #
cd
/srv/salt/ceph/configuration/files/root@master #
cp
ceph.conf.rgw silver.confroot@master #
cp
ceph.conf.rgw gold.conf
在 /srv/pillar/ceph/proposals/policy.cfg
中将新建的角色指定给集群节点:
role-silver/cluster/NODE1.sls role-gold/cluster/NODE2.sls
将 NODE1 和 NODE2 分别替换为要将角色指定给的节点的名称。
执行 DeepSea 阶段 0 到 4。
下面针对 Salt Master 的示例过程展示如何创建使用 CephFS 和对象网关的 2 个不同的新角色:
使用您选择的编辑器打开文件 /srv/pillar/ceph/rgw.sls
。如果该文件不存在,请予以创建。
该文件需要包含以下几行:
rgw_configurations: ganesha_cfs: users: - { uid: "demo", name: "Demo", email: "demo@demo.nil" } ganesha_rgw: users: - { uid: "demo", name: "Demo", email: "demo@demo.nil" } ganesha_configurations: - ganesha_cfs - ganesha_rgw
稍后可以在 policy.cfg
中指定这些角色。
现在,需要为每个角色创建 ganesha.conf
的模板。使用 DeepSea 的原始模板是较佳的做法。创建两个副本:
root@master #
cd
/srv/salt/ceph/ganesha/files/root@master #
cp
ganesha.conf.j2 ganesha_rgw.conf.j2root@master #
cp
ganesha.conf.j2 ganesha_cfs.conf.j2
编辑 ganesha_rgw.conf.j2
,删除以下段落:
{% if salt.saltutil.runner('select.minions', cluster='ceph', roles='mds') != [] %} [...] {% endif %}
编辑 ganesha_cfs.conf.j2
,删除以下段落:
{% if salt.saltutil.runner('select.minions', cluster='ceph', roles=role) != [] %} [...] {% endif %}
新的角色需要密钥环来访问集群。要提供访问权限,请复制 ganesha.j2
:
root@master #
cp
ganesha.j2 ganesha_rgw.j2root@master #
cp
ganesha.j2 ganesha_cfs.j2
可从 ganesha_rgw.j2
中删除 caps mds = "allow *"
这一行。
复制对象网关的密钥环:
root@master #
cp
/srv/salt/ceph/rgw/files/rgw.j2 \ /srv/salt/ceph/rgw/files/ganesha_rgw.j2
对象网关需要您对新角色进行配置:
root@master #
cp
/srv/salt/ceph/configuration/files/ceph.conf.rgw \ /srv/salt/ceph/configuration/files/ceph.conf.ganesha_rgw
在 /srv/pillar/ceph/proposals/policy.cfg
中将新建的角色指定给集群节点:
role-ganesha_rgw/cluster/NODE1.sls role-ganesha_cfs/cluster/NODE1.sls
将 NODE1 和 NODE2 分别替换为要将角色指定给的节点的名称。
执行 DeepSea 阶段 0 到 4。
RGW NFS 接口支持对文件及目录执行的大部分操作,但存在以下限制:
不支持包含符号链接的链接。
不支持 NFS 访问控制列表 (ACL)。支持 Unix 用户及组所有权和权限。
目录不可移动或重命名。您可在目录之间移动文件。
仅支持完整的顺序写入 I/O。因此,它会强制上载写入操作。许多执行非顺序存储的典型 I/O 操作(如就地编辑文件)必定会失败。有一些归档实用程序(例如,GNU tar
的某些版本)表面上是按顺序写入,但也可能会因偶尔的非顺序存储而失败。通过 NFS 装入时,一般可通过同步装入(-o sync
选项)强制应用的顺序 I/O 向 NFS 服务器顺序写入数据。无法同步装入的 NFS 客户端(例如 Microsoft Windows*)将无法上载文件。
NFS RGW 仅支持对小于 4 MB 的存储块执行读写操作。
要启用并启动 NFS Ganesha 服务,请运行以下命令:
root@minion >
systemctl
enable nfs-ganesharoot@minion >
systemctl
start nfs-ganesha
要重启动 NFS Ganesha,请运行以下命令:
root@minion >
systemctl
restart nfs-ganesha
启动或重启动 NFS Ganesha 时,NFS v4 会有 90 秒的超时宽限期。在宽限期内,会主动拒绝来自客户端的新请求。因此,当 NFS 处于宽限状态时,客户端可能会发生请求处理速度变慢的情况。
通过编辑文件 /etc/sysconfig/nfs-ganesha
,可更改默认调试级别 NIV_EVENT
。将 NIV_EVENT
替换为 NIV_DEBUG
或 NIV_FULL_DEBUG
。提高日志详细程度可能会在日志文件中产生大量数据。
OPTIONS="-L /var/log/ganesha/ganesha.log -f /etc/ganesha/ganesha.conf -N NIV_EVENT"
更改日志级别时,需要重启动服务。
使用 NFS v3 时,可以在 NFS Ganesha 服务器节点上校验是否导出了 NFS 共享:
root@minion >
showmount
-e / (everything)
要在客户端主机上装入导出的 NFS 共享(根据第 21.2 节 “配置”中的配置),请运行以下命令:
root #
mount
-t nfs -o rw,noatime,sync \ nfs_ganesha_server_hostname:/ /path/to/local/mountpoint