클라이언트 VM에서 NFS 포트 구성

이 페이지에서는 클라이언트 VM에서 statdnlockmgr 데몬의 포트를 설정하여 방화벽 구성을 쉽게 만드는 방법을 설명합니다.

Filestore는 nlockmgrstatd 데몬을 사용하여 파일 잠금을 사용 설정합니다. 이러한 서비스의 포트는 클라이언트가 잠금을 올바르게 사용할 수 있도록 방화벽 규칙을 통해 클라이언트 VM에 올바르게 노출되어야 합니다. 인그레스 방화벽 규칙을 더 쉽게 구성하기 위해 모든 클라이언트 VM에서 일관성을 갖도록 statdnlockmgr 포트를 설정하는 것이 좋습니다.

VPC 네트워크에 대한 방화벽 규칙을 구성해야 하는지 여부를 확인하는 방법은 방화벽 규칙 구성을 참조하세요.

포트 설정 확인

statdnlockmgr 포트가 현재 설정된 값을 확인하려면 클라이언트 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 포트를 설정할 필요가 없습니다.

포트 설정

statdnlockmgr 포트를 설정하려면 클라이언트 VM 인스턴스에서 다음 명령어를 실행합니다. 이러한 예에서는 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_tcpport, nlm_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_tcpport, nlm_udpport, 옵션을 설정합니다.

      options lockd nlm_tcpport=4045
      options lockd nlm_udpport=4045
      
    3. 파일을 저장하고 종료합니다.

SUSE

statdnlockmgr 포트를 설정합니다.

  1. 수정할 /etc/sysconfig/nfs 파일을 엽니다.

    sudo nano /etc/sysconfig/nfs
    
  2. STATD_PORT, LOCKD_TCPPORT, LOCKD_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: 스크립트 파일이 있는 경로입니다. 이 명령어는 루트로 실행해야 하며, 그렇지 않으면 명령어 시작 부분에 sudo를 추가합니다.
  4. 다음 명령어를 입력합니다.

    SCRIPT_PATH INSTANCE_IP SHARE_NAME
    

    다음을 바꿉니다.

    • SCRIPT_PATH: 스크립트 파일이 있는 경로입니다. 이 명령어는 루트로 실행해야 하며, 그렇지 않으면 명령어 시작 부분에 sudo를 추가합니다.
    • INSTANCE_IP: Filestore 인스턴스의 IP 주소
    • SHARE_NAME: 파일 공유 이름

    포트가 열려 있으면 스크립트가 다음 응답을 반환합니다.

    The NLM GRANT message is working properly!
    

    포트가 열려 있지 않으면 스크립트가 다음 오류를 반환합니다.

    The NLM GRANT message is not working properly!
    

다음 단계