Samba VFS 는 Samba 의 기능을 확장할 수 있도록 하는 매커니즘을 제공합니다.
- VFS Layer 로 파일 시스템에 저장하기 위해서 NTFS ACL 을 NFSv4 ACL 로 변환, GPFS VFS 모듈도 이를 수행 (RichACL 지원이 되면 Linux 에서도 동일한 작업을 수행할 수 있음)
- Linux 파일 시스템에서 지원하지 않는 파일 시스템에 구현한 기능을 지원합니다.
- 대체 데이터 스트림과 같은 기능을 구현합니다.
- XATTR 에 저장하고 의미 체계를 올바르게 처리하여 전체 NT ACL 지원을 구현합니다.
- 공유 메모리 인터페이스나 사용자 공간 라이브러리를 통해 액세스할 수 있는 사용자 공간 파일 시스템을 지원합니다. 이를 수행하는 모듈은 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 기능은 다음 클래스로 구분할 수 있습니다.:
- 마운트 및 마운트 해제 기능, 할당량 및 여유 공간 처리 루틴, statvfs 기능 등과 같은 디스크 또는 파일 시스템 작업
- opendir, readdir, mkdir 등과 같은 디렉터리 작업
- 파일 작업 : 파일 열기, 닫기, 읽기, 쓰기, 메타데이터 정보 가져오기, 파일에서 수행할 수 있는 기타 모든 작업
- 파일이나 디렉터리에서 NT ACL 을 설정하고 가져오는 것과 같은 작업, 보안 설명자 처리
- POSIX ACL 작업
- 파일에서 XATTR 을 설정하고 검색하기 위한 확장된 속성 작업
- 비동기 작업을 처리하기 위한 AIO 작업
- 오프라인 작업을 처리하기 위한 오프라인 작업
- 내구성 있는 핸들 작업(Durable handle operations)
두 가지 유형의 파일 시스템
- 시스템 호출을 통해 액세스 되고 시스템이 파일 설명자를 제공하는 파일 시스템
- 일반적으로 사용자 공간 라이브러리를 통해 사용자 공간에서 액세스되는 파일 시스템
사용자 공간 파일 시스템을 위한 모든 VFS 는 커널이 이해하지 못하는 파일 설명자를 제공합니다.
VFS 모듈 작성
vfs 모듈을 빌드하는 경우 source3/modules
디렉토리에 vfs\_.c
형식으로 지정해야 합니다. 모듈에는 vfs\_fn\_pointer
로 실제로 구현하는 함수에 대한 포인터로 함수를 초기화할 수 있습니다.
VFS module lifecycle
클라이언트가 TREE_CONNECT 요청을 발행하면 samba 는 SMB_VFS_CONNECT 를 호출
- 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) 을 공유 루트로 변경한 다음 일반적으로 해당 경로를 있는 그대로 전달합니다.
예외:
- 작업 디렉토리를 변경할 때: smbd 는 VFS chdir_fn 함수를 사용하여 공유 경로를 변경할 수 있습니다.
- 일부 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 |