2.14. 名前空間の NFS-Ganesha へのエクスポート

Red Hat Ceph Storage 3 以降では、Ceph Object Gateway は実稼働システムに NFS バージョン 3 および NFS バージョン 4.1 を使用して S3 オブジェクトの名前空間をエクスポートする機能を提供します。

注記

NFS Ganesha 機能は、一般的な使用ではなく、S3 クラウドへの移行のみを目的としています。

注記

Red Hat Ceph Storage では、バージョン付けされたバケットの NFS エクスポートはサポートされません。

この実装は、UNIX 形式のパス名を S3 バケットおよびオブジェクトにマッピングする Amazon Web Services(AWS)階層の namespace の規則に準拠します。NFSv4 擬似ルート(存在する場合は NFSv4 擬似ルート)の最上位は、Ceph Object Gateway S3 バケットで構成されます。ここで、バケットは NFS ディレクトリーとして表現されます。バケット内のオブジェクトは、S3 の規則に従って NFS ファイルおよびディレクトリー階層として表示されます。ファイルおよびディレクトリーを作成する操作がサポートされます。

注記

ハードリンクまたはソフトリンク IS の作成または削除はサポートされていません。NFS 経由でサポートされているバケットまたはディレクトリー IS で名前変更操作を実行することはできますが、ディレクトリー内でサポートされる IS、およびファイルシステムと NFS マウント間での名前を変更します。ファイルの名前変更操作は、NFS 上で行う場合、ターゲットディレクトリーを変更し、通常は完全な readdir を強制的に更新するため、コストが高くなります。

注記

NFS マウント IS を介したファイルの編集はサポートされていません。

注記

Ceph Object Gateway では、オフセット 0 からファイルの末尾にアプリケーションを順番に書き込む必要があります。順序が不足すると、アップロード操作は失敗します。この問題を回避するには、ファイルを NFS 領域にコピーする際に、cpcatrsync などのユーティリティーを使用します。常に sync オプションでマウントします。

NFS を使用する Ceph Object Gateway は、ゲートウェイサーバーのインプロセスライブラリーパッケージングと、NFS-Ganesha NFS サーバー用の File System Abstraction Layer(FSAL)名前空間ドライバーに基づいています。ランタイム時に、Ceph Object Gateway デーモンと NFS のインスタンスは、完全な Ceph Object Gateway デーモン(Civetweb HTTP サービスなし)と NFS-Ganesha インスタンスを 1 つのプロセスに統合します。この機能を利用するには、NFS-Ganesha バージョン 2.3.2 以降をデプロイします。

NFS-Ganesha (nfs-ganesha-rgw) インスタンスを含むホストで「作業を開始する前に」および「NFS-Ganesha インスタンス」 のステップを実行します。

複数の NFS ゲートウェイの実行

各 NFS-Ganesha インスタンスが完全なゲートウェイエンドポイントとして機能し、現在の制限により、NFS-Ganesha インスタンスが HTTP サービスをエクスポートするように設定することはできません。通常のゲートウェイインスタンスと同様に、任意の数の NFS-Ganesha インスタンスを起動し、クラスターから同じリソースまたは異なるリソースをエクスポートできます。これにより、NFS-Ganesha インスタンスのクラスタリングが有効になります。ただし、これは高可用性を意味するものではありません。

通常のゲートウェイインスタンスと NFS-Ganesha インスタンスが同じデータリソースと重複する場合には、標準の S3 API とエクスポートされた NFS-Ganesha インスタンスの両方からアクセスできます。NFS-Ganesha インスタンスを、同じホスト上で Ceph Object Gateway インスタンスと共存させることができます。

