クライアント VM 上の NFS ポートを構成する

このページでは、クライアント VM で statd デーモンと nlockmgr デーモンのポートを設定してファイアウォールの構成を簡単にする方法について説明します。

Filestore は、nlockmgr デーモンと statd デーモンを使用して、ファイルロックを有効にします。クライアントがロックを適切に使用できるように、これらのサービスのポートは、ファイアウォール ルールを使用してクライアント VM に適切に公開する必要があります。上り(内向き)ファイアウォール ルールを簡単に構成できるように、すべてのクライアント VM で整合性を持たせるように statd ポートと nlockmgr ポートを設定することをおすすめします。

VPC ネットワークに対してファイアウォール ルールを構成する必要があるかどうかを判別する方法の詳細については、ファイアウォール ルールの構成をご覧ください。

ポート設定を確認する

statd ポートと nlockmgr ポートが現在設定されている値を確認するには、クライアント VM インスタンスで次のコマンドを実行します。ファイルが存在しない場合、またはオプションに値が設定されていない場合、ポートは設定されていません。その場合、デーモンは使用可能な任意のポートに動的に割り当てられます。

Debian / Ubuntu

  1. statd ポートを特定するには、次のコマンドを実行して STATDOPTS 値を確認します。

    cat /etc/default/nfs-common
    
  2. nlockmgr ポートを特定するには、次のコマンドを実行して、nlm_tcpportnlm_udpport の値を確認します。

    cat /etc/modprobe.d/lock.conf
    

RHEL / CentOS

  1. statd ポートを特定するには、次のコマンドを実行して STATD_PORT 値を確認します。

    cat /etc/sysconfig/nfs
    
  2. nlockmgr ポートを特定するには、次のコマンドを実行して、nlm_tcpportnlm_udpport の値を確認します。

    cat /etc/modprobe.d/lock.conf
    

SUSE

次のコマンドを実行します。

cat /etc/sysconfig/nfs

statd ポートは STATD_PORT の下に、nlockmgr ポートは LOCKD_TCPPORTLOCKD_UDPPORT の下に一覧表示されます。

Windows

Windows では NFS ポートの設定は不要です。

ポートを設定する

クライアント VM インスタンスで次のコマンドを実行し、statd ポートと nlockmgr ポートを設定します。これらの例では nano テキスト エディタを使用していますが、任意のテキスト エディタを使用できます。これらの例では、値が一般的な選択という理由で、statd のポートとして 2046 を、また nlockmgr のポートとして 4045 を使用しています。ネットワーク構成に基づいて、異なるポートを使用できます。この場合、上り(内向き)ファイアウォール ルールで、使用する特定のポートへのトラフィックを許可する必要があります。

Debian、Ubuntu

  • statd ポートを設定します。

    1. 編集する /etc/default/nfs-common ファイルを開きます。

      sudo nano /etc/default/nfs-common
      
    2. STATDOPTS オプションを設定します。

      STATDOPTS="-p 2046"
      
    3. ファイルを保存して終了します。

  • nlockmgr ポートを設定します。

    1. /etc/modprobe.d/lock.conf ファイルを作成します。

      sudo nano /etc/modprobe.d/lock.conf
      
    2. nlm_tcpportnlm_udpport の各オプションを設定します。

      options lockd nlm_tcpport=4045
      options lockd nlm_udpport=4045
      
    3. ファイルを保存して終了します。

RHEL / CentOS

  • statd ポートを設定します。

    1. 編集する /etc/sysconfig/nfs ファイルを開きます。

      sudo nano /etc/sysconfig/nfs
      
    2. STATD_PORT オプションを設定します。

      STATD_PORT=2046
      
    3. ファイルを保存して終了します。

  • nlockmgr ポートを設定します。

    1. /etc/modprobe.d/lock.conf ファイルを作成します。

      sudo nano /etc/modprobe.d/lock.conf
      
    2. nlm_tcpportnlm_udpport の各オプションを設定します。

      options lockd nlm_tcpport=4045
      options lockd nlm_udpport=4045
      
    3. ファイルを保存して終了します。

SUSE

statd ポートと nlockmgr ポートを設定します。

  1. 編集する /etc/sysconfig/nfs ファイルを開きます。

    sudo nano /etc/sysconfig/nfs
    
  2. STATD_PORTLOCKD_TCPPORTLOCKD_UDPPORT の各オプションを設定します。

    STATD_PORT=2046
    LOCKD_TCPPORT=4045
    LOCKD_UDPPORT=4045
    
  3. ファイルを保存して終了します。

Windows

Windows では NFS ポートの設定は不要です。

ポートが開いていることを確認する

