DevOps/지식창고

Samba VFS

WhiteDuck 2024. 3. 30. 12:54

Samba VFS 는 Samba 의 기능을 확장할 수 있도록 하는 매커니즘을 제공합니다.


  1. VFS Layer 로 파일 시스템에 저장하기 위해서 NTFS ACL 을 NFSv4 ACL 로 변환, GPFS VFS 모듈도 이를 수행 (RichACL 지원이 되면 Linux 에서도 동일한 작업을 수행할 수 있음)
  2. Linux 파일 시스템에서 지원하지 않는 파일 시스템에 구현한 기능을 지원합니다.
  3. 대체 데이터 스트림과 같은 기능을 구현합니다.
  4. XATTR 에 저장하고 의미 체계를 올바르게 처리하여 전체 NT ACL 지원을 구현합니다.
  5. 공유 메모리 인터페이스나 사용자 공간 라이브러리를 통해 액세스할 수 있는 사용자 공간 파일 시스템을 지원합니다. 이를 수행하는 모듈은 vfs_ceph.c, cfs_glsuterfs.c 입니다.

Samba VFS 는 원하는 기능을 제공하기 위해 Samba VFS 인터페이스가 제공하는 기능 중 일부 혹은 전부를 구현하는 공유 라이브러리, 모듈입니다. 또한 VFS 모듈은 스택형이 가능하고, 스택 상위에 구현되지 않은 기능에 대해 기본 Samba 기능을 제공하는 vfs\_default.c 가 있습니다.

호출된 함수에서 스택의 다른 모듈에서 제공하는 기능이 필요한 경우 VFS_SMB_NEXT_XXX 를 호출합니다. 계속 호출하다보면 마지막은 vfs\_default.c 를 호출합니다.

만약 VFS\_SMB\_NEXT\_XXX 를 포함하지 않은 경우 자체적으로 처리할 수 있다고 판단하여, Req2 의 예시처럼 진행될 수 있습니다.


Samba VFS 기능은 다음 클래스로 구분할 수 있습니다.:

  1. 마운트 및 마운트 해제 기능, 할당량 및 여유 공간 처리 루틴, statvfs 기능 등과 같은 디스크 또는 파일 시스템 작업
  2. opendir, readdir, mkdir 등과 같은 디렉터리 작업
  3. 파일 작업 : 파일 열기, 닫기, 읽기, 쓰기, 메타데이터 정보 가져오기, 파일에서 수행할 수 있는 기타 모든 작업
  4. 파일이나 디렉터리에서 NT ACL 을 설정하고 가져오는 것과 같은 작업, 보안 설명자 처리
  5. POSIX ACL 작업
  6. 파일에서 XATTR 을 설정하고 검색하기 위한 확장된 속성 작업
  7. 비동기 작업을 처리하기 위한 AIO 작업
  8. 오프라인 작업을 처리하기 위한 오프라인 작업
  9. 내구성 있는 핸들 작업(Durable handle operations)

두 가지 유형의 파일 시스템

  1. 시스템 호출을 통해 액세스 되고 시스템이 파일 설명자를 제공하는 파일 시스템
  2. 일반적으로 사용자 공간 라이브러리를 통해 사용자 공간에서 액세스되는 파일 시스템

사용자 공간 파일 시스템을 위한 모든 VFS 는 커널이 이해하지 못하는 파일 설명자를 제공합니다.


VFS 모듈 작성

vfs 모듈을 빌드하는 경우 source3/modules 디렉토리에 vfs\_.c 형식으로 지정해야 합니다. 모듈에는 vfs\_fn\_pointer 로 실제로 구현하는 함수에 대한 포인터로 함수를 초기화할 수 있습니다.

VFS module lifecycle

클라이언트가 TREE_CONNECT 요청을 발행하면 samba 는 SMB_VFS_CONNECT 를 호출

  1. vfs_fn_pointer 의 connect_fn

일반적으로 handle→conn 를 컨텍스트로 사용하여 해당 메모리가 할당된 경우 연결 모듈에서 talloc 을 사용하여 할당된 메모리를 정리할 필요가 없습니다.