作業を開始する前に

  1. NFS-Ganesha を実行する前に、NFS-Ganesha を実行するホストで実行中のカーネル NFS サービスインスタンスをすべて無効にします。NFS-Ganesha は、別の NFS インスタンスが実行している場合は起動しません。
  2. root で Red Hat Ceph Storage Tools リポジトリーを有効にします。

    Red Hat Enterprise Linux 7

    # subscription-manager repos --enable=rhel-7-server-rhceph-4-tools-rpms

    Red Hat Enterprise Linux 8

    # subscription-manager repos --enable=rhceph-4-tools-for-rhel-8-x86_64-rpms

  3. rpcbind サービスが実行していることを確認します。

    # systemctl start rpcbind
    注記

    rpcbind を提供する rpcbind パッケージは通常、デフォルトでインストールされます。そうでない場合は、最初にパッケージをインストールします。

    NFS の rpcbind の使用方法の詳細は、Red Hat Enterprise Linux 7 の『ストレージ管理ガイド』の「必要なサービス」セクションを参照してください。

  4. nfs-service サービスが実行中である場合は、これを停止して無効にします。

    # systemctl stop nfs-server.service
    # systemctl disable nfs-server.service

NFS-Ganesha インスタンスの設定

  1. nfs-ganesha-rgw パッケージをインストールします。

    # yum install nfs-ganesha-rgw
  2. Ceph Monitor ノードから NFS-Ganesha ホストの /etc/ceph/ ディレクトリーに Ceph 設定ファイルをコピーし、必要に応じて編集します。

    # scp <mon-host>:/etc/ceph/ceph.conf <nfs-ganesha-rgw-host>:/etc/ceph
    注記

    Ceph 構成ファイルには、有効な [client.rgw.{instance-name}] セクションと、rgw_datakeyringrgw_frontends など、必要なさまざまな Gateway 設定変数が含まれている必要があります。有効な S3 バケットの命名要件に準拠していない Swift コンテナーをエクスポートする場合は、Ceph 設定ファイルの [client.rgw] セクションで rgw_relaxed_s3_bucket_namestrue に設定します。たとえば、Swift コンテナー名にアンダースコアが含まれる場合、これは有効な S3 バケット名ではなく、rgw_relaxed_s3_bucket_namestrue に設定されていない限り同期されません。NFS 外にオブジェクトおよびバケットを追加すると、これらのオブジェクトは、デフォルトで rgw_nfs_namespace_expire_secs によって設定された時間に NFS 名前空間に表示されます。デフォルトでは約 5 分です。Ceph 設定ファイルの rgw_nfs_namespace_expire_secs のデフォルト値を上書きして、更新レートを変更します。

  3. NFS-Ganesha 設定ファイルを開きます。

    # vim /etc/ganesha/ganesha.conf
  4. FSAL (File System Abstraction Layer) ブロックを使用して EXPORT セクションを設定します。ID、S3 ユーザー ID、S3 アクセスキー、およびシークレットを指定します。NFSv4 の場合、以下のようになります。

    EXPORT
    {
            Export_ID={numeric-id};
            Path = "/";
            Pseudo = "/";
            Access_Type = RW;
            SecType = "sys";
            NFS_Protocols = 4;
            Transport_Protocols = TCP;
            Squash = No_Root_Squash;
    
            FSAL {
                    Name = RGW;
                    User_Id = {s3-user-id};
                    Access_Key_Id ="{s3-access-key}";
                    Secret_Access_Key = "{s3-secret}";
            }
    }

    Path オプションは、エクスポートを見つける場所を Ganesha に指示します。VFS FSAL では、これはサーバーの名前空間内の場所です。他の FSAL の場合、その FSAL の名前空間で管理されるファイルシステム内での場所が考えられます。たとえば、CephFSAL を使用して CephFS ボリューム全体をエクスポートする場合、Path/ になります。

    Pseudo オプションは、Ganesha に対して NFS v4 の擬似ファイルシステムの名前空間内にエクスポートを配置するよう指示します。NFS v4 を指定すると、サーバーが実際のエクスポートの場所に対応していない擬似名前空間を構築する可能性があり、その擬似ファイルシステムの一部は NFS サーバーのレルム内にのみ存在し、物理ディレクトリーに対応していません。さらに、NFS v4 サーバーは、1 つの名前空間内にすべてのエクスポートを配置します。擬似ファイルシステムのルートとして 1 つのエクスポートをエクスポートすることは可能ですが、擬似ファイルシステムに複数のエクスポートを配置するのがはるかに一般的です。従来の VFS では、多くの場合、Pseudo の場所は Path の場所と同じです。/Path として使用して CephFS エクスポート例に戻る場合、複数のエクスポートが必要な場合は、エクスポートに Pseudo オプションが他にない可能性があります。たとえば、/ceph です。

    NFSv3 に対応する EXPORT ブロックには、NFS_Protocols 設定でバージョン 3 を含める必要があります。さらに、NFSv3 は、UDP トランスポートをサポートする最後のメジャーバージョンです。標準の初期バージョンには UDP が含まれていましたが、RFC 7530 は使用を禁止しています。UDP を有効にするには、Transport_Protocols 設定に追加します。以下に例を示します。

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

    SecType = sys; を設定することで、クライアントは Kerberos 認証なしで接続できます。

    Squash = No_Root_Squash; を設定すると、ユーザーは NFS マウント内のディレクトリー所有権を変更できます。

    従来の OS ネイティブ NFS 4.1 クライアントを使用する NFS クライアントは通常、移行先サーバーの pseudofs root で定義されるエクスポートされたファイルシステムのフェデレーションされた名前空間を表示します。これら数は、Ceph Object Gateway のエクスポートです。

    各エクスポートには、nameUser_IdAccess_Key、および Secret_Access_Key という独自のタプルがあり、指定されたユーザーが確認できるオブジェクトの名前空間のプロキシーを作成します。

    ganesha.conf のエクスポートには、NFSV4 ブロックを含めることもできます。Red Hat Ceph Storage では、idmapper プログラムを設定する代わりに、Allow_Numeric_Owners パラメーターおよび Only_Numberic_Owners パラメーターサポートされます。

    NFSV4 {
        Allow_Numeric_Owners = true;
        Only_Numeric_Owners = true;
    }
  5. NFS_CORE_PARAM ブロックを設定します。

    NFS_CORE_PARAM{
        mount_path_pseudo = true;
    }

    mount_path_pseudo 構成設定は、true に設定すると、NFS v3 および NFS v4.x のマウントが同じサーバー側パスを使用してエクスポートに到達させます。

        mount -o vers=3 <IP ADDRESS>:/export /mnt
        mount -o vers=4 <IP ADDRESS>:/export /mnt
    Path            Pseudo          Tag     Mechanism   Mount
    /export/test1   /export/test1   test1   v3 Pseudo   mount -o vers=3 server:/export/test1
    /export/test1   /export/test1   test1   v3 Tag      mount -o vers=3 server:test1
    /export/test1   /export/test1   test1   v4 Pseudo   mount -o vers=4 server:/export/test1
    /               /export/ceph1   ceph1   v3 Pseudo   mount -o vers=3 server:/export/ceph1
    /               /export/ceph1   ceph1   v3 Tag      mount -o vers=3 server:ceph1
    /               /export/ceph1   ceph1   v4 Pseudo   mount -o vers=4 server:/export/ceph1
    /               /export/ceph2   ceph2   v3 Pseudo   mount -o vers=3 server:/export/ceph2
    /               /export/ceph2   ceph2   v3 Tag      mount -o vers=3 server:ceph2
    /               /export/ceph2   ceph2   v4 Pseudo   mount -o vers=4

    mount_path_pseudo の構成設定を false に設定すると、NFS v3 は Path オプションを使用し、NFS v4.x マウントは Pseudo オプションを使用します。

    Path            Pseudo          Tag     Mechanism   Mount
    /export/test1   /export/test1   test1   v3 Path     mount -o vers=3 server:/export/test1
    /export/test1   /export/test1   test1   v3 Tag      mount -o vers=3 server:test1
    /export/test1   /export/test1   test1   v4 Pseudo   mount -o vers=4 server:/export/test1
    /               /export/ceph1   ceph1   v3 Path     mount -o vers=3 server:/
    /               /export/ceph1   ceph1   v3 Tag      mount -o vers=3 server:ceph1
    /               /export/ceph1   ceph1   v4 Pseudo   mount -o vers=4 server:/export/ceph1
    /               /export/ceph2   ceph2   v3 Path     not accessible
    /               /export/ceph2   ceph2   v3 Tag      mount -o vers=3 server:ceph2
    /               /export/ceph2   ceph2   v4 Pseudo   mount -o vers=4 server:/export/ceph2
  6. RGW セクションを設定します。インスタンスの名前を指定し、Ceph 設定ファイルへのパスを指定し、初期化引数を指定します。

    RGW {
        name = "client.rgw.{instance-name}";
        ceph_conf = "/etc/ceph/ceph.conf";
        init_args = "--{arg}={arg-value}";
    }
  7. /etc/ganesha/ganesha.conf 設定ファイルを保存します。
  8. nfs-ganesha サービスを有効にして開始します。

    # systemctl enable nfs-ganesha
    # systemctl start nfs-ganesha
  9. 擬似ディレクトリーが非常に大きい場合には、ceph.conf ファイルの設定可能なパラメーター rgw_nfs_s3_fast_attrstrue に設定して、名前をイミュータブルかつ加速します。

    rgw_nfs_s3_fast_attrs= true
  10. 各ゲートウェイノードから Ceph Object Gateway サービスを再起動します。

    # systemctl restart ceph-radosgw.target

