NFS 서비스 시작
6200 단어 NFS 파일 시스템
내보낼 파일 시스템을 설정하면 NFS 서비스를 시작할 수 있습니다.클라이언트는 NFS 서비스가 시작된 후에만 서버 측의 파일 시스템을 마운트할 수 있습니다.NFS 서비스를 시작하는 명령은 서비스 nfs start입니다. 이 명령은 다음 6개의 명령을 포함합니다.
/sbin/service rpcsvcgssd start
/usr/sbin/exportfs -r
rpc.rquotad
rpc.nfsd 8
rpc.mountd
/sbin/service rpcidmapd condstart
rpcsvcgssd는 gss인증과 관련된 서비스입니다. 만약에 우리가 UNIX 인증을 사용한다면 이 서비스를 열지 않을 수 있습니다.rpc.rquotad는 디스크 할당량과 관련된 프로세스입니다. 이 프로세스는 열리지 않을 수도 있습니다.rpcidmapd는 사용자 이름 맵과 관련된 서비스로 이 서비스도 켜지 않을 수 있습니다.따라서 반드시 실행해야 하는 명령은 제2, 4, 5조이다.다음은 이 세 가지 명령이 어떤 일을 했는지 설명합니다.
2.exportfs
이 명령의 주요 역할은 파일/etc/exports를 분석하고 그 결과를 파일/var/lib/nfs/etab에 저장하는 것입니다./etc/exports에는 파일 시스템을 내보내야 하는 옵션이 포함되어 있습니다. 많은 옵션이 기본값을 가지고 있습니다. 우리는 이 기본값을 자주 사용합니다. exportfs는 이 기본값을 파일 시스템의 옵션에 기입합니다.예를 들면 아래의 이 파일 시스템.
/tmp/nfs/ 192.168.6.0/24(fsid=0,crossmnt,rw,no_root_squash,anonuid=500,anongid=500) 192.168.4.0/24(fsid=0,rw)
해석된 결과는
/tmp/nfs 192.168.6.0/24(rw,sync,wdelay,hide,crossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,fsid=0,anonuid=500,anongid=500)
/tmp/nfs 192.168.4.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,fsid=0,anonuid=65534,anongid=65534)
3.rpc.nfsd
이것은 가장 주요한 명령으로 서버 측의 NFS 서비스를 열었고 NFS 서비스는 일종의 RPC 서비스이다.간단하게 말하면 RPC는 일종의 메시지 전송 메커니즘이다.클라이언트는 서버 측에 RPC 메시지를 보내고 서버 측은 RPC 메시지를 처리한 후에 처리 결과를 클라이언트에게 반환합니다.NFS 파일 시스템에서 mkdir, ls,cat 등의 작업을 수행하면 클라이언트는 이러한 작업을 RPC 메시지로 변환하여 서버에 처리합니다.NFS 서비스에는 다음 RPC 메시지가 정의되어 있습니다.
#define NFSPROC_NULL 0
#define NFSPROC_GETATTR 1
#define NFSPROC_SETATTR 2
#define NFSPROC_ROOT 3 //
#define NFSPROC_LOOKUP 4
#define NFSPROC_READLINK 5
#define NFSPROC_READ 6
#define NFSPROC_WRITECACHE 7 //
#define NFSPROC_WRITE 8
#define NFSPROC_CREATE 9
#define NFSPROC_REMOVE 10
#define NFSPROC_RENAME 11
#define NFSPROC_LINK 12
#define NFSPROC_SYMLINK 13
#define NFSPROC_MKDIR 14
#define NFSPROC_RMDIR 15
#define NFSPROC_READDIR 16
#define NFSPROC_STATFS 17
일반적으로 mkdir는 NFSPROC로 변환됩니다_MKDIR, ls를 NFSPROC로 변환_READDIR,cat에서 NFSPROC로 변환_READ.서버 측에서 NFS 서비스를 시작하면 RPC 메시지를 감청하는 일부 코어 스레드가 생성됩니다.RPC 메시지가 서버에 전달되면 이러한 커널 메시지는 상응하는 처리를 한다.rpc.nfsd8은 8개의 핵 라인을 가동하는 것을 나타낸다.
4.rpc.mountd
이 명령은 주로 두 가지 일을 했고 첫 번째는 마운트 서비스를 시작한 것이다.MOUNT 서비스도 RPC 서비스입니다. 우리가 mount 명령을 실행하여 NFS 파일 시스템을 마운트할 때 클라이언트는 MOUNT 서비스를 통해 서버 측의 기본 정보를 요청했습니다. 주로 NFS 파일 시스템 루트 노드의 파일 핸들(앞으로 글에서 파일 핸들을 설명할 것)과 인증 방식입니다.그러나 NFSV4에 변화가 생겼다. NFSV4는 이 기능을 NFS 서비스에 통합했기 때문에 NFSV4는 마운트 서비스를 열 필요가 없지만 rpc를 실행해야 한다.mountd 명령, 원인은 rpc입니다.mountd가 한 두 번째 일.
rpc.mountd가 하는 두 번째 일은 파일/var/lib/nfs/etab를 분석하여 이 파일의 내용을 메모리에 저장하고 서버 측에서 NFS 요청을 받은 후에 이 파일에서 NFS 파일 시스템의 정보를 조회해야 하는 것이다.이 정보를 메모리에 저장하면 검색 속도가 빨라집니다.이 파일의 해석은 매우 번거롭지만 복잡하지 않은 작업으로 주로 문자열 해석 함수, 체인 테이블 역행 함수와 체인 테이블 찾기 함수와 관련된다.따라서 해석 과정을 생략하고 해석 후의 결과를 직접 붙인다.
먼저 클라이언트 주소 형식과 관련된 매개 변수를 보십시오.
enum {
MCL_FQDN = 0, //
MCL_SUBNETWORK, // IP
MCL_IPADDR = MCL_SUBNETWORK, // IP
MCL_WILDCARD,
MCL_NETGROUP,
MCL_ANONYMOUS,
MCL_GSS,
MCL_MAXTYPES
};
이 변수는 NFS에서 지원하는 클라이언트 주소 유형을 나타낸다. 이 글의 예는 IP 주소를 통해 접근한 것으로 192.168.6.0/24와 192.168.4.0/24 두 개의 네트워크를 포함하고 이를 두 개의 인증역이라고 부른다.모든 인증 영역은 아래의 데이터 구조로 표시합니다.
typedef struct mclient {
struct mclient * m_next; //
char * m_hostname; // , 192.168.6.0/24
int m_type; // , MCL_IPADDR
int m_naddr;
union nfs_sockaddr m_addrlist[NFSCLNT_ADDRMAX];
int m_exported; /* exported to nfsd */
int m_count;
} nfs_client;
인증 영역의 유형에 따라 시스템의 모든 인증 영역은hash표에 저장됩니다.
nfs_client *clientlist[MCL_MAXTYPES] = { NULL, };
따라서 서버 측 인증 도메인은 다음과 같이 저장됩니다.
파일 시스템의 데이터 구조는 다음과 같습니다.
struct exportent {
char * e_hostname;
char e_path[NFS_MAXPATHLEN+1];
int e_flags;
int e_anonuid;
int e_anongid;
int * e_squids;
int e_nsquids;
int * e_sqgids;
int e_nsqgids;
unsigned int e_fsid;
char * e_mountpoint;
int e_fslocmethod;
char * e_fslocdata;
char * e_uuid;
struct sec_entry e_secinfo[SECFLAVOR_COUNT+1];
unsigned int e_ttl;
};
이 구조의 각 필드는 파일 시스템을 내보낼 때 설정된 옵션입니다.
이 데이터 구조는 다른 데이터 구조 중의 한 필드이다
typedef struct mexport {
struct mexport * m_next;
struct mclient * m_client; //
struct exportent m_export; //
int m_exported; /* known to knfsd. -1 means not sure */
int m_xtabent : 1, /* xtab entry exists */
m_mayexport: 1, /* derived from xtabbed */
m_changed : 1, /* options (may) have changed */
m_warned : 1; /* warned about multiple exports
* matching one client */
} nfs_export;
따라서 파일 시스템 정보를 나타내는 데이터 구조는 nfs_export, 각 nfs_export 구조는 내보낸 파일 시스템을 표시합니다.앞의 예에서 우리는 파일 시스템/tmp/nfs를 내보냈지만 두 개의 인증 도메인 192.168.6.0/24와 192.168.4.0/24를 설정했기 때문에 시스템에 두 개의 nfs_가 존재한다client 구조, 두 nfs_export 구조.
nfs_export 구조도hash표의 형식으로 존재하지만 이hash표는 매우 크다. 기본 형식은 아래와 같다.
먼저 파일 시스템은 인증 도메인 유형에 따라 MCL_로 구분됩니다.MAXTYPES 개의hash표, 인증역이 같은 파일 시스템은 같은hash표에 저장되며, 각각hash표에는 1021개의 체인표가 포함됩니다.서버가 클라이언트의 요청을 받은 후에 이 큰hash표를 찾아 클라이언트가 요청한 파일 시스템이 어느 파일 시스템인지, 그리고 클라이언트가 이 파일 시스템에 해당하는 권한이 있는지 판단합니다.권한이 충족되면 이 요청을 처리합니다.권한이 충족되지 않으면 이 요청을 거부합니다.