VFS module initialize

samba_init_module 에서는 모듈이 구현하는 기능으로 모듈을 등록하는 것입니다. 다음과 같이 vfs 모듈을 등록할 수 있습니다.

NTSTATUS vfs_<module_name>_init(TALLOC_CTX *ctx) 
{ 
        return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "my_module", 
                                &vfs_my_module_fns); 
}

VFS Function Pointer Structure

모듈은 struct vfs_fn_pointers 구조를 선언하고 초기화해야 합니다. 다음은 예시입니다.

static struct vfs_fn_pointers vfs_my_module_fns = {
       .getxattr_fn = my_module_getxattr,
       .fgetxattr_fn = my_module_fgetxattr,
       .setxattr_fn = my_module_setxattr,
       .fsetxattr_fn = my_module_fsetxattr,
       .listxattr_fn = my_module_ 목록xattr,
};

Include Files

모듈은 일부 포함 파일을 호출해야 합니다. include.h 가 필요하지만 다음과 같은 몇 가지를 더 포함해야 할 수도 있습니다.

  • fcntl 등과 같은 많은 파일 시스템 호출에 엑세스 해야 하는 경우 system/filesys.h, 시스템 include files 를 확인하려면 lib/replace/system/filesys.h 를 참조
  • NT ACL 등에 대한 정의에 액세스해야 하는 경우 smbd/smbd.h

VFS 기능

일반적으로 SMB_VFS_NEXT_XXXX 를 호출합니다.

  • 대게 int 값을 반환하고, 0 보다 작은 값은 오류가 발생했음을 의미합니다.
  • NTSTATUS 반환으로 치환하려면 map_nt_error_from_unix 를 사용합니다.
  • SMB_STRUCT_DIR 와 같은 항목에서 오류로 NULL 도 반환할 수도 있습니다.

Providing Context between Calls

vfs_handle_struct 에 SMB_VFS_HANDLE_SET_DATA 를 사용하여 컨텍스트 정보를 저장할 수 있습니다. 예제는 다음과 같습니다.

config =talloc_zero(handle->conn,struct my_module_config_data); 
if (!config) { 
       SMB_VFS_NEXT_DISCONNECT(핸들); 
       DEBUG(0, ("talloc_zero() 실패\n")); -1을 반환합니다. 
} 
SMB_VFS_HANDLE_SET_DATA(handle, my_module_context_data, 
                        NULL, struct my_module_config_data, 
                        return -1);

핸들에서 컨텍스트 정보를 조회하는 것은 다음과 같습니다.

SMB_VFS_HANDLE_GET_DATA(handle, config, 
                        struct my_module_config_data, return next);

Module Specific Parameters

smb.conf 에서 모듈별 파리미터를 검색할 수 있습니다.

config->some_bool_param = lp_parm_bool(SNUM(handle->conn), 
                                       "my_module", "someboolparam", true);

위는 다음과 같은 파라미터를 넣었을 때 수신할 수 있습니다.

... 
    my_module:someboolparam = 예 
...

Extending the Samba files_struct structure

samba 의 file_struct 를 커스텀할 수 있습니다. (모듈당 하나의 확장 가능)

p_var = (struct my_struct *) VFS_ADD_FSP_EXTENSION(handle, 
                                                   fsp, struct my_struct, 
                                                   NULL);

AIO 처리

AIO를 사용하려면 Samba의 TEVENT 기능을 알아야 합니다.

기능 설명
SMB_VFS_PREAD_SEND AIO 읽기 요청을 시작하는 데 사용됩니다.
SMB_VFS_PWRITE_SEND AIO 쓰기 요청을 시작하는 데 사용됩니다.
SMB_VFS_AIO_RETURN 성공적으로 시작된 AIO 에서 반환된 상태를 검색합니다.
SMB_VFS_AIO_CANCEL 이미 시작된 AIO 작업을 취소합니다.
SMB_VFS_AIO_ERROR 성공적으로 시작된 경우 0 으로 반환하고, 그 외의 경우 EINPROGRESS, ECANCELED 등을 반환합니다.
SMB_VFS_AIO_FSYNC AIO 를 정리합니다.
SMB_VFS_AIO_SUSPEND AIO 를 연결합니다.
SMB_VFS_AIO_FORCE 모듈은 원하는 경우 요청별로 AIO 요청 시작을 거부할 수 있습니다. 해당 작업이 AIO 작업이 되도록 허용하려면 FALSE를 반환하고, 해당 작업이 AIO를 통해 전송되는 것을 원하지 않으면 TRUE를 반환합니다.