NFSv4 クライアントの設定

名前空間にアクセスするには、設定した NFS-Ganesha エクスポートをローカルの POSIX 名前空間にある任意の場所にマウントします。前述のように、この実装にはいくつかの特殊な制限があります。

  • NFS 4.1 以降のプロトコルフレーバーのみがサポートされます。
  • 書き込み順序を設定するには、sync マウントオプションを使用します。

NFS-Ganesha エクスポートをマウントするには、クライアントホストの /etc/fstab ファイルに以下のエントリーを追加します。

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

NFS-Ganesha のホスト名と、クライアントのマウントポイントへのパスを指定します。

注記

NFS-Ganesha エクスポートを正常にマウントするには、クライアントに /sbin/mount.nfs ファイルが存在する必要があります。nfs-tools パッケージはこのファイルを提供します。多くの場合、パッケージはデフォルトでインストールされます。ただし、nfs-tools パッケージがクライアントにインストールされていることを確認し、インストールされていない場合はインストールします。

NFS の詳細は、Red Hat Enterprise Linux 7 の『ストレージ管理ガイド』の「ネットワークファイルシステム (NFS)」の章を参照してください。

NFSv3 クライアントの設定

マウントオプションとして nfsvers=3 および noacl を指定して、Linux クライアントが NFSv3 でマウントされるように設定できます。UDP をトランスポートとして使用するには、proto=udp をマウントオプションに追加します。ただし、TCP が優先されるプロトコルです。

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

NFS Ganesha EXPORT ブロックの Protocols 設定をバージョン 3 に設定し、マウントがバージョン 3 を UDP で使用する場合は Transports 設定を UDP に設定します。

NFSv3 は、クライアント OPEN 操作および CLOSE 操作をファイルサーバーと通信しないため、RGW NFS はこれらの操作を使用してファイルのアップロードトランザクションの開始と終了をマークできません。代わりに、RGW NFS は、オフセット 0 で最初の書き込みがファイルに送信されると新しいアップロードを開始しようとし、ファイルへの新規書き込みが一定期間表示されない場合にアップロードを確定します。デフォルトでは 10 秒です。この値を変更するには、Ceph 設定ファイルの RGW セクションに rgw_nfs_write_completion_interval_s の値を設定します。