NFS ポートが正しく開いていることを確認するには、次の手順を完了します。

  1. 次の依存関係をインストールします。

    Debian / Ubuntu

    コマンドラインで次のコマンドを入力します。

    sudo apt install nfs-common tcpdump tshark
    

    RHEL / CentOS

    コマンドラインで次のコマンドを入力します。

    sudo yum install nfs-utils tcpdump wireshark
    

    SUSE

    コマンドラインで次のコマンドを入力します。

    sudo zypper install nfs-client tcpdump wireshark
    

    Windows

    この確認プロセスは Windows ではサポートされていません。

  2. verify-nfs-port-script.sh というスクリプト ファイルを作成し、その中に次のスクリプトをコピーして貼り付け、マシンにローカルで保存します。ファイルの場所をメモし、次の手順のために保存します。

    #!/bin/bash
    
    # This script is intended to run on client machines to verify that the ports
    # are properly open to allow the reception of NLM GRANT messages from the server.
    
    set -eu
    
    function kill_descendants() {
       for pid in $(ps -o pid= --ppid "$1")
       do
       kill_descendants "$pid"
       done
       if [[ $1 -ne $$ ]]; then
       kill "$1" 2>/dev/null | true
       fi
    }
    
    function cleanup {
       set +eu
    
       # Kill all background jobs and wait for it to end, makes sure locks are released
       kill_descendants $$
    
       # Wait for jobs to die and locks to be released, so mount is not busy
       sleep 2
    
       umount -f "$MNT1"
       umount -f "$MNT2"
    
       rmdir "$MNT1" 2&> /dev/null || true
       rmdir "$MNT2" 2&> /dev/null || true
    }
    
    function print_help {
       echo "$0 [server_ip] [mount_path]"
       echo -e "\t For example, if you mount a server using:"
       echo -e "\t\t \"mount 10.0.0.1:share /mnt/mount_point\""
       echo -e "\t Run the script: "
       echo -e "\t\t \"$0 10.0.0.1 share\""
    }
    
    if [ $# -ne 2 ]; then
       print_help
       exit 1
    fi
    
    if [ $(id -u) -ne 0 ]; then
       echo "Failure! This script needs to run as root, use \"sudo $@\""
       exit 1
    fi
    
    if ! [ -x "$(command -v tshark)" ]; then
       echo "The 'tshark' command does not exist and is needed for the script. Please install it"
       exit 1
    fi
    
    if ! [ -x "$(command -v tcpdump)" ]; then
       echo "The 'tcpdump' command does not exist and is needed for the script. Please install it"
       exit 1
    fi
    
    SERVER_IP=$1
    MOUNT_PATH=$2
    
    MNT1=$(mktemp -d)
    MNT2=$(mktemp -d)
    
    trap cleanup EXIT
    
    echo "Mounting..."
    mount -o nosharecache "$SERVER_IP":"$MOUNT_PATH" "$MNT1"
    mount -o nosharecache "$SERVER_IP":"$MOUNT_PATH" "$MNT2"
    
    REC_FILE=$(mktemp /tmp/nlm_recording_XXXXXXXX.pcap)
    tcpdump -i any -s0 -w "$REC_FILE" "host $SERVER_IP" &
    TCPDUMP_PID=$!
    echo "Recording TCP dump to $REC_FILE"
    
    sleep 5 # wait for tcpdump to start running
    
    echo "Running test..."
    flock "$MNT1"/lock_file -c "echo -n \"Got first lock: \" && date && sleep 5 && echo -n \"Releasing first lock: \" && date" &
    sleep 2 # Wait for the first lock to actually be taken
    
    echo "Waiting for second lock: $(date)"
    flock "$MNT2"/lock_file -c "echo -n \"Got second lock: \" && date"
    
    sleep 2 # Wait for tcpdump to record everything
    kill $TCPDUMP_PID
    
    # For quick analysis inspect recording with tshark, if you don't have it just inspect with Wireshark
    echo "Inspecting results in $REC_FILE with TShark"
    tshark -r "$REC_FILE" -Y nlm # First, print the output
    
    tshark -r "$REC_FILE" -Y nlm 2>/dev/null | grep -q GRANTED
    EXIT_CODE=0
    if [ $? -eq 0 ]; then
       echo "The NLM GRANT message is working properly!"
       EXIT_CODE=0
    else
    echo "The NLM GRANT message is not working properly!"
    EXIT_CODE=1
    fi
    echo "For debugging, please provide the printed output of the script, and $REC_FILE"
    exit ${EXIT_CODE}
    
  3. 次のコマンドを入力します。

    chmod +x SCRIPT_PATH
    

    以下を置き換えます。

    • SCRIPT_PATH: スクリプト ファイルが配置されているパス。これは root として実行する必要があります。それ以外の場合は、コマンドの先頭に sudo を追加します。
  4. 次のコマンドを入力します。

    SCRIPT_PATH INSTANCE_IP SHARE_NAME
    

    以下を置き換えます。

    • SCRIPT_PATH: スクリプト ファイルが配置されているパス。これは root として実行する必要があります。それ以外の場合は、コマンドの先頭に sudo を追加します。
    • INSTANCE_IP: Filestore インスタンスの IP アドレス
    • SHARE_NAME: ファイル共有の名前

    ポートが開いている場合、スクリプトは次のレスポンスを返します。

    The NLM GRANT message is working properly!
    

    ポートが開いていない場合は、スクリプトが次のエラーを返します。

    The NLM GRANT message is not working properly!
    

次のステップ