기본 동작은 표준 시스템 AIO 루틴인 aio_read/aio_read64, aio_write/aio_write64 및 aio_return/aio_return64를 호출하는 것입니다.

기본 인터페이스 규칙

대게 VFS 모듈은 POXIS 인터페이스를 제공하는데, 오류가 발생한 경우 -1을 반환하고 errno 를 POXIS 오류값으로 설정해야 한다는 것입니다. 정상인 경우는 0을 반환합니다.

Path 의 의미

대부분은 공유 루트에 대해서 상대 경로입니다. 그렇지 않다면은 절대경로로 표현합니다.

SMB 요청을 처리할때 작업 디렉터리(chdir) 을 공유 루트로 변경한 다음 일반적으로 해당 경로를 있는 그대로 전달합니다.

예외:

  1. 작업 디렉토리를 변경할 때: smbd 는 VFS chdir_fn 함수를 사용하여 공유 경로를 변경할 수 있습니다.
  2. 일부 VFS 모듈은 경로를 수정하고 요청을 아래 계층으로 전달합니다. 그 중 일부는 구성에 따라 절대 경로를 수정할 수 있습니다. (예 : vfs_shadow_copy2 의 snapshare_path)

절대경로로 처리하는 모듈은 다른 절대경로로 처리하는 모듈과 같이 스택을 쌓을 수 없습니다.

상대경로는 handler→conn→connectpath 에서 확인할 수 있습니다.


  • NTFS ACL : Microsoft가 개발한 소유권을 가진 파일 시스템인 NTFS (New Technology File System)의 액세스 제어 목록을 가리킵니다. ACL은 사용자나 시스템 프로세스가 객체에 대한 액세스를 허용 받을 수 있는지, 주어진 객체에서 어떤 작업을 허용하는지 결정하는 기능입니다.
  • NFSv4 ACL : 네트워크 파일 시스템(Network File System, NFS)의 버전 4에서 사용되는 액세스 제어 목록(Access Control List)을 가리킵니다. 이는 특정 파일 또는 디렉토리에 접근할 수 있는 사람을 제어하는 목록이며, 그들이 그것에 수행할 수 있는 작업을 제어합니다.
  • NT ACL : Windows NT의 기능으로, 시스템 객체에 대한 권한을 제어하며, 어떤 사용자 또는 시스템 프로세스에 접근이 허용되고 객체에서 어떤 작업이 허용되는지를 명시합니다.
  • XATTR 또는 확장 속성: 파일 시스템 기능으로, 사용자가 파일 시스템에서 해석하지 않는 메타데이터와 컴퓨터 파일을 연결할 수 있게 해줍니다. 반면에 일반 속성은 파일 시스템에 의해 엄격하게 정의된 목적을 가지고 있습니다.
  • talloc: 메모리의 주체를 지정하여 메모리 할당, 주체자가 반환되면 나머지도 반환됨. 명시적으로 하고 싶다면 talloc_free 를 사용하여 해제가능

참고

반응형

'DevOps > 지식창고' 카테고리의 다른 글

Devel  (0) 2024.04.01
LVM 메타데이터 (feat. dd)  (1) 2024.02.28
LVM Thin  (0) 2024.02.11
NFS  (0) 2023.12.16
Paxos 기능 개발기 - 개념 정리(2)  (0) 2023.12.15
Paxos 기능 개발기 - 개념정리(1)  (1) 2023.12.11
VDI(Virtual Desktop Infrastructur  (1) 2023.12.07
SAN  (0) 2023.12.02