NFS SERVER의 동작에 대해 이야기하기 전에 NFS SERVER와 관련된 몇 가지 사항을 살펴보겠습니다.
RPC(Remote Procedure Call)
NFS 자체는 그렇지 않습니다. NFS는 정보 전송 프로토콜과 기능을 제공하지만 NFS는 다른 전송 프로토콜을 사용하기 때문에 네트워크를 통해 데이터를 공유할 수 있습니다. 이러한 전송 프로토콜 전사는 이 RPC 기능을 사용합니다. NFS 자체가 RPC를 이용한 프로그램이라고 할 수 있습니다. 즉, NFS는 RPC SERVER이기도 하므로 NFS를 사용하는 곳마다 NFS SERVER든 NFS CLIENT든 RPC 서비스를 시작해야 합니다. 이러한 방식으로 SERVER와 CLIENT는 RPC를 통해 PROGRAM PORT 대응을 실현할 수 있습니다. RPC와 NFS의 관계는 다음과 같이 이해할 수 있습니다. NFS는 파일 시스템이고 RPC는 정보 전송을 담당합니다.
NFS가 시작해야 하는 데몬
pc.nfsd: 주로 복잡한 로그인 권한 감지 등
rpc.mountd: NFS의 파일 시스템을 담당한다. 클라이언트가 rpc.nfsd를 통해 SERVER에 로그인하면 클라이언트 액세스 서버의 파일에 대한 일련의 관리를 수행한다.
NFS SERVER는 REDHAT LINUX 플랫폼의 다음 단계에 두 개의 패키지가 필요합니다: nfs-utils 및 PORTMAP
nfs-utils: rpc.nfsd 및 rpc.mountd, 두 개의 NFS DAEMONS 패키지 제공
p>portmap: NFS는 실제로 RPC SERVER PROGRAM으로 간주할 수 있습니다. RPC SERVER PROGRAM을 시작하려면 PORT에 해당하는 작업을 수행해야 하며 이러한 작업은 PORTMAP에 의해 완료됩니다. 일반인의 관점에서 보면 PortMap은 PORT 매핑에 사용됩니다.
1: 서버측 설정(LINUX를 예로 들어)
서버측 설정은 /etc/exports 파일에서 설정됩니다.
p>
공유할 디렉터리는 호스트 이름 1 또는 IP1(매개변수 1, 매개변수 2) 호스트 이름 2 또는 IP2(매개변수 3, 매개변수 4)입니다.
위 형식은 동일함을 나타냅니다. 디렉터리는 서로 다른 두 호스트에 공유되지만 두 호스트에 제공되는 권한과 매개변수가 다르기 때문에 두 호스트가 얻는 권한은 별도로 설정됩니다.
설정할 수 있는 매개변수는 주로 다음과 같습니다.
rw: 읽기 및 쓰기 권한
ro: 읽기 전용 권한;
no_root_squash: NFS 호스트에 로그인하는 사용자가 ROOT 사용자인 경우 이 매개변수는 매우 안전하지 않으므로 사용하지 않는 것이 좋습니다.
root_squash: NFS 호스트에 로그인하고 공유 디렉터리를 사용하는 사용자가 루트인 경우 사용자의 권한은 익명 사용자로 압축되며 일반적으로 그의 UID 및 GID는 없음 ID가 됩니다. ;
all_squash: 어떤 사용자가 NFS 호스트에 로그인하든 아무도 없음으로 재설정됩니다.
anonuid: NFS 호스트에 로그인하는 모든 사용자를 지정된 사용자 ID로 설정합니다. 이 ID는 /etc/passwd에 있어야 합니다.
anongid: anonuid와 동일하지만 그룹 ID로 변경되었습니다!
동기화: 데이터가 동기적으로 메모리에 기록됩니다.
async: 데이터는 먼저 메모리에 일시적으로 저장되며 하드 디스크에 직접 기록되지 않습니다.
안전하지 않은 경우 이 시스템의 무단 액세스를 허용합니다.
예를 들어 /etc/exports를 다음과 같이 편집할 수 있습니다:
/tmp *(rw, no_root_squash)
/home/public 192.168.0.* (rw) *(ro)
/home/test 192.168.0.100(rw)
/home/linux *.the9.com(rw, all_squash, anonuid=40, anongid =40)
설정 후 다음 명령을 사용하여 NFS를 시작할 수 있습니다:
/etc/rc.d/init.d/portmap start (PORTMAP은 기본적으로 다음에서 시작됩니다. REDHAT)
p>/etc/rc.d/init.d/nfs start
exportfs 명령:
시작 후 /etc/exports를 수정하는 경우 NFS, nfs를 다시 시작해야 합니까? 이때, 내보내기fs 명령을 사용하여 변경 사항을 즉시 적용할 수 있습니다. 명령 형식은 다음과 같습니다:
exportfs [-aruv]
-a: mount all 또는 unmount /etc/exports content
-r: /etc/exports에 공유된 디렉토리를 다시 마운트합니다.
-u: 디렉토리 umount
-v: 내보낼 때, 자세한 정보를 화면에 출력합니다.
구체적인 예:
[root @test root]#exportfs -rv
2. nfs 디렉터리를 마운트하는 방법:
mount -t nfs 호스트 이름(또는 IP):/directory /mount/point
구체적인 예:
Linux: mount -t nfs 192.168.0.1:/tmp /mnt/nfs
Solaris: 마운트 -F nfs 192.168.0.1:/tmp /mnt/nfs
BSD: 마운트 192.168.0.1:/tmp /mnt/nfs
3. nfs에 대한 기타 선택적 매개변수:
HARD 마운트 및 SOFT MOUNT:
HARD: NFS CLIENT는 지속적으로 서버에 연결을 시도합니다(백그라운드에서는 프롬프트 메시지가 표시되지 않습니다). , LINUX의 일부 버전에서는 MOUNT까지 여전히 몇 가지 프롬프트를 표시합니다.
SOFT: 기본 연결 방법인 포그라운드에서 SERVER에 연결을 시도합니다. 오류 메시지가 수신되면 마운트 시도가 종료되고 관련 정보가 제공됩니다.
예: mount -F nfs -o hard 192.168.0.10:/nfs /nfs
하드를 사용할지 소프트를 사용할지는 주로 어떤 정보에 액세스하는지에 따라 다릅니다. . 예를 들어 NFS를 통해 X PROGRAM을 실행하려는 경우 예상치 못한 상황(예: 네트워크 속도가 갑자기 매우 느려지는 경우, 네트워크 연결 및 연결 해제 등)으로 인해 시스템이 많은 수의 오류 메시지를 출력하는 것을 원하지 않을 것입니다. 카드 등) 이때 HARD 모드를 사용하는 경우 시스템은 정보를 전송하기 위해 NFS SERVER와 연결을 다시 설정할 수 있을 때까지 기다립니다.
또한, 중요하지 않은 데이터인 경우 FTP 데이터 등 SOFT 방식을 사용할 수도 있으므로 원격 시스템이 일시적으로 연결할 수 없거나 종료될 때 세션이 중단되지 않습니다.
rsize 및 wsize:
파일 전송 크기 설정: V3은 전송 크기를 제한하지 않으며 V2는 최대 8k로만 설정할 수 있습니다. -rsize 및 -wsize를 사용하여 그것을 설정하십시오. 이 두 매개변수의 설정은 NFS의 실행 성능에 큰 영향을 미칩니다.
bg: 마운트 중에 마운트를 성공적으로 마운트할 수 없는 경우 시스템은 마운트 작업을 백그라운드로 전송하고 계속해서 마운트를 시도합니다. mount., 마운트가 성공할 때까지. (보통 bg는 시작 속도에 영향을 줄 수 있는 마운트 실패 가능성을 피하기 위해 /etc/fstab 파일을 설정할 때 사용해야 합니다.)
fg: bg와 정반대이며 기본 매개변수입니다.
nfsvers=n: 사용할 NFS 버전을 설정합니다. 기본값은 2를 사용하는 것입니다. 이 옵션의 설정도 서버가 NFS VER 3을 지원하는지 여부에 따라 다릅니다.
mountport: 마운트 포트를 설정합니다. /p>
port: 서버에서 내보낸 포트 설정을 기반으로 합니다. 예를 들어 서버가 NFS를 내보내는 데 포트 5555를 사용하는 경우 클라이언트는 이 매개변수를 사용하여 동일한 설정을 지정해야 합니다.
timeo= n: 시간 초과를 설정합니다. 데이터 전송에 문제가 발생하면 이 매개변수에 따라 재전송을 시도합니다. 기본값은 7/10초(0.7초)입니다. 네트워크 연결이 그다지 안정적이지 않은 경우에는 이 값을 높여야 하며, 보류 중인 파일 액세스를 종료할 수 있도록 HARD MOUNT 방식을 사용하는 것이 좋습니다.
intr 알림을 통해 NFS 호출을 중단할 수 있습니다. 서버가 응답하지 않아 포기해야 할 때 유용합니다.
udp: udp를 nfs의 전송 프로토콜로 사용(NFS V2는 UDP만 지원)
tcp: nfs의 전송 프로토콜로 tcp 사용
namlen= n: 원격 서버에서 허용하는 가장 긴 파일 이름을 설정합니다. 이 값의 기본값은 255입니다.
acregmin=n: 파일이 업데이트되기 전의 최소 캐시 시간을 설정합니다. 기본값은 3입니다.
acregmax=n: 파일이 업데이트되기 전의 최대 캐시 시간을 설정합니다. 파일이 업데이트됩니다. 캐시 시간, 기본값은 60입니다.
acdirmin=n: 디렉토리 업데이트 전 최소 캐시 시간을 설정합니다. 기본값은 30입니다.
acdirmax=n: 최대값을 설정합니다. 디렉토리 업데이트 전 캐시 시간 캐시 시간, 기본값은 60입니다.
actimeo=n: acregmin, acregmax, acdirmin 및 acdirmax를 동일한 값으로 설정합니다. 기본값은 활성화되지 않습니다.
retry=n: 네트워크 전송이 실패할 때 더 이상 시도하지 않기 전에 다시 연결을 시도하는 시간을 설정합니다. 기본값은 10000분입니다.
noac: 캐시 메커니즘을 끕니다.
여러 매개변수를 동시에 사용하는 방법: mount -t nfs -o timeo=3, udp, hard 192.168.0.30:/tmp /nfs
NFS는 클라이언트와 서버 옵션은 반드시 동일할 필요는 없으며 때때로 충돌합니다. 예를 들어, 서버는 읽기 전용 모드로 내보내고 클라이언트는 쓰기 가능 모드로 마운트하는 경우 성공적으로 마운트할 수 있더라도 쓰기를 시도할 때 오류가 발생합니다. 일반적으로 서버와 클라이언트 구성 간에 충돌이 있는 경우 서버 구성이 우선합니다.
4. /etc/fstab 설정 방법
/etc/fstab 형식은 다음과 같습니다.
fs_spec fs_file fs_type fs_options fs_dump fs_pass
fs_spec: 이 필드는 로드하려는 파일 시스템이 있는 장치 또는 원격 파일 시스템을 정의합니다. nfs의 경우 이 매개변수는 일반적으로 다음과 같이 설정됩니다: 192.168.0.1:/NFS
fs_file: 로컬 마운트 지점
fs_type: NFS의 경우 이 필드는 nfs로만 설정하면 됩니다.
fs_options: 사용할 수 있는 매개변수는 마운트를 참조하세요. 위의 매개변수.
fs_dump - 이 옵션은 "dump" 명령에서 파일 시스템을 덤프해야 하는 빈도를 확인하는 데 사용됩니다. 덤프가 필요하지 않은 경우 이 필드를 0으로 설정하세요.
fs_pass - 이 필드는 fsck 명령에서 시작 시 검사해야 하는 파일 시스템의 순서를 결정하는 데 사용됩니다. 루트 파일 시스템 "/"에 대한 이 필드의 값은 1이어야 하고 다른 파일 시스템의 경우 2여야 합니다. 시작 시 파일 시스템을 검색할 필요가 없으면 이 필드를 0으로 설정하십시오.
5. NFS 관련 명령어 소개
nfsstat:
NFS의 실행 상태를 보는 것은 NFS 작동을 조정하는 데 매우 도움이 됩니다.
rpcinfo:
rpc 실행 상태를 감지하는 데 사용할 수 있는 도구인 rpc 실행 정보를 확인합니다.
4. NFS 튜닝
튜닝 단계:
1. 현재 네트워크, 서버 및 각 클라이언트의 실행 효율성을 측정합니다.
2. 수집된 데이터를 분석하고 차트를 그립니다. 높은 디스크 및 CPU 사용량, 이미 높은 디스크 사용량 등 특별한 상황을 찾습니다.
3. 서버를 조정합니다.
4. 원하는 성능에 도달할 때까지 1~3단계를 반복합니다.
NFS 성능과 관련된 많은 문제가 있으며 일반적으로 다음 옵션을 고려해야 합니다.
NFS의 실행 성능을 최적화하기 위한 WSIZE, RSIZE 매개변수
WSIZE 및 RSIZE NFS 성능에 큰 영향을 미칩니다.
wsize 및 rsize는 SERVER와 CLIENT 사이의 데이터 블록 크기를 설정합니다. 이 두 매개변수의 합리적인 설정은 소프트웨어뿐만 아니라 하드웨어 요소도 이 두 매개변수 설정에 영향을 미칩니다. LINUX 커널, 네트워크 카드, 스위치 등과 같은).
다음 명령은 NFS의 실행 성능을 테스트하기 위해 읽기 및 쓰기 성능을 별도로 테스트하여 적절한 매개변수를 찾을 수 있습니다. 분산된 대량의 데이터 읽기 및 쓰기를 테스트하려면 스크립트를 작성하여 테스트할 수 있습니다. 각 테스트 중에 MOUNT를 반복적으로 실행하고 마운트 해제하는 것이 가장 좋습니다.
time dd if=/dev/zero of=/mnt/home/testfile bs=16k count=16384
테스트용 WSIZE, RSIZE는 1024의 배수인 것이 바람직하고, NFS의 경우 V2, 8192는 RSIZE 및 WSIZE의 최대값입니다. NFS V3을 사용하는 경우 시도할 수 있는 최대값은 32768입니다.
설정된 값이 상대적으로 큰 경우 CLIENT에서 마운트에 있는 디렉터리에 들어가서 몇 가지 일반적인 작업(LS, VI 등)을 수행하여 오류 메시지가 나타나는지 확인하는 것이 가장 좋습니다. 발생할 수 있는 일반적인 문제로는 파일을 완전히 나열할 수 없거나 LS 중에 오류 메시지가 나타나는 것 등이 있습니다. 운영체제마다 최적의 값이 다르기 때문에 다양한 운영체제를 테스트해야 합니다.
NFSD에 대한 최적의 COPY 수를 설정합니다.
Linux에서 NFSD에 대한 COPY 수는 시작 파일 /etc/rc.d/init.d/nfs에 설정됩니다. 기본값은 8 NFSD입니다. WSIZE, RSIZE와 마찬가지로 가능한 CLIENT 수에 따라 설정되며, 테스트를 통해 가장 가까운 값을 찾는 것이 필요합니다.
UDP 및 TCP
수동으로 설정하거나 자동으로 선택할 수 있습니다.
mount -t nfs -o sync, tcp, noatime, rsize=1024, wsize=1024 EXPORT_MACHINE:/EXPORTED_DIR /DIR
UDP는 빠른 전송과 비연결의 편리성을 가지고 있습니다. 그러나 UDP는 전송에 있어서 TCP만큼 안정적이지 않습니다. 네트워크가 불안정하거나 해커의 침입이 있을 경우 NFS의 성능이 크게 저하되거나 네트워크가 마비되기 쉽습니다. 따라서 전송 프로토콜은 다양한 네트워크에 맞게 선택되어야 합니다. tcp를 통한 nfs는 상대적으로 안정적이며 udp를 통한 nfs는 더 빠릅니다. UDP 프로토콜을 사용하면 머신 수가 적고 네트워크 상태가 좋을 때 더 나은 성능을 얻을 수 있습니다. 머신이 많고 네트워크 상태가 복잡할 경우에는 TCP 프로토콜을 사용하는 것이 좋습니다(V2는 UDP 프로토콜만 지원합니다). LAN에서는 상대적으로 안정적인 네트워크 보장을 제공하므로 UDP 프로토콜을 사용하는 것이 좋습니다. UDP를 사용하면 WAN에서 TCP 프로토콜을 사용하는 것이 좋습니다. 복잡한 네트워크 환경에서의 성능 전송 안정성. 다음 문서를 참조할 수 있습니다: .tw/ssn/unix/0212/unix021204.asp
버전 선택
V3이 기본 선택입니다(RED HAT 8은 기본적으로 V2를 사용하고 SOLARIS 8 위의 경우 기본적으로 V3를 사용하며 vers= 마운트 옵션을 통해 선택할 수 있습니다.
LINUX는 마운트 옵션의 nfsvers=n을 통해 선택합니다.
5. NFS 문제 해결
1. NFSD가 시작되지 않습니다.
먼저 NFS 출력 목록이 있는지 확인하세요. 그렇지 않으면 nfsd가 시작되지 않습니다. 내보내기fs 명령을 사용하여 확인할 수 있습니다. 내보내기fs 명령이 결과를 반환하지 않거나 잘못된 결과를 반환하는 경우 /etc/exports 파일을 확인해야 합니다.
2. mountd 프로세스가 시작되지 않았습니다.
mountd 프로세스는 RPC(원격 프로시저 호출)이며 해당 기능은 파일 시스템을 마운트하라는 클라이언트의 요청에 응답하는 것입니다. mountd 프로세스는 원격 클라이언트가 사용할 수 있는 파일 시스템을 알아보기 위해 /etc/xtab 파일을 찾습니다. 또한, mountd 프로세스를 통해 사용자는 현재 원격 파일 시스템에 어떤 파일 시스템이 마운트되어 있는지 알 수 있고, 원격 클라이언트 목록도 학습할 수 있습니다. mountd가 정상적으로 시작되는지 확인하려면 rpcinfo 명령을 사용하면 됩니다. 일반적인 상황에서 출력 목록은 다음과 같습니다:
100005 1 udp 1039 mountd
100005 1 tcp 1113 mountd
100005 2 UDP 1039 마운트
100005 2 tcp 1113 마운트
100005 3 udp 1039 마운트
100005 3 tcp 1113 마운트
p>
나타나지 않으면 PORTMAP 컴포넌트가 설치되어 있는지 확인하시면 됩니다.
rpm -qa|grep portmap
3. fs 유형 nfs는 커널에서 지원되지 않습니다.
커널은 문제를 해결하기 위해 nfs 파일 시스템을 지원하지 않습니다. 문제.
4. portmapper에 연결할 수 없습니다: RPC: 원격 시스템 오류 - 연결이 거부되었습니다.
이 오류 메시지는 SEVER 측의 PORTMAP이 시작되지 않았기 때문에 발생합니다.
5. mount clntudp_create: RPC: 프로그램이 등록되지 않았습니다.
NFS가 시작되지 않았습니다. showmout -e 호스트 명령을 사용하여 NFS SERVER가 정상적으로 시작되는지 확인할 수 있습니다.
6. 마운트: localhost:/home/test 실패, 서버에서 제공한 이유: 권한 거부됨
이 프롬프트는 클라이언트가 nfs 서버를 마운트하려고 할 때 나타날 수 있는 프롬프트입니다. 의미 이 머신에는 nfs 서버에 디렉터리를 마운트할 수 있는 권한이 없다는 의미입니다. 물론 해결책은 NFS SERVER를 수정하는 것입니다.
7. 방화벽에 의해 차단되는 경우
요구 사항이 엄격한 네트워크 환경에서는 일반적으로 Linux의 모든 포트를 사용해야 하는 경우가 많습니다. 포트가 열려야 포트가 열립니다. NFS는 기본적으로 포트 111을 사용하므로 먼저 이 포트가 열려 있는지 확인하고 TCP_Wrappers의 설정도 확인해야 합니다.
6. NFS 보안
NFS의 불안정성은 주로 다음 네 가지 측면에서 나타납니다.
1. 초보자가 접근 제어를 구현하기 어렵습니다. NFS 메커니즘은 사용하기 쉽지만 제어 대상의 정확성을 달성하기 어렵습니다.
2. NFS에는 실제 사용자 인증 메커니즘이 없고 RPC/마운트에 대한 프로세스 인증 메커니즘만 있습니다. 요청
3. 이전 NFS는 권한이 없는 사용자가 유효한 파일 핸들을 얻을 수 있도록 허용했습니다.
4. RPC 원격 호출에서 SUID 프로그램은 슈퍼 사용자 권한을 갖습니다.
방법 NFS 보안을 강화하려면:
1. /etc/exports에 공유 디렉터리를 올바르게 설정하세요. MOUNT에서 NFS SERVER로의 CLIENT가 최소한의 권한만 가지도록 annuid와 anongid를 사용하는 것이 가장 좋습니다. root_squash를 사용하지 않는 것이 가장 좋습니다.
2. IPTABLE 방화벽을 사용하여 NFS 서버에 연결할 수 있는 머신의 범위를 제한하세요.
iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 -- dport 111 - j 승인
iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j 승인
iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j 승인
iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j 승인 p>
3. DoS 공격을 방지하기 위해서는 NFSD의 COPY 개수를 적절하게 설정해야 합니다.
4. CLIENT를 제한하도록 /etc/hosts.allow 및 /etc/hosts.deny를 수정합니다.
/etc/hosts.allow
portmap: 192.168. 0.0/255.255.255.0: 허용
portmap: 140.116.44.125: 허용
/etc/hosts.deny
portmap: ALL: 거부
p>5. 기본 NFS 포트 변경
NFS는 기본적으로 포트 111을 사용하지만, 포트 매개변수를 사용하여 이 포트를 변경할 수도 있으며, 이는 어느 정도 보안을 강화할 수 있습니다.
6. Kerberos V5를 로그인 확인 시스템으로 사용